Browse Source

commit: reduce use of redundant global variables

The file-scope global variable head_sha1[] was used to hold the object
name of the current HEAD commit (unless we are about to make an initial
commit). Also there is an independent "static int initial_commit".

Fix all the functions on the call-chain that use these two variables to
take a new "(const) struct commit *current_head" argument instead, and
replace their uses, e.g. "if (initial_commit)" becomes "if (!current_head)"
and a reference to "head_sha1" becomes "current_head->object.sha1".

Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Junio C Hamano 14 years ago
parent
commit
06bb643b72
  1. 87
      builtin/commit.c

87
builtin/commit.c

@ -62,8 +62,6 @@ N_("The previous cherry-pick is now empty, possibly due to conflict resolution.\
"\n" "\n"
"Otherwise, please use 'git reset'\n"); "Otherwise, please use 'git reset'\n");


static unsigned char head_sha1[20];

static const char *use_message_buffer; static const char *use_message_buffer;
static const char commit_editmsg[] = "COMMIT_EDITMSG"; static const char commit_editmsg[] = "COMMIT_EDITMSG";
static struct lock_file index_lock; /* real index */ static struct lock_file index_lock; /* real index */
@ -102,7 +100,7 @@ static enum {
static char *cleanup_arg; static char *cleanup_arg;


static enum commit_whence whence; static enum commit_whence whence;
static int use_editor = 1, initial_commit, include_status = 1; static int use_editor = 1, include_status = 1;
static int show_ignored_in_status; static int show_ignored_in_status;
static const char *only_include_assumed; static const char *only_include_assumed;
static struct strbuf message; static struct strbuf message;
@ -294,13 +292,13 @@ static void add_remove_files(struct string_list *list)
} }
} }


static void create_base_index(void) static void create_base_index(const struct commit *current_head)
{ {
struct tree *tree; struct tree *tree;
struct unpack_trees_options opts; struct unpack_trees_options opts;
struct tree_desc t; struct tree_desc t;


if (initial_commit) { if (!current_head) {
discard_cache(); discard_cache();
return; return;
} }
@ -313,7 +311,7 @@ static void create_base_index(void)
opts.dst_index = &the_index; opts.dst_index = &the_index;


opts.fn = oneway_merge; opts.fn = oneway_merge;
tree = parse_tree_indirect(head_sha1); tree = parse_tree_indirect(current_head->object.sha1);
if (!tree) if (!tree)
die(_("failed to unpack HEAD tree object")); die(_("failed to unpack HEAD tree object"));
parse_tree(tree); parse_tree(tree);
@ -332,7 +330,8 @@ static void refresh_cache_or_die(int refresh_flags)
die_resolve_conflict("commit"); 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 struct commit *current_head, int is_status)
{ {
int fd; int fd;
struct string_list partial; struct string_list partial;
@ -448,7 +447,7 @@ static char *prepare_index(int argc, const char **argv, const char *prefix, int


memset(&partial, 0, sizeof(partial)); memset(&partial, 0, sizeof(partial));
partial.strdup_strings = 1; partial.strdup_strings = 1;
if (list_paths(&partial, initial_commit ? NULL : "HEAD", prefix, pathspec)) if (list_paths(&partial, !current_head ? NULL : "HEAD", prefix, pathspec))
exit(1); exit(1);


discard_cache(); discard_cache();
@ -467,7 +466,7 @@ static char *prepare_index(int argc, const char **argv, const char *prefix, int
(uintmax_t) getpid()), (uintmax_t) getpid()),
LOCK_DIE_ON_ERROR); LOCK_DIE_ON_ERROR);


create_base_index(); create_base_index(current_head);
add_remove_files(&partial); add_remove_files(&partial);
refresh_cache(REFRESH_QUIET); refresh_cache(REFRESH_QUIET);


@ -516,12 +515,9 @@ static int run_status(FILE *fp, const char *index_file, const char *prefix, int
return s->commitable; return s->commitable;
} }


static int is_a_merge(const unsigned char *sha1) static int is_a_merge(const struct commit *current_head)
{ {
struct commit *commit = lookup_commit(sha1); return !!(current_head->parents && current_head->parents->next);
if (!commit || parse_commit(commit))
die(_("could not parse HEAD commit"));
return !!(commit->parents && commit->parents->next);
} }


static const char sign_off_header[] = "Signed-off-by: "; static const char sign_off_header[] = "Signed-off-by: ";
@ -625,6 +621,7 @@ static char *cut_ident_timestamp_part(char *string)
} }


static int prepare_to_commit(const char *index_file, const char *prefix, static int prepare_to_commit(const char *index_file, const char *prefix,
struct commit *current_head,
struct wt_status *s, struct wt_status *s,
struct strbuf *author_ident) struct strbuf *author_ident)
{ {
@ -846,7 +843,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
* empty due to conflict resolution, which the user should okay. * empty due to conflict resolution, which the user should okay.
*/ */
if (!commitable && whence != FROM_MERGE && !allow_empty && if (!commitable && whence != FROM_MERGE && !allow_empty &&
!(amend && is_a_merge(head_sha1))) { !(amend && is_a_merge(current_head))) {
run_status(stdout, index_file, prefix, 0, s); run_status(stdout, index_file, prefix, 0, s);
if (amend) if (amend)
fputs(_(empty_amend_advice), stderr); fputs(_(empty_amend_advice), stderr);
@ -1004,6 +1001,7 @@ static const char *read_commit_message(const char *name)
static int parse_and_validate_options(int argc, const char *argv[], static int parse_and_validate_options(int argc, const char *argv[],
const char * const usage[], const char * const usage[],
const char *prefix, const char *prefix,
struct commit *current_head,
struct wt_status *s) struct wt_status *s)
{ {
int f = 0; int f = 0;
@ -1024,11 +1022,8 @@ static int parse_and_validate_options(int argc, const char *argv[],
if (!use_editor) if (!use_editor)
setenv("GIT_EDITOR", ":", 1); setenv("GIT_EDITOR", ":", 1);


if (get_sha1("HEAD", head_sha1))
initial_commit = 1;

/* Sanity check options */ /* Sanity check options */
if (amend && initial_commit) if (amend && !current_head)
die(_("You have nothing to amend.")); die(_("You have nothing to amend."));
if (amend && whence != FROM_COMMIT) if (amend && whence != FROM_COMMIT)
die(_("You are in the middle of a %s -- cannot amend."), whence_s()); die(_("You are in the middle of a %s -- cannot amend."), whence_s());
@ -1100,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, static int dry_run_commit(int argc, const char **argv, const char *prefix,
struct wt_status *s) const struct commit *current_head, struct wt_status *s)
{ {
int commitable; int commitable;
const char *index_file; const char *index_file;


index_file = prepare_index(argc, argv, prefix, 1); index_file = prepare_index(argc, argv, prefix, current_head, 1);
commitable = run_status(stdout, index_file, prefix, 0, s); commitable = run_status(stdout, index_file, prefix, 0, s);
rollback_index_files(); rollback_index_files();


@ -1258,7 +1253,8 @@ int cmd_status(int argc, const char **argv, const char *prefix)
return 0; return 0;
} }


static void print_summary(const char *prefix, const unsigned char *sha1) static void print_summary(const char *prefix, const unsigned char *sha1,
int initial_commit)
{ {
struct rev_info rev; struct rev_info rev;
struct commit *commit; struct commit *commit;
@ -1380,12 +1376,13 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
struct strbuf author_ident = STRBUF_INIT; struct strbuf author_ident = STRBUF_INIT;
const char *index_file, *reflog_msg; const char *index_file, *reflog_msg;
char *nl, *p; char *nl, *p;
unsigned char commit_sha1[20]; unsigned char sha1[20];
struct ref_lock *ref_lock; struct ref_lock *ref_lock;
struct commit_list *parents = NULL, **pptr = &parents; struct commit_list *parents = NULL, **pptr = &parents;
struct stat statbuf; struct stat statbuf;
int allow_fast_forward = 1; int allow_fast_forward = 1;
struct wt_status s; struct wt_status s;
struct commit *current_head = NULL;


if (argc == 2 && !strcmp(argv[1], "-h")) if (argc == 2 && !strcmp(argv[1], "-h"))
usage_with_options(builtin_commit_usage, builtin_commit_options); usage_with_options(builtin_commit_usage, builtin_commit_options);
@ -1396,38 +1393,41 @@ int cmd_commit(int argc, const char **argv, const char *prefix)


if (s.use_color == -1) if (s.use_color == -1)
s.use_color = git_use_color_default; s.use_color = git_use_color_default;
if (get_sha1("HEAD", sha1))
current_head = NULL;
else {
current_head = lookup_commit(sha1);
if (!current_head || parse_commit(current_head))
die(_("could not parse HEAD commit"));
}
argc = parse_and_validate_options(argc, argv, builtin_commit_usage, argc = parse_and_validate_options(argc, argv, builtin_commit_usage,
prefix, &s); prefix, current_head, &s);
if (dry_run) { if (dry_run) {
if (diff_use_color_default == -1) if (diff_use_color_default == -1)
diff_use_color_default = git_use_color_default; diff_use_color_default = git_use_color_default;
return dry_run_commit(argc, argv, prefix, &s); return dry_run_commit(argc, argv, prefix, current_head, &s);
} }
index_file = prepare_index(argc, argv, prefix, 0); index_file = prepare_index(argc, argv, prefix, current_head, 0);


/* Set up everything for writing the commit object. This includes /* Set up everything for writing the commit object. This includes
running hooks, writing the trees, and interacting with the user. */ 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,
current_head, &s, &author_ident)) {
rollback_index_files(); rollback_index_files();
return 1; return 1;
} }


/* Determine parents */ /* Determine parents */
reflog_msg = getenv("GIT_REFLOG_ACTION"); reflog_msg = getenv("GIT_REFLOG_ACTION");
if (initial_commit) { if (!current_head) {
if (!reflog_msg) if (!reflog_msg)
reflog_msg = "commit (initial)"; reflog_msg = "commit (initial)";
} else if (amend) { } else if (amend) {
struct commit_list *c; struct commit_list *c;
struct commit *commit;


if (!reflog_msg) if (!reflog_msg)
reflog_msg = "commit (amend)"; reflog_msg = "commit (amend)";
commit = lookup_commit(head_sha1); for (c = current_head->parents; c; c = c->next)
if (!commit || parse_commit(commit))
die(_("could not parse HEAD commit"));

for (c = commit->parents; c; c = c->next)
pptr = &commit_list_insert(c->item, pptr)->next; pptr = &commit_list_insert(c->item, pptr)->next;
} else if (whence == FROM_MERGE) { } else if (whence == FROM_MERGE) {
struct strbuf m = STRBUF_INIT; struct strbuf m = STRBUF_INIT;
@ -1435,7 +1435,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)


if (!reflog_msg) if (!reflog_msg)
reflog_msg = "commit (merge)"; reflog_msg = "commit (merge)";
pptr = &commit_list_insert(lookup_commit(head_sha1), pptr)->next; pptr = &commit_list_insert(current_head, pptr)->next;
fp = fopen(git_path("MERGE_HEAD"), "r"); fp = fopen(git_path("MERGE_HEAD"), "r");
if (fp == NULL) if (fp == NULL)
die_errno(_("could not open '%s' for reading"), die_errno(_("could not open '%s' for reading"),
@ -1461,7 +1461,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
reflog_msg = (whence == FROM_CHERRY_PICK) reflog_msg = (whence == FROM_CHERRY_PICK)
? "commit (cherry-pick)" ? "commit (cherry-pick)"
: "commit"; : "commit";
pptr = &commit_list_insert(lookup_commit(head_sha1), pptr)->next; pptr = &commit_list_insert(current_head, pptr)->next;
} }


/* Finally, get the commit message */ /* Finally, get the commit message */
@ -1487,7 +1487,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
exit(1); exit(1);
} }


if (commit_tree(sb.buf, active_cache_tree->sha1, parents, commit_sha1, if (commit_tree(sb.buf, active_cache_tree->sha1, parents, sha1,
author_ident.buf)) { author_ident.buf)) {
rollback_index_files(); rollback_index_files();
die(_("failed to write commit object")); die(_("failed to write commit object"));
@ -1495,7 +1495,9 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
strbuf_release(&author_ident); strbuf_release(&author_ident);


ref_lock = lock_any_ref_for_update("HEAD", ref_lock = lock_any_ref_for_update("HEAD",
initial_commit ? NULL : head_sha1, !current_head
? NULL
: current_head->object.sha1,
0); 0);


nl = strchr(sb.buf, '\n'); nl = strchr(sb.buf, '\n');
@ -1510,7 +1512,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
rollback_index_files(); rollback_index_files();
die(_("cannot lock HEAD ref")); die(_("cannot lock HEAD ref"));
} }
if (write_ref_sha1(ref_lock, commit_sha1, sb.buf) < 0) { if (write_ref_sha1(ref_lock, sha1, sb.buf) < 0) {
rollback_index_files(); rollback_index_files();
die(_("cannot update HEAD ref")); die(_("cannot update HEAD ref"));
} }
@ -1532,13 +1534,14 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
struct notes_rewrite_cfg *cfg; struct notes_rewrite_cfg *cfg;
cfg = init_copy_notes_for_rewrite("amend"); cfg = init_copy_notes_for_rewrite("amend");
if (cfg) { if (cfg) {
copy_note_for_rewrite(cfg, head_sha1, commit_sha1); /* we are amending, so current_head is not NULL */
copy_note_for_rewrite(cfg, current_head->object.sha1, sha1);
finish_copy_notes_for_rewrite(cfg); finish_copy_notes_for_rewrite(cfg);
} }
run_rewrite_hook(head_sha1, commit_sha1); run_rewrite_hook(current_head->object.sha1, sha1);
} }
if (!quiet) if (!quiet)
print_summary(prefix, commit_sha1); print_summary(prefix, sha1, !current_head);


return 0; return 0;
} }

Loading…
Cancel
Save