Skip to content

Commit

Permalink
Merge branch 'jc/apply-trailing-blank-removal' into maint
Browse files Browse the repository at this point in the history
"git apply" misbehaved when fixing whitespace breakages by removing
excess trailing blank lines.

* jc/apply-trailing-blank-removal:
  apply.c:update_pre_post_images(): the preimage can be truncated
  • Loading branch information
gitster committed Jan 14, 2013
2 parents 659742f + 5de7166 commit 7842c44
Showing 1 changed file with 17 additions and 6 deletions.
23 changes: 17 additions & 6 deletions builtin/apply.c
Original file line number Diff line number Diff line change
Expand Up @@ -2095,7 +2095,7 @@ static void update_pre_post_images(struct image *preimage,
char *buf,
size_t len, size_t postlen)
{
int i, ctx;
int i, ctx, reduced;
char *new, *old, *fixed;
struct image fixed_preimage;

Expand All @@ -2105,8 +2105,10 @@ static void update_pre_post_images(struct image *preimage,
* free "oldlines".
*/
prepare_image(&fixed_preimage, buf, len, 1);
assert(fixed_preimage.nr == preimage->nr);
for (i = 0; i < preimage->nr; i++)
assert(postlen
? fixed_preimage.nr == preimage->nr
: fixed_preimage.nr <= preimage->nr);
for (i = 0; i < fixed_preimage.nr; i++)
fixed_preimage.line[i].flag = preimage->line[i].flag;
free(preimage->line_allocated);
*preimage = fixed_preimage;
Expand All @@ -2126,7 +2128,8 @@ static void update_pre_post_images(struct image *preimage,
else
new = old;
fixed = preimage->buf;
for (i = ctx = 0; i < postimage->nr; i++) {

for (i = reduced = ctx = 0; i < postimage->nr; i++) {
size_t len = postimage->line[i].len;
if (!(postimage->line[i].flag & LINE_COMMON)) {
/* an added line -- no counterparts in preimage */
Expand All @@ -2145,8 +2148,15 @@ static void update_pre_post_images(struct image *preimage,
fixed += preimage->line[ctx].len;
ctx++;
}
if (preimage->nr <= ctx)
die(_("oops"));

/*
* preimage is expected to run out, if the caller
* fixed addition of trailing blank lines.
*/
if (preimage->nr <= ctx) {
reduced++;
continue;
}

/* and copy it in, while fixing the line length */
len = preimage->line[ctx].len;
Expand All @@ -2159,6 +2169,7 @@ static void update_pre_post_images(struct image *preimage,

/* Fix the length of the whole thing */
postimage->len = new - postimage->buf;
postimage->nr -= reduced;
}

static int match_fragment(struct image *img,
Expand Down

0 comments on commit 7842c44

Please sign in to comment.