status: fix missing newline when comment chars are disabled

When git-status shows tracking data for the current branch
in the long format, we try to end the stanza with a blank
line. When status.displayCommentPrefix is true, we call
color_fprintf_ln() to do so. But when it's false, we call
the enigmatic:

  fputs("", s->fp);

which does nothing at all! This is a bug from 7d7d68022
(silence a bunch of format-zero-length warnings,
2014-05-04). Prior to that, we called fprintf_ln() with an
empty string. Switching to fputs() meant we needed to
include the "newline in the string, but we didn't.

So you see:

  On branch jk/status-tracking-newline
  Your branch is ahead of 'origin/master' by 1 commit.
  Changes not staged for commit:
          modified:  foo

  Untracked files:
     bar

whereas there should be a blank line before the "Changes not
staged" line.

The fix itself is a one-liner. But we never noticed this
bug because t7508 doesn't exercise the ahead/behind code at
all.  So let's configure an upstream during the initial
setup, which means that the code will be exercised as part
of all of the various invocations in that script. This makes
the diff rather noisy, but should give us good coverage.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2017-04-27 05:01:05 -04:00 коммит произвёл Junio C Hamano
Родитель 027a3b943b
Коммит 75177c8591
2 изменённых файлов: 112 добавлений и 5 удалений

Просмотреть файл

@ -32,6 +32,17 @@ test_expect_success 'commit -h in broken repository' '
test_i18ngrep "[Uu]sage" broken/usage test_i18ngrep "[Uu]sage" broken/usage
' '
test_expect_success 'create upstream branch' '
git checkout -b upstream &&
test_commit upstream1 &&
test_commit upstream2 &&
# leave the first commit on master as root because several
# tests depend on this case; for our upstream we only
# care about commit counts anyway, so a totally divergent
# history is OK
git checkout --orphan master
'
test_expect_success 'setup' ' test_expect_success 'setup' '
: >tracked && : >tracked &&
: >modified && : >modified &&
@ -53,7 +64,9 @@ test_expect_success 'setup' '
echo 1 >dir1/modified && echo 1 >dir1/modified &&
echo 2 >dir2/modified && echo 2 >dir2/modified &&
echo 3 >dir2/added && echo 3 >dir2/added &&
git add dir2/added git add dir2/added &&
git branch --set-upstream-to=upstream
' '
test_expect_success 'status (1)' ' test_expect_success 'status (1)' '
@ -75,6 +88,10 @@ EOF
test_expect_success 'status --column' ' test_expect_success 'status --column' '
cat >expect <<\EOF && cat >expect <<\EOF &&
# On branch master # On branch master
# Your branch and '\''upstream'\'' have diverged,
# and have 1 and 2 different commits each, respectively.
# (use "git pull" to merge the remote branch into yours)
#
# Changes to be committed: # Changes to be committed:
# (use "git reset HEAD <file>..." to unstage) # (use "git reset HEAD <file>..." to unstage)
# #
@ -105,6 +122,10 @@ test_expect_success 'status --column status.displayCommentPrefix=false' '
cat >expect <<\EOF cat >expect <<\EOF
# On branch master # On branch master
# Your branch and 'upstream' have diverged,
# and have 1 and 2 different commits each, respectively.
# (use "git pull" to merge the remote branch into yours)
#
# Changes to be committed: # Changes to be committed:
# (use "git reset HEAD <file>..." to unstage) # (use "git reset HEAD <file>..." to unstage)
# #
@ -178,6 +199,9 @@ test_expect_success 'commit ignores status.displayCommentPrefix=false in COMMIT_
cat >expect <<\EOF cat >expect <<\EOF
On branch master On branch master
Your branch and 'upstream' have diverged,
and have 1 and 2 different commits each, respectively.
Changes to be committed: Changes to be committed:
new file: dir2/added new file: dir2/added
@ -248,6 +272,10 @@ test_expect_success 'status with gitignore' '
cat >expect <<\EOF && cat >expect <<\EOF &&
On branch master On branch master
Your branch and '\''upstream'\'' have diverged,
and have 1 and 2 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
Changes to be committed: Changes to be committed:
(use "git reset HEAD <file>..." to unstage) (use "git reset HEAD <file>..." to unstage)
@ -313,6 +341,10 @@ test_expect_success 'status with gitignore (nothing untracked)' '
cat >expect <<\EOF && cat >expect <<\EOF &&
On branch master On branch master
Your branch and '\''upstream'\'' have diverged,
and have 1 and 2 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
Changes to be committed: Changes to be committed:
(use "git reset HEAD <file>..." to unstage) (use "git reset HEAD <file>..." to unstage)
@ -348,7 +380,7 @@ output*
EOF EOF
cat >expect <<\EOF cat >expect <<\EOF
## master ## master...upstream [ahead 1, behind 2]
M dir1/modified M dir1/modified
A dir2/added A dir2/added
?? dir1/untracked ?? dir1/untracked
@ -382,6 +414,10 @@ test_expect_success 'setup dir3' '
test_expect_success 'status -uno' ' test_expect_success 'status -uno' '
cat >expect <<EOF && cat >expect <<EOF &&
On branch master On branch master
Your branch and '\''upstream'\'' have diverged,
and have 1 and 2 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
Changes to be committed: Changes to be committed:
(use "git reset HEAD <file>..." to unstage) (use "git reset HEAD <file>..." to unstage)
@ -408,6 +444,9 @@ test_expect_success 'status (status.showUntrackedFiles no)' '
test_expect_success 'status -uno (advice.statusHints false)' ' test_expect_success 'status -uno (advice.statusHints false)' '
cat >expect <<EOF && cat >expect <<EOF &&
On branch master On branch master
Your branch and '\''upstream'\'' have diverged,
and have 1 and 2 different commits each, respectively.
Changes to be committed: Changes to be committed:
new file: dir2/added new file: dir2/added
@ -439,6 +478,10 @@ test_expect_success 'status -s (status.showUntrackedFiles no)' '
test_expect_success 'status -unormal' ' test_expect_success 'status -unormal' '
cat >expect <<EOF && cat >expect <<EOF &&
On branch master On branch master
Your branch and '\''upstream'\'' have diverged,
and have 1 and 2 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
Changes to be committed: Changes to be committed:
(use "git reset HEAD <file>..." to unstage) (use "git reset HEAD <file>..." to unstage)
@ -493,6 +536,10 @@ test_expect_success 'status -s (status.showUntrackedFiles normal)' '
test_expect_success 'status -uall' ' test_expect_success 'status -uall' '
cat >expect <<EOF && cat >expect <<EOF &&
On branch master On branch master
Your branch and '\''upstream'\'' have diverged,
and have 1 and 2 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
Changes to be committed: Changes to be committed:
(use "git reset HEAD <file>..." to unstage) (use "git reset HEAD <file>..." to unstage)
@ -552,6 +599,10 @@ test_expect_success 'status -s (status.showUntrackedFiles all)' '
test_expect_success 'status with relative paths' ' test_expect_success 'status with relative paths' '
cat >expect <<\EOF && cat >expect <<\EOF &&
On branch master On branch master
Your branch and '\''upstream'\'' have diverged,
and have 1 and 2 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
Changes to be committed: Changes to be committed:
(use "git reset HEAD <file>..." to unstage) (use "git reset HEAD <file>..." to unstage)
@ -617,6 +668,10 @@ test_expect_success 'setup unique colors' '
test_expect_success 'status with color.ui' ' test_expect_success 'status with color.ui' '
cat >expect <<\EOF && cat >expect <<\EOF &&
On branch <GREEN>master<RESET> On branch <GREEN>master<RESET>
Your branch and '\''upstream'\'' have diverged,
and have 1 and 2 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
Changes to be committed: Changes to be committed:
(use "git reset HEAD <file>..." to unstage) (use "git reset HEAD <file>..." to unstage)
@ -675,7 +730,7 @@ test_expect_success 'status -s with color.status' '
' '
cat >expect <<\EOF cat >expect <<\EOF
## <GREEN>master<RESET> ## <GREEN>master<RESET>...<RED>upstream<RESET> [ahead <GREEN>1<RESET>, behind <RED>2<RESET>]
<RED>M<RESET> dir1/modified <RED>M<RESET> dir1/modified
<GREEN>A<RESET> dir2/added <GREEN>A<RESET> dir2/added
<BLUE>??<RESET> dir1/untracked <BLUE>??<RESET> dir1/untracked
@ -726,7 +781,7 @@ test_expect_success 'status --porcelain respects -b' '
git status --porcelain -b >output && git status --porcelain -b >output &&
{ {
echo "## master" && echo "## master...upstream [ahead 1, behind 2]" &&
cat expect cat expect
} >tmp && } >tmp &&
mv tmp expect && mv tmp expect &&
@ -739,6 +794,10 @@ test_expect_success 'status --porcelain respects -b' '
test_expect_success 'status without relative paths' ' test_expect_success 'status without relative paths' '
cat >expect <<\EOF && cat >expect <<\EOF &&
On branch master On branch master
Your branch and '\''upstream'\'' have diverged,
and have 1 and 2 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
Changes to be committed: Changes to be committed:
(use "git reset HEAD <file>..." to unstage) (use "git reset HEAD <file>..." to unstage)
@ -785,6 +844,10 @@ test_expect_success 'status -s without relative paths' '
test_expect_success 'dry-run of partial commit excluding new file in index' ' test_expect_success 'dry-run of partial commit excluding new file in index' '
cat >expect <<EOF && cat >expect <<EOF &&
On branch master On branch master
Your branch and '\''upstream'\'' have diverged,
and have 1 and 2 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
Changes to be committed: Changes to be committed:
(use "git reset HEAD <file>..." to unstage) (use "git reset HEAD <file>..." to unstage)
@ -825,6 +888,10 @@ test_expect_success 'setup status submodule summary' '
test_expect_success 'status submodule summary is disabled by default' ' test_expect_success 'status submodule summary is disabled by default' '
cat >expect <<EOF && cat >expect <<EOF &&
On branch master On branch master
Your branch and '\''upstream'\'' have diverged,
and have 1 and 2 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
Changes to be committed: Changes to be committed:
(use "git reset HEAD <file>..." to unstage) (use "git reset HEAD <file>..." to unstage)
@ -881,6 +948,10 @@ head=$(cd sm && git rev-parse --short=7 --verify HEAD)
test_expect_success 'status submodule summary' ' test_expect_success 'status submodule summary' '
cat >expect <<EOF && cat >expect <<EOF &&
On branch master On branch master
Your branch and '\''upstream'\'' have diverged,
and have 1 and 2 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
Changes to be committed: Changes to be committed:
(use "git reset HEAD <file>..." to unstage) (use "git reset HEAD <file>..." to unstage)
@ -939,6 +1010,10 @@ test_expect_success 'status -s submodule summary' '
test_expect_success 'status submodule summary (clean submodule): commit' ' test_expect_success 'status submodule summary (clean submodule): commit' '
cat >expect <<EOF && cat >expect <<EOF &&
On branch master On branch master
Your branch and '\''upstream'\'' have diverged,
and have 2 and 2 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
Changes not staged for commit: Changes not staged for commit:
(use "git add <file>..." to update what will be committed) (use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory) (use "git checkout -- <file>..." to discard changes in working directory)
@ -985,6 +1060,10 @@ test_expect_success 'status -z implies porcelain' '
test_expect_success 'commit --dry-run submodule summary (--amend)' ' test_expect_success 'commit --dry-run submodule summary (--amend)' '
cat >expect <<EOF && cat >expect <<EOF &&
On branch master On branch master
Your branch and '\''upstream'\'' have diverged,
and have 2 and 2 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
Changes to be committed: Changes to be committed:
(use "git reset HEAD^1 <file>..." to unstage) (use "git reset HEAD^1 <file>..." to unstage)
@ -1038,6 +1117,10 @@ touch .gitmodules
test_expect_success '--ignore-submodules=untracked suppresses submodules with untracked content' ' test_expect_success '--ignore-submodules=untracked suppresses submodules with untracked content' '
cat > expect << EOF && cat > expect << EOF &&
On branch master On branch master
Your branch and '\''upstream'\'' have diverged,
and have 2 and 2 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
Changes to be committed: Changes to be committed:
(use "git reset HEAD <file>..." to unstage) (use "git reset HEAD <file>..." to unstage)
@ -1146,6 +1229,10 @@ test_expect_success '.git/config ignore=dirty suppresses submodules with modifie
test_expect_success "--ignore-submodules=untracked doesn't suppress submodules with modified content" ' test_expect_success "--ignore-submodules=untracked doesn't suppress submodules with modified content" '
cat > expect << EOF && cat > expect << EOF &&
On branch master On branch master
Your branch and '\''upstream'\'' have diverged,
and have 2 and 2 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
Changes to be committed: Changes to be committed:
(use "git reset HEAD <file>..." to unstage) (use "git reset HEAD <file>..." to unstage)
@ -1202,6 +1289,10 @@ head2=$(cd sm && git commit -q -m "2nd commit" foo && git rev-parse --short=7 --
test_expect_success "--ignore-submodules=untracked doesn't suppress submodule summary" ' test_expect_success "--ignore-submodules=untracked doesn't suppress submodule summary" '
cat > expect << EOF && cat > expect << EOF &&
On branch master On branch master
Your branch and '\''upstream'\'' have diverged,
and have 2 and 2 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
Changes to be committed: Changes to be committed:
(use "git reset HEAD <file>..." to unstage) (use "git reset HEAD <file>..." to unstage)
@ -1282,6 +1373,10 @@ test_expect_success ".git/config ignore=dirty doesn't suppress submodule summary
cat > expect << EOF cat > expect << EOF
; On branch master ; On branch master
; Your branch and 'upstream' have diverged,
; and have 2 and 2 different commits each, respectively.
; (use "git pull" to merge the remote branch into yours)
;
; Changes to be committed: ; Changes to be committed:
; (use "git reset HEAD <file>..." to unstage) ; (use "git reset HEAD <file>..." to unstage)
; ;
@ -1329,6 +1424,10 @@ test_expect_success "status (core.commentchar with two chars with submodule summ
test_expect_success "--ignore-submodules=all suppresses submodule summary" ' test_expect_success "--ignore-submodules=all suppresses submodule summary" '
cat > expect << EOF && cat > expect << EOF &&
On branch master On branch master
Your branch and '\''upstream'\'' have diverged,
and have 2 and 2 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
Changes not staged for commit: Changes not staged for commit:
(use "git add <file>..." to update what will be committed) (use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory) (use "git checkout -- <file>..." to discard changes in working directory)
@ -1353,6 +1452,10 @@ EOF
test_expect_success '.gitmodules ignore=all suppresses unstaged submodule summary' ' test_expect_success '.gitmodules ignore=all suppresses unstaged submodule summary' '
cat > expect << EOF && cat > expect << EOF &&
On branch master On branch master
Your branch and '\''upstream'\'' have diverged,
and have 2 and 2 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
Changes to be committed: Changes to be committed:
(use "git reset HEAD <file>..." to unstage) (use "git reset HEAD <file>..." to unstage)
@ -1472,6 +1575,10 @@ test_expect_success 'git commit --dry-run will show a staged but ignored submodu
git add sm && git add sm &&
cat >expect << EOF && cat >expect << EOF &&
On branch master On branch master
Your branch and '\''upstream'\'' have diverged,
and have 2 and 2 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
Changes to be committed: Changes to be committed:
(use "git reset HEAD <file>..." to unstage) (use "git reset HEAD <file>..." to unstage)

Просмотреть файл

@ -1002,7 +1002,7 @@ static void wt_longstatus_print_tracking(struct wt_status *s)
color_fprintf_ln(s->fp, color(WT_STATUS_HEADER, s), "%c", color_fprintf_ln(s->fp, color(WT_STATUS_HEADER, s), "%c",
comment_line_char); comment_line_char);
else else
fputs("", s->fp); fputs("\n", s->fp);
} }
static int has_unmerged(struct wt_status *s) static int has_unmerged(struct wt_status *s)