From: Junio C Hamano Date: Wed, 3 Oct 2007 10:03:22 +0000 (-0700) Subject: Merge branch 'ap/dateformat' X-Git-Tag: v1.5.4-rc0~392 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/5e5b2b98c844c791c87a3a084d7748b9d6888a0a?ds=inline;hp=-c Merge branch 'ap/dateformat' * ap/dateformat: Add a test script for for-each-ref, including test of date formatting dateformat: parse %(xxdate) %(yydate:format) correctly Make for-each-ref's grab_date() support per-atom formatting Make for-each-ref allow atom names like ":" parse_date_format(): convert a format name to an enum date_mode --- 5e5b2b98c844c791c87a3a084d7748b9d6888a0a diff --combined builtin-for-each-ref.c index 29f70aabc3,00afe89317..5dbf3e59f2 --- a/builtin-for-each-ref.c +++ b/builtin-for-each-ref.c @@@ -43,7 -43,7 +43,7 @@@ static struct { "objectsize", FIELD_ULONG }, { "objectname" }, { "tree" }, - { "parent" }, /* NEEDSWORK: how to address 2nd and later parents? */ + { "parent" }, { "numparent", FIELD_ULONG }, { "object" }, { "type" }, @@@ -106,7 -106,16 +106,16 @@@ static int parse_atom(const char *atom /* Is the atom a valid one? */ for (i = 0; i < ARRAY_SIZE(valid_atom); i++) { int len = strlen(valid_atom[i].name); - if (len == ep - sp && !memcmp(valid_atom[i].name, sp, len)) + /* + * If the atom name has a colon, strip it and everything after + * it off - it specifies the format for this entry, and + * shouldn't be used for checking against the valid_atom + * table. + */ + const char *formatp = strchr(sp, ':'); + if (!formatp || ep < formatp) + formatp = ep; + if (len == formatp - sp && !memcmp(valid_atom[i].name, sp, len)) break; } @@@ -262,26 -271,24 +271,26 @@@ static void grab_commit_values(struct a } if (!strcmp(name, "numparent")) { char *s = xmalloc(40); + v->ul = num_parents(commit); sprintf(s, "%lu", v->ul); v->s = s; - v->ul = num_parents(commit); } else if (!strcmp(name, "parent")) { int num = num_parents(commit); int i; struct commit_list *parents; - char *s = xmalloc(42 * num); + char *s = xmalloc(41 * num + 1); v->s = s; for (i = 0, parents = commit->parents; parents; - parents = parents->next, i = i + 42) { + parents = parents->next, i = i + 41) { struct commit *parent = parents->item; strcpy(s+i, sha1_to_hex(parent->object.sha1)); if (parents->next) s[i+40] = ' '; } + if (!i) + *s = '\0'; } } } @@@ -349,12 -356,26 +358,26 @@@ static const char *copy_email(const cha return line; } - static void grab_date(const char *buf, struct atom_value *v) + static void grab_date(const char *buf, struct atom_value *v, const char *atomname) { const char *eoemail = strstr(buf, "> "); char *zone; unsigned long timestamp; long tz; + enum date_mode date_mode = DATE_NORMAL; + const char *formatp; + + /* + * We got here because atomname ends in "date" or "date"; + * it's not possible that is not ":" because + * parse_atom() wouldn't have allowed it, so we can assume that no + * ":" means no format is specified, and use the default. + */ + formatp = strchr(atomname, ':'); + if (formatp != NULL) { + formatp++; + date_mode = parse_date_format(formatp); + } if (!eoemail) goto bad; @@@ -364,7 -385,7 +387,7 @@@ tz = strtol(zone, NULL, 10); if ((tz == LONG_MIN || tz == LONG_MAX) && errno == ERANGE) goto bad; - v->s = xstrdup(show_date(timestamp, tz, 0)); + v->s = xstrdup(show_date(timestamp, tz, date_mode)); v->ul = timestamp; return; bad: @@@ -391,7 -412,7 +414,7 @@@ static void grab_person(const char *who if (name[wholen] != 0 && strcmp(name + wholen, "name") && strcmp(name + wholen, "email") && - strcmp(name + wholen, "date")) + prefixcmp(name + wholen, "date")) continue; if (!wholine) wholine = find_wholine(who, wholen, buf, sz); @@@ -403,8 -424,8 +426,8 @@@ v->s = copy_name(wholine); else if (!strcmp(name + wholen, "email")) v->s = copy_email(wholine); - else if (!strcmp(name + wholen, "date")) - grab_date(wholine, v); + else if (!prefixcmp(name + wholen, "date")) + grab_date(wholine, v, name); } /* For a tag or a commit object, if "creator" or "creatordate" is @@@ -424,8 -445,8 +447,8 @@@ if (deref) name++; - if (!strcmp(name, "creatordate")) - grab_date(wholine, v); + if (!prefixcmp(name, "creatordate")) + grab_date(wholine, v, name); else if (!strcmp(name, "creator")) v->s = copy_line(wholine); }