X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=inline;f=builtin-for-each-ref.c;h=227aa3cd7f887ad44fd6b885479ef2afb586ded4;hb=e33fba4c5a33bce748d2c8a1c7a38b78a1fd2cda;hp=698618b798184ad24eed43917b5d609f9abf5886;hpb=019298015bb7c826b72f2573047b7221b0921fd3;p=git.git diff --git a/builtin-for-each-ref.c b/builtin-for-each-ref.c index 698618b79..227aa3cd7 100644 --- a/builtin-for-each-ref.c +++ b/builtin-for-each-ref.c @@ -59,6 +59,8 @@ static struct { { "taggername" }, { "taggeremail" }, { "taggerdate", FIELD_TIME }, + { "creator" }, + { "creatordate", FIELD_TIME }, { "subject" }, { "body" }, { "contents" }, @@ -401,6 +403,29 @@ static void grab_person(const char *who, struct atom_value *val, int deref, stru else if (!strcmp(name + wholen, "date")) grab_date(wholine, v); } + + /* For a tag or a commit object, if "creator" or "creatordate" is + * requested, do something special. + */ + if (strcmp(who, "tagger") && strcmp(who, "committer")) + return; /* "author" for commit object is not wanted */ + if (!wholine) + wholine = find_wholine(who, wholen, buf, sz); + if (!wholine) + return; + for (i = 0; i < used_atom_cnt; i++) { + const char *name = used_atom[i]; + struct atom_value *v = &val[i]; + if (!!deref != (*name == '*')) + continue; + if (deref) + name++; + + if (!strcmp(name, "creatordate")) + grab_date(wholine, v); + else if (!strcmp(name, "creator")) + v->s = copy_line(wholine); + } } static void find_subpos(const char *buf, unsigned long sz, const char **sub, const char **body) @@ -453,9 +478,9 @@ static void grab_sub_body_contents(struct atom_value *val, int deref, struct obj if (!strcmp(name, "subject")) v->s = copy_line(subpos); else if (!strcmp(name, "body")) - v->s = bodypos; + v->s = xstrdup(bodypos); else if (!strcmp(name, "contents")) - v->s = subpos; + v->s = xstrdup(subpos); } } @@ -585,24 +610,27 @@ static void get_value(struct refinfo *ref, int atom, struct atom_value **v) *v = &ref->value[atom]; } -static struct refinfo **grab_array; -static const char **grab_pattern; -static int *grab_cnt; +struct grab_ref_cbdata { + struct refinfo **grab_array; + const char **grab_pattern; + int grab_cnt; +}; /* * A call-back given to for_each_ref(). It is unfortunate that we * need to use global variables to pass extra information to this * function. */ -static int grab_single_ref(const char *refname, const unsigned char *sha1) +static int grab_single_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data) { + struct grab_ref_cbdata *cb = cb_data; struct refinfo *ref; int cnt; - if (*grab_pattern) { + if (*cb->grab_pattern) { const char **pattern; int namelen = strlen(refname); - for (pattern = grab_pattern; *pattern; pattern++) { + for (pattern = cb->grab_pattern; *pattern; pattern++) { const char *p = *pattern; int plen = strlen(p); @@ -626,25 +654,14 @@ static int grab_single_ref(const char *refname, const unsigned char *sha1) ref->refname = xstrdup(refname); hashcpy(ref->objectname, sha1); - cnt = *grab_cnt; - grab_array = xrealloc(grab_array, sizeof(*grab_array) * (cnt + 1)); - grab_array[cnt++] = ref; - *grab_cnt = cnt; + cnt = cb->grab_cnt; + cb->grab_array = xrealloc(cb->grab_array, + sizeof(*cb->grab_array) * (cnt + 1)); + cb->grab_array[cnt++] = ref; + cb->grab_cnt = cnt; return 0; } -static struct refinfo **grab_refs(const char **pattern, int *cnt) -{ - /* Sheesh, we really should make for-each-ref to take - * callback data. - */ - *cnt = 0; - grab_pattern = pattern; - grab_cnt = cnt; - for_each_ref(grab_single_ref); - return grab_array; -} - static int cmp_ref_sort(struct ref_sort *s, struct refinfo *a, struct refinfo *b) { struct atom_value *va, *vb; @@ -784,6 +801,7 @@ int cmd_for_each_ref(int ac, const char **av, char *prefix) int maxcount = 0; int quote_style = -1; /* unspecified yet */ struct refinfo **refs; + struct grab_ref_cbdata cbdata; for (i = 1; i < ac; i++) { const char *arg = av[i]; @@ -855,7 +873,11 @@ int cmd_for_each_ref(int ac, const char **av, char *prefix) verify_format(format); - refs = grab_refs(av + i, &num_refs); + memset(&cbdata, 0, sizeof(cbdata)); + cbdata.grab_pattern = av + i; + for_each_ref(grab_single_ref, &cbdata); + refs = cbdata.grab_array; + num_refs = cbdata.grab_cnt; for (i = 0; i < used_atom_cnt; i++) { if (used_atom[i][0] == '*') {