ref-filter: move code from 'for-each-ref'
[gitweb.git] / builtin / tag.c
index de1beed2f9fb252b76ef29a6560f0149cf6882f1..5f6cdc5a03cd0d6df75c06453785f110cc3b08ee 100644 (file)
@@ -19,9 +19,9 @@
 #include "column.h"
 
 static const char * const git_tag_usage[] = {
-       N_("git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]"),
+       N_("git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> [<head>]"),
        N_("git tag -d <tagname>..."),
-       N_("git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>] "
+       N_("git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]"
                "\n\t\t[<pattern>...]"),
        N_("git tag -v <tagname>..."),
        NULL
@@ -85,7 +85,7 @@ static int in_commit_list(const struct commit_list *want, struct commit *c)
 enum contains_result {
        CONTAINS_UNKNOWN = -1,
        CONTAINS_NO = 0,
-       CONTAINS_YES = 1,
+       CONTAINS_YES = 1
 };
 
 /*
@@ -176,7 +176,7 @@ static enum contains_result contains(struct commit *candidate,
        return contains_test(candidate, want);
 }
 
-static void show_tag_lines(const unsigned char *sha1, int lines)
+static void show_tag_lines(const struct object_id *oid, int lines)
 {
        int i;
        unsigned long size;
@@ -184,14 +184,14 @@ static void show_tag_lines(const unsigned char *sha1, int lines)
        char *buf, *sp, *eol;
        size_t len;
 
-       buf = read_sha1_file(sha1, &type, &size);
+       buf = read_sha1_file(oid->hash, &type, &size);
        if (!buf)
-               die_errno("unable to read object %s", sha1_to_hex(sha1));
+               die_errno("unable to read object %s", oid_to_hex(oid));
        if (type != OBJ_COMMIT && type != OBJ_TAG)
                goto free_return;
        if (!size)
                die("an empty %s object %s?",
-                   typename(type), sha1_to_hex(sha1));
+                   typename(type), oid_to_hex(oid));
 
        /* skip header */
        sp = strstr(buf, "\n\n");
@@ -215,7 +215,7 @@ static void show_tag_lines(const unsigned char *sha1, int lines)
        free(buf);
 }
 
-static int show_reference(const char *refname, const unsigned char *sha1,
+static int show_reference(const char *refname, const struct object_id *oid,
                          int flag, void *cb_data)
 {
        struct tag_filter *filter = cb_data;
@@ -224,14 +224,14 @@ static int show_reference(const char *refname, const unsigned char *sha1,
                if (filter->with_commit) {
                        struct commit *commit;
 
-                       commit = lookup_commit_reference_gently(sha1, 1);
+                       commit = lookup_commit_reference_gently(oid->hash, 1);
                        if (!commit)
                                return 0;
                        if (!contains(commit, filter->with_commit))
                                return 0;
                }
 
-               if (points_at.nr && !match_points_at(refname, sha1))
+               if (points_at.nr && !match_points_at(refname, oid->hash))
                        return 0;
 
                if (!filter->lines) {
@@ -242,7 +242,7 @@ static int show_reference(const char *refname, const unsigned char *sha1,
                        return 0;
                }
                printf("%-15s ", refname);
-               show_tag_lines(sha1, filter->lines);
+               show_tag_lines(oid, filter->lines);
                putchar('\n');
        }
 
@@ -268,7 +268,7 @@ 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);
+       for_each_tag_ref(show_reference, (void *)&filter);
        if (sort) {
                int i;
                if ((sort & SORT_MASK) == VERCMP_SORT)
@@ -576,7 +576,6 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
        struct strbuf ref = STRBUF_INIT;
        unsigned char object[20], prev[20];
        const char *object_ref, *tag;
-       struct ref_lock *lock;
        struct create_tag_options opt;
        char *cleanup_arg = NULL;
        int annotate = 0, force = 0, lines = -1;
@@ -584,6 +583,8 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
        const char *msgfile = NULL, *keyid = NULL;
        struct msg_arg msg = { 0, STRBUF_INIT };
        struct commit_list *with_commit = NULL;
+       struct ref_transaction *transaction;
+       struct strbuf err = STRBUF_INIT;
        struct option options[] = {
                OPT_CMDMODE('l', "list", &cmdmode, N_("list tag names"), 'l'),
                { OPTION_INTEGER, 'n', NULL, &lines, N_("n"),
@@ -729,14 +730,17 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
        if (annotate)
                create_tag(object, tag, &buf, &opt, prev, object);
 
-       lock = lock_any_ref_for_update(ref.buf, prev, 0, NULL);
-       if (!lock)
-               die(_("%s: cannot lock the ref"), ref.buf);
-       if (write_ref_sha1(lock, object, NULL) < 0)
-               die(_("%s: cannot update the ref"), ref.buf);
+       transaction = ref_transaction_begin(&err);
+       if (!transaction ||
+           ref_transaction_update(transaction, ref.buf, object, prev,
+                                  0, NULL, &err) ||
+           ref_transaction_commit(transaction, &err))
+               die("%s", err.buf);
+       ref_transaction_free(transaction);
        if (force && !is_null_sha1(prev) && hashcmp(prev, object))
                printf(_("Updated tag '%s' (was %s)\n"), tag, find_unique_abbrev(prev, DEFAULT_ABBREV));
 
+       strbuf_release(&err);
        strbuf_release(&buf);
        strbuf_release(&ref);
        return 0;