From 19bfcd5a14e647763e5ecc247ba24790f56721f3 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sun, 26 Feb 2006 09:29:00 -0800 Subject: The war on trailing whitespace On Sat, 25 Feb 2006, Andrew Morton wrote: > > I'd suggest a) git will simply refuse to apply such a patch unless given a > special `forcing' flag, b) even when thus forced, it will still warn and c) > with a different flag, it will strip-then-apply, without generating a > warning. This doesn't do the "strip-then-apply" thing, but it allows you to make git-apply generate a warning or error on extraneous whitespace. Use --whitespace=warn to warn, and (surprise, surprise) --whitespace=error to make it a fatal error to have whitespace at the end. Totally untested, of course. But it compiles, so it must be fine. HOWEVER! Note that this literally will check every single patch-line with "+" at the beginning. Which means that if you fix a simple typo, and the line had a space at the end before, and you didn't remove it, that's still considered a "new line with whitespace at the end", even though obviously the line wasn't really new. I assume this is what you wanted, and there isn't really any sane alternatives (you could make the warning activate only for _pure_ additions with no deletions at all in that hunk, but that sounds a bit insane). Linus diff --git a/apply.c b/apply.c index 244718c..e7b3dca 100644 --- a/apply.c +++ b/apply.c @@ -34,6 +34,12 @@ static int line_termination = '\n'; 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, + warn_on_whitespace, + error_on_whitespace +} new_whitespace = nowarn; + /* * 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 @@ -815,6 +821,22 @@ static int parse_fragment(char *line, unsigned long size, struct patch *patch, s oldlines--; break; case '+': + /* + * We know len is at least two, since we have a '+' and + * we checked that the last character was a '\n' above + */ + if (isspace(line[len-2])) { + switch (new_whitespace) { + case nowarn: + break; + case warn_on_whitespace: + new_whitespace = nowarn; /* Just once */ + error("Added whitespace at end of line at line %d", linenr); + break; + case error_on_whitespace: + die("Added whitespace at end of line at line %d", linenr); + } + } added++; newlines--; break; @@ -1839,6 +1861,17 @@ int main(int argc, char **argv) line_termination = 0; 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; + } + die("unrecognixed whitespace option '%s'", arg+13); + } if (check_index && prefix_length < 0) { prefix = setup_git_directory(); -- cgit v0.10.2-6-g49f6