From: Christian Couder Date: Mon, 7 Jul 2014 06:35:37 +0000 (+0200) Subject: commit: add for_each_mergetag() X-Git-Tag: v2.1.0-rc0~25^2 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/063da62b02aeafe58fdacce0ea48c0761b06df60?hp=6f92e5ff3cdc813de8ef5327fd4bad492fb7d6c9 commit: add for_each_mergetag() In the same way as there is for_each_ref() to iterate on refs, for_each_mergetag() allows the caller to iterate on the mergetags of a given commit. Use it to rewrite show_mergetag() used in "git log". Signed-off-by: Christian Couder Signed-off-by: Junio C Hamano --- diff --git a/commit.c b/commit.c index 4ff8077dbf..94b1af9392 100644 --- a/commit.c +++ b/commit.c @@ -1316,6 +1316,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)) || diff --git a/commit.h b/commit.h index 2e1492a6e4..b695aa4a5b 100644 --- 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; diff --git a/log-tree.c b/log-tree.c index 10e68442b3..706ed4c250 100644 --- a/log-tree.c +++ b/log-tree.c @@ -413,10 +413,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; @@ -463,15 +464,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)