mirror of
https://github.com/git/git.git
synced 2024-05-08 17:56:09 +02:00
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 <chriscool@tuxfamily.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
6f92e5ff3c
commit
063da62b02
13
commit.c
13
commit.c
|
@ -1316,6 +1316,19 @@ struct commit_extra_header *read_commit_extra_headers(struct commit *commit,
|
||||||
return extra;
|
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)
|
static inline int standard_header_field(const char *field, size_t len)
|
||||||
{
|
{
|
||||||
return ((len == 4 && !memcmp(field, "tree ", 5)) ||
|
return ((len == 4 && !memcmp(field, "tree ", 5)) ||
|
||||||
|
|
5
commit.h
5
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);
|
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 merge_remote_desc {
|
||||||
struct object *obj; /* the named object, could be a tag */
|
struct object *obj; /* the named object, could be a tag */
|
||||||
const char *name;
|
const char *name;
|
||||||
|
|
15
log-tree.c
15
log-tree.c
|
@ -413,10 +413,11 @@ static int is_common_merge(const struct commit *commit)
|
||||||
&& !commit->parents->next->next);
|
&& !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_extra_header *extra,
|
||||||
struct commit *commit)
|
void *data)
|
||||||
{
|
{
|
||||||
|
struct rev_info *opt = (struct rev_info *)data;
|
||||||
unsigned char sha1[20];
|
unsigned char sha1[20];
|
||||||
struct tag *tag;
|
struct tag *tag;
|
||||||
struct strbuf verify_message;
|
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)
|
static void show_mergetag(struct rev_info *opt, struct commit *commit)
|
||||||
{
|
{
|
||||||
struct commit_extra_header *extra, *to_free;
|
for_each_mergetag(show_one_mergetag, commit, opt);
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_log(struct rev_info *opt)
|
void show_log(struct rev_info *opt)
|
||||||
|
|
Loading…
Reference in New Issue