Skip to content

Commit a121d53

Browse files
committed
Merge branch 'jk/commit-die-on-bogus-ident' into maint
* jk/commit-die-on-bogus-ident: commit: die before asking to edit the log message ident: die on bogus date format
2 parents 359f34f + 4c28e4a commit a121d53

File tree

3 files changed

+40
-24
lines changed

3 files changed

+40
-24
lines changed

builtin/commit.c

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ static enum {
6969
static const char *logfile, *force_author;
7070
static const char *template_file;
7171
static char *edit_message, *use_message;
72-
static char *author_name, *author_email, *author_date;
7372
static int all, edit_flag, also, interactive, only, amend, signoff;
7473
static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
7574
static int no_post_rewrite, allow_empty_message;
@@ -459,7 +458,7 @@ static int is_a_merge(const unsigned char *sha1)
459458

460459
static const char sign_off_header[] = "Signed-off-by: ";
461460

462-
static void determine_author_info(void)
461+
static void determine_author_info(struct strbuf *author_ident)
463462
{
464463
char *name, *email, *date;
465464

@@ -503,10 +502,8 @@ static void determine_author_info(void)
503502

504503
if (force_date)
505504
date = force_date;
506-
507-
author_name = name;
508-
author_email = email;
509-
author_date = date;
505+
strbuf_addstr(author_ident, fmt_ident(name, email, date,
506+
IDENT_ERROR_ON_NO_NAME));
510507
}
511508

512509
static int ends_rfc2822_footer(struct strbuf *sb)
@@ -550,10 +547,21 @@ static int ends_rfc2822_footer(struct strbuf *sb)
550547
return 1;
551548
}
552549

550+
static char *cut_ident_timestamp_part(char *string)
551+
{
552+
char *ket = strrchr(string, '>');
553+
if (!ket || ket[1] != ' ')
554+
die("Malformed ident string: '%s'", string);
555+
*++ket = '\0';
556+
return ket;
557+
}
558+
553559
static int prepare_to_commit(const char *index_file, const char *prefix,
554-
struct wt_status *s)
560+
struct wt_status *s,
561+
struct strbuf *author_ident)
555562
{
556563
struct stat statbuf;
564+
struct strbuf committer_ident = STRBUF_INIT;
557565
int commitable, saved_color_setting;
558566
struct strbuf sb = STRBUF_INIT;
559567
char *buffer;
@@ -637,14 +645,13 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
637645

638646
strbuf_release(&sb);
639647

640-
determine_author_info();
648+
/* This checks and barfs if author is badly specified */
649+
determine_author_info(author_ident);
641650

642651
/* This checks if committer ident is explicitly given */
643-
git_committer_info(0);
652+
strbuf_addstr(&committer_ident, git_committer_info(0));
644653
if (use_editor && include_status) {
645-
char *author_ident;
646-
const char *committer_ident;
647-
654+
char *ai_tmp, *ci_tmp;
648655
if (in_merge)
649656
fprintf(fp,
650657
"#\n"
@@ -672,23 +679,21 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
672679
if (only_include_assumed)
673680
fprintf(fp, "# %s\n", only_include_assumed);
674681

675-
author_ident = xstrdup(fmt_name(author_name, author_email));
676-
committer_ident = fmt_name(getenv("GIT_COMMITTER_NAME"),
677-
getenv("GIT_COMMITTER_EMAIL"));
678-
if (strcmp(author_ident, committer_ident))
682+
ai_tmp = cut_ident_timestamp_part(author_ident->buf);
683+
ci_tmp = cut_ident_timestamp_part(committer_ident.buf);
684+
if (strcmp(author_ident->buf, committer_ident.buf))
679685
fprintf(fp,
680686
"%s"
681687
"# Author: %s\n",
682688
ident_shown++ ? "" : "#\n",
683-
author_ident);
684-
free(author_ident);
689+
author_ident->buf);
685690

686691
if (!user_ident_sufficiently_given())
687692
fprintf(fp,
688693
"%s"
689694
"# Committer: %s\n",
690695
ident_shown++ ? "" : "#\n",
691-
committer_ident);
696+
committer_ident.buf);
692697

693698
if (ident_shown)
694699
fprintf(fp, "#\n");
@@ -697,6 +702,9 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
697702
s->use_color = 0;
698703
commitable = run_status(fp, index_file, prefix, 1, s);
699704
s->use_color = saved_color_setting;
705+
706+
*ai_tmp = ' ';
707+
*ci_tmp = ' ';
700708
} else {
701709
unsigned char sha1[20];
702710
const char *parent = "HEAD";
@@ -712,6 +720,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
712720
else
713721
commitable = index_differs_from(parent, 0);
714722
}
723+
strbuf_release(&committer_ident);
715724

716725
fclose(fp);
717726

@@ -1246,6 +1255,7 @@ static int run_rewrite_hook(const unsigned char *oldsha1,
12461255
int cmd_commit(int argc, const char **argv, const char *prefix)
12471256
{
12481257
struct strbuf sb = STRBUF_INIT;
1258+
struct strbuf author_ident = STRBUF_INIT;
12491259
const char *index_file, *reflog_msg;
12501260
char *nl, *p;
12511261
unsigned char commit_sha1[20];
@@ -1273,7 +1283,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
12731283

12741284
/* Set up everything for writing the commit object. This includes
12751285
running hooks, writing the trees, and interacting with the user. */
1276-
if (!prepare_to_commit(index_file, prefix, &s)) {
1286+
if (!prepare_to_commit(index_file, prefix, &s, &author_ident)) {
12771287
rollback_index_files();
12781288
return 1;
12791289
}
@@ -1352,11 +1362,11 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
13521362
}
13531363

13541364
if (commit_tree(sb.buf, active_cache_tree->sha1, parents, commit_sha1,
1355-
fmt_ident(author_name, author_email, author_date,
1356-
IDENT_ERROR_ON_NO_NAME))) {
1365+
author_ident.buf)) {
13571366
rollback_index_files();
13581367
die("failed to write commit object");
13591368
}
1369+
strbuf_release(&author_ident);
13601370

13611371
ref_lock = lock_any_ref_for_update("HEAD",
13621372
initial_commit ? NULL : head_sha1,

ident.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,10 @@ const char *fmt_ident(const char *name, const char *email,
217217
}
218218

219219
strcpy(date, git_default_date);
220-
if (!name_addr_only && date_str)
221-
parse_date(date_str, date, sizeof(date));
220+
if (!name_addr_only && date_str && date_str[0]) {
221+
if (parse_date(date_str, date, sizeof(date)) < 0)
222+
die("invalid date format: %s", date_str);
223+
}
222224

223225
i = copy(buffer, sizeof(buffer), 0, name);
224226
i = add_raw(buffer, sizeof(buffer), i, " <");

t/t7501-commit.sh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,10 @@ test_expect_success 'amend commit to fix date' '
230230
231231
'
232232

233+
test_expect_success 'commit complains about bogus date' '
234+
test_must_fail git commit --amend --date=10.11.2010
235+
'
236+
233237
test_expect_success 'sign off (1)' '
234238
235239
echo 1 >positive &&

0 commit comments

Comments
 (0)