Add support to sort by version using the "v:refname" and
"version:refname" option. This is achieved by using the
'version_cmp()' function as the comparing function for qsort.

Mentored-by: Christian Couder <christian.cou...@gmail.com>
Mentored-by: Matthieu Moy <matthieu....@grenoble-inp.fr>
Signed-off-by: Karthik Nayak <karthik....@gmail.com>
---
 ref-filter.c | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/ref-filter.c b/ref-filter.c
index 57a5cfb..e307fab 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -10,8 +10,9 @@
 #include "quote.h"
 #include "ref-filter.h"
 #include "revision.h"
+#include "version.h"
 
-typedef enum { FIELD_STR, FIELD_ULONG, FIELD_TIME } cmp_type;
+typedef enum { FIELD_STR, FIELD_ULONG, FIELD_TIME, FIELD_VER } cmp_type;
 
 static struct {
        const char *name;
@@ -53,6 +54,8 @@ static struct {
        { "flag" },
        { "HEAD" },
        { "color" },
+       { "version", FIELD_VER },
+       { "v", FIELD_VER },
 };
 
 /*
@@ -629,7 +632,9 @@ static void populate_value(struct ref_array_item *ref)
                        name++;
                }
 
-               if (starts_with(name, "refname"))
+               if (starts_with(name, "refname") ||
+                   starts_with(name, "version:") ||
+                   starts_with(name, "v:"))
                        refname = ref->refname;
                else if (starts_with(name, "symref"))
                        refname = ref->symref ? ref->symref : "";
@@ -695,7 +700,13 @@ static void populate_value(struct ref_array_item *ref)
                        int num_ours, num_theirs;
 
                        formatp++;
-                       if (starts_with(formatp, "lalign")) {
+                       if (starts_with(name, "version") || starts_with(name, 
"v")) {
+                               if (strcmp(formatp, "refname"))
+                                       die("unknown %.*s format %s",
+                                           (int)(formatp - name), name, 
formatp);
+                               v->s = refname;
+                               continue;
+                       } else if (starts_with(formatp, "lalign")) {
                                const char *valp;
                                int val;
 
@@ -1165,6 +1176,9 @@ static int cmp_ref_sorting(struct ref_sorting *s, struct 
ref_array_item *a, stru
        case FIELD_STR:
                cmp = strcmp(va->s, vb->s);
                break;
+       case FIELD_VER:
+               cmp = versioncmp(va->s, vb->s);
+               break;
        default:
                if (va->ul < vb->ul)
                        cmp = -1;
-- 
2.4.4

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to