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 "<name>:<something>" parse_date_format(): convert a format name to an enum date_mode
This commit is contained in:
@ -106,7 +106,16 @@ static int parse_atom(const char *atom, const char *ep)
|
||||
/* 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;
|
||||
}
|
||||
|
||||
@ -349,12 +358,26 @@ static const char *copy_email(const char *buf)
|
||||
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<something>";
|
||||
* it's not possible that <something> is not ":<format>" 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 +387,7 @@ static void grab_date(const char *buf, struct atom_value *v)
|
||||
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 +414,7 @@ static void grab_person(const char *who, struct atom_value *val, int deref, stru
|
||||
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 +426,8 @@ static void grab_person(const char *who, struct atom_value *val, int deref, stru
|
||||
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 +447,8 @@ static void grab_person(const char *who, struct atom_value *val, int deref, stru
|
||||
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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user