commit: support alternate status formats

The status command recently grew "short" and "porcelain"
options for alternate output formats. Since status is no
longer "commit --dry-run", these formats are inaccessible to
people who do want to see a dry-run in a parseable form.

This patch makes those formats available to "git commit",
implying the "dry-run" option when they are used.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Jeff King 2009-09-05 04:59:56 -04:00 committed by Junio C Hamano
parent 6f15787181
commit 7c9f7038e9
2 changed files with 46 additions and 7 deletions

View File

@ -75,6 +75,20 @@ OPTIONS
and paths that are untracked, similar to the one that is given and paths that are untracked, similar to the one that is given
in the commit log editor. in the commit log editor.


--short::
When doing a dry-run, give the output in the short-format. See
linkgit:git-status[1] for details. Implies `--dry-run`.

--porcelain::
When doing a dry-run, give the output in a porcelain-ready
format. See linkgit:git-status[1] for details. Implies
`--dry-run`.

-z::
When showing `short` or `porcelain` status output, terminate
entries in the status output with NUL, instead of LF. If no
format is given, implies the `--porcelain` output format.

-F <file>:: -F <file>::
--file=<file>:: --file=<file>::
Take the commit message from the given file. Use '-' to Take the commit message from the given file. Use '-' to

View File

@ -72,6 +72,15 @@ static int use_editor = 1, initial_commit, in_merge;
static const char *only_include_assumed; static const char *only_include_assumed;
static struct strbuf message; static struct strbuf message;


static int null_termination;
static enum {
STATUS_FORMAT_LONG,
STATUS_FORMAT_SHORT,
STATUS_FORMAT_PORCELAIN,
} status_format = STATUS_FORMAT_LONG;

static void short_print(struct wt_status *s, int null_termination);

static int opt_parse_m(const struct option *opt, const char *arg, int unset) static int opt_parse_m(const struct option *opt, const char *arg, int unset)
{ {
struct strbuf *buf = opt->value; struct strbuf *buf = opt->value;
@ -105,6 +114,12 @@ static struct option builtin_commit_options[] = {
OPT_BOOLEAN('o', "only", &only, "commit only specified files"), OPT_BOOLEAN('o', "only", &only, "commit only specified files"),
OPT_BOOLEAN('n', "no-verify", &no_verify, "bypass pre-commit hook"), OPT_BOOLEAN('n', "no-verify", &no_verify, "bypass pre-commit hook"),
OPT_BOOLEAN(0, "dry-run", &dry_run, "show what would be committed"), OPT_BOOLEAN(0, "dry-run", &dry_run, "show what would be committed"),
OPT_SET_INT(0, "short", &status_format, "show status concisely",
STATUS_FORMAT_SHORT),
OPT_SET_INT(0, "porcelain", &status_format,
"show porcelain output format", STATUS_FORMAT_PORCELAIN),
OPT_BOOLEAN('z', "null", &null_termination,
"terminate entries with NUL"),
OPT_BOOLEAN(0, "amend", &amend, "amend previous commit"), OPT_BOOLEAN(0, "amend", &amend, "amend previous commit"),
{ OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, "mode", "show untracked files, optional modes: all, normal, no. (Default: all)", PARSE_OPT_OPTARG, NULL, (intptr_t)"all" }, { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, "mode", "show untracked files, optional modes: all, normal, no. (Default: all)", PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
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"),
@ -363,7 +378,18 @@ static int run_status(FILE *fp, const char *index_file, const char *prefix, int
s->is_initial = get_sha1(s->reference, sha1) ? 1 : 0; s->is_initial = get_sha1(s->reference, sha1) ? 1 : 0;


wt_status_collect(s); wt_status_collect(s);
wt_status_print(s);
switch (status_format) {
case STATUS_FORMAT_SHORT:
short_print(s, null_termination);
break;
case STATUS_FORMAT_PORCELAIN:
short_print(s, null_termination);
break;
case STATUS_FORMAT_LONG:
wt_status_print(s);
break;
}


return s->commitable; return s->commitable;
} }
@ -821,6 +847,11 @@ static int parse_and_validate_options(int argc, const char *argv[],
else if (interactive && argc > 0) else if (interactive && argc > 0)
die("Paths with --interactive does not make sense."); die("Paths with --interactive does not make sense.");


if (null_termination && status_format == STATUS_FORMAT_LONG)
status_format = STATUS_FORMAT_PORCELAIN;
if (status_format != STATUS_FORMAT_LONG)
dry_run = 1;

return argc; return argc;
} }


@ -991,12 +1022,6 @@ static void short_print(struct wt_status *s, int null_termination)
int cmd_status(int argc, const char **argv, const char *prefix) int cmd_status(int argc, const char **argv, const char *prefix)
{ {
struct wt_status s; struct wt_status s;
static int null_termination;
static enum {
STATUS_FORMAT_LONG,
STATUS_FORMAT_SHORT,
STATUS_FORMAT_PORCELAIN,
} status_format = STATUS_FORMAT_LONG;
unsigned char sha1[20]; unsigned char sha1[20];
static struct option builtin_status_options[] = { static struct option builtin_status_options[] = {
OPT__VERBOSE(&verbose), OPT__VERBOSE(&verbose),