Merge branch 'cc/for-each-mergetag'
authorJunio C Hamano <gitster@pobox.com>
Mon, 21 Jul 2014 18:17:45 +0000 (11:17 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 21 Jul 2014 18:17:45 +0000 (11:17 -0700)
* cc/for-each-mergetag:
commit: add for_each_mergetag()

commit.c
commit.h
log-tree.c
index f43970dca1e11baf3b7690df81e13866f536f8db..f1c9d0e2b99bd6f21ce0a0debae646eb677fccf5 100644 (file)
--- a/commit.c
+++ b/commit.c
@@ -1310,6 +1310,19 @@ struct commit_extra_header *read_commit_extra_headers(struct commit *commit,
        return extra;
 }
 
+void for_each_mergetag(each_mergetag_fn fn, struct commit *commit, void *data)
+{
+       struct commit_extra_header *extra, *to_free;
+
+       to_free = read_commit_extra_headers(commit, NULL);
+       for (extra = to_free; extra; extra = extra->next) {
+               if (strcmp(extra->key, "mergetag"))
+                       continue; /* not a merge tag */
+               fn(commit, extra, data);
+       }
+       free_commit_extra_headers(to_free);
+}
+
 static inline int standard_header_field(const char *field, size_t len)
 {
        return ((len == 4 && !memcmp(field, "tree ", 5)) ||
index 2e1492a6e4d1c5fc5bea3a48180f128601c3461e..b695aa4a5bfc7917da1cd3e00a295439fe905020 100644 (file)
--- a/commit.h
+++ b/commit.h
@@ -312,6 +312,11 @@ extern struct commit_extra_header *read_commit_extra_headers(struct commit *, co
 
 extern void free_commit_extra_headers(struct commit_extra_header *extra);
 
+typedef void (*each_mergetag_fn)(struct commit *commit, struct commit_extra_header *extra,
+                                void *cb_data);
+
+extern void for_each_mergetag(each_mergetag_fn fn, struct commit *commit, void *data);
+
 struct merge_remote_desc {
        struct object *obj; /* the named object, could be a tag */
        const char *name;
index f87b7e891adc5dfb429bc0ae35227e19f335b90f..0c53dc11abf5aa10c83b35f07452f3c00a2998d4 100644 (file)
@@ -414,10 +414,11 @@ static int is_common_merge(const struct commit *commit)
                && !commit->parents->next->next);
 }
 
-static void show_one_mergetag(struct rev_info *opt,
+static void show_one_mergetag(struct commit *commit,
                              struct commit_extra_header *extra,
-                             struct commit *commit)
+                             void *data)
 {
+       struct rev_info *opt = (struct rev_info *)data;
        unsigned char sha1[20];
        struct tag *tag;
        struct strbuf verify_message;
@@ -465,15 +466,7 @@ static void show_one_mergetag(struct rev_info *opt,
 
 static void show_mergetag(struct rev_info *opt, struct commit *commit)
 {
-       struct commit_extra_header *extra, *to_free;
-
-       to_free = read_commit_extra_headers(commit, NULL);
-       for (extra = to_free; extra; extra = extra->next) {
-               if (strcmp(extra->key, "mergetag"))
-                       continue; /* not a merge tag */
-               show_one_mergetag(opt, extra, commit);
-       }
-       free_commit_extra_headers(to_free);
+       for_each_mergetag(show_one_mergetag, commit, opt);
 }
 
 void show_log(struct rev_info *opt)