From: Clemens Buchacher <drizzd@aon.at>
To: Junio C Hamano <gitster@pobox.com>
Cc: "Shawn O. Pearce" <spearce@spearce.org>, git@vger.kernel.org
Subject: [PATCH] git apply: do not match beginning in special unidiff-zero case
Date: Sat, 30 Aug 2008 21:03:02 +0200 [thread overview]
Message-ID: <20080830190302.GA29851@localhost> (raw)
In-Reply-To: <7vhc92ie44.fsf@gitster.siamese.dyndns.org>
If a unidiff patch without any context modifies the second line, it does
not match the beginning, even though oldpos == 1.
Signed-off-by: Clemens Buchacher <drizzd@aon.at>
---
On Sat, Aug 30, 2008 at 10:53:15AM -0700, Junio C Hamano wrote:
> Clemens Buchacher <drizzd@aon.at> writes:
>
> > echo a > victim
> > git add victim
> > echo b >> victim
> > git diff -U0 | git apply --cached --unidiff-zero
> > git diff
>
> I think "diff -U0" there would say "@@ -1,0 +2 @@", iow "add this one line
> after the first line", and "apply" has an off-by-one in this case.
Indeed. This appears to fix problems with staging hunks in git gui, even
with zero context lines. Staging individual lines still doesn't work,
though.
Clemens
builtin-apply.c | 9 ++++-----
t/t4104-apply-boundary.sh | 15 ++++++++++++---
2 files changed, 16 insertions(+), 8 deletions(-)
diff --git a/builtin-apply.c b/builtin-apply.c
index 2216a0b..8402f9d 100644
--- a/builtin-apply.c
+++ b/builtin-apply.c
@@ -1994,16 +1994,15 @@ static int apply_one_fragment(struct image *img, struct fragment *frag,
trailing = frag->trailing;
/*
- * A hunk to change lines at the beginning would begin with
+ * Unless the patch was generated with unidiff without any context, a
+ * hunk to change lines at the beginning would begin with
* @@ -1,L +N,M @@
*
* And a hunk to add to an empty file would begin with
* @@ -0,0 +N,M @@
- *
- * In other words, a hunk that is (frag->oldpos <= 1) with or
- * without leading context must match at the beginning.
*/
- match_beginning = frag->oldpos <= 1;
+ match_beginning = frag->oldpos == 0 ||
+ (!unidiff_zero && frag->oldpos == 1);
/*
* A hunk without trailing lines must match at the end.
diff --git a/t/t4104-apply-boundary.sh b/t/t4104-apply-boundary.sh
index e7e2913..0e3ce36 100755
--- a/t/t4104-apply-boundary.sh
+++ b/t/t4104-apply-boundary.sh
@@ -27,6 +27,15 @@ test_expect_success setup '
git diff victim >add-a-patch.with &&
git diff --unified=0 >add-a-patch.without &&
+ : insert at line two
+ for i in b a '"$L"' y
+ do
+ echo $i
+ done >victim &&
+ cat victim >insert-a-expect &&
+ git diff victim >insert-a-patch.with &&
+ git diff --unified=0 >insert-a-patch.without &&
+
: modify at the head
for i in a '"$L"' y
do
@@ -55,7 +64,7 @@ test_expect_success setup '
git diff --unified=0 >add-z-patch.without &&
: modify at the tail
- for i in a '"$L"' y
+ for i in b '"$L"' z
do
echo $i
done >victim &&
@@ -81,7 +90,7 @@ do
with) u= ;;
without) u='--unidiff-zero ' ;;
esac
- for kind in add-a add-z mod-a mod-z del-a del-z
+ for kind in add-a add-z insert-a mod-a mod-z del-a del-z
do
test_expect_success "apply $kind-patch $with context" '
cat original >victim &&
@@ -95,7 +104,7 @@ do
done
done
-for kind in add-a add-z mod-a mod-z del-a del-z
+for kind in add-a add-z insert-a mod-a mod-z del-a del-z
do
rm -f $kind-ng.without
sed -e "s/^diff --git /diff /" \
--
1.6.0
next prev parent reply other threads:[~2008-08-30 19:03 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-08-30 16:45 [PATCH] git gui: show diffs with a minimum of 1 context line Clemens Buchacher
2008-08-30 16:56 ` [PATCH] git gui: use apply --unidiff-zero when staging hunks without context Clemens Buchacher
2008-08-30 17:53 ` Junio C Hamano
2008-08-30 19:03 ` Clemens Buchacher [this message]
2008-08-30 19:54 ` [PATCH] git apply: do not match beginning in special unidiff-zero case Junio C Hamano
2008-08-30 19:40 ` [PATCH] git-apply: Loosen "match_beginning" logic Junio C Hamano
2008-08-30 19:43 ` [PATCH] git gui: use apply --unidiff-zero when staging hunks without context Johannes Sixt
2008-08-30 20:27 ` Clemens Buchacher
2008-08-30 20:52 ` Junio C Hamano
2008-08-30 21:00 ` Clemens Buchacher
2008-09-01 19:40 ` Shawn O. Pearce
2008-08-30 17:19 ` [PATCH] git gui: show diffs with a minimum of 1 context line Junio C Hamano
2008-08-30 17:30 ` Junio C Hamano
2008-08-30 20:46 ` Clemens Buchacher
2008-09-01 19:33 ` Shawn O. Pearce
2008-09-01 19:41 ` Clemens Buchacher
2008-09-01 19:47 ` Shawn O. Pearce
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080830190302.GA29851@localhost \
--to=drizzd@aon.at \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=spearce@spearce.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).