1a22bd3 (Merge branch 'jg/status-config', 2013-06-23) introduced a serious regression in --porcelain by introducing the configuration variables status.short and status.branch. Contrary to its description, the output of $ git status --porcelain now depends on the configuration variables status.short and status.branch. As a result, callers that expect parsable output to be returned are broken. For instance, in a repository with submodules with status.branch and status.short set, $ git status always reports all submodules as containing modified content, even if they are clean. One solution to the problem is to turn off s->show_branch in wt_porcelain_print() just like we turn off other s->* variables, but that would break callers of --porcelain --branch (in fact, there is such a caller in t/t7508-status.sh). Besides, we never said that --porcelain cannot be combined with other options. The larger problem is that the config parser and command-line option parser set the same variables, making it impossible to determine who set them. The correct solution is therefore to skip the config parser completely when --porcelain is given. Unfortunately, to determine that --porcelain is given, we have to run the command-line option parser. Running the command-line option parser before the config parser is undesirable, as configuration variables would override options on the command-line. As a fair compromise, check that argv[1] is equal to the string "--porcelain" and skip the config parser in this case. It is a compromise, because we expect --porcelain to be specified as the first argument to status. On a related note, the command-line parser is not very robust. $ git status --short --long $ git status --long --long $ git status --porcelain --long $ git status --long --porcelain $ git status --porcelain --short $ git status --short --porcelain all return different outputs. This bug is left as an exercise for future contributors to fix. Signed-off-by: Ramkumar Ramachandra <artagnon@xxxxxxxxx> --- builtin/commit.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/builtin/commit.c b/builtin/commit.c index b589ce0..896f002 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -1193,7 +1193,12 @@ int cmd_status(int argc, const char **argv, const char *prefix) wt_status_prepare(&s); gitmodules_config(); - git_config(git_status_config, &s); + + if (argc > 1 && !strcmp(argv[1], "--porcelain")) + ; /* Do not read user configuration */ + else + git_config(git_status_config, &s); + determine_whence(&s); argc = parse_options(argc, argv, prefix, builtin_status_options, -- 1.8.3.1.550.gd96f26e.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html