Re: 2.10.0: multiple versionsort.prereleasesuffix buggy?
Hi, Quoting Jeff King: On Tue, Sep 06, 2016 at 03:07:59AM +0200, SZEDER Gábor wrote: So that seems wrong. Even weirder, if I set _only_ "-beta", I get: $ git tag -l --sort=version:refname | grep -v ^2.6.0 2.6.0-beta-2 2.6.0-beta-3 2.6.0-beta-4 2.6.0 2.6.0-RC1 2.6.0-RC2 2.6.0-beta-1 Umm...what? beta-1 is sorted away from its companions? That's weird. I wondered if the presence of "-" after the suffix ("beta-1" rather than "beta1") would matter. It looks like that shouldn't matter, though; it's purely doing a prefix match on "do these names differ at a prerelease suffix". But something certainly seems wrong. Some of the weirdness is caused by the '-' at the _beginning_ of the suffixes, because versioncmp() gets confused by suffixes starting with the same character(s). Oh, right, that makes sense. So it's effectively not finding _any_ suffix between X-RC1 and X-beta-1, because we only start looking after "X-", and none of them match. I am still confused why "2.6.0-beta-1" doesn't get sorted with its peers. I'd guess that the comparison function doesn't actually provide a strict ordering, so the results depend on the actual sort algorithm, and which pairs it ends up comparing. Turns out that this weirdness is caused by that leading '-' in the suffix, too. Here is a manageably small recipe to reproduce: $ git -c versionsort.prereleasesuffix=-beta tag -l --sort=version:refname v2.1.0* v2.1.{1,2} v2.1.0-beta-2 v2.1.0-beta-3 v2.1.0 v2.1.0-RC1 v2.1.0-RC2 v2.1.0-beta-1 v2.1.1 v2.1.2 Tracing which pairs of tagnames are compared, I found that somewhere along the line "v2.1.0-beta-1" happens to be compared to "v2.1.0-RC2", and the issue described in my previous email strikes again: the '-' is part of the common part of the two tagnames, swap_prereleases() gets only "beta-1" and "RC2", thus it can't match the configured "-beta" suffix, and since the byte value of 'b' is higher than that of 'R', "-beta-1" is sorted after "-RC2". OTOH, "v2.1.0-beta-2" and "v2.1.0-beta-3" are only compared to each other or to final release tags, but never to any "-RCx" tags, hence they are sorted properly. Once I finish teaching versioncmp() and swap_prereleases() to cope with leading characters of a prereleaseSuffix being part of the common part of two tagnames, this out-of-order "beta-1" issue will be gone as well. Best, Gábor
Re: 2.10.0: multiple versionsort.prereleasesuffix buggy?
On 06.09.2016 04:07, SZEDER Gábor wrote: [versionsort] prereleasesuffix = beta prereleasesuffix = -beta prereleasesuffix = RC prereleasesuffix = -RC Best, Gábor Yes, yes you are the best. Workaround works, tyvm. I was heading in that direction, too, but never thought to remove leading dash on the alternates - instead I tried "-b", "-R" and similar just to see what happens.
Re: 2.10.0: multiple versionsort.prereleasesuffix buggy?
On Tue, Sep 06, 2016 at 03:07:59AM +0200, SZEDER Gábor wrote: > > So that seems wrong. Even weirder, if I set _only_ "-beta", I get: > > > > $ git tag -l --sort=version:refname | grep -v ^2.6.0 > > 2.6.0-beta-2 > > 2.6.0-beta-3 > > 2.6.0-beta-4 > > 2.6.0 > > 2.6.0-RC1 > > 2.6.0-RC2 > > 2.6.0-beta-1 > > > > Umm...what? beta-1 is sorted away from its companions? That's weird. > > > > I wondered if the presence of "-" after the suffix ("beta-1" rather than > > "beta1") would matter. It looks like that shouldn't matter, though; it's > > purely doing a prefix match on "do these names differ at a prerelease > > suffix". > > > > But something certainly seems wrong. > > Some of the weirdness is caused by the '-' at the _beginning_ of the > suffixes, because versioncmp() gets confused by suffixes starting with > the same character(s). Oh, right, that makes sense. So it's effectively not finding _any_ suffix between X-RC1 and X-beta-1, because we only start looking after "X-", and none of them match. I am still confused why "2.6.0-beta-1" doesn't get sorted with its peers. I'd guess that the comparison function doesn't actually provide a strict ordering, so the results depend on the actual sort algorithm, and which pairs it ends up comparing. -Peff
Re: 2.10.0: multiple versionsort.prereleasesuffix buggy?
> On Tue, Sep 06, 2016 at 01:42:28AM +0300, Leho Kraav (Conversion Ready) wrote: > > > Here's the testing tree https://github.com/woothemes/woocommerce > > > > .git/config has: > > > > [versionsort] > > > > > > prereleasesuffix = -beta > > prereleasesuffix = -RC > > > > $ git tag -l --sort=version:refname > > [...] > > 2.6.0-RC1 > > 2.6.0-RC2 > > 2.6.0-beta-1 > > 2.6.0-beta-2 > > 2.6.0-beta-3 > > 2.6.0-beta-4 > > So that seems wrong. Even weirder, if I set _only_ "-beta", I get: > > $ git tag -l --sort=version:refname | grep -v ^2.6.0 > 2.6.0-beta-2 > 2.6.0-beta-3 > 2.6.0-beta-4 > 2.6.0 > 2.6.0-RC1 > 2.6.0-RC2 > 2.6.0-beta-1 > > Umm...what? beta-1 is sorted away from its companions? That's weird. > > I wondered if the presence of "-" after the suffix ("beta-1" rather than > "beta1") would matter. It looks like that shouldn't matter, though; it's > purely doing a prefix match on "do these names differ at a prerelease > suffix". > > But something certainly seems wrong. Some of the weirdness is caused by the '-' at the _beginning_ of the suffixes, because versioncmp() gets confused by suffixes starting with the same character(s). versioncmp() consumes two tagnames up to the first different character and then calls swap_prereleases() to try to match prerelease suffixes starting at those characters. This works fine when comparing a release with a prerelease, e.g. "2.6.0" and "2.6.0-RC1", because swap_prereleases() gets "" and "-RC1" and the latter does match one of the configured suffixes. However, when comparing two prereleases, e.g. "2.6.0-beta1" and "2.6.0-RC1", then the '-' is consumed from both tagnames because the first differing characters are 'b' and 'R', thus swap_prereleases() gets "beta1" and "RC1", which, of course, don't match any of the configured suffixes without the leading '-'. It's way past my bedtime, so for the time being I can only come up with a hacky configuration workaround that seems to deliver the expected results: [versionsort] prereleasesuffix = beta prereleasesuffix = -beta prereleasesuffix = RC prereleasesuffix = -RC Best, Gábor
Re: 2.10.0: multiple versionsort.prereleasesuffix buggy?
On Tue, Sep 06, 2016 at 01:42:28AM +0300, Leho Kraav (Conversion Ready) wrote: > Here's the testing tree https://github.com/woothemes/woocommerce > > .git/config has: > > [versionsort] > > > prereleasesuffix = -beta > prereleasesuffix = -RC > > $ git tag -l --sort=version:refname > [...] > 2.6.0-RC1 > 2.6.0-RC2 > 2.6.0-beta-1 > 2.6.0-beta-2 > 2.6.0-beta-3 > 2.6.0-beta-4 So that seems wrong. Even weirder, if I set _only_ "-beta", I get: $ git tag -l --sort=version:refname | grep -v ^2.6.0 2.6.0-beta-2 2.6.0-beta-3 2.6.0-beta-4 2.6.0 2.6.0-RC1 2.6.0-RC2 2.6.0-beta-1 Umm...what? beta-1 is sorted away from its companions? That's weird. I wondered if the presence of "-" after the suffix ("beta-1" rather than "beta1") would matter. It looks like that shouldn't matter, though; it's purely doing a prefix match on "do these names differ at a prerelease suffix". But something certainly seems wrong. -Peff