diff options
author | Karthik Nayak <karthik.188@gmail.com> | 2015-09-10 21:18:25 +0530 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2015-09-17 10:02:49 -0700 |
commit | 90c004085cfe65e1b290e5b5fc05817ec2c596a6 (patch) | |
tree | aa817c17f370c8aa00cb96dda725b9584ac8fa58 /ref-filter.c | |
parent | 1bb38e5a6a8fb6cf9b882a1a7038d649ceba0085 (diff) | |
download | git-90c004085cfe65e1b290e5b5fc05817ec2c596a6.tar.gz |
ref-filter: add support to sort by version
Add support to sort by version using the "v:refname" and
"version:refname" option. This is achieved by using the 'versioncmp()'
function as the comparing function for qsort.
This option is included to support sorting by versions in `git tag -l`
which will eventually be ported to use ref-filter APIs.
Add documentation and tests for the same.
Mentored-by: Christian Couder <christian.couder@gmail.com>
Mentored-by: Matthieu Moy <matthieu.moy@grenoble-inp.fr>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'ref-filter.c')
-rw-r--r-- | ref-filter.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/ref-filter.c b/ref-filter.c index 32aab37d36..c039fc891b 100644 --- a/ref-filter.c +++ b/ref-filter.c @@ -11,6 +11,8 @@ #include "ref-filter.h" #include "revision.h" #include "utf8.h" +#include "git-compat-util.h" +#include "version.h" typedef enum { FIELD_STR, FIELD_ULONG, FIELD_TIME } cmp_type; @@ -1439,19 +1441,19 @@ static int cmp_ref_sorting(struct ref_sorting *s, struct ref_array_item *a, stru get_ref_atom_value(a, s->atom, &va); get_ref_atom_value(b, s->atom, &vb); - switch (cmp_type) { - case FIELD_STR: + if (s->version) + cmp = versioncmp(va->s, vb->s); + else if (cmp_type == FIELD_STR) cmp = strcmp(va->s, vb->s); - break; - default: + else { if (va->ul < vb->ul) cmp = -1; else if (va->ul == vb->ul) cmp = 0; else cmp = 1; - break; } + return (s->reverse) ? -cmp : cmp; } @@ -1584,6 +1586,9 @@ int parse_opt_ref_sorting(const struct option *opt, const char *arg, int unset) s->reverse = 1; arg++; } + if (skip_prefix(arg, "version:", &arg) || + skip_prefix(arg, "v:", &arg)) + s->version = 1; len = strlen(arg); s->atom = parse_ref_filter_atom(arg, arg+len); return 0; |