diff options
Diffstat (limited to 'builtin/commit.c')
| -rw-r--r-- | builtin/commit.c | 108 | 
1 files changed, 55 insertions, 53 deletions
| diff --git a/builtin/commit.c b/builtin/commit.c index e13303787a..1cba3b75c8 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -92,8 +92,9 @@ N_("If you wish to skip this commit, use:\n"  "Then \"git cherry-pick --continue\" will resume cherry-picking\n"  "the remaining commits.\n"); +static GIT_PATH_FUNC(git_path_commit_editmsg, "COMMIT_EDITMSG") +  static const char *use_message_buffer; -static const char commit_editmsg[] = "COMMIT_EDITMSG";  static struct lock_file index_lock; /* real index */  static struct lock_file false_lock; /* used only for partial commits */  static enum { @@ -114,6 +115,7 @@ static char *fixup_message, *squash_message;  static int all, also, interactive, patch_interactive, only, amend, signoff;  static int edit_flag = -1; /* unspecified */  static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship; +static int config_commit_verbose = -1; /* unspecified */  static int no_post_rewrite, allow_empty_message;  static char *untracked_files_arg, *force_date, *ignore_submodule_arg;  static char *sign_commit; @@ -140,14 +142,24 @@ static int show_ignored_in_status, have_option_m;  static const char *only_include_assumed;  static struct strbuf message = STRBUF_INIT; -static enum status_format { -	STATUS_FORMAT_NONE = 0, -	STATUS_FORMAT_LONG, -	STATUS_FORMAT_SHORT, -	STATUS_FORMAT_PORCELAIN, +static enum wt_status_format status_format = STATUS_FORMAT_UNSPECIFIED; + +static int opt_parse_porcelain(const struct option *opt, const char *arg, int unset) +{ +	enum wt_status_format *value = (enum wt_status_format *)opt->value; +	if (unset) +		*value = STATUS_FORMAT_NONE; +	else if (!arg) +		*value = STATUS_FORMAT_PORCELAIN; +	else if (!strcmp(arg, "v1") || !strcmp(arg, "1")) +		*value = STATUS_FORMAT_PORCELAIN; +	else if (!strcmp(arg, "v2") || !strcmp(arg, "2")) +		*value = STATUS_FORMAT_PORCELAIN_V2; +	else +		die("unsupported porcelain version '%s'", arg); -	STATUS_FORMAT_UNSPECIFIED -} status_format = STATUS_FORMAT_UNSPECIFIED; +	return 0; +}  static int opt_parse_m(const struct option *opt, const char *arg, int unset)  { @@ -186,6 +198,7 @@ static void status_init_config(struct wt_status *s, config_fn_t fn)  	gitmodules_config();  	git_config(fn, s);  	determine_whence(s); +	init_diff_ui_defaults();  	s->hints = advice_status_hints; /* must come after git_config() */  } @@ -497,24 +510,13 @@ static int run_status(FILE *fp, const char *index_file, const char *prefix, int  	s->fp = fp;  	s->nowarn = nowarn;  	s->is_initial = get_sha1(s->reference, sha1) ? 1 : 0; +	if (!s->is_initial) +		hashcpy(s->sha1_commit, sha1); +	s->status_format = status_format; +	s->ignore_submodule_arg = ignore_submodule_arg;  	wt_status_collect(s); - -	switch (status_format) { -	case STATUS_FORMAT_SHORT: -		wt_shortstatus_print(s); -		break; -	case STATUS_FORMAT_PORCELAIN: -		wt_porcelain_print(s); -		break; -	case STATUS_FORMAT_UNSPECIFIED: -		die("BUG: finalize_deferred_config() should have been called"); -		break; -	case STATUS_FORMAT_NONE: -	case STATUS_FORMAT_LONG: -		wt_status_print(s); -		break; -	} +	wt_status_print(s);  	return s->commitable;  } @@ -712,7 +714,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,  		char *buffer;  		buffer = strstr(use_message_buffer, "\n\n");  		if (buffer) -			strbuf_addstr(&sb, buffer + 2); +			strbuf_addstr(&sb, skip_blank_lines(buffer + 2));  		hook_arg1 = "commit";  		hook_arg2 = use_message;  	} else if (fixup_message) { @@ -770,9 +772,9 @@ static int prepare_to_commit(const char *index_file, const char *prefix,  		hook_arg2 = "";  	} -	s->fp = fopen_for_writing(git_path(commit_editmsg)); +	s->fp = fopen_for_writing(git_path_commit_editmsg());  	if (s->fp == NULL) -		die_errno(_("could not open '%s'"), git_path(commit_editmsg)); +		die_errno(_("could not open '%s'"), git_path_commit_editmsg());  	/* Ignore status.displayCommentPrefix: we do need comments in COMMIT_EDITMSG. */  	old_display_comment_prefix = s->display_comment_prefix; @@ -949,7 +951,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,  	}  	if (run_commit_hook(use_editor, index_file, "prepare-commit-msg", -			    git_path(commit_editmsg), hook_arg1, hook_arg2, NULL)) +			    git_path_commit_editmsg(), hook_arg1, hook_arg2, NULL))  		return 0;  	if (use_editor) { @@ -957,7 +959,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,  		const char *env[2] = { NULL };  		env[0] =  index;  		snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", index_file); -		if (launch_editor(git_path(commit_editmsg), NULL, env)) { +		if (launch_editor(git_path_commit_editmsg(), NULL, env)) {  			fprintf(stderr,  			_("Please supply the message using either -m or -F option.\n"));  			exit(1); @@ -965,7 +967,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,  	}  	if (!no_verify && -	    run_commit_hook(use_editor, index_file, "commit-msg", git_path(commit_editmsg), NULL)) { +	    run_commit_hook(use_editor, index_file, "commit-msg", git_path_commit_editmsg(), NULL)) {  		return 0;  	} @@ -1096,7 +1098,7 @@ static const char *read_commit_message(const char *name)   * is not in effect here.   */  static struct status_deferred_config { -	enum status_format status_format; +	enum wt_status_format status_format;  	int show_branch;  } status_deferred_config = {  	STATUS_FORMAT_UNSPECIFIED, @@ -1106,6 +1108,7 @@ static struct status_deferred_config {  static void finalize_deferred_config(struct wt_status *s)  {  	int use_deferred_config = (status_format != STATUS_FORMAT_PORCELAIN && +				   status_format != STATUS_FORMAT_PORCELAIN_V2 &&  				   !s->null_termination);  	if (s->null_termination) { @@ -1333,9 +1336,9 @@ int cmd_status(int argc, const char **argv, const char *prefix)  			    N_("show status concisely"), STATUS_FORMAT_SHORT),  		OPT_BOOL('b', "branch", &s.show_branch,  			 N_("show branch information")), -		OPT_SET_INT(0, "porcelain", &status_format, -			    N_("machine-readable output"), -			    STATUS_FORMAT_PORCELAIN), +		{ OPTION_CALLBACK, 0, "porcelain", &status_format, +		  N_("version"), N_("machine-readable output"), +		  PARSE_OPT_OPTARG, opt_parse_porcelain },  		OPT_SET_INT(0, "long", &status_format,  			    N_("show status in long format (default)"),  			    STATUS_FORMAT_LONG), @@ -1377,7 +1380,13 @@ int cmd_status(int argc, const char **argv, const char *prefix)  	fd = hold_locked_index(&index_lock, 0);  	s.is_initial = get_sha1(s.reference, sha1) ? 1 : 0; +	if (!s.is_initial) +		hashcpy(s.sha1_commit, sha1); +  	s.ignore_submodule_arg = ignore_submodule_arg; +	s.status_format = status_format; +	s.verbose = verbose; +  	wt_status_collect(&s);  	if (0 <= fd) @@ -1386,23 +1395,7 @@ int cmd_status(int argc, const char **argv, const char *prefix)  	if (s.relative_paths)  		s.prefix = prefix; -	switch (status_format) { -	case STATUS_FORMAT_SHORT: -		wt_shortstatus_print(&s); -		break; -	case STATUS_FORMAT_PORCELAIN: -		wt_porcelain_print(&s); -		break; -	case STATUS_FORMAT_UNSPECIFIED: -		die("BUG: finalize_deferred_config() should have been called"); -		break; -	case STATUS_FORMAT_NONE: -	case STATUS_FORMAT_LONG: -		s.verbose = verbose; -		s.ignore_submodule_arg = ignore_submodule_arg; -		wt_status_print(&s); -		break; -	} +	wt_status_print(&s);  	return 0;  } @@ -1514,6 +1507,11 @@ static int git_commit_config(const char *k, const char *v, void *cb)  		sign_commit = git_config_bool(k, v) ? "" : NULL;  		return 0;  	} +	if (!strcmp(k, "commit.verbose")) { +		int is_bool; +		config_commit_verbose = git_config_bool_or_int(k, v, &is_bool); +		return 0; +	}  	status = git_gpg_config(k, v, NULL);  	if (status) @@ -1609,7 +1607,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)  		OPT_BOOL(0, "interactive", &interactive, N_("interactively add files")),  		OPT_BOOL('p', "patch", &patch_interactive, N_("interactively add changes")),  		OPT_BOOL('o', "only", &only, N_("commit only specified files")), -		OPT_BOOL('n', "no-verify", &no_verify, N_("bypass pre-commit hook")), +		OPT_BOOL('n', "no-verify", &no_verify, N_("bypass pre-commit and commit-msg hooks")),  		OPT_BOOL(0, "dry-run", &dry_run, N_("show what would be committed")),  		OPT_SET_INT(0, "short", &status_format, N_("show status concisely"),  			    STATUS_FORMAT_SHORT), @@ -1660,9 +1658,13 @@ int cmd_commit(int argc, const char **argv, const char *prefix)  		if (parse_commit(current_head))  			die(_("could not parse HEAD commit"));  	} +	verbose = -1; /* unspecified */  	argc = parse_and_validate_options(argc, argv, builtin_commit_options,  					  builtin_commit_usage,  					  prefix, current_head, &s); +	if (verbose == -1) +		verbose = (config_commit_verbose < 0) ? 0 : config_commit_verbose; +  	if (dry_run)  		return dry_run_commit(argc, argv, prefix, current_head, &s);  	index_file = prepare_index(argc, argv, prefix, current_head, 0); @@ -1727,7 +1729,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)  	/* Finally, get the commit message */  	strbuf_reset(&sb); -	if (strbuf_read_file(&sb, git_path(commit_editmsg), 0) < 0) { +	if (strbuf_read_file(&sb, git_path_commit_editmsg(), 0) < 0) {  		int saved_errno = errno;  		rollback_index_files();  		die(_("could not read commit message: %s"), strerror(saved_errno)); | 
