Skip to content

Commit

Permalink
status: support --porcelain[=<version>]
Browse files Browse the repository at this point in the history
Update --porcelain argument to take optional version parameter
to allow multiple porcelain formats to be supported in the future.

The token "v1" is the default value and indicates the traditional
porcelain format.  (The token "1" is an alias for that.)

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
jeffhostetler authored and gitster committed Aug 5, 2016
1 parent be7e795 commit c4f596b
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 5 deletions.
7 changes: 5 additions & 2 deletions Documentation/git-status.txt
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,14 @@ OPTIONS
--branch::
Show the branch and tracking info even in short-format.

--porcelain::
--porcelain[=<version>]::
Give the output in an easy-to-parse format for scripts.
This is similar to the short output, but will remain stable
across Git versions and regardless of user configuration. See
below for details.
+
The version parameter is used to specify the format version.
This is optional and defaults to the original version 'v1' format.

--long::
Give the output in the long-format. This is the default.
Expand Down Expand Up @@ -96,7 +99,7 @@ configuration variable documented in linkgit:git-config[1].

-z::
Terminate entries with NUL, instead of LF. This implies
the `--porcelain` output format if no other format is given.
the `--porcelain=v1` output format if no other format is given.

--column[=<options>]::
--no-column::
Expand Down
21 changes: 18 additions & 3 deletions builtin/commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,21 @@ static struct strbuf message = STRBUF_INIT;

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
die("unsupported porcelain version '%s'", arg);

return 0;
}

static int opt_parse_m(const struct option *opt, const char *arg, int unset)
{
struct strbuf *buf = opt->value;
Expand Down Expand Up @@ -1316,9 +1331,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),
Expand Down
21 changes: 21 additions & 0 deletions t/t7060-wtstatus.sh
Original file line number Diff line number Diff line change
Expand Up @@ -228,4 +228,25 @@ test_expect_success 'status --branch with detached HEAD' '
test_i18ncmp expected actual
'

## Duplicate the above test and verify --porcelain=v1 arg parsing.
test_expect_success 'status --porcelain=v1 --branch with detached HEAD' '
git reset --hard &&
git checkout master^0 &&
git status --branch --porcelain=v1 >actual &&
cat >expected <<-EOF &&
## HEAD (no branch)
?? .gitconfig
?? actual
?? expect
?? expected
?? mdconflict/
EOF
test_i18ncmp expected actual
'

## Verify parser error on invalid --porcelain argument.
test_expect_success 'status --porcelain=bogus' '
test_must_fail git status --porcelain=bogus
'

test_done

0 comments on commit c4f596b

Please sign in to comment.