builtin/apply: move 'state_linenr' global into 'struct apply_state'

To libify the apply functionality the 'state_linenr' variable should
not be static and global to the file. Let's move it into
'struct apply_state'.

Reviewed-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Christian Couder 2016-05-24 10:11:20 +02:00 committed by Junio C Hamano
parent 1ffec303ab
commit d7263d097c

View File

@ -73,6 +73,9 @@ struct apply_state {
struct string_list limit_by_name;
int has_include;
/* Various "current state" */
int linenr; /* current line number */
/*
* For "diff-stat" like behaviour, we keep track of the biggest change
* we've seen, and the longest filename. That allows us to do simple
@ -149,13 +152,6 @@ static void set_default_whitespace_mode(struct apply_state *state)
state->ws_error_action = (state->apply ? warn_on_ws_error : nowarn_ws_error);
}
/*
* Various "current state", notably line numbers and what
* file (and how) we're patching right now.. The "is_xxxx"
* things are flags, where -1 means "don't know yet".
*/
static int state_linenr = 1;
/*
* This represents one "hunk" from a patch, starting with
* "@@ -oldpos,oldlines +newpos,newlines @@" marker. The
@ -932,7 +928,7 @@ static void parse_traditional_patch(struct apply_state *state,
}
}
if (!name)
die(_("unable to find filename in patch at line %d"), state_linenr);
die(_("unable to find filename in patch at line %d"), state->linenr);
}
static int gitdiff_hdrend(struct apply_state *state,
@ -970,17 +966,17 @@ static void gitdiff_verify_name(struct apply_state *state,
char *another;
if (isnull)
die(_("git apply: bad git-diff - expected /dev/null, got %s on line %d"),
*name, state_linenr);
*name, state->linenr);
another = find_name(state, line, NULL, state->p_value, TERM_TAB);
if (!another || memcmp(another, *name, len + 1))
die((side == DIFF_NEW_NAME) ?
_("git apply: bad git-diff - inconsistent new filename on line %d") :
_("git apply: bad git-diff - inconsistent old filename on line %d"), state_linenr);
_("git apply: bad git-diff - inconsistent old filename on line %d"), state->linenr);
free(another);
} else {
/* expect "/dev/null" */
if (memcmp("/dev/null", line, 9) || line[9] != '\n')
die(_("git apply: bad git-diff - expected /dev/null on line %d"), state_linenr);
die(_("git apply: bad git-diff - expected /dev/null on line %d"), state->linenr);
}
}
@ -1343,8 +1339,8 @@ static int parse_git_header(struct apply_state *state,
line += len;
size -= len;
state_linenr++;
for (offset = len ; size > 0 ; offset += len, size -= len, line += len, state_linenr++) {
state->linenr++;
for (offset = len ; size > 0 ; offset += len, size -= len, line += len, state->linenr++) {
static const struct opentry {
const char *str;
int (*fn)(struct apply_state *, const char *, struct patch *);
@ -1515,7 +1511,7 @@ static int find_header(struct apply_state *state,
patch->is_new = patch->is_delete = -1;
patch->old_mode = patch->new_mode = 0;
patch->old_name = patch->new_name = NULL;
for (offset = 0; size > 0; offset += len, size -= len, line += len, state_linenr++) {
for (offset = 0; size > 0; offset += len, size -= len, line += len, state->linenr++) {
unsigned long nextlen;
len = linelen(line, size);
@ -1536,7 +1532,7 @@ static int find_header(struct apply_state *state,
if (parse_fragment_header(line, len, &dummy) < 0)
continue;
die(_("patch fragment without header at line %d: %.*s"),
state_linenr, (int)len-1, line);
state->linenr, (int)len-1, line);
}
if (size < len + 6)
@ -1557,13 +1553,13 @@ static int find_header(struct apply_state *state,
"git diff header lacks filename information when removing "
"%d leading pathname components (line %d)",
state->p_value),
state->p_value, state_linenr);
state->p_value, state->linenr);
patch->old_name = xstrdup(patch->def_name);
patch->new_name = xstrdup(patch->def_name);
}
if (!patch->is_delete && !patch->new_name)
die("git diff header lacks filename information "
"(line %d)", state_linenr);
"(line %d)", state->linenr);
patch->is_toplevel_relative = 1;
*hdrsize = git_hdr_len;
return offset;
@ -1585,7 +1581,7 @@ static int find_header(struct apply_state *state,
/* Ok, we'll consider it a patch */
parse_traditional_patch(state, line, line+len, patch);
*hdrsize = len + nextlen;
state_linenr += 2;
state->linenr += 2;
return offset;
}
return -1;
@ -1620,7 +1616,7 @@ static void check_whitespace(struct apply_state *state,
{
unsigned result = ws_check(line + 1, len - 1, ws_rule);
record_ws_error(state, result, line + 1, len - 2, state_linenr);
record_ws_error(state, result, line + 1, len - 2, state->linenr);
}
/*
@ -1653,11 +1649,11 @@ static int parse_fragment(struct apply_state *state,
/* Parse the thing.. */
line += len;
size -= len;
state_linenr++;
state->linenr++;
added = deleted = 0;
for (offset = len;
0 < size;
offset += len, size -= len, line += len, state_linenr++) {
offset += len, size -= len, line += len, state->linenr++) {
if (!oldlines && !newlines)
break;
len = linelen(line, size);
@ -1756,10 +1752,10 @@ static int parse_single_patch(struct apply_state *state,
int len;
fragment = xcalloc(1, sizeof(*fragment));
fragment->linenr = state_linenr;
fragment->linenr = state->linenr;
len = parse_fragment(state, line, size, patch, fragment);
if (len <= 0)
die(_("corrupt patch at line %d"), state_linenr);
die(_("corrupt patch at line %d"), state->linenr);
fragment->patch = line;
fragment->size = len;
oldlines += fragment->oldlines;
@ -1845,7 +1841,8 @@ static char *inflate_it(const void *data, unsigned long size,
* points at an allocated memory that the caller must free, so
* it is marked as "->free_patch = 1".
*/
static struct fragment *parse_binary_hunk(char **buf_p,
static struct fragment *parse_binary_hunk(struct apply_state *state,
char **buf_p,
unsigned long *sz_p,
int *status_p,
int *used_p)
@ -1887,13 +1884,13 @@ static struct fragment *parse_binary_hunk(char **buf_p,
else
return NULL;
state_linenr++;
state->linenr++;
buffer += llen;
while (1) {
int byte_length, max_byte_length, newsize;
llen = linelen(buffer, size);
used += llen;
state_linenr++;
state->linenr++;
if (llen == 1) {
/* consume the blank line */
buffer++;
@ -1947,7 +1944,7 @@ static struct fragment *parse_binary_hunk(char **buf_p,
free(data);
*status_p = -1;
error(_("corrupt binary patch at line %d: %.*s"),
state_linenr-1, llen-1, buffer);
state->linenr-1, llen-1, buffer);
return NULL;
}
@ -1956,7 +1953,10 @@ static struct fragment *parse_binary_hunk(char **buf_p,
* -1 in case of error,
* the length of the parsed binary patch otherwise
*/
static int parse_binary(char *buffer, unsigned long size, struct patch *patch)
static int parse_binary(struct apply_state *state,
char *buffer,
unsigned long size,
struct patch *patch)
{
/*
* We have read "GIT binary patch\n"; what follows is a line
@ -1977,15 +1977,15 @@ static int parse_binary(char *buffer, unsigned long size, struct patch *patch)
int status;
int used, used_1;
forward = parse_binary_hunk(&buffer, &size, &status, &used);
forward = parse_binary_hunk(state, &buffer, &size, &status, &used);
if (!forward && !status)
/* there has to be one hunk (forward hunk) */
return error(_("unrecognized binary patch at line %d"), state_linenr-1);
return error(_("unrecognized binary patch at line %d"), state->linenr-1);
if (status)
/* otherwise we already gave an error message */
return status;
reverse = parse_binary_hunk(&buffer, &size, &status, &used_1);
reverse = parse_binary_hunk(state, &buffer, &size, &status, &used_1);
if (reverse)
used += used_1;
else if (status) {
@ -2100,8 +2100,8 @@ static int parse_chunk(struct apply_state *state, char *buffer, unsigned long si
if (llen == sizeof(git_binary) - 1 &&
!memcmp(git_binary, buffer + hd, llen)) {
int used;
state_linenr++;
used = parse_binary(buffer + hd + llen,
state->linenr++;
used = parse_binary(state, buffer + hd + llen,
size - hd - llen, patch);
if (used < 0)
return -1;
@ -2121,7 +2121,7 @@ static int parse_chunk(struct apply_state *state, char *buffer, unsigned long si
int len = strlen(binhdr[i]);
if (len < size - hd &&
!memcmp(binhdr[i], buffer + hd, len)) {
state_linenr++;
state->linenr++;
patch->is_binary = 1;
patchsize = llen;
break;
@ -2135,7 +2135,7 @@ static int parse_chunk(struct apply_state *state, char *buffer, unsigned long si
*/
if ((state->apply || state->check) &&
(!patch->is_binary && !metadata_changes(patch)))
die(_("patch with only garbage at line %d"), state_linenr);
die(_("patch with only garbage at line %d"), state->linenr);
}
return offset + hdrsize + patchsize;
@ -4654,6 +4654,7 @@ static void init_apply_state(struct apply_state *state, const char *prefix)
state->squelch_whitespace_errors = 5;
state->ws_error_action = warn_on_ws_error;
state->ws_ignore_action = ignore_ws_none;
state->linenr = 1;
strbuf_init(&state->root, 0);
git_apply_config();