]> git.ipfire.org Git - thirdparty/git.git/blobdiff - builtin/tag.c
prefer comment_line_str to comment_line_char for printing
[thirdparty/git.git] / builtin / tag.c
index 358b30861617f7cfc6c1eb2e99c5bb65c4385278..721d07a589733ebe5dddcf886e017a021364ef39 100644 (file)
@@ -43,18 +43,11 @@ static const char * const git_tag_usage[] = {
 static unsigned int colopts;
 static int force_sign_annotate;
 static int config_sign_tag = -1; /* unspecified */
-static int omit_empty = 0;
 
 static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting,
                     struct ref_format *format)
 {
-       struct ref_array array;
-       struct strbuf output = STRBUF_INIT;
-       struct strbuf err = STRBUF_INIT;
        char *to_free = NULL;
-       int i;
-
-       memset(&array, 0, sizeof(array));
 
        if (filter->lines == -1)
                filter->lines = 0;
@@ -72,23 +65,8 @@ static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting,
        if (verify_ref_format(format))
                die(_("unable to parse format string"));
        filter->with_commit_tag_algo = 1;
-       filter_refs(&array, filter, FILTER_REFS_TAGS);
-       filter_ahead_behind(the_repository, format, &array);
-       ref_array_sort(sorting, &array);
-
-       for (i = 0; i < array.nr; i++) {
-               strbuf_reset(&output);
-               strbuf_reset(&err);
-               if (format_ref_array_item(array.items[i], format, &output, &err))
-                       die("%s", err.buf);
-               fwrite(output.buf, 1, output.len, stdout);
-               if (output.len || !omit_empty)
-                       putchar('\n');
-       }
+       filter_and_format_refs(filter, FILTER_REFS_TAGS, sorting, format);
 
-       strbuf_release(&err);
-       strbuf_release(&output);
-       ref_array_clear(&array);
        free(to_free);
 
        return 0;
@@ -175,16 +153,16 @@ static int verify_tag(const char *name, const char *ref UNUSED,
 
 static int do_sign(struct strbuf *buffer)
 {
-       return sign_buffer(buffer, buffer, get_signing_key());
+       return sign_buffer(buffer, buffer, get_signing_key()) ? -1 : 0;
 }
 
 static const char tag_template[] =
        N_("\nWrite a message for tag:\n  %s\n"
-       "Lines starting with '%c' will be ignored.\n");
+       "Lines starting with '%s' will be ignored.\n");
 
 static const char tag_template_nocleanup[] =
        N_("\nWrite a message for tag:\n  %s\n"
-       "Lines starting with '%c' will be kept; you may remove them"
+       "Lines starting with '%s' will be kept; you may remove them"
        " yourself if you want to.\n");
 
 static int git_tag_config(const char *var, const char *value,
@@ -313,11 +291,11 @@ static void create_tag(const struct object_id *object, const char *object_ref,
                        struct strbuf buf = STRBUF_INIT;
                        strbuf_addch(&buf, '\n');
                        if (opt->cleanup_mode == CLEANUP_ALL)
-                               strbuf_commented_addf(&buf, comment_line_char,
-                                     _(tag_template), tag, comment_line_char);
+                               strbuf_commented_addf(&buf, comment_line_str,
+                                     _(tag_template), tag, comment_line_str);
                        else
-                               strbuf_commented_addf(&buf, comment_line_char,
-                                     _(tag_template_nocleanup), tag, comment_line_char);
+                               strbuf_commented_addf(&buf, comment_line_str,
+                                     _(tag_template_nocleanup), tag, comment_line_str);
                        write_or_die(fd, buf.buf, buf.len);
                        strbuf_release(&buf);
                }
@@ -332,7 +310,7 @@ static void create_tag(const struct object_id *object, const char *object_ref,
 
        if (opt->cleanup_mode != CLEANUP_NONE)
                strbuf_stripspace(buf,
-                 opt->cleanup_mode == CLEANUP_ALL ? comment_line_char : '\0');
+                 opt->cleanup_mode == CLEANUP_ALL ? comment_line_str : NULL);
 
        if (!opt->message_given && !buf->len)
                die(_("no tag message?"));
@@ -480,7 +458,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
                OPT_WITHOUT(&filter.no_commit, N_("print only tags that don't contain the commit")),
                OPT_MERGED(&filter, N_("print only tags that are merged")),
                OPT_NO_MERGED(&filter, N_("print only tags that are not merged")),
-               OPT_BOOL(0, "omit-empty",  &omit_empty,
+               OPT_BOOL(0, "omit-empty",  &format.array_opts.omit_empty,
                        N_("do not output a newline after empty formatted refs")),
                OPT_REF_SORT(&sorting_options),
                {
@@ -500,7 +478,13 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
 
        setup_ref_filter_porcelain_msg();
 
+       /*
+        * Try to set sort keys from config. If config does not set any,
+        * fall back on default (refname) sorting.
+        */
        git_config(git_tag_config, &sorting_options);
+       if (!sorting_options.nr)
+               string_list_append(&sorting_options, "refname");
 
        memset(&opt, 0, sizeof(opt));
        filter.lines = -1;
@@ -546,7 +530,8 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
                        struct column_options copts;
                        memset(&copts, 0, sizeof(copts));
                        copts.padding = 2;
-                       run_column_filter(colopts, &copts);
+                       if (run_column_filter(colopts, &copts))
+                               die(_("could not start 'git column'"));
                }
                filter.name_patterns = argv;
                ret = list_tags(&filter, sorting, &format);