diff options
| author | Junio C Hamano <gitster@pobox.com> | 2008-06-26 15:37:21 -0700 | 
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2008-06-26 22:07:54 -0700 | 
| commit | 049540435fa5f7f583b8f5af257322b17eac7375 (patch) | |
| tree | 501fceeeb949f29edeac20f6182635ca4323adaa | |
| parent | 877f23ccb88227203f2576abdfb5d1c15925fcb3 (diff) | |
| download | git-049540435fa5f7f583b8f5af257322b17eac7375.tar.gz | |
diff --check: detect leftover conflict markers
This teaches "diff --check" to detect and complain if the change
adds lines that look like leftover conflict markers.
We should be able to remove the old Perl script used in the sample
pre-commit hook and modernize the script with this facility.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
| -rw-r--r-- | diff.c | 35 | ||||
| -rwxr-xr-x | t/t4017-diff-retval.sh | 14 | 
2 files changed, 49 insertions, 0 deletions
@@ -1143,6 +1143,35 @@ struct checkdiff_t {  	int trailing_blanks_start;  }; +static int is_conflict_marker(const char *line, unsigned long len) +{ +	char firstchar; +	int cnt; + +	if (len < 8) +		return 0; +	firstchar = line[0]; +	switch (firstchar) { +	case '=': case '>': case '<': +		break; +	default: +		return 0; +	} +	for (cnt = 1; cnt < 7; cnt++) +		if (line[cnt] != firstchar) +			return 0; +	/* line[0] thru line[6] are same as firstchar */ +	if (firstchar == '=') { +		/* divider between ours and theirs? */ +		if (len != 8 || line[7] != '\n') +			return 0; +	} else if (len < 8 || !isspace(line[7])) { +		/* not divider before ours nor after theirs */ +		return 0; +	} +	return 1; +} +  static void checkdiff_consume(void *priv, char *line, unsigned long len)  {  	struct checkdiff_t *data = priv; @@ -1159,6 +1188,12 @@ static void checkdiff_consume(void *priv, char *line, unsigned long len)  			data->trailing_blanks_start = 0;  		else if (!data->trailing_blanks_start)  			data->trailing_blanks_start = data->lineno; +		if (is_conflict_marker(line + 1, len - 1)) { +			data->status |= 1; +			fprintf(data->o->file, +				"%s:%d: leftover conflict marker\n", +				data->filename, data->lineno); +		}  		bad = ws_check(line + 1, len - 1, data->ws_rule);  		if (!bad)  			return; diff --git a/t/t4017-diff-retval.sh b/t/t4017-diff-retval.sh index 0d0fb87f57..d748d45dae 100755 --- a/t/t4017-diff-retval.sh +++ b/t/t4017-diff-retval.sh @@ -113,4 +113,18 @@ test_expect_success 'check should test not just the last line' '  ' +test_expect_success 'check detects leftover conflict markers' ' +	git reset --hard && +	git checkout HEAD^ && +	echo binary >>b && +	git commit -m "side" b && +	test_must_fail git merge master && +	git add b && ( +		git --no-pager diff --cached --check >test.out +		test $? = 2 +	) && +	test "$(grep "conflict marker" test.out | wc -l)" = 3 && +	git reset --hard +' +  test_done  | 
