add-interactive: fix bogus diff header line ordering
authorJeff King <peff@peff.net>
Tue, 23 Feb 2010 01:05:44 +0000 (20:05 -0500)
committerJunio C Hamano <gitster@pobox.com>
Tue, 23 Feb 2010 03:23:49 +0000 (19:23 -0800)
commite1327ed5fbaca0af44db89d60c33b641e2f21ee1
tree7ecc644aa78d18b29077905a0f59ecd7a34ec06a
parent003c6abdb27c367747847a76b0a7890d67c794be
add-interactive: fix bogus diff header line ordering

When we look at a patch for adding hunks interactively, we
first split it into a header and a list of hunks. Some of
the header lines, such as mode changes and deletion, however,
become their own selectable hunks. Later when we reassemble
the patch, we simply concatenate the header and the selected
hunks. This leads to patches like this:

  diff --git a/file b/file
  index d95f3ad..0000000
  --- a/file
  +++ /dev/null
  deleted file mode 100644
  @@ -1 +0,0 @@
  -content

Notice how the deletion comes _after_ the ---/+++ lines,
when it should come before.

In many cases, we can get away with this as git-apply
accepts the slightly bogus input. However, in the specific
case of a deletion line that is being applied via "apply
-R", this malformed patch triggers an assert in git-apply.
This comes up when discarding a deletion via "git checkout
-p".

Rather than try to make git-apply accept our odd input,
let's just reassemble the patch in the correct order.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-add--interactive.perl
t/t2016-checkout-patch.sh