From: Junio C Hamano Date: Mon, 27 Feb 2006 22:47:45 +0000 (-0800) Subject: apply --whitespace: configuration option. X-Git-Tag: v1.3.0-rc1~107^2~3 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=2ae1c53b51ff78b13cc8abf8e9798a12140b7638;p=git.git 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 --- diff --git a/apply.c b/apply.c index 8139d832e..a5cdd8e26 100644 --- a/apply.c +++ b/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] ..."; 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; @@ -1824,10 +1850,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]; @@ -1895,30 +1932,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); diff --git a/cache.h b/cache.h index 58eec00e0..0d3b244dd 100644 --- a/cache.h +++ b/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 void rollback_index_file(struct cache_file *); +/* Environment bits from configuration mechanism */ extern int trust_executable_bit; extern int assume_unchanged; 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; diff --git a/environment.c b/environment.c index 251e53ca0..16c08f069 100644 --- a/environment.c +++ b/environment.c @@ -17,6 +17,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;