Re: [PATCH v3] tag: support --sort=<spec>
- From
Jeff King <peff@peff.net>
- Date
- Feb 26, 2014, 09:05 UTC
- Message-ID
- <20140226090511.GA32537@sigill.intra.peff.net>
- In-Reply-To
- <1393330935-22229-1-git-send-email-pclouds@gmail.com>
On Tue, Feb 25, 2014 at 07:22:15PM +0700, Nguyễn Thái Ngọc Duy wrote:
> versioncmp() is copied from string/strverscmp.c in glibc commit > ee9247c38a8def24a59eb5cfb7196a98bef8cfdc, reformatted to Git coding > style. The implementation is under LGPL-2.1 and according to [1] I can > relicense it to GPLv2.
Cool. I think doing this makes the most sense, as we do not have to worry about build-time config (and I do not see any particular reason why we would want to use the system strverscmp on glibc systems).
Show 17 quoted lines
> +static int parse_opt_sort(const struct option *opt, const char *arg, int unset)
> +{
> + int *sort = opt->value;
> + if (*arg == '-') {
> + *sort = REVERSE_SORT;
> + arg++;
> + } else
> + *sort = STRCMP_SORT;
> + if (starts_with(arg, "version:")) {
> + *sort |= VERCMP_SORT;
> + arg += 8;
> + } else if (starts_with(arg, "v:")) {
> + *sort |= VERCMP_SORT;
> + arg += 2;
> + }
> + if (strcmp(arg, "refname"))
> + die(_("unsupported sort specification %s"), arg);I found this logic a bit weird, as STRCMP_SORT and VERCMP_SORT are not mutually exclusive flags, but REVERSE and STRCMP are. I would have thought REVERSE is the flag, and the other two are selections. Like:
int flags = 0;
if (*arg == '-') {
flags |= REVERSE_SORT;
arg++;
}
if (starts_with(arg, "version:")) {
*sort = VERCMP_SORT;
arg += 8;
} else
*sort = STRCMP_SORT;*sort |= flags;
I think they end up doing the same thing, but maybe I am missing something.
-Peff