diff: strip extra "/" when stripping prefix
There are two ways a user might want to use "diff --relative":
1. For a file in a directory, like "subdir/file", the user
can use "--relative=subdir/" to strip the directory.
2. To strip part of a filename, like "foo-10", they can
use "--relative=foo-".
We currently handle both of those situations. However, if the user passes
"--relative=subdir" (without the trailing slash), we produce inconsistent
results. For the unified diff format, we collapse the double-slash of
"a//file" correctly into "a/file". But for other formats (raw, stat,
name-status), we end up with "/file".
We can do what the user means here and strip the extra "/" (and only a
slash). We are not hurting any existing users of (2) above with this
behavior change because the existing output for this case was nonsensical.
Patch by Jakub, tests and commit message by Jeff King.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-08-09 14:50:53 +00:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
test_description='diff --relative tests'
|
|
|
|
. ./test-lib.sh
|
|
|
|
|
|
|
|
test_expect_success 'setup' '
|
|
|
|
git commit --allow-empty -m empty &&
|
|
|
|
echo content >file1 &&
|
|
|
|
mkdir subdir &&
|
|
|
|
echo other content >subdir/file2 &&
|
2020-05-22 10:46:18 +00:00
|
|
|
blob_file1=$(git hash-object file1) &&
|
|
|
|
blob_file2=$(git hash-object subdir/file2) &&
|
diff: strip extra "/" when stripping prefix
There are two ways a user might want to use "diff --relative":
1. For a file in a directory, like "subdir/file", the user
can use "--relative=subdir/" to strip the directory.
2. To strip part of a filename, like "foo-10", they can
use "--relative=foo-".
We currently handle both of those situations. However, if the user passes
"--relative=subdir" (without the trailing slash), we produce inconsistent
results. For the unified diff format, we collapse the double-slash of
"a//file" correctly into "a/file". But for other formats (raw, stat,
name-status), we end up with "/file".
We can do what the user means here and strip the extra "/" (and only a
slash). We are not hurting any existing users of (2) above with this
behavior change because the existing output for this case was nonsensical.
Patch by Jakub, tests and commit message by Jeff King.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-08-09 14:50:53 +00:00
|
|
|
git add . &&
|
|
|
|
git commit -m one
|
|
|
|
'
|
|
|
|
|
2017-12-09 20:40:13 +00:00
|
|
|
check_diff () {
|
|
|
|
dir=$1
|
|
|
|
shift
|
|
|
|
expect=$1
|
|
|
|
shift
|
2020-05-22 10:46:18 +00:00
|
|
|
short_blob=$(git rev-parse --short $blob_file2)
|
2017-12-09 20:40:13 +00:00
|
|
|
cat >expected <<-EOF
|
|
|
|
diff --git a/$expect b/$expect
|
|
|
|
new file mode 100644
|
2018-05-21 02:01:45 +00:00
|
|
|
index 0000000..$short_blob
|
2017-12-09 20:40:13 +00:00
|
|
|
--- /dev/null
|
|
|
|
+++ b/$expect
|
|
|
|
@@ -0,0 +1 @@
|
|
|
|
+other content
|
|
|
|
EOF
|
|
|
|
test_expect_success "-p $*" "
|
|
|
|
git -C '$dir' diff -p $* HEAD^ >actual &&
|
|
|
|
test_cmp expected actual
|
|
|
|
"
|
diff: strip extra "/" when stripping prefix
There are two ways a user might want to use "diff --relative":
1. For a file in a directory, like "subdir/file", the user
can use "--relative=subdir/" to strip the directory.
2. To strip part of a filename, like "foo-10", they can
use "--relative=foo-".
We currently handle both of those situations. However, if the user passes
"--relative=subdir" (without the trailing slash), we produce inconsistent
results. For the unified diff format, we collapse the double-slash of
"a//file" correctly into "a/file". But for other formats (raw, stat,
name-status), we end up with "/file".
We can do what the user means here and strip the extra "/" (and only a
slash). We are not hurting any existing users of (2) above with this
behavior change because the existing output for this case was nonsensical.
Patch by Jakub, tests and commit message by Jeff King.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-08-09 14:50:53 +00:00
|
|
|
}
|
|
|
|
|
2017-12-09 20:40:13 +00:00
|
|
|
check_numstat () {
|
|
|
|
dir=$1
|
|
|
|
shift
|
|
|
|
expect=$1
|
|
|
|
shift
|
|
|
|
cat >expected <<-EOF
|
|
|
|
1 0 $expect
|
|
|
|
EOF
|
|
|
|
test_expect_success "--numstat $*" "
|
|
|
|
echo '1 0 $expect' >expected &&
|
|
|
|
git -C '$dir' diff --numstat $* HEAD^ >actual &&
|
|
|
|
test_cmp expected actual
|
|
|
|
"
|
2012-03-13 05:05:54 +00:00
|
|
|
}
|
|
|
|
|
2017-12-09 20:40:13 +00:00
|
|
|
check_stat () {
|
|
|
|
dir=$1
|
|
|
|
shift
|
|
|
|
expect=$1
|
|
|
|
shift
|
|
|
|
cat >expected <<-EOF
|
|
|
|
$expect | 1 +
|
|
|
|
1 file changed, 1 insertion(+)
|
|
|
|
EOF
|
|
|
|
test_expect_success "--stat $*" "
|
|
|
|
git -C '$dir' diff --stat $* HEAD^ >actual &&
|
|
|
|
test_i18ncmp expected actual
|
|
|
|
"
|
diff: strip extra "/" when stripping prefix
There are two ways a user might want to use "diff --relative":
1. For a file in a directory, like "subdir/file", the user
can use "--relative=subdir/" to strip the directory.
2. To strip part of a filename, like "foo-10", they can
use "--relative=foo-".
We currently handle both of those situations. However, if the user passes
"--relative=subdir" (without the trailing slash), we produce inconsistent
results. For the unified diff format, we collapse the double-slash of
"a//file" correctly into "a/file". But for other formats (raw, stat,
name-status), we end up with "/file".
We can do what the user means here and strip the extra "/" (and only a
slash). We are not hurting any existing users of (2) above with this
behavior change because the existing output for this case was nonsensical.
Patch by Jakub, tests and commit message by Jeff King.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-08-09 14:50:53 +00:00
|
|
|
}
|
|
|
|
|
2017-12-09 20:40:13 +00:00
|
|
|
check_raw () {
|
|
|
|
dir=$1
|
|
|
|
shift
|
|
|
|
expect=$1
|
|
|
|
shift
|
|
|
|
cat >expected <<-EOF
|
2020-05-22 10:46:18 +00:00
|
|
|
:000000 100644 $ZERO_OID $blob_file2 A $expect
|
2017-12-09 20:40:13 +00:00
|
|
|
EOF
|
|
|
|
test_expect_success "--raw $*" "
|
|
|
|
git -C '$dir' diff --no-abbrev --raw $* HEAD^ >actual &&
|
|
|
|
test_cmp expected actual
|
|
|
|
"
|
diff: strip extra "/" when stripping prefix
There are two ways a user might want to use "diff --relative":
1. For a file in a directory, like "subdir/file", the user
can use "--relative=subdir/" to strip the directory.
2. To strip part of a filename, like "foo-10", they can
use "--relative=foo-".
We currently handle both of those situations. However, if the user passes
"--relative=subdir" (without the trailing slash), we produce inconsistent
results. For the unified diff format, we collapse the double-slash of
"a//file" correctly into "a/file". But for other formats (raw, stat,
name-status), we end up with "/file".
We can do what the user means here and strip the extra "/" (and only a
slash). We are not hurting any existing users of (2) above with this
behavior change because the existing output for this case was nonsensical.
Patch by Jakub, tests and commit message by Jeff King.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-08-09 14:50:53 +00:00
|
|
|
}
|
|
|
|
|
2017-12-09 20:40:12 +00:00
|
|
|
for type in diff numstat stat raw
|
|
|
|
do
|
|
|
|
check_$type . file2 --relative=subdir/
|
|
|
|
check_$type . file2 --relative=subdir
|
|
|
|
check_$type subdir file2 --relative
|
|
|
|
check_$type . dir/file2 --relative=sub
|
diff: strip extra "/" when stripping prefix
There are two ways a user might want to use "diff --relative":
1. For a file in a directory, like "subdir/file", the user
can use "--relative=subdir/" to strip the directory.
2. To strip part of a filename, like "foo-10", they can
use "--relative=foo-".
We currently handle both of those situations. However, if the user passes
"--relative=subdir" (without the trailing slash), we produce inconsistent
results. For the unified diff format, we collapse the double-slash of
"a//file" correctly into "a/file". But for other formats (raw, stat,
name-status), we end up with "/file".
We can do what the user means here and strip the extra "/" (and only a
slash). We are not hurting any existing users of (2) above with this
behavior change because the existing output for this case was nonsensical.
Patch by Jakub, tests and commit message by Jeff King.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-08-09 14:50:53 +00:00
|
|
|
done
|
|
|
|
|
2020-05-22 10:46:18 +00:00
|
|
|
check_diff_relative_option () {
|
|
|
|
dir=$1
|
|
|
|
shift
|
|
|
|
expect=$1
|
|
|
|
shift
|
|
|
|
relative_opt=$1
|
|
|
|
shift
|
|
|
|
test_expect_success "config diff.relative $relative_opt -p $*" "
|
|
|
|
short_blob=\$(git rev-parse --short $blob_file2) &&
|
|
|
|
cat >expected <<-EOF &&
|
|
|
|
diff --git a/$expect b/$expect
|
|
|
|
new file mode 100644
|
|
|
|
index 0000000..\$short_blob
|
|
|
|
--- /dev/null
|
|
|
|
+++ b/$expect
|
|
|
|
@@ -0,0 +1 @@
|
|
|
|
+other content
|
|
|
|
EOF
|
|
|
|
test_config -C $dir diff.relative $relative_opt &&
|
|
|
|
git -C '$dir' diff -p $* HEAD^ >actual &&
|
|
|
|
test_cmp expected actual
|
|
|
|
"
|
|
|
|
}
|
|
|
|
|
|
|
|
check_diff_no_relative_option () {
|
|
|
|
dir=$1
|
|
|
|
shift
|
|
|
|
expect=$1
|
|
|
|
shift
|
|
|
|
relative_opt=$1
|
|
|
|
shift
|
|
|
|
test_expect_success "config diff.relative $relative_opt -p $*" "
|
|
|
|
short_blob_file1=\$(git rev-parse --short $blob_file1) &&
|
|
|
|
short_blob_file2=\$(git rev-parse --short $blob_file2) &&
|
|
|
|
cat >expected <<-EOF &&
|
|
|
|
diff --git a/file1 b/file1
|
|
|
|
new file mode 100644
|
|
|
|
index 0000000..\$short_blob_file1
|
|
|
|
--- /dev/null
|
|
|
|
+++ b/file1
|
|
|
|
@@ -0,0 +1 @@
|
|
|
|
+content
|
|
|
|
diff --git a/$expect b/$expect
|
|
|
|
new file mode 100644
|
|
|
|
index 0000000..\$short_blob_file2
|
|
|
|
--- /dev/null
|
|
|
|
+++ b/$expect
|
|
|
|
@@ -0,0 +1 @@
|
|
|
|
+other content
|
|
|
|
EOF
|
|
|
|
test_config -C $dir diff.relative $relative_opt &&
|
|
|
|
git -C '$dir' diff -p $* HEAD^ >actual &&
|
|
|
|
test_cmp expected actual
|
|
|
|
"
|
|
|
|
}
|
|
|
|
|
|
|
|
check_diff_no_relative_option . subdir/file2 false
|
|
|
|
check_diff_no_relative_option . subdir/file2 true --no-relative
|
|
|
|
check_diff_no_relative_option . subdir/file2 false --no-relative
|
|
|
|
check_diff_no_relative_option subdir subdir/file2 false
|
|
|
|
check_diff_no_relative_option subdir subdir/file2 true --no-relative
|
|
|
|
check_diff_no_relative_option subdir subdir/file2 false --no-relative
|
|
|
|
|
|
|
|
check_diff_relative_option . file2 false --relative=subdir/
|
|
|
|
check_diff_relative_option . file2 false --relative=subdir
|
|
|
|
check_diff_relative_option . file2 true --relative=subdir/
|
|
|
|
check_diff_relative_option . file2 true --relative=subdir
|
|
|
|
check_diff_relative_option subdir file2 false --relative
|
|
|
|
check_diff_relative_option subdir file2 true --relative
|
|
|
|
check_diff_relative_option subdir file2 true
|
|
|
|
check_diff_relative_option subdir file2 false --no-relative --relative
|
|
|
|
check_diff_relative_option subdir file2 true --no-relative --relative
|
|
|
|
check_diff_relative_option . file2 false --no-relative --relative=subdir
|
|
|
|
check_diff_relative_option . file2 true --no-relative --relative=subdir
|
|
|
|
|
diff: strip extra "/" when stripping prefix
There are two ways a user might want to use "diff --relative":
1. For a file in a directory, like "subdir/file", the user
can use "--relative=subdir/" to strip the directory.
2. To strip part of a filename, like "foo-10", they can
use "--relative=foo-".
We currently handle both of those situations. However, if the user passes
"--relative=subdir" (without the trailing slash), we produce inconsistent
results. For the unified diff format, we collapse the double-slash of
"a//file" correctly into "a/file". But for other formats (raw, stat,
name-status), we end up with "/file".
We can do what the user means here and strip the extra "/" (and only a
slash). We are not hurting any existing users of (2) above with this
behavior change because the existing output for this case was nonsensical.
Patch by Jakub, tests and commit message by Jeff King.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-08-09 14:50:53 +00:00
|
|
|
test_done
|