Merge branch 'lt/apply' into next
* lt/apply: apply --whitespace: configuration option. apply: squelch excessive errors and --whitespace=error-all
This commit is contained in:
commit
27a3f33945
113
apply.c
113
apply.c
@ -35,14 +35,42 @@ static const char apply_usage[] =
|
|||||||
"git-apply [--stat] [--numstat] [--summary] [--check] [--index] [--apply] [--no-add] [--index-info] [--allow-binary-replacement] [-z] [-pNUM] <patch>...";
|
"git-apply [--stat] [--numstat] [--summary] [--check] [--index] [--apply] [--no-add] [--index-info] [--allow-binary-replacement] [-z] [-pNUM] <patch>...";
|
||||||
|
|
||||||
static enum whitespace_eol {
|
static enum whitespace_eol {
|
||||||
nowarn,
|
nowarn_whitespace,
|
||||||
warn_on_whitespace,
|
warn_on_whitespace,
|
||||||
error_on_whitespace,
|
error_on_whitespace,
|
||||||
strip_and_apply,
|
strip_whitespace,
|
||||||
} new_whitespace = nowarn;
|
} new_whitespace = nowarn_whitespace;
|
||||||
static int whitespace_error = 0;
|
static int whitespace_error = 0;
|
||||||
|
static int squelch_whitespace_errors = 5;
|
||||||
|
static int applied_after_stripping = 0;
|
||||||
static const char *patch_input_file = NULL;
|
static const char *patch_input_file = NULL;
|
||||||
|
|
||||||
|
static void parse_whitespace_option(const char *option)
|
||||||
|
{
|
||||||
|
if (!option) {
|
||||||
|
new_whitespace = nowarn_whitespace;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!strcmp(option, "warn")) {
|
||||||
|
new_whitespace = warn_on_whitespace;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!strcmp(option, "error")) {
|
||||||
|
new_whitespace = error_on_whitespace;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!strcmp(option, "error-all")) {
|
||||||
|
new_whitespace = error_on_whitespace;
|
||||||
|
squelch_whitespace_errors = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!strcmp(option, "strip")) {
|
||||||
|
new_whitespace = strip_whitespace;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
die("unrecognized whitespace option '%s'", option);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For "diff-stat" like behaviour, we keep track of the biggest change
|
* 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
|
* we've seen, and the longest filename. That allows us to do simple
|
||||||
@ -830,13 +858,18 @@ static int parse_fragment(char *line, unsigned long size, struct patch *patch, s
|
|||||||
* That is, an addition of an empty line would check
|
* That is, an addition of an empty line would check
|
||||||
* the '+' here. Sneaky...
|
* the '+' here. Sneaky...
|
||||||
*/
|
*/
|
||||||
if ((new_whitespace != nowarn) &&
|
if ((new_whitespace != nowarn_whitespace) &&
|
||||||
isspace(line[len-2])) {
|
isspace(line[len-2])) {
|
||||||
fprintf(stderr, "Added whitespace\n");
|
whitespace_error++;
|
||||||
fprintf(stderr, "%s:%d:%.*s\n",
|
if (squelch_whitespace_errors &&
|
||||||
patch_input_file,
|
squelch_whitespace_errors <
|
||||||
linenr, len-2, line+1);
|
whitespace_error)
|
||||||
whitespace_error = 1;
|
;
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "Adds trailing whitespace.\n%s:%d:%.*s\n",
|
||||||
|
patch_input_file,
|
||||||
|
linenr, len-2, line+1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
added++;
|
added++;
|
||||||
newlines--;
|
newlines--;
|
||||||
@ -1122,13 +1155,14 @@ static int apply_line(char *output, const char *patch, int plen)
|
|||||||
* patch[plen] is '\n'.
|
* patch[plen] is '\n'.
|
||||||
*/
|
*/
|
||||||
int add_nl_to_tail = 0;
|
int add_nl_to_tail = 0;
|
||||||
if ((new_whitespace == strip_and_apply) &&
|
if ((new_whitespace == strip_whitespace) &&
|
||||||
1 < plen && isspace(patch[plen-1])) {
|
1 < plen && isspace(patch[plen-1])) {
|
||||||
if (patch[plen] == '\n')
|
if (patch[plen] == '\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]))
|
||||||
plen--;
|
plen--;
|
||||||
|
applied_after_stripping++;
|
||||||
}
|
}
|
||||||
memcpy(output, patch + 1, plen);
|
memcpy(output, patch + 1, plen);
|
||||||
if (add_nl_to_tail)
|
if (add_nl_to_tail)
|
||||||
@ -1816,10 +1850,21 @@ static int apply_patch(int fd, const char *filename)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int git_apply_config(const char *var, const char *value)
|
||||||
|
{
|
||||||
|
if (!strcmp(var, "apply.whitespace")) {
|
||||||
|
apply_default_whitespace = strdup(value);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return git_default_config(var, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int read_stdin = 1;
|
int read_stdin = 1;
|
||||||
|
const char *whitespace_option = NULL;
|
||||||
|
|
||||||
for (i = 1; i < argc; i++) {
|
for (i = 1; i < argc; i++) {
|
||||||
const char *arg = argv[i];
|
const char *arg = argv[i];
|
||||||
@ -1887,25 +1932,17 @@ int main(int argc, char **argv)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!strncmp(arg, "--whitespace=", 13)) {
|
if (!strncmp(arg, "--whitespace=", 13)) {
|
||||||
if (!strcmp(arg+13, "warn")) {
|
whitespace_option = arg + 13;
|
||||||
new_whitespace = warn_on_whitespace;
|
parse_whitespace_option(arg + 13);
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
if (!strcmp(arg+13, "error")) {
|
|
||||||
new_whitespace = error_on_whitespace;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!strcmp(arg+13, "strip")) {
|
|
||||||
new_whitespace = strip_and_apply;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
die("unrecognixed whitespace option '%s'", arg+13);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (check_index && prefix_length < 0) {
|
if (check_index && prefix_length < 0) {
|
||||||
prefix = setup_git_directory();
|
prefix = setup_git_directory();
|
||||||
prefix_length = prefix ? strlen(prefix) : 0;
|
prefix_length = prefix ? strlen(prefix) : 0;
|
||||||
git_config(git_default_config);
|
git_config(git_apply_config);
|
||||||
|
if (!whitespace_option && apply_default_whitespace)
|
||||||
|
parse_whitespace_option(apply_default_whitespace);
|
||||||
}
|
}
|
||||||
if (0 < prefix_length)
|
if (0 < prefix_length)
|
||||||
arg = prefix_filename(prefix, prefix_length, arg);
|
arg = prefix_filename(prefix, prefix_length, arg);
|
||||||
@ -1919,7 +1956,31 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
if (read_stdin)
|
if (read_stdin)
|
||||||
apply_patch(0, "<stdin>");
|
apply_patch(0, "<stdin>");
|
||||||
if (whitespace_error && new_whitespace == error_on_whitespace)
|
if (whitespace_error) {
|
||||||
return 1;
|
if (squelch_whitespace_errors &&
|
||||||
|
squelch_whitespace_errors < whitespace_error) {
|
||||||
|
int squelched =
|
||||||
|
whitespace_error - squelch_whitespace_errors;
|
||||||
|
fprintf(stderr, "warning: squelched %d whitespace error%s\n",
|
||||||
|
squelched,
|
||||||
|
squelched == 1 ? "" : "s");
|
||||||
|
}
|
||||||
|
if (new_whitespace == error_on_whitespace)
|
||||||
|
die("%d line%s add%s trailing whitespaces.",
|
||||||
|
whitespace_error,
|
||||||
|
whitespace_error == 1 ? "" : "s",
|
||||||
|
whitespace_error == 1 ? "s" : "");
|
||||||
|
if (applied_after_stripping)
|
||||||
|
fprintf(stderr, "warning: %d line%s applied after"
|
||||||
|
" stripping trailing whitespaces.\n",
|
||||||
|
applied_after_stripping,
|
||||||
|
applied_after_stripping == 1 ? "" : "s");
|
||||||
|
else if (whitespace_error)
|
||||||
|
fprintf(stderr, "warning: %d line%s add%s trailing"
|
||||||
|
" whitespaces.\n",
|
||||||
|
whitespace_error,
|
||||||
|
whitespace_error == 1 ? "" : "s",
|
||||||
|
whitespace_error == 1 ? "s" : "");
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
2
cache.h
2
cache.h
@ -161,11 +161,13 @@ extern int hold_index_file_for_update(struct cache_file *, const char *path);
|
|||||||
extern int commit_index_file(struct cache_file *);
|
extern int commit_index_file(struct cache_file *);
|
||||||
extern void rollback_index_file(struct cache_file *);
|
extern void rollback_index_file(struct cache_file *);
|
||||||
|
|
||||||
|
/* Environment bits from configuration mechanism */
|
||||||
extern int trust_executable_bit;
|
extern int trust_executable_bit;
|
||||||
extern int assume_unchanged;
|
extern int assume_unchanged;
|
||||||
extern int only_use_symrefs;
|
extern int only_use_symrefs;
|
||||||
extern int diff_rename_limit_default;
|
extern int diff_rename_limit_default;
|
||||||
extern int shared_repository;
|
extern int shared_repository;
|
||||||
|
extern const char *apply_default_whitespace;
|
||||||
|
|
||||||
#define GIT_REPO_VERSION 0
|
#define GIT_REPO_VERSION 0
|
||||||
extern int repository_format_version;
|
extern int repository_format_version;
|
||||||
|
@ -17,6 +17,7 @@ int only_use_symrefs = 0;
|
|||||||
int repository_format_version = 0;
|
int repository_format_version = 0;
|
||||||
char git_commit_encoding[MAX_ENCODING_LENGTH] = "utf-8";
|
char git_commit_encoding[MAX_ENCODING_LENGTH] = "utf-8";
|
||||||
int shared_repository = 0;
|
int shared_repository = 0;
|
||||||
|
const char *apply_default_whitespace = NULL;
|
||||||
|
|
||||||
static char *git_dir, *git_object_dir, *git_index_file, *git_refs_dir,
|
static char *git_dir, *git_object_dir, *git_index_file, *git_refs_dir,
|
||||||
*git_graft_file;
|
*git_graft_file;
|
||||||
|
Loading…
Reference in New Issue
Block a user