Skip to content

Commit 5072ad8

Browse files
committed
Merge branch 'xx/diff-tree-remerge-diff-fix' into maint-2.46
"git rev-list ... | git diff-tree -p --remerge-diff --stdin" should behave more or less like "git log -p --remerge-diff" but instead it crashed, forgetting to prepare a temporary object store needed. * xx/diff-tree-remerge-diff-fix: diff-tree: fix crash when used with --remerge-diff
2 parents 164cffa + a77554e commit 5072ad8

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

builtin/diff-tree.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "read-cache-ll.h"
99
#include "repository.h"
1010
#include "revision.h"
11+
#include "tmp-objdir.h"
1112
#include "tree.h"
1213

1314
static struct rev_info log_tree_opt;
@@ -166,6 +167,13 @@ int cmd_diff_tree(int argc, const char **argv, const char *prefix)
166167

167168
opt->diffopt.rotate_to_strict = 1;
168169

170+
if (opt->remerge_diff) {
171+
opt->remerge_objdir = tmp_objdir_create("remerge-diff");
172+
if (!opt->remerge_objdir)
173+
die(_("unable to create temporary object directory"));
174+
tmp_objdir_replace_primary_odb(opt->remerge_objdir, 1);
175+
}
176+
169177
/*
170178
* NOTE! We expect "a..b" to expand to "^a b" but it is
171179
* perfectly valid for revision range parser to yield "b ^a",
@@ -230,5 +238,10 @@ int cmd_diff_tree(int argc, const char **argv, const char *prefix)
230238
diff_free(&opt->diffopt);
231239
}
232240

241+
if (opt->remerge_diff) {
242+
tmp_objdir_destroy(opt->remerge_objdir);
243+
opt->remerge_objdir = NULL;
244+
}
245+
233246
return diff_result_code(&opt->diffopt);
234247
}

t/t4069-remerge-diff.sh

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,41 @@ test_expect_success 'can filter out additional headers with pickaxe' '
110110
test_must_be_empty actual
111111
'
112112

113+
test_expect_success 'remerge-diff also works for git-diff-tree' '
114+
# With a clean merge
115+
git diff-tree -r -p --remerge-diff --no-commit-id bc_resolution >actual &&
116+
test_must_be_empty actual &&
117+
118+
# With both a resolved conflict and an unrelated change
119+
cat <<-EOF >tmp &&
120+
diff --git a/numbers b/numbers
121+
remerge CONFLICT (content): Merge conflict in numbers
122+
index a1fb731..6875544 100644
123+
--- a/numbers
124+
+++ b/numbers
125+
@@ -1,13 +1,9 @@
126+
1
127+
2
128+
-<<<<<<< b0ed5cb (change_a)
129+
-three
130+
-=======
131+
-tres
132+
->>>>>>> 6cd3f82 (change_b)
133+
+drei
134+
4
135+
5
136+
6
137+
7
138+
-eight
139+
+acht
140+
9
141+
EOF
142+
sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >expect &&
143+
git diff-tree -r -p --remerge-diff --no-commit-id ab_resolution >tmp &&
144+
sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual &&
145+
test_cmp expect actual
146+
'
147+
113148
test_expect_success 'setup non-content conflicts' '
114149
git switch --orphan base &&
115150

0 commit comments

Comments
 (0)