提交 6d3e1f2e 编写于 作者: J Junio C Hamano

Merge branch 'mm/status-without-comment-char'

"git status" now omits the prefix to make its output a comment in a
commit log editor, which is not necessary for human consumption.

We may want to tighten the output to omit unnecessary trailing blank
lines, but that does not have to be in the scope of this series.

* mm/status-without-comment-char:
  t7508: avoid non-portable sed expression
  status: add missing blank line after list of "other" files
  tests: don't set status.displayCommentPrefix file-wide
  status: disable display of '#' comment prefix by default
  submodule summary: ignore --for-status option
  wt-status: use argv_array API
  builtin/stripspace.c: fix broken indentation
......@@ -2183,6 +2183,13 @@ status.branch::
Set to true to enable --branch by default in linkgit:git-status[1].
The option --no-branch takes precedence over this variable.
status.displayCommentPrefix::
If set to true, linkgit:git-status[1] will insert a comment
prefix before each output line (starting with
`core.commentChar`, i.e. `#` by default). This was the
behavior of linkgit:git-status[1] in Git 1.8.4 and previous.
Defaults to false.
status.showUntrackedFiles::
By default, linkgit:git-status[1] and linkgit:git-commit[1] show
files which are not currently tracked by Git. Directories which
......
......@@ -598,6 +598,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
const char *hook_arg2 = NULL;
int ident_shown = 0;
int clean_message_contents = (cleanup_mode != CLEANUP_NONE);
int old_display_comment_prefix;
/* This checks and barfs if author is badly specified */
determine_author_info(author_ident);
......@@ -695,6 +696,10 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
if (s->fp == NULL)
die_errno(_("could not open '%s'"), git_path(commit_editmsg));
/* Ignore status.displayCommentPrefix: we do need comments in COMMIT_EDITMSG. */
old_display_comment_prefix = s->display_comment_prefix;
s->display_comment_prefix = 1;
if (clean_message_contents)
stripspace(&sb, 0);
......@@ -820,6 +825,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
*/
if (!commitable && whence != FROM_MERGE && !allow_empty &&
!(amend && is_a_merge(current_head))) {
s->display_comment_prefix = old_display_comment_prefix;
run_status(stdout, index_file, prefix, 0, s);
if (amend)
fputs(_(empty_amend_advice), stderr);
......@@ -1186,6 +1192,10 @@ static int git_status_config(const char *k, const char *v, void *cb)
s->use_color = git_config_colorbool(k, v);
return 0;
}
if (!strcmp(k, "status.displaycommentprefix")) {
s->display_comment_prefix = git_config_bool(k, v);
return 0;
}
if (!prefixcmp(k, "status.color.") || !prefixcmp(k, "color.status.")) {
int slot = parse_status_slot(k, 13);
if (slot < 0)
......
......@@ -1149,18 +1149,7 @@ cmd_summary() {
echo
fi
echo
done |
if test -n "$for_status"; then
if [ -n "$files" ]; then
gettextln "Submodules changed but not updated:" | git stripspace -c
else
gettextln "Submodule changes to be committed:" | git stripspace -c
fi
printf "\n" | git stripspace -c
git stripspace -c
else
cat
fi
done
}
#
# List all submodules, prefixed with:
......
......@@ -115,7 +115,7 @@ EOF
git config core.excludesFile excludes-file
git status | grep "^# " > output
git -c status.displayCommentPrefix=true status | grep "^# " > output
cat > expect << EOF
# .gitignore
......
......@@ -29,20 +29,19 @@ test_expect_success 'Report new path with conflict' '
test_cmp expect actual
'
cat >expect <<EOF
# On branch side
# You have unmerged paths.
# (fix conflicts and run "git commit")
#
# Unmerged paths:
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# deleted by us: foo
#
test_expect_success 'M/D conflict does not segfault' '
cat >expect <<EOF &&
On branch side
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add/rm <file>..." as appropriate to mark resolution)
deleted by us: foo
no changes added to commit (use "git add" and/or "git commit -a")
EOF
test_expect_success 'M/D conflict does not segfault' '
mkdir mdconflict &&
(
cd mdconflict &&
......@@ -135,19 +134,19 @@ test_expect_success 'status when conflicts with add and rm advice (deleted by th
test_commit on_second main.txt on_second &&
test_commit master conflict.txt master &&
test_must_fail git merge second_branch &&
cat >expected <<-\EOF &&
# On branch master
# You have unmerged paths.
# (fix conflicts and run "git commit")
#
# Unmerged paths:
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both added: conflict.txt
# deleted by them: main.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
EOF
cat >expected <<\EOF &&
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add/rm <file>..." as appropriate to mark resolution)
both added: conflict.txt
deleted by them: main.txt
no changes added to commit (use "git add" and/or "git commit -a")
EOF
git status --untracked-files=no >actual &&
test_i18ncmp expected actual
'
......@@ -168,20 +167,20 @@ test_expect_success 'prepare for conflicts' '
test_expect_success 'status when conflicts with add and rm advice (both deleted)' '
test_must_fail git merge conflict &&
cat >expected <<-\EOF &&
# On branch conflict_second
# You have unmerged paths.
# (fix conflicts and run "git commit")
#
# Unmerged paths:
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both deleted: main.txt
# added by them: sub_master.txt
# added by us: sub_second.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
EOF
cat >expected <<\EOF &&
On branch conflict_second
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add/rm <file>..." as appropriate to mark resolution)
both deleted: main.txt
added by them: sub_master.txt
added by us: sub_second.txt
no changes added to commit (use "git add" and/or "git commit -a")
EOF
git status --untracked-files=no >actual &&
test_i18ncmp expected actual
'
......@@ -192,22 +191,22 @@ test_expect_success 'status when conflicts with only rm advice (both deleted)' '
test_must_fail git merge conflict &&
git add sub_master.txt &&
git add sub_second.txt &&
cat >expected <<-\EOF &&
# On branch conflict_second
# You have unmerged paths.
# (fix conflicts and run "git commit")
#
# Changes to be committed:
#
# new file: sub_master.txt
#
# Unmerged paths:
# (use "git rm <file>..." to mark resolution)
#
# both deleted: main.txt
#
# Untracked files not listed (use -u option to show untracked files)
EOF
cat >expected <<\EOF &&
On branch conflict_second
You have unmerged paths.
(fix conflicts and run "git commit")
Changes to be committed:
new file: sub_master.txt
Unmerged paths:
(use "git rm <file>..." to mark resolution)
both deleted: main.txt
Untracked files not listed (use -u option to show untracked files)
EOF
git status --untracked-files=no >actual &&
test_i18ncmp expected actual &&
git reset --hard &&
......
......@@ -265,13 +265,11 @@ EOF
test_expect_success '--for-status' "
git submodule summary --for-status HEAD^ >actual &&
test_i18ncmp actual - <<EOF
# Submodule changes to be committed:
#
# * sm1 $head6...0000000:
#
# * sm2 0000000...$head7 (2):
# > Add foo9
#
* sm1 $head6...0000000:
* sm2 0000000...$head7 (2):
> Add foo9
EOF
"
......
此差异已折叠。
此差异已折叠。
......@@ -9,6 +9,7 @@
#include "diffcore.h"
#include "quote.h"
#include "run-command.h"
#include "argv-array.h"
#include "remote.h"
#include "refs.h"
#include "submodule.h"
......@@ -46,9 +47,11 @@ static void status_vprintf(struct wt_status *s, int at_bol, const char *color,
strbuf_vaddf(&sb, fmt, ap);
if (!sb.len) {
if (s->display_comment_prefix) {
strbuf_addch(&sb, comment_line_char);
if (!trail)
strbuf_addch(&sb, ' ');
}
color_print_strbuf(s->fp, color, &sb);
if (trail)
fprintf(s->fp, "%s", trail);
......@@ -59,7 +62,7 @@ static void status_vprintf(struct wt_status *s, int at_bol, const char *color,
eol = strchr(line, '\n');
strbuf_reset(&linebuf);
if (at_bol) {
if (at_bol && s->display_comment_prefix) {
strbuf_addch(&linebuf, comment_line_char);
if (*line != '\n' && *line != '\t')
strbuf_addch(&linebuf, ' ');
......@@ -129,6 +132,7 @@ void wt_status_prepare(struct wt_status *s)
s->untracked.strdup_strings = 1;
s->ignored.strdup_strings = 1;
s->show_branch = -1; /* unspecified */
s->display_comment_prefix = 0;
}
static void wt_status_print_unmerged_header(struct wt_status *s)
......@@ -661,29 +665,57 @@ static void wt_status_print_submodule_summary(struct wt_status *s, int uncommitt
char summary_limit[64];
char index[PATH_MAX];
const char *env[] = { NULL, NULL };
const char *argv[8];
env[0] = index;
argv[0] = "submodule";
argv[1] = "summary";
argv[2] = uncommitted ? "--files" : "--cached";
argv[3] = "--for-status";
argv[4] = "--summary-limit";
argv[5] = summary_limit;
argv[6] = uncommitted ? NULL : (s->amend ? "HEAD^" : "HEAD");
argv[7] = NULL;
struct argv_array argv = ARGV_ARRAY_INIT;
struct strbuf cmd_stdout = STRBUF_INIT;
struct strbuf summary = STRBUF_INIT;
char *summary_content;
size_t len;
sprintf(summary_limit, "%d", s->submodule_summary);
snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", s->index_file);
env[0] = index;
argv_array_push(&argv, "submodule");
argv_array_push(&argv, "summary");
argv_array_push(&argv, uncommitted ? "--files" : "--cached");
argv_array_push(&argv, "--for-status");
argv_array_push(&argv, "--summary-limit");
argv_array_push(&argv, summary_limit);
if (!uncommitted)
argv_array_push(&argv, s->amend ? "HEAD^" : "HEAD");
memset(&sm_summary, 0, sizeof(sm_summary));
sm_summary.argv = argv;
sm_summary.argv = argv.argv;
sm_summary.env = env;
sm_summary.git_cmd = 1;
sm_summary.no_stdin = 1;
fflush(s->fp);
sm_summary.out = dup(fileno(s->fp)); /* run_command closes it */
sm_summary.out = -1;
run_command(&sm_summary);
argv_array_clear(&argv);
len = strbuf_read(&cmd_stdout, sm_summary.out, 1024);
/* prepend header, only if there's an actual output */
if (len) {
if (uncommitted)
strbuf_addstr(&summary, _("Submodules changed but not updated:"));
else
strbuf_addstr(&summary, _("Submodule changes to be committed:"));
strbuf_addstr(&summary, "\n\n");
}
strbuf_addbuf(&summary, &cmd_stdout);
strbuf_release(&cmd_stdout);
if (s->display_comment_prefix) {
summary_content = strbuf_detach(&summary, &len);
strbuf_add_commented_lines(&summary, summary_content, len);
free(summary_content);
}
fputs(summary.buf, s->fp);
strbuf_release(&summary);
}
static void wt_status_print_other(struct wt_status *s,
......@@ -717,10 +749,11 @@ static void wt_status_print_other(struct wt_status *s,
strbuf_release(&buf);
if (!column_active(s->colopts))
return;
goto conclude;
strbuf_addf(&buf, "%s#\t%s",
strbuf_addf(&buf, "%s%s\t%s",
color(WT_STATUS_HEADER, s),
s->display_comment_prefix ? "#" : "",
color(WT_STATUS_UNTRACKED, s));
memset(&copts, 0, sizeof(copts));
copts.padding = 1;
......@@ -730,6 +763,8 @@ static void wt_status_print_other(struct wt_status *s,
print_columns(&output, s->colopts, &copts);
string_list_clear(&output, 0);
strbuf_release(&buf);
conclude:
status_printf_ln(s, GIT_COLOR_NORMAL, "");
}
static void wt_status_print_verbose(struct wt_status *s)
......@@ -764,6 +799,8 @@ static void wt_status_print_tracking(struct wt_status *s)
struct strbuf sb = STRBUF_INIT;
const char *cp, *ep;
struct branch *branch;
char comment_line_string[3];
int i;
assert(s->branch && !s->is_initial);
if (prefixcmp(s->branch, "refs/heads/"))
......@@ -772,12 +809,22 @@ static void wt_status_print_tracking(struct wt_status *s)
if (!format_tracking_info(branch, &sb))
return;
i = 0;
if (s->display_comment_prefix) {
comment_line_string[i++] = comment_line_char;
comment_line_string[i++] = ' ';
}
comment_line_string[i] = '\0';
for (cp = sb.buf; (ep = strchr(cp, '\n')) != NULL; cp = ep + 1)
color_fprintf_ln(s->fp, color(WT_STATUS_HEADER, s),
"%c %.*s", comment_line_char,
"%s%.*s", comment_line_string,
(int)(ep - cp), cp);
if (s->display_comment_prefix)
color_fprintf_ln(s->fp, color(WT_STATUS_HEADER, s), "%c",
comment_line_char);
else
fprintf_ln(s->fp, "");
}
static int has_unmerged(struct wt_status *s)
......
......@@ -50,6 +50,7 @@ struct wt_status {
enum commit_whence whence;
int nowarn;
int use_color;
int display_comment_prefix;
int relative_paths;
int submodule_summary;
int show_ignored_files;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册