Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- builtin/commit.c | 52 ++++++++++++++++++++++++++-------------------------- 1 files changed, 26 insertions(+), 26 deletions(-) diff --git a/builtin/commit.c b/builtin/commit.c index cb73857..c9c4ea5 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -62,8 +62,6 @@ N_("The previous cherry-pick is now empty, possibly due to conflict resolution.\ "\n" "Otherwise, please use 'git reset'\n"); -static unsigned char head_sha1[20]; - static const char *use_message_buffer; static const char commit_editmsg[] = "COMMIT_EDITMSG"; static struct lock_file index_lock; /* real index */ @@ -296,7 +294,7 @@ static void add_remove_files(struct string_list *list) } } -static void create_base_index(void) +static void create_base_index(const unsigned char *head_sha1) { struct tree *tree; struct unpack_trees_options opts; @@ -334,7 +332,8 @@ static void refresh_cache_or_die(int refresh_flags) die_resolve_conflict("commit"); } -static char *prepare_index(int argc, const char **argv, const char *prefix, int is_status) +static char *prepare_index(int argc, const char **argv, const char *prefix, + const unsigned char *head_sha1, int is_status) { int fd; struct string_list partial; @@ -469,7 +468,7 @@ static char *prepare_index(int argc, const char **argv, const char *prefix, int (uintmax_t) getpid()), LOCK_DIE_ON_ERROR); - create_base_index(); + create_base_index(head_sha1); add_remove_files(&partial); refresh_cache(REFRESH_QUIET); @@ -518,11 +517,8 @@ static int run_status(FILE *fp, const char *index_file, const char *prefix, int return s->commitable; } -static int is_a_merge(const unsigned char *sha1) +static int is_a_merge(struct commit *commit) { - struct commit *commit = lookup_commit(sha1); - if (!commit || parse_commit(commit)) - die(_("could not parse HEAD commit")); return !!(commit->parents && commit->parents->next); } @@ -627,7 +623,7 @@ static char *cut_ident_timestamp_part(char *string) } static int prepare_to_commit(const char *index_file, const char *prefix, - struct wt_status *s, + struct commit *head_commit, struct wt_status *s, struct strbuf *author_ident) { struct stat statbuf; @@ -848,7 +844,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix, * empty due to conflict resolution, which the user should okay. */ if (!commitable && whence != FROM_MERGE && !allow_empty && - !(amend && is_a_merge(head_sha1))) { + !(amend && is_a_merge(head_commit))) { run_status(stdout, index_file, prefix, 0, s); if (amend) fputs(_(empty_amend_advice), stderr); @@ -1026,9 +1022,6 @@ static int parse_and_validate_options(int argc, const char *argv[], if (!use_editor) setenv("GIT_EDITOR", ":", 1); - if (get_sha1("HEAD", head_sha1)) - initial_commit = 1; - /* Sanity check options */ if (amend && initial_commit) die(_("You have nothing to amend.")); @@ -1102,12 +1095,12 @@ static int parse_and_validate_options(int argc, const char *argv[], } static int dry_run_commit(int argc, const char **argv, const char *prefix, - struct wt_status *s) + const unsigned char *head_sha1, struct wt_status *s) { int commitable; const char *index_file; - index_file = prepare_index(argc, argv, prefix, 1); + index_file = prepare_index(argc, argv, prefix, head_sha1, 1); commitable = run_status(stdout, index_file, prefix, 0, s); rollback_index_files(); @@ -1383,11 +1376,13 @@ int cmd_commit(int argc, const char **argv, const char *prefix) const char *index_file, *reflog_msg; char *nl, *p; unsigned char commit_sha1[20]; + unsigned char head_sha1[20]; struct ref_lock *ref_lock; struct commit_list *parents = NULL, **pptr = &parents; struct stat statbuf; int allow_fast_forward = 1; struct wt_status s; + struct commit *head_commit; if (argc == 2 && !strcmp(argv[1], "-h")) usage_with_options(builtin_commit_usage, builtin_commit_options); @@ -1396,6 +1391,14 @@ int cmd_commit(int argc, const char **argv, const char *prefix) git_config(git_commit_config, &s); determine_whence(&s); + if (get_sha1("HEAD", head_sha1)) + initial_commit = 1; + else { + head_commit = lookup_commit(head_sha1); + if (!head_commit || parse_commit(head_commit)) + die(_("could not parse HEAD commit")); + } + if (s.use_color == -1) s.use_color = git_use_color_default; argc = parse_and_validate_options(argc, argv, builtin_commit_usage, @@ -1403,13 +1406,14 @@ int cmd_commit(int argc, const char **argv, const char *prefix) if (dry_run) { if (diff_use_color_default == -1) diff_use_color_default = git_use_color_default; - return dry_run_commit(argc, argv, prefix, &s); + return dry_run_commit(argc, argv, prefix, head_sha1, &s); } - index_file = prepare_index(argc, argv, prefix, 0); + index_file = prepare_index(argc, argv, prefix, head_sha1, 0); /* Set up everything for writing the commit object. This includes running hooks, writing the trees, and interacting with the user. */ - if (!prepare_to_commit(index_file, prefix, &s, &author_ident)) { + if (!prepare_to_commit(index_file, prefix, head_commit, + &s, &author_ident)) { rollback_index_files(); return 1; } @@ -1421,15 +1425,11 @@ int cmd_commit(int argc, const char **argv, const char *prefix) reflog_msg = "commit (initial)"; } else if (amend) { struct commit_list *c; - struct commit *commit; if (!reflog_msg) reflog_msg = "commit (amend)"; - commit = lookup_commit(head_sha1); - if (!commit || parse_commit(commit)) - die(_("could not parse HEAD commit")); - for (c = commit->parents; c; c = c->next) + for (c = head_commit->parents; c; c = c->next) pptr = &commit_list_insert(c->item, pptr)->next; } else if (whence == FROM_MERGE) { struct strbuf m = STRBUF_INIT; @@ -1437,7 +1437,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix) if (!reflog_msg) reflog_msg = "commit (merge)"; - pptr = &commit_list_insert(lookup_commit(head_sha1), pptr)->next; + pptr = &commit_list_insert(head_commit, pptr)->next; fp = fopen(git_path("MERGE_HEAD"), "r"); if (fp == NULL) die_errno(_("could not open '%s' for reading"), @@ -1463,7 +1463,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix) reflog_msg = (whence == FROM_CHERRY_PICK) ? "commit (cherry-pick)" : "commit"; - pptr = &commit_list_insert(lookup_commit(head_sha1), pptr)->next; + pptr = &commit_list_insert(head_commit, pptr)->next; } /* Finally, get the commit message */ -- 1.7.4.74.g639db -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html