@ -47,6 +47,19 @@ static char *logfile, *force_author, *template_file;
static char *edit_message, *use_message;
static char *edit_message, *use_message;
static int all, edit_flag, also, interactive, only, amend, signoff;
static int all, edit_flag, also, interactive, only, amend, signoff;
static int quiet, verbose, untracked_files, no_verify, allow_empty;
static int quiet, verbose, untracked_files, no_verify, allow_empty;
/*
* The default commit message cleanup mode will remove the lines
* beginning with # (shell comments) and leading and trailing
* whitespaces (empty lines or containing only whitespaces)
* if editor is used, and only the whitespaces if the message
* is specified explicitly.
*/
static enum {
CLEANUP_SPACE,
CLEANUP_NONE,
CLEANUP_ALL,
} cleanup_mode;
static char *cleanup_arg;
static int use_editor = 1, initial_commit, in_merge;
static int use_editor = 1, initial_commit, in_merge;
const char *only_include_assumed;
const char *only_include_assumed;
@ -88,6 +101,7 @@ static struct option builtin_commit_options[] = {
OPT_BOOLEAN(0, "amend", &amend, "amend previous commit"),
OPT_BOOLEAN(0, "amend", &amend, "amend previous commit"),
OPT_BOOLEAN(0, "untracked-files", &untracked_files, "show all untracked files"),
OPT_BOOLEAN(0, "untracked-files", &untracked_files, "show all untracked files"),
OPT_BOOLEAN(0, "allow-empty", &allow_empty, "ok to record an empty change"),
OPT_BOOLEAN(0, "allow-empty", &allow_empty, "ok to record an empty change"),
OPT_STRING(0, "cleanup", &cleanup_arg, "default", "how to strip spaces and #comments from message"),
OPT_END()
OPT_END()
};
};
@ -346,7 +360,8 @@ static int prepare_log_message(const char *index_file, const char *prefix)
if (fp == NULL)
if (fp == NULL)
die("could not open %s", git_path(commit_editmsg));
die("could not open %s", git_path(commit_editmsg));
stripspace(&sb, 0);
if (cleanup_mode != CLEANUP_NONE)
stripspace(&sb, 0);
if (signoff) {
if (signoff) {
struct strbuf sob;
struct strbuf sob;
@ -411,7 +426,12 @@ static int prepare_log_message(const char *index_file, const char *prefix)
fprintf(fp,
fprintf(fp,
"\n"
"\n"
"# Please enter the commit message for your changes.\n"
"# Please enter the commit message for your changes.\n"
"# (Comment lines starting with '#' will not be included)\n");
"# (Comment lines starting with '#' will ");
if (cleanup_mode == CLEANUP_ALL)
fprintf(fp, "not be included)\n");
else /* CLEANUP_SPACE, that is. */
fprintf(fp, "be kept.\n"
"# You can remove them yourself if you want to)\n");
if (only_include_assumed)
if (only_include_assumed)
fprintf(fp, "# %s\n", only_include_assumed);
fprintf(fp, "# %s\n", only_include_assumed);
@ -435,10 +455,13 @@ static int message_is_empty(struct strbuf *sb, int start)
const char *nl;
const char *nl;
int eol, i;
int eol, i;
if (cleanup_mode == CLEANUP_NONE && sb->len)
return 0;
/* See if the template is just a prefix of the message. */
/* See if the template is just a prefix of the message. */
strbuf_init(&tmpl, 0);
strbuf_init(&tmpl, 0);
if (template_file && strbuf_read_file(&tmpl, template_file, 0) > 0) {
if (template_file && strbuf_read_file(&tmpl, template_file, 0) > 0) {
stripspace(&tmpl, 1);
stripspace(&tmpl, cleanup_mode == CLEANUP_ALL);
if (start + tmpl.len <= sb->len &&
if (start + tmpl.len <= sb->len &&
memcmp(tmpl.buf, sb->buf + start, tmpl.len) == 0)
memcmp(tmpl.buf, sb->buf + start, tmpl.len) == 0)
start += tmpl.len;
start += tmpl.len;
@ -591,6 +614,16 @@ static int parse_and_validate_options(int argc, const char *argv[],
only_include_assumed = "Explicit paths specified without -i nor -o; assuming --only paths...";
only_include_assumed = "Explicit paths specified without -i nor -o; assuming --only paths...";
also = 0;
also = 0;
}
}
if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
cleanup_mode = use_editor ? CLEANUP_ALL : CLEANUP_SPACE;
else if (!strcmp(cleanup_arg, "verbatim"))
cleanup_mode = CLEANUP_NONE;
else if (!strcmp(cleanup_arg, "whitespace"))
cleanup_mode = CLEANUP_SPACE;
else if (!strcmp(cleanup_arg, "strip"))
cleanup_mode = CLEANUP_ALL;
else
die("Invalid cleanup mode %s", cleanup_arg);
if (all && argc > 0)
if (all && argc > 0)
die("Paths with -a does not make sense.");
die("Paths with -a does not make sense.");
@ -817,7 +850,8 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
if (p != NULL)
if (p != NULL)
strbuf_setlen(&sb, p - sb.buf + 1);
strbuf_setlen(&sb, p - sb.buf + 1);
stripspace(&sb, 1);
if (cleanup_mode != CLEANUP_NONE)
stripspace(&sb, cleanup_mode == CLEANUP_ALL);
if (sb.len < header_len || message_is_empty(&sb, header_len)) {
if (sb.len < header_len || message_is_empty(&sb, header_len)) {
rollback_index_files();
rollback_index_files();
die("no commit message? aborting commit.");
die("no commit message? aborting commit.");