git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v5 3/9] status: support --porcelain[=<version>]

From
JHJeff Hostetler <git@jeffhostetler.com>
Date
Aug 5, 2016, 22:00 UTC
Message-ID
<1470434434-64283-4-git-send-email-git@jeffhostetler.com>
In-Reply-To
<1470434434-64283-1-git-send-email-git@jeffhostetler.com>
From: Jeff Hostetler <jeffhost@microsoft.com>

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>
---
 Documentation/git-status.txt |  7 +++++--
 builtin/commit.c             | 21 ++++++++++++++++++---
 t/t7060-wtstatus.sh          | 21 +++++++++++++++++++++
 3 files changed, 44 insertions(+), 5 deletions(-)
diff --git a/Documentation/git-status.txt b/Documentation/git-status.txt
index e1e8f57..6b1454b 100644
--- a/Documentation/git-status.txt
+++ b/Documentation/git-status.txt
@@ -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.
@@ -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::
diff --git a/builtin/commit.c b/builtin/commit.c
index a792deb..185ac35 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -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;
@@ -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),
diff --git a/t/t7060-wtstatus.sh b/t/t7060-wtstatus.sh
index 44bf1d8..00e0ceb 100755
--- a/t/t7060-wtstatus.sh
+++ b/t/t7060-wtstatus.sh
@@ -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
-- 
2.8.0.rc4.17.gac42084.dirty
Previous: Jeff HostetlerNext: Jeff Hostetler
Message 11 of 19 in “status: V2 porcelain status”
  1. 0/9 status: V2 porcelain statusJeff Hostetler, Aug 5, 2016
  2. 2/9 status: cleanup API to wt_status_printJeff Hostetler, Aug 5, 2016
  3. 8/9 test-lib-functions.sh: Add lf_to_nulJeff Hostetler, Aug 5, 2016
  4. 6/9 status: print branch info with --porcelain=v2 --branchJeff Hostetler, Aug 5, 2016
  5. 9/9 status: unit tests for --porcelain=v2Jeff Hostetler, Aug 5, 2016
  6. Junio C HamanoAug 8, 2016
  7. Jeff HostetlerAug 10, 2016
  8. Junio C HamanoAug 10, 2016
  9. Jeff HostetlerAug 10, 2016
  10. 7/9 git-status.txt: describe --porcelain=v2 formatJeff Hostetler, Aug 5, 2016
  11. 3/9 status: support --porcelain[=<version>]Jeff Hostetler, Aug 5, 2016
  12. 1/9 status: rename long-format print routinesJeff Hostetler, Aug 5, 2016
  13. 4/9 status: collect per-file data for --porcelain=v2Jeff Hostetler, Aug 5, 2016
  14. Junio C HamanoAug 5, 2016
  15. Johannes SchindelinAug 7, 2016
  16. Eric WongAug 7, 2016
  17. Junio C HamanoAug 8, 2016
  18. 5/9 status: print per-file porcelain v2 status dataJeff Hostetler, Aug 5, 2016
  19. Junio C HamanoAug 5, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.