Merge branch 'jk/commit-date-approxidate'

* jk/commit-date-approxidate:
  commit: accept more date formats for "--date"
  commit: print "Date" line when the user has set date
  pretty: make show_ident_date public
  commit: use split_ident_line to compare author/committer
This commit is contained in:
Junio C Hamano
2014-06-03 12:06:46 -07:00
6 changed files with 97 additions and 23 deletions

View File

@ -526,10 +526,29 @@ static int sane_ident_split(struct ident_split *person)
return 1;
}
static int parse_force_date(const char *in, char *out, int len)
{
if (len < 1)
return -1;
*out++ = '@';
len--;
if (parse_date(in, out, len) < 0) {
int errors = 0;
unsigned long t = approxidate_careful(in, &errors);
if (errors)
return -1;
snprintf(out, len, "%lu", t);
}
return 0;
}
static void determine_author_info(struct strbuf *author_ident)
{
char *name, *email, *date;
struct ident_split author;
char date_buf[64];
name = getenv("GIT_AUTHOR_NAME");
email = getenv("GIT_AUTHOR_EMAIL");
@ -574,8 +593,12 @@ static void determine_author_info(struct strbuf *author_ident)
email = xstrndup(lb + 2, rb - (lb + 2));
}
if (force_date)
date = force_date;
if (force_date) {
if (parse_force_date(force_date, date_buf, sizeof(date_buf)))
die(_("invalid date format: %s"), force_date);
date = date_buf;
}
strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT));
if (!split_ident_line(&author, author_ident->buf, author_ident->len) &&
sane_ident_split(&author)) {
@ -585,13 +608,16 @@ static void determine_author_info(struct strbuf *author_ident)
}
}
static char *cut_ident_timestamp_part(char *string)
static void split_ident_or_die(struct ident_split *id, const struct strbuf *buf)
{
char *ket = strrchr(string, '>');
if (!ket || ket[1] != ' ')
die(_("Malformed ident string: '%s'"), string);
*++ket = '\0';
return ket;
if (split_ident_line(id, buf->buf, buf->len) ||
!sane_ident_split(id))
die(_("Malformed ident string: '%s'"), buf->buf);
}
static int author_date_is_interesting(void)
{
return author_message || force_date;
}
static int prepare_to_commit(const char *index_file, const char *prefix,
@ -755,7 +781,8 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
if (use_editor && include_status) {
int ident_shown = 0;
int saved_color_setting;
char *ai_tmp, *ci_tmp;
struct ident_split ci, ai;
if (whence != FROM_COMMIT) {
if (cleanup_mode == CLEANUP_SCISSORS)
wt_status_add_cut_line(s->fp);
@ -795,21 +822,31 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
status_printf_ln(s, GIT_COLOR_NORMAL,
"%s", only_include_assumed);
ai_tmp = cut_ident_timestamp_part(author_ident->buf);
ci_tmp = cut_ident_timestamp_part(committer_ident.buf);
if (strcmp(author_ident->buf, committer_ident.buf))
split_ident_or_die(&ai, author_ident);
split_ident_or_die(&ci, &committer_ident);
if (ident_cmp(&ai, &ci))
status_printf_ln(s, GIT_COLOR_NORMAL,
_("%s"
"Author: %s"),
"Author: %.*s <%.*s>"),
ident_shown++ ? "" : "\n",
author_ident->buf);
(int)(ai.name_end - ai.name_begin), ai.name_begin,
(int)(ai.mail_end - ai.mail_begin), ai.mail_begin);
if (author_date_is_interesting())
status_printf_ln(s, GIT_COLOR_NORMAL,
_("%s"
"Date: %s"),
ident_shown++ ? "" : "\n",
show_ident_date(&ai, DATE_NORMAL));
if (!committer_ident_sufficiently_given())
status_printf_ln(s, GIT_COLOR_NORMAL,
_("%s"
"Committer: %s"),
"Committer: %.*s <%.*s>"),
ident_shown++ ? "" : "\n",
committer_ident.buf);
(int)(ci.name_end - ci.name_begin), ci.name_begin,
(int)(ci.mail_end - ci.mail_begin), ci.mail_begin);
if (ident_shown)
status_printf_ln(s, GIT_COLOR_NORMAL, "");
@ -818,9 +855,6 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
s->use_color = 0;
commitable = run_status(s->fp, index_file, prefix, 1, s);
s->use_color = saved_color_setting;
*ai_tmp = ' ';
*ci_tmp = ' ';
} else {
unsigned char sha1[20];
const char *parent = "HEAD";
@ -1356,6 +1390,13 @@ static void print_summary(const char *prefix, const unsigned char *sha1,
strbuf_addstr(&format, "\n Author: ");
strbuf_addbuf_percentquote(&format, &author_ident);
}
if (author_date_is_interesting()) {
struct strbuf date = STRBUF_INIT;
format_commit_message(commit, "%ad", &date, &pctx);
strbuf_addstr(&format, "\n Date: ");
strbuf_addbuf_percentquote(&format, &date);
strbuf_release(&date);
}
if (!committer_ident_sufficiently_given()) {
strbuf_addstr(&format, "\n Committer: ");
strbuf_addbuf_percentquote(&format, &committer_ident);