Add git-checkpoint.html manual page
[git-osx-installer.git] / patches / jh / apply-correct-count.txt
blobe42b1349aeebadad856026c159961f130b2d6683
1 Received: by 10.52.8.42 with SMTP id o10csp460020vda;
2         Fri, 16 Jan 2015 15:54:28 -0800 (PST)
3 X-Received: by 10.140.22.49 with SMTP id 46mr18108225qgm.29.1421452467856;
4         Fri, 16 Jan 2015 15:54:27 -0800 (PST)
5 Return-Path: <junio@pobox.com>
6 Received: from sasl.smtp.pobox.com (pb-smtp1.int.icgroup.com. [208.72.237.35])
7         by mx.google.com with ESMTP id cy1si8209895qcb.41.2015.01.16.15.54.27;
8         Fri, 16 Jan 2015 15:54:27 -0800 (PST)
9 Received-SPF: pass (google.com: domain of junio@pobox.com designates 208.72.237.35 as permitted sender) client-ip=208.72.237.35;
10 Authentication-Results: mx.google.com;
11        spf=pass (google.com: domain of junio@pobox.com designates 208.72.237.35 as permitted sender) smtp.mail=junio@pobox.com;
12        dkim=pass header.i=@pobox.com
13 Received: from sasl.smtp.pobox.com (unknown [127.0.0.1])
14         by pb-smtp1.pobox.com (Postfix) with ESMTP id 666DF300A3;
15         Fri, 16 Jan 2015 18:54:27 -0500 (EST)
16 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=pobox.com; h=from:to:cc
17         :subject:references:date:in-reply-to:message-id:mime-version
18         :content-type; s=sasl; bh=zQQuK35SPIZFzhl2uX+pfxU0SzU=; b=dzIJy9
19         ZKSyyvL4UeUfF2KiKgQBQ3Wrl364yh+PR60xVrWz6gOqhoq54dl9q3vGV4DUTtFG
20         wWj2CGpAvyjuSpDHf6FGF817fpcipk3UplG3apnFxBbzLneDnwYbaJa70nwqIV2N
21         T7HaaIAeOhekHM4Lhtfs+DfqgYHradpcEbmhw=
22 DomainKey-Signature: a=rsa-sha1; c=nofws; d=pobox.com; h=from:to:cc
23         :subject:references:date:in-reply-to:message-id:mime-version
24         :content-type; q=dns; s=sasl; b=vqqctFFSnc7zMSmci5gE4qEoOSbluON2
25         49BHsu50E9KeyQfIhpJbvSrrsAdehDIZk+bm1Sqm/woq+W10aHmmaxdcmVKyROMk
26         /wHkrCT2Tma7rBbtZCMgD7qagcP2B9Ub2D/WhBReS7f5EQ78+g0BXllxAq8MAxU4
27         FmBjt0ocXzg=
28 Received: from pb-smtp1.int.icgroup.com (unknown [127.0.0.1])
29         by pb-smtp1.pobox.com (Postfix) with ESMTP id 5A935300A2;
30         Fri, 16 Jan 2015 18:54:27 -0500 (EST)
31 Received: from pobox.com (unknown [72.14.226.9])
32         (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits))
33         (No client certificate requested)
34         by pb-smtp1.pobox.com (Postfix) with ESMTPSA id D1F6A300A1;
35         Fri, 16 Jan 2015 18:54:26 -0500 (EST)
36 From: Junio C Hamano <gitster@pobox.com>
37 Cc:  Git List <git@vger.kernel.org>
38 Subject: [PATCH] apply: count the size of postimage correctly
39 References: <CAO2U3QjGUfnTRO_poS+=-MfE4aYGuWpVJTe20H-u=FgkVy-RYg@mail.gmail.com>
40         <CAO2U3Qjn9o_eYayEMCC3S6DBr9kVH7mPL00QGrXAnV2iYRP-=A@mail.gmail.com>
41         <CAO2U3Qj-Hg2tb72NgO6wb-aqAxFG7aga2ZDeZNDCPJzGtmHTAA@mail.gmail.com>
42         <CAO2U3Qhd_DPP09BUyMr6NKUtOe4EQQ7G83BRg7MbtQXFPjKv8w@mail.gmail.com>
43         <CAO2U3Qje-YwcV1d5BK_zZqrTki4AU=emdkUZzEEieRjmoQdmGg@mail.gmail.com>
44         <CAO2U3Qi4TWZiNoOQVSW=Ycvp3bpBySZrCGmRLCbRJJes_n2Wkw@mail.gmail.com>
45         <99579252-EF8A-4DAF-A49D-2AC5627ED9E3@gmail.com>
46         <4157F6B0-DDF4-4F71-A09B-EE216537CA89@gmail.com>
47         <xmqqbnly1oqo.fsf@gitster.dls.corp.google.com>
48 Date: Fri, 16 Jan 2015 15:54:25 -0800
49 In-Reply-To: <xmqqbnly1oqo.fsf@gitster.dls.corp.google.com> (Junio C. Hamano's
50         message of "Fri, 16 Jan 2015 11:58:55 -0800")
51 Message-ID: <xmqqzj9iz3gu.fsf_-_@gitster.dls.corp.google.com>
52 User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux)
53 MIME-Version: 1.0
54 Content-Type: text/plain
55 X-Pobox-Relay-ID:
56  010881B6-9DDB-11E4-903F-42529F42C9D4-77302942!pb-smtp1.pobox.com
58 Under --whitespace=fix option, match_fragment() function examines
59 the preimage (the common context and the removed lines in the patch)
60 and the file being patched and checks if they match after correcting
61 all whitespace errors.  When they are found to match, the common
62 context lines in the preimage is replaced with the fixed copy,
63 because these lines will then be copied to the corresponding place
64 in the postimage by a later call to update_pre_post_images().  Lines
65 that are added in the postimage, under --whitespace=fix, have their
66 whitespace errors already fixed when apply_one_fragment() prepares
67 the preimage and the postimage, so in the end, application of the
68 patch can be done by replacing the block of text in the file being
69 patched that matched the preimage with what is in the postimage that
70 was updated by update_pre_post_images().
72 In the earlier days, fixing whitespace errors always resulted in
73 reduction of size, either collapsing runs of spaces in the indent to
74 a tab or removing the trailing whitespaces.  These days, however,
75 some whitespace error fix results in extending the size.
77 250b3c6c (apply --whitespace=fix: avoid running over the postimage
78 buffer, 2013-03-22) tried to compute the final postimage size but
79 its math was flawed.  It counted the size of the block of text in
80 the original being patched after fixing the whitespace errors on its
81 lines that correspond to the preimage.  That number does not have
82 much to do with how big the final postimage would be.
84 Instead count (1) the added lines in the postimage, whose size is
85 the same as in the final patch result because their whitespace
86 errors have already been corrected, and (2) the fixed size of the
87 lines that are common.
89 Signed-off-by: Junio C Hamano <gitster@pobox.com>
90 ---
92  * This seems to fix the clojure test case without breaking existing
93    tests.  We would need a test case for this, though.
95  builtin/apply.c | 23 +++++++++++++++++++++--
96  1 file changed, 21 insertions(+), 2 deletions(-)
98 diff --git a/builtin/apply.c b/builtin/apply.c
99 index 622ee16..8e79510 100644
100 --- a/builtin/apply.c
101 +++ b/builtin/apply.c
102 @@ -2398,6 +2398,23 @@ static int match_fragment(struct image *img,
103          * ignore whitespace, we were asked to correct whitespace
104          * errors, so let's try matching after whitespace correction.
105          *
106 +        * While checking the preimage against the target, whitespace
107 +        * errors in both fixed, we count how large the corresponding
108 +        * postimage needs to be.  The postimage prepared by
109 +        * apply_one_fragment() has whitespace errors fixed on added
110 +        * lines already, but the common lines were propagated as-is,
111 +        * which may become longer when their whitespace errors are
112 +        * fixed.
113 +        */
115 +       /* First count added lines in postimage */
116 +       postlen = 0;
117 +       for (i = 0; i < postimage->nr; i++) {
118 +               if (!(postimage->line[i].flag & LINE_COMMON))
119 +                       postlen += postimage->line[i].len;
120 +       }
122 +       /*
123          * The preimage may extend beyond the end of the file,
124          * but in this loop we will only handle the part of the
125          * preimage that falls within the file.
126 @@ -2405,7 +2422,6 @@ static int match_fragment(struct image *img,
127         strbuf_init(&fixed, preimage->len + 1);
128         orig = preimage->buf;
129         target = img->buf + try;
130 -       postlen = 0;
131         for (i = 0; i < preimage_limit; i++) {
132                 size_t oldlen = preimage->line[i].len;
133                 size_t tgtlen = img->line[try_lno + i].len;
134 @@ -2433,7 +2449,10 @@ static int match_fragment(struct image *img,
135                 match = (tgtfix.len == fixed.len - fixstart &&
136                          !memcmp(tgtfix.buf, fixed.buf + fixstart,
137                                              fixed.len - fixstart));
138 -               postlen += tgtfix.len;
140 +               /* Add the length if this is common with the postimage */
141 +               if (preimage->line[i].flag & LINE_COMMON)
142 +                       postlen += tgtfix.len;
144                 strbuf_release(&tgtfix);
145                 if (!match)
146 -- 
147 2.3.0-rc0-157-g96da9ba