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:
Junio C Hamano 2006-02-27 14:47:45 -08:00
Родитель fc96b7c9ba
Коммит 2ae1c53b51
3 изменённых файлов: 51 добавлений и 24 удалений

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>..."; "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 squelch_whitespace_errors = 5;
static int applied_after_stripping = 0; 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
@ -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 * 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])) {
whitespace_error++; whitespace_error++;
if (squelch_whitespace_errors && if (squelch_whitespace_errors &&
@ -1129,7 +1155,7 @@ 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;
@ -1824,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];
@ -1895,30 +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, "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);
} }
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);

Просмотреть файл

@ -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;