
Default to the real terminal width for diff --stat output, instead of the hard-coded 80 columns. Some projects (especially in Java), have long filename paths, with nested directories or long individual filenames. When files are renamed, the filename part in stat output can be almost useless. If the middle part between { and } is long (because the file was moved to a completely different directory), then most of the path would be truncated. It makes sense to detect and use the full terminal width and display full filenames if possible. The are commands like diff, show, and log, which can adapt the output to the terminal width. There are also commands like format-patch, whose output should be independent of the terminal width. Since it is safer to use the 80-column default, the real terminal width is only used if requested by the calling code by setting diffopts.stat_width=-1. Normally this value is 0, and can be set by the user only to a non-negative value, so -1 is safe to use internally. This patch only changes the diff builtin to use the full terminal width. Signed-off-by: Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> Signed-off-by: Junio C Hamano <gitster@pobox.com>
190 lines
4.8 KiB
Bash
Executable File
190 lines
4.8 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# Copyright (c) 2012 Zbigniew Jędrzejewski-Szmek
|
|
#
|
|
|
|
test_description='test --stat output of various commands'
|
|
|
|
. ./test-lib.sh
|
|
. "$TEST_DIRECTORY"/lib-terminal.sh
|
|
|
|
# 120 character name
|
|
name=aaaaaaaaaa
|
|
name=$name$name$name$name$name$name$name$name$name$name$name$name
|
|
test_expect_success 'preparation' '
|
|
>"$name" &&
|
|
git add "$name" &&
|
|
git commit -m message &&
|
|
echo a >"$name" &&
|
|
git commit -m message "$name"
|
|
'
|
|
|
|
while read cmd args
|
|
do
|
|
cat >expect <<-'EOF'
|
|
...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1 +
|
|
EOF
|
|
test_expect_success "$cmd: a short graph bar does not extend to the full width" '
|
|
git $cmd $args >output &&
|
|
grep " | " output >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
cat >expect <<-'EOF'
|
|
...aaaaaaaaaaaaaaaaaaaaaa | 1 +
|
|
EOF
|
|
test_expect_success "$cmd --stat=width: name is chopped to leave room to the right of a short bar" '
|
|
git $cmd $args --stat=40 >output &&
|
|
grep " | " output >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success "$cmd --stat-width=width with long name" '
|
|
git $cmd $args --stat-width=40 >output &&
|
|
grep " | " output >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
cat >expect <<-'EOF'
|
|
...aaaaaaaaaaaaaaaaaaaaaaaaaaa | 1 +
|
|
EOF
|
|
test_expect_success "$cmd --stat=...,name-width with long name" '
|
|
git $cmd $args --stat=60,30 >output &&
|
|
grep " | " output >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success "$cmd --stat-name-width with long name" '
|
|
git $cmd $args --stat-name-width=30 >output &&
|
|
grep " | " output >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
done <<\EOF
|
|
format-patch -1 --stdout
|
|
diff HEAD^ HEAD --stat
|
|
show --stat
|
|
log -1 --stat
|
|
EOF
|
|
|
|
|
|
test_expect_success 'preparation for big change tests' '
|
|
>abcd &&
|
|
git add abcd &&
|
|
git commit -m message &&
|
|
i=0 &&
|
|
while test $i -lt 1000
|
|
do
|
|
echo $i && i=$(($i + 1))
|
|
done >abcd &&
|
|
git commit -m message abcd
|
|
'
|
|
|
|
cat >expect80 <<'EOF'
|
|
abcd | 1000 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
EOF
|
|
|
|
cat >expect200 <<'EOF'
|
|
abcd | 1000 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
EOF
|
|
|
|
while read verb expect cmd args
|
|
do
|
|
test_expect_success "$cmd $verb COLUMNS (big change)" '
|
|
COLUMNS=200 git $cmd $args >output
|
|
grep " | " output >actual &&
|
|
test_cmp "$expect" actual
|
|
'
|
|
done <<\EOF
|
|
ignores expect80 format-patch -1 --stdout
|
|
respects expect200 diff HEAD^ HEAD --stat
|
|
ignores expect80 show --stat
|
|
ignores expect80 log -1 --stat
|
|
EOF
|
|
|
|
cat >expect <<'EOF'
|
|
abcd | 1000 ++++++++++++++++++++++++++
|
|
EOF
|
|
while read cmd args
|
|
do
|
|
test_expect_success "$cmd --stat=width with big change" '
|
|
git $cmd $args --stat=40 >output
|
|
grep " | " output >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success "$cmd --stat-width=width with big change" '
|
|
git $cmd $args --stat-width=40 >output
|
|
grep " | " output >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
done <<\EOF
|
|
format-patch -1 --stdout
|
|
diff HEAD^ HEAD --stat
|
|
show --stat
|
|
log -1 --stat
|
|
EOF
|
|
|
|
test_expect_success 'preparation for long filename tests' '
|
|
cp abcd aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&
|
|
git add aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&
|
|
git commit -m message
|
|
'
|
|
|
|
cat >expect <<'EOF'
|
|
...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1000 +++++
|
|
EOF
|
|
while read cmd args
|
|
do
|
|
test_expect_success "$cmd --stat=width with big change and long name favors name part" '
|
|
git $cmd $args --stat-width=60 >output &&
|
|
grep " | " output >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
done <<\EOF
|
|
format-patch -1 --stdout
|
|
diff HEAD^ HEAD --stat
|
|
show --stat
|
|
log -1 --stat
|
|
EOF
|
|
|
|
cat >expect80 <<'EOF'
|
|
...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1000 ++++++++++++++++++++
|
|
EOF
|
|
cat >expect200 <<'EOF'
|
|
...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1000 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
EOF
|
|
while read verb expect cmd args
|
|
do
|
|
test_expect_success "$cmd $verb COLUMNS (long filename)" '
|
|
COLUMNS=200 git $cmd $args >output
|
|
grep " | " output >actual &&
|
|
test_cmp "$expect" actual
|
|
'
|
|
done <<\EOF
|
|
ignores expect80 format-patch -1 --stdout
|
|
respects expect200 diff HEAD^ HEAD --stat
|
|
ignores expect80 show --stat
|
|
ignores expect80 log -1 --stat
|
|
EOF
|
|
|
|
cat >expect <<'EOF'
|
|
abcd | 1000 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
EOF
|
|
test_expect_success 'merge --stat ignores COLUMNS (big change)' '
|
|
git checkout -b branch HEAD^^ &&
|
|
COLUMNS=100 git merge --stat --no-ff master^ >output &&
|
|
grep " | " output >actual
|
|
test_cmp expect actual
|
|
'
|
|
|
|
cat >expect <<'EOF'
|
|
...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1000 ++++++++++++++++++++
|
|
EOF
|
|
test_expect_success 'merge --stat ignores COLUMNS (long filename)' '
|
|
COLUMNS=100 git merge --stat --no-ff master >output &&
|
|
grep " | " output >actual
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_done
|