Skip to content

Commit ec4f70e

Browse files
committed
Merge branch 'pw/add-p-hunk-split-fix'
"git add -p" rewritten in C regressed hunk splitting in some cases, which has been corrected. * pw/add-p-hunk-split-fix: builtin add -p: fix hunk splitting t3701: clean up hunk splitting tests
2 parents e704a44 + 7008ddc commit ec4f70e

File tree

2 files changed

+56
-12
lines changed

2 files changed

+56
-12
lines changed

add-patch.c

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,17 @@ static int is_octal(const char *p, size_t len)
383383
return 1;
384384
}
385385

386+
static void complete_file(char marker, struct hunk *hunk)
387+
{
388+
if (marker == '-' || marker == '+')
389+
/*
390+
* Last hunk ended in non-context line (i.e. it
391+
* appended lines to the file, so there are no
392+
* trailing context lines).
393+
*/
394+
hunk->splittable_into++;
395+
}
396+
386397
static int parse_diff(struct add_p_state *s, const struct pathspec *ps)
387398
{
388399
struct strvec args = STRVEC_INIT;
@@ -472,6 +483,7 @@ static int parse_diff(struct add_p_state *s, const struct pathspec *ps)
472483
eol = pend;
473484

474485
if (starts_with(p, "diff ")) {
486+
complete_file(marker, hunk);
475487
ALLOC_GROW_BY(s->file_diff, s->file_diff_nr, 1,
476488
file_diff_alloc);
477489
file_diff = s->file_diff + s->file_diff_nr - 1;
@@ -598,13 +610,7 @@ static int parse_diff(struct add_p_state *s, const struct pathspec *ps)
598610
file_diff->hunk->colored_end = hunk->colored_end;
599611
}
600612
}
601-
602-
if (marker == '-' || marker == '+')
603-
/*
604-
* Last hunk ended in non-context line (i.e. it appended lines
605-
* to the file, so there are no trailing context lines).
606-
*/
607-
hunk->splittable_into++;
613+
complete_file(marker, hunk);
608614

609615
/* non-colored shorter than colored? */
610616
if (colored_p != colored_pend) {

t/t3701-add-interactive.sh

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,9 @@ test_expect_success 'correct message when there is nothing to do' '
326326
test_expect_success 'setup again' '
327327
git reset --hard &&
328328
test_chmod +x file &&
329-
echo content >>file
329+
echo content >>file &&
330+
test_write_lines A B C D>file2 &&
331+
git add file2
330332
'
331333

332334
# Write the patch file with a new line at the top and bottom
@@ -341,13 +343,27 @@ test_expect_success 'setup patch' '
341343
content
342344
+lastline
343345
\ No newline at end of file
346+
diff --git a/file2 b/file2
347+
index 8422d40..35b930a 100644
348+
--- a/file2
349+
+++ b/file2
350+
@@ -1,4 +1,5 @@
351+
-A
352+
+Z
353+
B
354+
+Y
355+
C
356+
-D
357+
+X
344358
EOF
345359
'
346360

347361
# Expected output, diff is similar to the patch but w/ diff at the top
348362
test_expect_success 'setup expected' '
349363
echo diff --git a/file b/file >expected &&
350-
cat patch |sed "/^index/s/ 100644/ 100755/" >>expected &&
364+
sed -e "/^index 180b47c/s/ 100644/ 100755/" \
365+
-e /1,5/s//1,4/ \
366+
-e /Y/d patch >>expected &&
351367
cat >expected-output <<-\EOF
352368
--- a/file
353369
+++ b/file
@@ -366,16 +382,38 @@ test_expect_success 'setup expected' '
366382
content
367383
+lastline
368384
\ No newline at end of file
385+
--- a/file2
386+
+++ b/file2
387+
@@ -1,4 +1,5 @@
388+
-A
389+
+Z
390+
B
391+
+Y
392+
C
393+
-D
394+
+X
395+
@@ -1,2 +1,2 @@
396+
-A
397+
+Z
398+
B
399+
@@ -2,2 +2,3 @@
400+
B
401+
+Y
402+
C
403+
@@ -3,2 +4,2 @@
404+
C
405+
-D
406+
+X
369407
EOF
370408
'
371409

372410
# Test splitting the first patch, then adding both
373411
test_expect_success 'add first line works' '
374412
git commit -am "clear local changes" &&
375413
git apply patch &&
376-
printf "%s\n" s y y | git add -p file 2>error |
377-
sed -n -e "s/^([1-2]\/[1-2]) Stage this hunk[^@]*\(@@ .*\)/\1/" \
378-
-e "/^[-+@ \\\\]"/p >output &&
414+
test_write_lines s y y s y n y | git add -p 2>error >raw-output &&
415+
sed -n -e "s/^([1-9]\/[1-9]) Stage this hunk[^@]*\(@@ .*\)/\1/" \
416+
-e "/^[-+@ \\\\]"/p raw-output >output &&
379417
test_must_be_empty error &&
380418
git diff --cached >diff &&
381419
diff_cmp expected diff &&

0 commit comments

Comments
 (0)