builtin-apply.c: do not feed copy_wsfix() leading '+'
The "patch" parameter used to include leading '+' of an added line in the patch, and the array was treated as 1-based. Make it accept the contents of the line alone and simplify the code. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
8441a9a842
commit
42ab241cfa
@ -1646,16 +1646,15 @@ static int copy_wsfix(char *output, const char *patch, int plen,
|
|||||||
unsigned ws_rule)
|
unsigned ws_rule)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* plen is number of bytes to be copied from patch,
|
* plen is number of bytes to be copied from patch, starting
|
||||||
* starting at patch+1 (patch[0] is '+'). Typically
|
* at patch. Typically patch[plen-1] is '\n', unless this is
|
||||||
* patch[plen] is '\n', unless this is the incomplete
|
* the incomplete last line.
|
||||||
* last line.
|
|
||||||
*/
|
*/
|
||||||
int i;
|
int i;
|
||||||
int add_nl_to_tail = 0;
|
int add_nl_to_tail = 0;
|
||||||
int fixed = 0;
|
int fixed = 0;
|
||||||
int last_tab_in_indent = 0;
|
int last_tab_in_indent = -1;
|
||||||
int last_space_in_indent = 0;
|
int last_space_in_indent = -1;
|
||||||
int need_fix_leading_space = 0;
|
int need_fix_leading_space = 0;
|
||||||
char *buf;
|
char *buf;
|
||||||
|
|
||||||
@ -1663,11 +1662,11 @@ static int copy_wsfix(char *output, const char *patch, int plen,
|
|||||||
* Strip trailing whitespace
|
* Strip trailing whitespace
|
||||||
*/
|
*/
|
||||||
if ((ws_rule & WS_TRAILING_SPACE) &&
|
if ((ws_rule & WS_TRAILING_SPACE) &&
|
||||||
(1 < plen && isspace(patch[plen-1]))) {
|
(2 < plen && isspace(patch[plen-2]))) {
|
||||||
if (patch[plen] == '\n')
|
if (patch[plen-1] == '\n')
|
||||||
add_nl_to_tail = 1;
|
add_nl_to_tail = 1;
|
||||||
plen--;
|
plen--;
|
||||||
while (0 < plen && isspace(patch[plen]))
|
while (0 < plen && isspace(patch[plen-1]))
|
||||||
plen--;
|
plen--;
|
||||||
fixed = 1;
|
fixed = 1;
|
||||||
}
|
}
|
||||||
@ -1675,25 +1674,25 @@ static int copy_wsfix(char *output, const char *patch, int plen,
|
|||||||
/*
|
/*
|
||||||
* Check leading whitespaces (indent)
|
* Check leading whitespaces (indent)
|
||||||
*/
|
*/
|
||||||
for (i = 1; i < plen; i++) {
|
for (i = 0; i < plen; i++) {
|
||||||
char ch = patch[i];
|
char ch = patch[i];
|
||||||
if (ch == '\t') {
|
if (ch == '\t') {
|
||||||
last_tab_in_indent = i;
|
last_tab_in_indent = i;
|
||||||
if ((ws_rule & WS_SPACE_BEFORE_TAB) &&
|
if ((ws_rule & WS_SPACE_BEFORE_TAB) &&
|
||||||
0 < last_space_in_indent)
|
0 <= last_space_in_indent)
|
||||||
need_fix_leading_space = 1;
|
need_fix_leading_space = 1;
|
||||||
} else if (ch == ' ') {
|
} else if (ch == ' ') {
|
||||||
last_space_in_indent = i;
|
last_space_in_indent = i;
|
||||||
if ((ws_rule & WS_INDENT_WITH_NON_TAB) &&
|
if ((ws_rule & WS_INDENT_WITH_NON_TAB) &&
|
||||||
8 <= i - last_tab_in_indent)
|
8 <= i - last_tab_in_indent)
|
||||||
need_fix_leading_space = 1;
|
need_fix_leading_space = 1;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf = output;
|
buf = output;
|
||||||
if (need_fix_leading_space) {
|
if (need_fix_leading_space) {
|
||||||
|
/* Process indent ourselves */
|
||||||
int consecutive_spaces = 0;
|
int consecutive_spaces = 0;
|
||||||
int last = last_tab_in_indent + 1;
|
int last = last_tab_in_indent + 1;
|
||||||
|
|
||||||
@ -1706,10 +1705,10 @@ static int copy_wsfix(char *output, const char *patch, int plen,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* between patch[1..last], strip the funny spaces,
|
* between patch[0..last-1], strip the funny spaces,
|
||||||
* updating them to tab as needed.
|
* updating them to tab as needed.
|
||||||
*/
|
*/
|
||||||
for (i = 1; i < last; i++, plen--) {
|
for (i = 0; i < last; i++) {
|
||||||
char ch = patch[i];
|
char ch = patch[i];
|
||||||
if (ch != ' ') {
|
if (ch != ' ') {
|
||||||
consecutive_spaces = 0;
|
consecutive_spaces = 0;
|
||||||
@ -1724,13 +1723,12 @@ static int copy_wsfix(char *output, const char *patch, int plen,
|
|||||||
}
|
}
|
||||||
while (0 < consecutive_spaces--)
|
while (0 < consecutive_spaces--)
|
||||||
*output++ = ' ';
|
*output++ = ' ';
|
||||||
|
plen -= last;
|
||||||
|
patch += last;
|
||||||
fixed = 1;
|
fixed = 1;
|
||||||
i = last;
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
i = 1;
|
|
||||||
|
|
||||||
memcpy(output, patch + i, plen);
|
memcpy(output, patch, plen);
|
||||||
if (add_nl_to_tail)
|
if (add_nl_to_tail)
|
||||||
output[plen++] = '\n';
|
output[plen++] = '\n';
|
||||||
if (fixed)
|
if (fixed)
|
||||||
@ -1871,7 +1869,7 @@ static int apply_one_fragment(struct image *img, struct fragment *frag,
|
|||||||
added = plen;
|
added = plen;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
added = copy_wsfix(new, patch, plen, ws_rule);
|
added = copy_wsfix(new, patch + 1, plen, ws_rule);
|
||||||
}
|
}
|
||||||
add_line_info(&postimage, new, added,
|
add_line_info(&postimage, new, added,
|
||||||
(first == '+' ? 0 : LINE_COMMON));
|
(first == '+' ? 0 : LINE_COMMON));
|
||||||
|
Loading…
Reference in New Issue
Block a user