2009-07-23 05:48:29 +08:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
test_description='combined diff'
|
|
|
|
|
2020-11-19 07:44:27 +08:00
|
|
|
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
|
tests: mark tests relying on the current default for `init.defaultBranch`
In addition to the manual adjustment to let the `linux-gcc` CI job run
the test suite with `master` and then with `main`, this patch makes sure
that GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME is set in all test scripts
that currently rely on the initial branch name being `master by default.
To determine which test scripts to mark up, the first step was to
force-set the default branch name to `master` in
- all test scripts that contain the keyword `master`,
- t4211, which expects `t/t4211/history.export` with a hard-coded ref to
initialize the default branch,
- t5560 because it sources `t/t556x_common` which uses `master`,
- t8002 and t8012 because both source `t/annotate-tests.sh` which also
uses `master`)
This trick was performed by this command:
$ sed -i '/^ *\. \.\/\(test-lib\|lib-\(bash\|cvs\|git-svn\)\|gitweb-lib\)\.sh$/i\
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master\
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\
' $(git grep -l master t/t[0-9]*.sh) \
t/t4211*.sh t/t5560*.sh t/t8002*.sh t/t8012*.sh
After that, careful, manual inspection revealed that some of the test
scripts containing the needle `master` do not actually rely on a
specific default branch name: either they mention `master` only in a
comment, or they initialize that branch specificially, or they do not
actually refer to the current default branch. Therefore, the
aforementioned modification was undone in those test scripts thusly:
$ git checkout HEAD -- \
t/t0027-auto-crlf.sh t/t0060-path-utils.sh \
t/t1011-read-tree-sparse-checkout.sh \
t/t1305-config-include.sh t/t1309-early-config.sh \
t/t1402-check-ref-format.sh t/t1450-fsck.sh \
t/t2024-checkout-dwim.sh \
t/t2106-update-index-assume-unchanged.sh \
t/t3040-subprojects-basic.sh t/t3301-notes.sh \
t/t3308-notes-merge.sh t/t3423-rebase-reword.sh \
t/t3436-rebase-more-options.sh \
t/t4015-diff-whitespace.sh t/t4257-am-interactive.sh \
t/t5323-pack-redundant.sh t/t5401-update-hooks.sh \
t/t5511-refspec.sh t/t5526-fetch-submodules.sh \
t/t5529-push-errors.sh t/t5530-upload-pack-error.sh \
t/t5548-push-porcelain.sh \
t/t5552-skipping-fetch-negotiator.sh \
t/t5572-pull-submodule.sh t/t5608-clone-2gb.sh \
t/t5614-clone-submodules-shallow.sh \
t/t7508-status.sh t/t7606-merge-custom.sh \
t/t9302-fast-import-unpack-limit.sh
We excluded one set of test scripts in these commands, though: the range
of `git p4` tests. The reason? `git p4` stores the (foreign) remote
branch in the branch called `p4/master`, which is obviously not the
default branch. Manual analysis revealed that only five of these tests
actually require a specific default branch name to pass; They were
modified thusly:
$ sed -i '/^ *\. \.\/lib-git-p4\.sh$/i\
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master\
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\
' t/t980[0167]*.sh t/t9811*.sh
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-11-19 07:44:19 +08:00
|
|
|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
|
|
|
|
2009-07-23 05:48:29 +08:00
|
|
|
. ./test-lib.sh
|
2021-02-12 21:29:40 +08:00
|
|
|
. "$TEST_DIRECTORY"/lib-diff.sh
|
2009-07-23 05:48:29 +08:00
|
|
|
|
|
|
|
setup_helper () {
|
|
|
|
one=$1 branch=$2 side=$3 &&
|
|
|
|
|
|
|
|
git branch $side $branch &&
|
|
|
|
for l in $one two three fyra
|
|
|
|
do
|
|
|
|
echo $l
|
|
|
|
done >file &&
|
|
|
|
git add file &&
|
|
|
|
test_tick &&
|
|
|
|
git commit -m $branch &&
|
|
|
|
git checkout $side &&
|
|
|
|
for l in $one two three quatro
|
|
|
|
do
|
|
|
|
echo $l
|
|
|
|
done >file &&
|
|
|
|
git add file &&
|
|
|
|
test_tick &&
|
|
|
|
git commit -m $side &&
|
|
|
|
test_must_fail git merge $branch &&
|
|
|
|
for l in $one three four
|
|
|
|
do
|
|
|
|
echo $l
|
|
|
|
done >file &&
|
|
|
|
git add file &&
|
|
|
|
test_tick &&
|
|
|
|
git commit -m "merge $branch into $side"
|
|
|
|
}
|
|
|
|
|
|
|
|
verify_helper () {
|
|
|
|
it=$1 &&
|
|
|
|
|
|
|
|
# Ignore lines that were removed only from the other parent
|
|
|
|
sed -e '
|
|
|
|
1,/^@@@/d
|
|
|
|
/^ -/d
|
|
|
|
s/^\(.\)./\1/
|
|
|
|
' "$it" >"$it.actual.1" &&
|
|
|
|
sed -e '
|
|
|
|
1,/^@@@/d
|
|
|
|
/^- /d
|
|
|
|
s/^.\(.\)/\1/
|
|
|
|
' "$it" >"$it.actual.2" &&
|
|
|
|
|
|
|
|
git diff "$it^" "$it" -- | sed -e '1,/^@@/d' >"$it.expect.1" &&
|
|
|
|
test_cmp "$it.expect.1" "$it.actual.1" &&
|
|
|
|
|
|
|
|
git diff "$it^2" "$it" -- | sed -e '1,/^@@/d' >"$it.expect.2" &&
|
|
|
|
test_cmp "$it.expect.2" "$it.actual.2"
|
|
|
|
}
|
|
|
|
|
|
|
|
test_expect_success setup '
|
|
|
|
>file &&
|
|
|
|
git add file &&
|
|
|
|
test_tick &&
|
|
|
|
git commit -m initial &&
|
|
|
|
|
|
|
|
git branch withone &&
|
|
|
|
git branch sansone &&
|
|
|
|
|
|
|
|
git checkout withone &&
|
|
|
|
setup_helper one withone sidewithone &&
|
|
|
|
|
|
|
|
git checkout sansone &&
|
|
|
|
setup_helper "" sansone sidesansone
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'check combined output (1)' '
|
|
|
|
git show sidewithone -- >sidewithone &&
|
|
|
|
verify_helper sidewithone
|
|
|
|
'
|
|
|
|
|
2022-10-01 18:28:07 +08:00
|
|
|
test_expect_success 'check combined output (1) with git diff <rev>^!' '
|
|
|
|
git diff sidewithone^! -- >sidewithone &&
|
|
|
|
verify_helper sidewithone
|
|
|
|
'
|
|
|
|
|
2010-01-28 16:41:52 +08:00
|
|
|
test_expect_success 'check combined output (2)' '
|
2009-07-23 05:48:29 +08:00
|
|
|
git show sidesansone -- >sidesansone &&
|
|
|
|
verify_helper sidesansone
|
|
|
|
'
|
|
|
|
|
2022-10-01 18:28:07 +08:00
|
|
|
test_expect_success 'check combined output (2) with git diff <rev>^!' '
|
|
|
|
git diff sidesansone^! -- >sidesansone &&
|
|
|
|
verify_helper sidesansone
|
|
|
|
'
|
|
|
|
|
2010-04-15 20:59:37 +08:00
|
|
|
test_expect_success 'diagnose truncated file' '
|
|
|
|
>file &&
|
|
|
|
git add file &&
|
|
|
|
git commit --amend -C HEAD &&
|
|
|
|
git show >out &&
|
|
|
|
grep "diff --cc file" out
|
|
|
|
'
|
|
|
|
|
2013-02-06 05:39:49 +08:00
|
|
|
test_expect_success 'setup for --cc --raw' '
|
|
|
|
blob=$(echo file | git hash-object --stdin -w) &&
|
|
|
|
base_tree=$(echo "100644 blob $blob file" | git mktree) &&
|
|
|
|
trees= &&
|
2014-05-01 00:23:02 +08:00
|
|
|
for i in $(test_seq 1 40)
|
2013-02-06 05:39:49 +08:00
|
|
|
do
|
|
|
|
blob=$(echo file$i | git hash-object --stdin -w) &&
|
2021-12-09 13:11:13 +08:00
|
|
|
trees="$trees$(echo "100644 blob $blob file" | git mktree)$LF" || return 1
|
2013-02-06 05:39:49 +08:00
|
|
|
done
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'check --cc --raw with four trees' '
|
|
|
|
four_trees=$(echo "$trees" | sed -e 4q) &&
|
|
|
|
git diff --cc --raw $four_trees $base_tree >out &&
|
|
|
|
# Check for four leading colons in the output:
|
|
|
|
grep "^::::[^:]" out
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'check --cc --raw with forty trees' '
|
|
|
|
git diff --cc --raw $trees $base_tree >out &&
|
|
|
|
# Check for forty leading colons in the output:
|
|
|
|
grep "^::::::::::::::::::::::::::::::::::::::::[^:]" out
|
|
|
|
'
|
|
|
|
|
2013-03-15 05:03:14 +08:00
|
|
|
test_expect_success 'setup combined ignore spaces' '
|
2020-11-19 07:44:27 +08:00
|
|
|
git checkout main &&
|
2013-03-15 05:03:14 +08:00
|
|
|
>test &&
|
|
|
|
git add test &&
|
|
|
|
git commit -m initial &&
|
|
|
|
|
|
|
|
tr -d Q <<-\EOF >test &&
|
|
|
|
always coalesce
|
|
|
|
eol space coalesce Q
|
|
|
|
space change coalesce
|
|
|
|
all spa ces coalesce
|
|
|
|
eol spaces Q
|
|
|
|
space change
|
|
|
|
all spa ces
|
|
|
|
EOF
|
|
|
|
git commit -m "test space change" -a &&
|
|
|
|
|
|
|
|
git checkout -b side HEAD^ &&
|
|
|
|
tr -d Q <<-\EOF >test &&
|
|
|
|
always coalesce
|
|
|
|
eol space coalesce
|
|
|
|
space change coalesce
|
|
|
|
all spaces coalesce
|
|
|
|
eol spaces
|
|
|
|
space change
|
|
|
|
all spaces
|
|
|
|
EOF
|
|
|
|
git commit -m "test other space changes" -a &&
|
|
|
|
|
2020-11-19 07:44:27 +08:00
|
|
|
test_must_fail git merge main &&
|
2013-03-15 05:03:14 +08:00
|
|
|
tr -d Q <<-\EOF >test &&
|
|
|
|
eol spaces Q
|
|
|
|
space change
|
|
|
|
all spa ces
|
|
|
|
EOF
|
|
|
|
git commit -m merged -a
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'check combined output (no ignore space)' '
|
|
|
|
git show >actual.tmp &&
|
|
|
|
sed -e "1,/^@@@/d" < actual.tmp >actual &&
|
|
|
|
tr -d Q <<-\EOF >expected &&
|
|
|
|
--always coalesce
|
|
|
|
- eol space coalesce
|
|
|
|
- space change coalesce
|
|
|
|
- all spaces coalesce
|
|
|
|
- eol spaces
|
|
|
|
- space change
|
|
|
|
- all spaces
|
|
|
|
-eol space coalesce Q
|
|
|
|
-space change coalesce
|
|
|
|
-all spa ces coalesce
|
|
|
|
+ eol spaces Q
|
|
|
|
+ space change
|
|
|
|
+ all spa ces
|
|
|
|
EOF
|
|
|
|
compare_diff_patch expected actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'check combined output (ignore space at eol)' '
|
|
|
|
git show --ignore-space-at-eol >actual.tmp &&
|
|
|
|
sed -e "1,/^@@@/d" < actual.tmp >actual &&
|
|
|
|
tr -d Q <<-\EOF >expected &&
|
|
|
|
--always coalesce
|
|
|
|
--eol space coalesce
|
|
|
|
- space change coalesce
|
|
|
|
- all spaces coalesce
|
|
|
|
-space change coalesce
|
|
|
|
-all spa ces coalesce
|
|
|
|
eol spaces Q
|
|
|
|
- space change
|
|
|
|
- all spaces
|
|
|
|
+ space change
|
|
|
|
+ all spa ces
|
|
|
|
EOF
|
|
|
|
compare_diff_patch expected actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'check combined output (ignore space change)' '
|
|
|
|
git show -b >actual.tmp &&
|
|
|
|
sed -e "1,/^@@@/d" < actual.tmp >actual &&
|
|
|
|
tr -d Q <<-\EOF >expected &&
|
|
|
|
--always coalesce
|
|
|
|
--eol space coalesce
|
|
|
|
--space change coalesce
|
|
|
|
- all spaces coalesce
|
|
|
|
-all spa ces coalesce
|
|
|
|
eol spaces Q
|
|
|
|
space change
|
|
|
|
- all spaces
|
|
|
|
+ all spa ces
|
|
|
|
EOF
|
|
|
|
compare_diff_patch expected actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'check combined output (ignore all spaces)' '
|
|
|
|
git show -w >actual.tmp &&
|
|
|
|
sed -e "1,/^@@@/d" < actual.tmp >actual &&
|
|
|
|
tr -d Q <<-\EOF >expected &&
|
|
|
|
--always coalesce
|
|
|
|
--eol space coalesce
|
|
|
|
--space change coalesce
|
|
|
|
--all spaces coalesce
|
|
|
|
eol spaces Q
|
|
|
|
space change
|
|
|
|
all spa ces
|
|
|
|
EOF
|
|
|
|
compare_diff_patch expected actual
|
|
|
|
'
|
|
|
|
|
2013-03-24 01:23:28 +08:00
|
|
|
test_expect_success 'combine diff coalesce simple' '
|
|
|
|
>test &&
|
|
|
|
git add test &&
|
|
|
|
git commit -m initial &&
|
|
|
|
test_seq 4 >test &&
|
|
|
|
git commit -a -m empty1 &&
|
|
|
|
git branch side1 &&
|
|
|
|
git checkout HEAD^ &&
|
|
|
|
test_seq 5 >test &&
|
|
|
|
git commit -a -m empty2 &&
|
|
|
|
test_must_fail git merge side1 &&
|
|
|
|
>test &&
|
|
|
|
git commit -a -m merge &&
|
|
|
|
git show >actual.tmp &&
|
|
|
|
sed -e "1,/^@@@/d" < actual.tmp >actual &&
|
|
|
|
tr -d Q <<-\EOF >expected &&
|
|
|
|
--1
|
|
|
|
--2
|
|
|
|
--3
|
|
|
|
--4
|
|
|
|
- 5
|
|
|
|
EOF
|
|
|
|
compare_diff_patch expected actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'combine diff coalesce tricky' '
|
|
|
|
>test &&
|
|
|
|
git add test &&
|
|
|
|
git commit -m initial --allow-empty &&
|
|
|
|
cat <<-\EOF >test &&
|
|
|
|
3
|
|
|
|
1
|
|
|
|
2
|
|
|
|
3
|
|
|
|
4
|
|
|
|
EOF
|
|
|
|
git commit -a -m empty1 &&
|
|
|
|
git branch -f side1 &&
|
|
|
|
git checkout HEAD^ &&
|
|
|
|
cat <<-\EOF >test &&
|
|
|
|
1
|
|
|
|
3
|
|
|
|
5
|
|
|
|
4
|
|
|
|
EOF
|
|
|
|
git commit -a -m empty2 &&
|
|
|
|
git branch -f side2 &&
|
|
|
|
test_must_fail git merge side1 &&
|
|
|
|
>test &&
|
|
|
|
git commit -a -m merge &&
|
|
|
|
git show >actual.tmp &&
|
|
|
|
sed -e "1,/^@@@/d" < actual.tmp >actual &&
|
|
|
|
tr -d Q <<-\EOF >expected &&
|
|
|
|
-3
|
|
|
|
--1
|
|
|
|
-2
|
|
|
|
--3
|
|
|
|
- 5
|
|
|
|
--4
|
|
|
|
EOF
|
|
|
|
compare_diff_patch expected actual &&
|
|
|
|
git checkout -f side1 &&
|
|
|
|
test_must_fail git merge side2 &&
|
|
|
|
>test &&
|
|
|
|
git commit -a -m merge &&
|
|
|
|
git show >actual.tmp &&
|
|
|
|
sed -e "1,/^@@@/d" < actual.tmp >actual &&
|
|
|
|
tr -d Q <<-\EOF >expected &&
|
|
|
|
- 3
|
|
|
|
--1
|
|
|
|
- 2
|
|
|
|
--3
|
|
|
|
-5
|
|
|
|
--4
|
|
|
|
EOF
|
|
|
|
compare_diff_patch expected actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_failure 'combine diff coalesce three parents' '
|
|
|
|
>test &&
|
|
|
|
git add test &&
|
|
|
|
git commit -m initial --allow-empty &&
|
|
|
|
cat <<-\EOF >test &&
|
|
|
|
3
|
|
|
|
1
|
|
|
|
2
|
|
|
|
3
|
|
|
|
4
|
|
|
|
EOF
|
|
|
|
git commit -a -m empty1 &&
|
|
|
|
git checkout -B side1 &&
|
|
|
|
git checkout HEAD^ &&
|
|
|
|
cat <<-\EOF >test &&
|
|
|
|
1
|
|
|
|
3
|
|
|
|
7
|
|
|
|
5
|
|
|
|
4
|
|
|
|
EOF
|
|
|
|
git commit -a -m empty2 &&
|
|
|
|
git branch -f side2 &&
|
|
|
|
git checkout HEAD^ &&
|
|
|
|
cat <<-\EOF >test &&
|
|
|
|
3
|
|
|
|
1
|
|
|
|
6
|
|
|
|
5
|
|
|
|
4
|
|
|
|
EOF
|
|
|
|
git commit -a -m empty3 &&
|
|
|
|
>test &&
|
|
|
|
git add test &&
|
|
|
|
TREE=$(git write-tree) &&
|
|
|
|
COMMIT=$(git commit-tree -p HEAD -p side1 -p side2 -m merge $TREE) &&
|
|
|
|
git show $COMMIT >actual.tmp &&
|
|
|
|
sed -e "1,/^@@@/d" < actual.tmp >actual &&
|
|
|
|
tr -d Q <<-\EOF >expected &&
|
|
|
|
-- 3
|
|
|
|
---1
|
|
|
|
- 6
|
|
|
|
- 2
|
|
|
|
--3
|
|
|
|
-7
|
|
|
|
- -5
|
|
|
|
---4
|
|
|
|
EOF
|
|
|
|
compare_diff_patch expected actual
|
|
|
|
'
|
|
|
|
|
2013-05-16 01:42:14 +08:00
|
|
|
# Test for a bug reported at
|
2019-11-27 20:54:04 +08:00
|
|
|
# https://lore.kernel.org/git/20130515143508.GO25742@login.drsnuggles.stderr.nl/
|
2013-05-16 01:42:14 +08:00
|
|
|
# where a delete lines were missing from combined diff output when they
|
|
|
|
# occurred exactly before the context lines of a later change.
|
|
|
|
test_expect_success 'combine diff missing delete bug' '
|
|
|
|
git commit -m initial --allow-empty &&
|
|
|
|
cat <<-\EOF >test &&
|
|
|
|
1
|
|
|
|
2
|
|
|
|
3
|
|
|
|
4
|
|
|
|
EOF
|
|
|
|
git add test &&
|
|
|
|
git commit -a -m side1 &&
|
|
|
|
git checkout -B side1 &&
|
|
|
|
git checkout HEAD^ &&
|
|
|
|
cat <<-\EOF >test &&
|
|
|
|
0
|
|
|
|
1
|
|
|
|
2
|
|
|
|
3
|
|
|
|
4modified
|
|
|
|
EOF
|
|
|
|
git add test &&
|
|
|
|
git commit -m side2 &&
|
|
|
|
git branch -f side2 &&
|
|
|
|
test_must_fail git merge --no-commit side1 &&
|
|
|
|
cat <<-\EOF >test &&
|
|
|
|
1
|
|
|
|
2
|
|
|
|
3
|
|
|
|
4modified
|
|
|
|
EOF
|
|
|
|
git add test &&
|
|
|
|
git commit -a -m merge &&
|
|
|
|
git diff-tree -c -p HEAD >actual.tmp &&
|
|
|
|
sed -e "1,/^@@@/d" < actual.tmp >actual &&
|
|
|
|
tr -d Q <<-\EOF >expected &&
|
|
|
|
- 0
|
|
|
|
1
|
|
|
|
2
|
|
|
|
3
|
|
|
|
-4
|
|
|
|
+4modified
|
|
|
|
EOF
|
2013-06-03 06:56:46 +08:00
|
|
|
compare_diff_patch expected actual
|
2013-05-16 01:42:14 +08:00
|
|
|
'
|
|
|
|
|
intersect_paths: respect mode in git's tree-sort
When we do a combined diff, we individually diff against
each parent, and then use intersect_paths to do a parallel
walk through the sorted results and come up with a final
list of interesting paths.
The sort order here is that returned by the diffs, which
means it is in git's tree-order which sorts sub-trees as if
their paths have "/" at the end. When we do our parallel
walk, we need to use a comparison function which provides
the same order.
Since 8518ff8 (combine-diff: optimize combine_diff_path sets
intersection, 2014-01-20), we use a simple strcmp to
compare the pathnames, and get this wrong. It's somewhat
hard to trigger because normally a diff does not produce
tree entries at all, and therefore the sort order is the
same as a strcmp. However, if the "-t" option is used with
the diff, then we will produce diff_filepairs for both trees
and files.
We can use base_name_compare to do the comparison, just as
the tree-diff code does. Even though what we have are not
technically base names (they are full paths within the
tree), the end result is the same (we do not care about
interior slashes at all, only about the final character).
However, since we do not have the length of each path
stored, we take a slight shortcut: if neither of the entries
is a sub-tree then the comparison is equivalent to a strcmp.
This lets us skip the extra strlen calls in the common case
without having to reimplement base_name_compare from
scratch.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2014-08-20 10:14:30 +08:00
|
|
|
test_expect_success 'combine diff gets tree sorting right' '
|
|
|
|
# create a directory and a file that sort differently in trees
|
|
|
|
# versus byte-wise (implied "/" sorts after ".")
|
2020-11-19 07:44:27 +08:00
|
|
|
git checkout -f main &&
|
intersect_paths: respect mode in git's tree-sort
When we do a combined diff, we individually diff against
each parent, and then use intersect_paths to do a parallel
walk through the sorted results and come up with a final
list of interesting paths.
The sort order here is that returned by the diffs, which
means it is in git's tree-order which sorts sub-trees as if
their paths have "/" at the end. When we do our parallel
walk, we need to use a comparison function which provides
the same order.
Since 8518ff8 (combine-diff: optimize combine_diff_path sets
intersection, 2014-01-20), we use a simple strcmp to
compare the pathnames, and get this wrong. It's somewhat
hard to trigger because normally a diff does not produce
tree entries at all, and therefore the sort order is the
same as a strcmp. However, if the "-t" option is used with
the diff, then we will produce diff_filepairs for both trees
and files.
We can use base_name_compare to do the comparison, just as
the tree-diff code does. Even though what we have are not
technically base names (they are full paths within the
tree), the end result is the same (we do not care about
interior slashes at all, only about the final character).
However, since we do not have the length of each path
stored, we take a slight shortcut: if neither of the entries
is a sub-tree then the comparison is equivalent to a strcmp.
This lets us skip the extra strlen calls in the common case
without having to reimplement base_name_compare from
scratch.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2014-08-20 10:14:30 +08:00
|
|
|
mkdir foo &&
|
|
|
|
echo base >foo/one &&
|
|
|
|
echo base >foo/two &&
|
|
|
|
echo base >foo.ext &&
|
|
|
|
git add foo foo.ext &&
|
|
|
|
git commit -m base &&
|
|
|
|
|
|
|
|
# one side modifies a file in the directory, along with the root
|
|
|
|
# file...
|
2020-11-19 07:44:27 +08:00
|
|
|
echo main >foo/one &&
|
|
|
|
echo main >foo.ext &&
|
|
|
|
git commit -a -m main &&
|
intersect_paths: respect mode in git's tree-sort
When we do a combined diff, we individually diff against
each parent, and then use intersect_paths to do a parallel
walk through the sorted results and come up with a final
list of interesting paths.
The sort order here is that returned by the diffs, which
means it is in git's tree-order which sorts sub-trees as if
their paths have "/" at the end. When we do our parallel
walk, we need to use a comparison function which provides
the same order.
Since 8518ff8 (combine-diff: optimize combine_diff_path sets
intersection, 2014-01-20), we use a simple strcmp to
compare the pathnames, and get this wrong. It's somewhat
hard to trigger because normally a diff does not produce
tree entries at all, and therefore the sort order is the
same as a strcmp. However, if the "-t" option is used with
the diff, then we will produce diff_filepairs for both trees
and files.
We can use base_name_compare to do the comparison, just as
the tree-diff code does. Even though what we have are not
technically base names (they are full paths within the
tree), the end result is the same (we do not care about
interior slashes at all, only about the final character).
However, since we do not have the length of each path
stored, we take a slight shortcut: if neither of the entries
is a sub-tree then the comparison is equivalent to a strcmp.
This lets us skip the extra strlen calls in the common case
without having to reimplement base_name_compare from
scratch.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2014-08-20 10:14:30 +08:00
|
|
|
|
|
|
|
# the other side modifies the other file in the directory
|
|
|
|
git checkout -b other HEAD^ &&
|
|
|
|
echo other >foo/two &&
|
|
|
|
git commit -a -m other &&
|
|
|
|
|
|
|
|
# And now we merge. The files in the subdirectory will resolve cleanly,
|
|
|
|
# meaning that a combined diff will not find them interesting. But it
|
|
|
|
# will find the tree itself interesting, because it had to be merged.
|
2020-11-19 07:44:27 +08:00
|
|
|
git checkout main &&
|
intersect_paths: respect mode in git's tree-sort
When we do a combined diff, we individually diff against
each parent, and then use intersect_paths to do a parallel
walk through the sorted results and come up with a final
list of interesting paths.
The sort order here is that returned by the diffs, which
means it is in git's tree-order which sorts sub-trees as if
their paths have "/" at the end. When we do our parallel
walk, we need to use a comparison function which provides
the same order.
Since 8518ff8 (combine-diff: optimize combine_diff_path sets
intersection, 2014-01-20), we use a simple strcmp to
compare the pathnames, and get this wrong. It's somewhat
hard to trigger because normally a diff does not produce
tree entries at all, and therefore the sort order is the
same as a strcmp. However, if the "-t" option is used with
the diff, then we will produce diff_filepairs for both trees
and files.
We can use base_name_compare to do the comparison, just as
the tree-diff code does. Even though what we have are not
technically base names (they are full paths within the
tree), the end result is the same (we do not care about
interior slashes at all, only about the final character).
However, since we do not have the length of each path
stored, we take a slight shortcut: if neither of the entries
is a sub-tree then the comparison is equivalent to a strcmp.
This lets us skip the extra strlen calls in the common case
without having to reimplement base_name_compare from
scratch.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2014-08-20 10:14:30 +08:00
|
|
|
git merge other &&
|
|
|
|
|
|
|
|
printf "MM\tfoo\n" >expect &&
|
|
|
|
git diff-tree -c --name-status -t HEAD >actual.tmp &&
|
|
|
|
sed 1d <actual.tmp >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
log,diff-tree: add --combined-all-paths option
The combined diff format for merges will only list one filename, even if
rename or copy detection is active. For example, with raw format one
might see:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM describe.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR phooey.c
This doesn't let us know what the original name of bar.sh was in the
first parent, and doesn't let us know what either of the original names
of phooey.c were in either of the parents. In contrast, for non-merge
commits, raw format does provide original filenames (and a rename score
to boot). In order to also provide original filenames for merge
commits, add a --combined-all-paths option (which must be used with
either -c or --cc, and is likely only useful with rename or copy
detection active) so that we can print tab-separated filenames when
renames are involved. This transforms the above output to:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c desc.c desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM foo.sh bar.sh bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR fooey.c fuey.c phooey.c
Further, in patch format, this changes the from/to headers so that
instead of just having one "from" header, we get one for each parent.
For example, instead of having
--- a/phooey.c
+++ b/phooey.c
we would see
--- a/fooey.c
--- a/fuey.c
+++ b/phooey.c
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-02-08 09:12:46 +08:00
|
|
|
test_expect_success 'setup for --combined-all-paths' '
|
|
|
|
git branch side1c &&
|
|
|
|
git branch side2c &&
|
|
|
|
git checkout side1c &&
|
|
|
|
test_seq 1 10 >filename-side1c &&
|
2019-10-28 08:59:03 +08:00
|
|
|
side1cf=$(git hash-object filename-side1c) &&
|
log,diff-tree: add --combined-all-paths option
The combined diff format for merges will only list one filename, even if
rename or copy detection is active. For example, with raw format one
might see:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM describe.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR phooey.c
This doesn't let us know what the original name of bar.sh was in the
first parent, and doesn't let us know what either of the original names
of phooey.c were in either of the parents. In contrast, for non-merge
commits, raw format does provide original filenames (and a rename score
to boot). In order to also provide original filenames for merge
commits, add a --combined-all-paths option (which must be used with
either -c or --cc, and is likely only useful with rename or copy
detection active) so that we can print tab-separated filenames when
renames are involved. This transforms the above output to:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c desc.c desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM foo.sh bar.sh bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR fooey.c fuey.c phooey.c
Further, in patch format, this changes the from/to headers so that
instead of just having one "from" header, we get one for each parent.
For example, instead of having
--- a/phooey.c
+++ b/phooey.c
we would see
--- a/fooey.c
--- a/fuey.c
+++ b/phooey.c
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-02-08 09:12:46 +08:00
|
|
|
git add filename-side1c &&
|
|
|
|
git commit -m with &&
|
|
|
|
git checkout side2c &&
|
|
|
|
test_seq 1 9 >filename-side2c &&
|
|
|
|
echo ten >>filename-side2c &&
|
2019-10-28 08:59:03 +08:00
|
|
|
side2cf=$(git hash-object filename-side2c) &&
|
log,diff-tree: add --combined-all-paths option
The combined diff format for merges will only list one filename, even if
rename or copy detection is active. For example, with raw format one
might see:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM describe.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR phooey.c
This doesn't let us know what the original name of bar.sh was in the
first parent, and doesn't let us know what either of the original names
of phooey.c were in either of the parents. In contrast, for non-merge
commits, raw format does provide original filenames (and a rename score
to boot). In order to also provide original filenames for merge
commits, add a --combined-all-paths option (which must be used with
either -c or --cc, and is likely only useful with rename or copy
detection active) so that we can print tab-separated filenames when
renames are involved. This transforms the above output to:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c desc.c desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM foo.sh bar.sh bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR fooey.c fuey.c phooey.c
Further, in patch format, this changes the from/to headers so that
instead of just having one "from" header, we get one for each parent.
For example, instead of having
--- a/phooey.c
+++ b/phooey.c
we would see
--- a/fooey.c
--- a/fuey.c
+++ b/phooey.c
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-02-08 09:12:46 +08:00
|
|
|
git add filename-side2c &&
|
|
|
|
git commit -m iam &&
|
|
|
|
git checkout -b mergery side1c &&
|
|
|
|
git merge --no-commit side2c &&
|
|
|
|
git rm filename-side1c &&
|
|
|
|
echo eleven >>filename-side2c &&
|
|
|
|
git mv filename-side2c filename-merged &&
|
2019-10-28 08:59:03 +08:00
|
|
|
mergedf=$(git hash-object filename-merged) &&
|
log,diff-tree: add --combined-all-paths option
The combined diff format for merges will only list one filename, even if
rename or copy detection is active. For example, with raw format one
might see:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM describe.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR phooey.c
This doesn't let us know what the original name of bar.sh was in the
first parent, and doesn't let us know what either of the original names
of phooey.c were in either of the parents. In contrast, for non-merge
commits, raw format does provide original filenames (and a rename score
to boot). In order to also provide original filenames for merge
commits, add a --combined-all-paths option (which must be used with
either -c or --cc, and is likely only useful with rename or copy
detection active) so that we can print tab-separated filenames when
renames are involved. This transforms the above output to:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c desc.c desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM foo.sh bar.sh bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR fooey.c fuey.c phooey.c
Further, in patch format, this changes the from/to headers so that
instead of just having one "from" header, we get one for each parent.
For example, instead of having
--- a/phooey.c
+++ b/phooey.c
we would see
--- a/fooey.c
--- a/fuey.c
+++ b/phooey.c
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-02-08 09:12:46 +08:00
|
|
|
git add filename-merged &&
|
|
|
|
git commit
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '--combined-all-paths and --raw' '
|
2019-10-28 08:59:03 +08:00
|
|
|
cat <<-EOF >expect &&
|
|
|
|
::100644 100644 100644 $side1cf $side2cf $mergedf RR filename-side1c filename-side2c filename-merged
|
log,diff-tree: add --combined-all-paths option
The combined diff format for merges will only list one filename, even if
rename or copy detection is active. For example, with raw format one
might see:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM describe.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR phooey.c
This doesn't let us know what the original name of bar.sh was in the
first parent, and doesn't let us know what either of the original names
of phooey.c were in either of the parents. In contrast, for non-merge
commits, raw format does provide original filenames (and a rename score
to boot). In order to also provide original filenames for merge
commits, add a --combined-all-paths option (which must be used with
either -c or --cc, and is likely only useful with rename or copy
detection active) so that we can print tab-separated filenames when
renames are involved. This transforms the above output to:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c desc.c desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM foo.sh bar.sh bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR fooey.c fuey.c phooey.c
Further, in patch format, this changes the from/to headers so that
instead of just having one "from" header, we get one for each parent.
For example, instead of having
--- a/phooey.c
+++ b/phooey.c
we would see
--- a/fooey.c
--- a/fuey.c
+++ b/phooey.c
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-02-08 09:12:46 +08:00
|
|
|
EOF
|
|
|
|
git diff-tree -c -M --raw --combined-all-paths HEAD >actual.tmp &&
|
|
|
|
sed 1d <actual.tmp >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '--combined-all-paths and --cc' '
|
|
|
|
cat <<-\EOF >expect &&
|
|
|
|
--- a/filename-side1c
|
|
|
|
--- a/filename-side2c
|
|
|
|
+++ b/filename-merged
|
|
|
|
EOF
|
|
|
|
git diff-tree --cc -M --combined-all-paths HEAD >actual.tmp &&
|
|
|
|
grep ^[-+][-+][-+] <actual.tmp >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success FUNNYNAMES 'setup for --combined-all-paths with funny names' '
|
|
|
|
git branch side1d &&
|
|
|
|
git branch side2d &&
|
|
|
|
git checkout side1d &&
|
2019-03-18 07:02:39 +08:00
|
|
|
test_seq 1 10 >"$(printf "file\twith\ttabs")" &&
|
log,diff-tree: add --combined-all-paths option
The combined diff format for merges will only list one filename, even if
rename or copy detection is active. For example, with raw format one
might see:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM describe.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR phooey.c
This doesn't let us know what the original name of bar.sh was in the
first parent, and doesn't let us know what either of the original names
of phooey.c were in either of the parents. In contrast, for non-merge
commits, raw format does provide original filenames (and a rename score
to boot). In order to also provide original filenames for merge
commits, add a --combined-all-paths option (which must be used with
either -c or --cc, and is likely only useful with rename or copy
detection active) so that we can print tab-separated filenames when
renames are involved. This transforms the above output to:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c desc.c desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM foo.sh bar.sh bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR fooey.c fuey.c phooey.c
Further, in patch format, this changes the from/to headers so that
instead of just having one "from" header, we get one for each parent.
For example, instead of having
--- a/phooey.c
+++ b/phooey.c
we would see
--- a/fooey.c
--- a/fuey.c
+++ b/phooey.c
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-02-08 09:12:46 +08:00
|
|
|
git add file* &&
|
2019-10-28 08:59:03 +08:00
|
|
|
side1df=$(git hash-object *tabs) &&
|
log,diff-tree: add --combined-all-paths option
The combined diff format for merges will only list one filename, even if
rename or copy detection is active. For example, with raw format one
might see:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM describe.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR phooey.c
This doesn't let us know what the original name of bar.sh was in the
first parent, and doesn't let us know what either of the original names
of phooey.c were in either of the parents. In contrast, for non-merge
commits, raw format does provide original filenames (and a rename score
to boot). In order to also provide original filenames for merge
commits, add a --combined-all-paths option (which must be used with
either -c or --cc, and is likely only useful with rename or copy
detection active) so that we can print tab-separated filenames when
renames are involved. This transforms the above output to:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c desc.c desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM foo.sh bar.sh bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR fooey.c fuey.c phooey.c
Further, in patch format, this changes the from/to headers so that
instead of just having one "from" header, we get one for each parent.
For example, instead of having
--- a/phooey.c
+++ b/phooey.c
we would see
--- a/fooey.c
--- a/fuey.c
+++ b/phooey.c
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-02-08 09:12:46 +08:00
|
|
|
git commit -m with &&
|
|
|
|
git checkout side2d &&
|
2019-03-18 07:02:39 +08:00
|
|
|
test_seq 1 9 >"$(printf "i\tam\ttabbed")" &&
|
|
|
|
echo ten >>"$(printf "i\tam\ttabbed")" &&
|
log,diff-tree: add --combined-all-paths option
The combined diff format for merges will only list one filename, even if
rename or copy detection is active. For example, with raw format one
might see:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM describe.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR phooey.c
This doesn't let us know what the original name of bar.sh was in the
first parent, and doesn't let us know what either of the original names
of phooey.c were in either of the parents. In contrast, for non-merge
commits, raw format does provide original filenames (and a rename score
to boot). In order to also provide original filenames for merge
commits, add a --combined-all-paths option (which must be used with
either -c or --cc, and is likely only useful with rename or copy
detection active) so that we can print tab-separated filenames when
renames are involved. This transforms the above output to:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c desc.c desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM foo.sh bar.sh bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR fooey.c fuey.c phooey.c
Further, in patch format, this changes the from/to headers so that
instead of just having one "from" header, we get one for each parent.
For example, instead of having
--- a/phooey.c
+++ b/phooey.c
we would see
--- a/fooey.c
--- a/fuey.c
+++ b/phooey.c
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-02-08 09:12:46 +08:00
|
|
|
git add *tabbed &&
|
2019-10-28 08:59:03 +08:00
|
|
|
side2df=$(git hash-object *tabbed) &&
|
log,diff-tree: add --combined-all-paths option
The combined diff format for merges will only list one filename, even if
rename or copy detection is active. For example, with raw format one
might see:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM describe.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR phooey.c
This doesn't let us know what the original name of bar.sh was in the
first parent, and doesn't let us know what either of the original names
of phooey.c were in either of the parents. In contrast, for non-merge
commits, raw format does provide original filenames (and a rename score
to boot). In order to also provide original filenames for merge
commits, add a --combined-all-paths option (which must be used with
either -c or --cc, and is likely only useful with rename or copy
detection active) so that we can print tab-separated filenames when
renames are involved. This transforms the above output to:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c desc.c desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM foo.sh bar.sh bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR fooey.c fuey.c phooey.c
Further, in patch format, this changes the from/to headers so that
instead of just having one "from" header, we get one for each parent.
For example, instead of having
--- a/phooey.c
+++ b/phooey.c
we would see
--- a/fooey.c
--- a/fuey.c
+++ b/phooey.c
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-02-08 09:12:46 +08:00
|
|
|
git commit -m iam &&
|
|
|
|
git checkout -b funny-names-mergery side1d &&
|
|
|
|
git merge --no-commit side2d &&
|
|
|
|
git rm *tabs &&
|
2019-03-18 07:02:39 +08:00
|
|
|
echo eleven >>"$(printf "i\tam\ttabbed")" &&
|
log,diff-tree: add --combined-all-paths option
The combined diff format for merges will only list one filename, even if
rename or copy detection is active. For example, with raw format one
might see:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM describe.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR phooey.c
This doesn't let us know what the original name of bar.sh was in the
first parent, and doesn't let us know what either of the original names
of phooey.c were in either of the parents. In contrast, for non-merge
commits, raw format does provide original filenames (and a rename score
to boot). In order to also provide original filenames for merge
commits, add a --combined-all-paths option (which must be used with
either -c or --cc, and is likely only useful with rename or copy
detection active) so that we can print tab-separated filenames when
renames are involved. This transforms the above output to:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c desc.c desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM foo.sh bar.sh bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR fooey.c fuey.c phooey.c
Further, in patch format, this changes the from/to headers so that
instead of just having one "from" header, we get one for each parent.
For example, instead of having
--- a/phooey.c
+++ b/phooey.c
we would see
--- a/fooey.c
--- a/fuey.c
+++ b/phooey.c
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-02-08 09:12:46 +08:00
|
|
|
git mv "$(printf "i\tam\ttabbed")" "$(printf "fickle\tnaming")" &&
|
|
|
|
git add fickle* &&
|
2019-10-28 08:59:03 +08:00
|
|
|
headf=$(git hash-object fickle*) &&
|
|
|
|
git commit &&
|
|
|
|
head=$(git rev-parse HEAD)
|
log,diff-tree: add --combined-all-paths option
The combined diff format for merges will only list one filename, even if
rename or copy detection is active. For example, with raw format one
might see:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM describe.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR phooey.c
This doesn't let us know what the original name of bar.sh was in the
first parent, and doesn't let us know what either of the original names
of phooey.c were in either of the parents. In contrast, for non-merge
commits, raw format does provide original filenames (and a rename score
to boot). In order to also provide original filenames for merge
commits, add a --combined-all-paths option (which must be used with
either -c or --cc, and is likely only useful with rename or copy
detection active) so that we can print tab-separated filenames when
renames are involved. This transforms the above output to:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c desc.c desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM foo.sh bar.sh bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR fooey.c fuey.c phooey.c
Further, in patch format, this changes the from/to headers so that
instead of just having one "from" header, we get one for each parent.
For example, instead of having
--- a/phooey.c
+++ b/phooey.c
we would see
--- a/fooey.c
--- a/fuey.c
+++ b/phooey.c
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-02-08 09:12:46 +08:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success FUNNYNAMES '--combined-all-paths and --raw and funny names' '
|
2019-10-28 08:59:03 +08:00
|
|
|
cat <<-EOF >expect &&
|
|
|
|
::100644 100644 100644 $side1df $side2df $headf RR "file\twith\ttabs" "i\tam\ttabbed" "fickle\tnaming"
|
log,diff-tree: add --combined-all-paths option
The combined diff format for merges will only list one filename, even if
rename or copy detection is active. For example, with raw format one
might see:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM describe.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR phooey.c
This doesn't let us know what the original name of bar.sh was in the
first parent, and doesn't let us know what either of the original names
of phooey.c were in either of the parents. In contrast, for non-merge
commits, raw format does provide original filenames (and a rename score
to boot). In order to also provide original filenames for merge
commits, add a --combined-all-paths option (which must be used with
either -c or --cc, and is likely only useful with rename or copy
detection active) so that we can print tab-separated filenames when
renames are involved. This transforms the above output to:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c desc.c desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM foo.sh bar.sh bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR fooey.c fuey.c phooey.c
Further, in patch format, this changes the from/to headers so that
instead of just having one "from" header, we get one for each parent.
For example, instead of having
--- a/phooey.c
+++ b/phooey.c
we would see
--- a/fooey.c
--- a/fuey.c
+++ b/phooey.c
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-02-08 09:12:46 +08:00
|
|
|
EOF
|
|
|
|
git diff-tree -c -M --raw --combined-all-paths HEAD >actual.tmp &&
|
|
|
|
sed 1d <actual.tmp >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success FUNNYNAMES '--combined-all-paths and --raw -and -z and funny names' '
|
2019-10-28 08:59:03 +08:00
|
|
|
printf "$head\0::100644 100644 100644 $side1df $side2df $headf RR\0file\twith\ttabs\0i\tam\ttabbed\0fickle\tnaming\0" >expect &&
|
log,diff-tree: add --combined-all-paths option
The combined diff format for merges will only list one filename, even if
rename or copy detection is active. For example, with raw format one
might see:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM describe.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR phooey.c
This doesn't let us know what the original name of bar.sh was in the
first parent, and doesn't let us know what either of the original names
of phooey.c were in either of the parents. In contrast, for non-merge
commits, raw format does provide original filenames (and a rename score
to boot). In order to also provide original filenames for merge
commits, add a --combined-all-paths option (which must be used with
either -c or --cc, and is likely only useful with rename or copy
detection active) so that we can print tab-separated filenames when
renames are involved. This transforms the above output to:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c desc.c desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM foo.sh bar.sh bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR fooey.c fuey.c phooey.c
Further, in patch format, this changes the from/to headers so that
instead of just having one "from" header, we get one for each parent.
For example, instead of having
--- a/phooey.c
+++ b/phooey.c
we would see
--- a/fooey.c
--- a/fuey.c
+++ b/phooey.c
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-02-08 09:12:46 +08:00
|
|
|
git diff-tree -c -M --raw --combined-all-paths -z HEAD >actual &&
|
2019-09-21 06:06:01 +08:00
|
|
|
test_cmp expect actual
|
log,diff-tree: add --combined-all-paths option
The combined diff format for merges will only list one filename, even if
rename or copy detection is active. For example, with raw format one
might see:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM describe.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR phooey.c
This doesn't let us know what the original name of bar.sh was in the
first parent, and doesn't let us know what either of the original names
of phooey.c were in either of the parents. In contrast, for non-merge
commits, raw format does provide original filenames (and a rename score
to boot). In order to also provide original filenames for merge
commits, add a --combined-all-paths option (which must be used with
either -c or --cc, and is likely only useful with rename or copy
detection active) so that we can print tab-separated filenames when
renames are involved. This transforms the above output to:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c desc.c desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM foo.sh bar.sh bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR fooey.c fuey.c phooey.c
Further, in patch format, this changes the from/to headers so that
instead of just having one "from" header, we get one for each parent.
For example, instead of having
--- a/phooey.c
+++ b/phooey.c
we would see
--- a/fooey.c
--- a/fuey.c
+++ b/phooey.c
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-02-08 09:12:46 +08:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success FUNNYNAMES '--combined-all-paths and --cc and funny names' '
|
|
|
|
cat <<-\EOF >expect &&
|
|
|
|
--- "a/file\twith\ttabs"
|
|
|
|
--- "a/i\tam\ttabbed"
|
|
|
|
+++ "b/fickle\tnaming"
|
|
|
|
EOF
|
|
|
|
git diff-tree --cc -M --combined-all-paths HEAD >actual.tmp &&
|
|
|
|
grep ^[-+][-+][-+] <actual.tmp >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2009-07-23 05:48:29 +08:00
|
|
|
test_done
|