date: use strbufs in date-formatting functions
Many of the date functions write into fixed-size buffers. This is a minor pain, as we have to take special precautions, and frequently end up copying the result into a strbuf or heap-allocated buffer anyway (for which we sometimes use strcpy!). Let's instead teach parse_date, datestamp, etc to write to a strbuf. The obvious downside is that we might need to perform a heap allocation where we otherwise would not need to. However, it turns out that the only two new allocations required are: 1. In test-date.c, where we don't care about efficiency. 2. In determine_author_info, which is not performance critical (and where the use of a strbuf will help later refactoring). Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
ea5517f04b
commit
c33ddc2e33
@ -520,19 +520,16 @@ static int sane_ident_split(struct ident_split *person)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int parse_force_date(const char *in, char *out, int len)
|
||||
static int parse_force_date(const char *in, struct strbuf *out)
|
||||
{
|
||||
if (len < 1)
|
||||
return -1;
|
||||
*out++ = '@';
|
||||
len--;
|
||||
strbuf_addch(out, '@');
|
||||
|
||||
if (parse_date(in, out, len) < 0) {
|
||||
if (parse_date(in, out) < 0) {
|
||||
int errors = 0;
|
||||
unsigned long t = approxidate_careful(in, &errors);
|
||||
if (errors)
|
||||
return -1;
|
||||
snprintf(out, len, "%lu", t);
|
||||
strbuf_addf(out, "%lu", t);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -542,7 +539,7 @@ static void determine_author_info(struct strbuf *author_ident)
|
||||
{
|
||||
char *name, *email, *date;
|
||||
struct ident_split author;
|
||||
char date_buf[64];
|
||||
struct strbuf date_buf = STRBUF_INIT;
|
||||
|
||||
name = getenv("GIT_AUTHOR_NAME");
|
||||
email = getenv("GIT_AUTHOR_EMAIL");
|
||||
@ -588,9 +585,10 @@ static void determine_author_info(struct strbuf *author_ident)
|
||||
}
|
||||
|
||||
if (force_date) {
|
||||
if (parse_force_date(force_date, date_buf, sizeof(date_buf)))
|
||||
strbuf_reset(&date_buf);
|
||||
if (parse_force_date(force_date, &date_buf))
|
||||
die(_("invalid date format: %s"), force_date);
|
||||
date = date_buf;
|
||||
date = date_buf.buf;
|
||||
}
|
||||
|
||||
strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT));
|
||||
@ -600,6 +598,8 @@ static void determine_author_info(struct strbuf *author_ident)
|
||||
export_one("GIT_AUTHOR_EMAIL", author.mail_begin, author.mail_end, 0);
|
||||
export_one("GIT_AUTHOR_DATE", author.date_begin, author.tz_end, '@');
|
||||
}
|
||||
|
||||
strbuf_release(&date_buf);
|
||||
}
|
||||
|
||||
static void split_ident_or_die(struct ident_split *id, const struct strbuf *buf)
|
||||
|
Reference in New Issue
Block a user