Allow -n and --sort=version:refname to be used together
instead of failing with:

  fatal: --sort and -n are incompatible

Signed-off-by: Rudy Matela <r...@matela.com.br>
---
 builtin/tag.c | 64 ++++++++++++++++++++++++++++++++---------------------------
 1 file changed, 35 insertions(+), 29 deletions(-)

diff --git a/builtin/tag.c b/builtin/tag.c
index cccca99..cdcb373 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -176,13 +176,19 @@ static enum contains_result contains(struct commit 
*candidate,
        return contains_test(candidate, want);
 }
 
-static void show_tag_lines(const struct object_id *oid, int lines)
+static char *get_tag_lines(const struct object_id *oid, int lines)
 {
        int i;
        unsigned long size;
        enum object_type type;
        char *buf, *sp, *eol;
        size_t len;
+       struct strbuf sb;
+
+       if (!lines)
+               return NULL;
+
+       strbuf_init(&sb,0);
 
        buf = read_sha1_file(oid->hash, &type, &size);
        if (!buf)
@@ -203,20 +209,21 @@ static void show_tag_lines(const struct object_id *oid, 
int lines)
                size = parse_signature(buf, size);
        for (i = 0, sp += 2; i < lines && sp < buf + size; i++) {
                if (i)
-                       printf("\n    ");
+                       strbuf_addstr(&sb,"\n    ");
                eol = memchr(sp, '\n', size - (sp - buf));
                len = eol ? eol - sp : size - (sp - buf);
-               fwrite(sp, len, 1, stdout);
+               strbuf_add(&sb, sp, len);
                if (!eol)
                        break;
                sp = eol + 1;
        }
 free_return:
        free(buf);
+       return strbuf_detach(&sb, NULL);
 }
 
-static int show_reference(const char *refname, const struct object_id *oid,
-                         int flag, void *cb_data)
+static int get_reference_and_tag_lines(const char *refname, const struct 
object_id *oid,
+                                      int flag, void *cb_data)
 {
        struct tag_filter *filter = cb_data;
 
@@ -234,16 +241,8 @@ static int show_reference(const char *refname, const 
struct object_id *oid,
                if (points_at.nr && !match_points_at(refname, oid->hash))
                        return 0;
 
-               if (!filter->lines) {
-                       if (filter->sort)
-                               string_list_append(&filter->tags, refname);
-                       else
-                               printf("%s\n", refname);
-                       return 0;
-               }
-               printf("%-15s ", refname);
-               show_tag_lines(oid, filter->lines);
-               putchar('\n');
+               string_list_append(&filter->tags, refname)->util =
+                       get_tag_lines(oid, filter->lines);
        }
 
        return 0;
@@ -260,6 +259,7 @@ static int list_tags(const char **patterns, int lines,
                     struct commit_list *with_commit, int sort)
 {
        struct tag_filter filter;
+       int i;
 
        filter.patterns = patterns;
        filter.lines = lines;
@@ -268,20 +268,28 @@ static int list_tags(const char **patterns, int lines,
        memset(&filter.tags, 0, sizeof(filter.tags));
        filter.tags.strdup_strings = 1;
 
-       for_each_tag_ref(show_reference, (void *)&filter);
-       if (sort) {
-               int i;
-               if ((sort & SORT_MASK) == VERCMP_SORT)
-                       qsort(filter.tags.items, filter.tags.nr,
-                             sizeof(struct string_list_item), sort_by_version);
-               if (sort & REVERSE_SORT)
-                       for (i = filter.tags.nr - 1; i >= 0; i--)
+       for_each_tag_ref(get_reference_and_tag_lines, (void *)&filter);
+       if ((sort & SORT_MASK) == VERCMP_SORT)
+               qsort(filter.tags.items, filter.tags.nr,
+                     sizeof(struct string_list_item), sort_by_version);
+       if (sort & REVERSE_SORT)
+               for (i = filter.tags.nr - 1; i >= 0; i--)
+                       if (lines)
+                               printf("%-15s %s\n",
+                                       filter.tags.items[i].string,
+                                       (char*)filter.tags.items[i].util);
+                       else
                                printf("%s\n", filter.tags.items[i].string);
-               else
-                       for (i = 0; i < filter.tags.nr; i++)
+       else
+               for (i = 0; i < filter.tags.nr; i++)
+                       if (lines)
+                               printf("%-15s %s\n",
+                                       filter.tags.items[i].string,
+                                       (char*)filter.tags.items[i].util);
+                       else
                                printf("%s\n", filter.tags.items[i].string);
-               string_list_clear(&filter.tags, 0);
-       }
+       string_list_clear(&filter.tags, 1);
+
        return 0;
 }
 
@@ -665,8 +673,6 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
                        copts.padding = 2;
                        run_column_filter(colopts, &copts);
                }
-               if (lines != -1 && tag_sort)
-                       die(_("--sort and -n are incompatible"));
                ret = list_tags(argv, lines == -1 ? 0 : lines, with_commit, 
tag_sort);
                if (column_active(colopts))
                        stop_column_filter();
-- 
2.5.0

--
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