Skip to content

Commit 19bfcd5

Browse files
Linus TorvaldsJunio C Hamano
authored andcommitted
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
1 parent c55f3ff commit 19bfcd5

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

apply.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ static int line_termination = '\n';
3434
static const char apply_usage[] =
3535
"git-apply [--stat] [--numstat] [--summary] [--check] [--index] [--apply] [--no-add] [--index-info] [--allow-binary-replacement] [-z] [-pNUM] <patch>...";
3636

37+
static enum whitespace_eol {
38+
nowarn,
39+
warn_on_whitespace,
40+
error_on_whitespace
41+
} new_whitespace = nowarn;
42+
3743
/*
3844
* For "diff-stat" like behaviour, we keep track of the biggest change
3945
* 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
815821
oldlines--;
816822
break;
817823
case '+':
824+
/*
825+
* We know len is at least two, since we have a '+' and
826+
* we checked that the last character was a '\n' above
827+
*/
828+
if (isspace(line[len-2])) {
829+
switch (new_whitespace) {
830+
case nowarn:
831+
break;
832+
case warn_on_whitespace:
833+
new_whitespace = nowarn; /* Just once */
834+
error("Added whitespace at end of line at line %d", linenr);
835+
break;
836+
case error_on_whitespace:
837+
die("Added whitespace at end of line at line %d", linenr);
838+
}
839+
}
818840
added++;
819841
newlines--;
820842
break;
@@ -1839,6 +1861,17 @@ int main(int argc, char **argv)
18391861
line_termination = 0;
18401862
continue;
18411863
}
1864+
if (!strncmp(arg, "--whitespace=", 13)) {
1865+
if (strcmp(arg+13, "warn")) {
1866+
new_whitespace = warn_on_whitespace;
1867+
continue;
1868+
}
1869+
if (strcmp(arg+13, "error")) {
1870+
new_whitespace = error_on_whitespace;
1871+
continue;
1872+
}
1873+
die("unrecognixed whitespace option '%s'", arg+13);
1874+
}
18421875

18431876
if (check_index && prefix_length < 0) {
18441877
prefix = setup_git_directory();

0 commit comments

Comments
 (0)