Mathieu Lirzin <[email protected]> skribis:

> The test case contains the example "guile-2.0.6.65-134c9" which
> invalidates my proposal.  Here is another idea which identifies the
> version part by the presence of dots.  WDYT?

Sometimes the version part does not contain dots, as in “diffoscope-34”.
Here’s the complete list of dot-less versions:

--8<---------------cut here---------------start------------->8---
scheme@(guile-user)> ,use(gnu packages)
scheme@(guile-user)> (fold-packages (lambda (p r)
                                      (if (string-index (package-version p) #\.)
                                          r
                                          (cons (package-full-name p) r)))
                                    '())
$38 = ("xterm-320" "unclutter-8" "tidy-20091223" "perl-uri-find-20140709" 
"libx264-20150706-2245" "vapoursynth-28" "texlive-texmf-2015" 
"texlive-bin-2015" "texlive-2015" "scmutils-20140302" 
"perl-regexp-common-2013031301" "parallel-20151122" "diffoscope-34" 
"mg-20050429" "ngircd-22" "bootstrap-tarballs-0" "static-binaries-tarball-0" 
"usbutils-006" "kmod-17" "less-481" "libjpeg-9a" "libjpeg-8d" "hugs-Sep2006" 
"ghc-bifunctors-5" "ghc-nats-1" "brdf-explorer-17" "libgudev-230" "psutils-17" 
"gcal-4" "libspiro-20071029" "fontforge-20120731-b" 
"font-gnu-freefont-ttf-20100919" "pcb-20140316" "paredit-24" 
"sfarkxtc-b5e0a2ba39" "lz4-131" "ld-wrapper-0" "glibc-bootstrap-0" 
"gcc-bootstrap-0" "binutils-bootstrap-0" "bootstrap-binaries-0" "bless-1p02" 
"tzdata-2015c" "freepats-20060219" "acpica-20150410")
--8<---------------cut here---------------end--------------->8---

Would they still be suitably parsed?

I liked that the initial algorithm was trivial, as in Nix:

--8<---------------cut here---------------start------------->8---
/* Parse a derivation name.  The `name' part of a derivation name is
   everything up to but not including the first dash *not* followed by
   a letter.  The `version' part is the rest (excluding the separating
   dash).  E.g., `apache-httpd-2.0.48' is parsed to (`apache-httpd',
   '2.0.48'). */
DrvName::DrvName(const string & s) : hits(0)
{
    name = fullName = s;
    for (unsigned int i = 0; i < s.size(); ++i) {
        /* !!! isalpha/isdigit are affected by the locale. */
        if (s[i] == '-' && i + 1 < s.size() && !isalpha(s[i + 1])) {
            name = string(s, 0, i);
            version = string(s, i + 1);
            break;
        }
    }
}
--8<---------------cut here---------------end--------------->8---

Another option would be to return a list of possible name version pairs,
and to change the UI to try them one after another?  The downside would
be that it moves complexity to the UI.  Hmm…

Ludo’.



Reply via email to