mirror of
https://github.com/git/git
synced 2024-08-27 11:39:22 +00:00
apply --whitespace: configuration option.
The new configuration option apply.whitespace can take one of "warn", "error", "error-all", or "strip". When git-apply is run to apply the patch to the index, they are used as the default value if there is no command line --whitespace option. Andrew can now tell people who feed him git trees to update to this version and say: git repo-config apply.whitespace error Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
59aa256204
commit
383e20b614
72
apply.c
72
apply.c
|
@ -35,16 +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>...";
|
||||
|
||||
static enum whitespace_eol {
|
||||
nowarn,
|
||||
nowarn_whitespace,
|
||||
warn_on_whitespace,
|
||||
error_on_whitespace,
|
||||
strip_and_apply,
|
||||
} new_whitespace = nowarn;
|
||||
strip_whitespace,
|
||||
} new_whitespace = nowarn_whitespace;
|
||||
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 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
|
||||
* we've seen, and the longest filename. That allows us to do simple
|
||||
|
@ -832,7 +858,7 @@ static int parse_fragment(char *line, unsigned long size, struct patch *patch, s
|
|||
* That is, an addition of an empty line would check
|
||||
* the '+' here. Sneaky...
|
||||
*/
|
||||
if ((new_whitespace != nowarn) &&
|
||||
if ((new_whitespace != nowarn_whitespace) &&
|
||||
isspace(line[len-2])) {
|
||||
whitespace_error++;
|
||||
if (squelch_whitespace_errors &&
|
||||
|
@ -1129,7 +1155,7 @@ static int apply_line(char *output, const char *patch, int plen)
|
|||
* patch[plen] is '\n'.
|
||||
*/
|
||||
int add_nl_to_tail = 0;
|
||||
if ((new_whitespace == strip_and_apply) &&
|
||||
if ((new_whitespace == strip_whitespace) &&
|
||||
1 < plen && isspace(patch[plen-1])) {
|
||||
if (patch[plen] == '\n')
|
||||
add_nl_to_tail = 1;
|
||||
|
@ -1816,10 +1842,21 @@ static int apply_patch(int fd, const char *filename)
|
|||
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 i;
|
||||
int read_stdin = 1;
|
||||
const char *whitespace_option = NULL;
|
||||
|
||||
for (i = 1; i < argc; i++) {
|
||||
const char *arg = argv[i];
|
||||
|
@ -1887,30 +1924,17 @@ int main(int argc, char **argv)
|
|||
continue;
|
||||
}
|
||||
if (!strncmp(arg, "--whitespace=", 13)) {
|
||||
if (!strcmp(arg+13, "warn")) {
|
||||
new_whitespace = warn_on_whitespace;
|
||||
continue;
|
||||
}
|
||||
if (!strcmp(arg+13, "error")) {
|
||||
new_whitespace = error_on_whitespace;
|
||||
continue;
|
||||
}
|
||||
if (!strcmp(arg+13, "error-all")) {
|
||||
new_whitespace = error_on_whitespace;
|
||||
squelch_whitespace_errors = 0;
|
||||
continue;
|
||||
}
|
||||
if (!strcmp(arg+13, "strip")) {
|
||||
new_whitespace = strip_and_apply;
|
||||
continue;
|
||||
}
|
||||
die("unrecognized whitespace option '%s'", arg+13);
|
||||
whitespace_option = arg + 13;
|
||||
parse_whitespace_option(arg + 13);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (check_index && prefix_length < 0) {
|
||||
prefix = setup_git_directory();
|
||||
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)
|
||||
arg = prefix_filename(prefix, prefix_length, arg);
|
||||
|
|
2
cache.h
2
cache.h
|
@ -160,10 +160,12 @@ extern int hold_index_file_for_update(struct cache_file *, const char *path);
|
|||
extern int commit_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 only_use_symrefs;
|
||||
extern int diff_rename_limit_default;
|
||||
extern int shared_repository;
|
||||
extern const char *apply_default_whitespace;
|
||||
|
||||
#define GIT_REPO_VERSION 0
|
||||
extern int repository_format_version;
|
||||
|
|
|
@ -16,6 +16,7 @@ int only_use_symrefs = 0;
|
|||
int repository_format_version = 0;
|
||||
char git_commit_encoding[MAX_ENCODING_LENGTH] = "utf-8";
|
||||
int shared_repository = 0;
|
||||
const char *apply_default_whitespace = NULL;
|
||||
|
||||
static char *git_dir, *git_object_dir, *git_index_file, *git_refs_dir,
|
||||
*git_graft_file;
|
||||
|
|
Loading…
Reference in a new issue