2010/9/8 Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx>: > This patch does preparation work for tree exclusion in > tree_entry_interesting(). '^' has similar meaning to '!' in > gitexcludes. '!' is not used because bash does not like arguments with > a leading '!'. > > Eventually, "git diff -- foo ^foo/bar" should show differences in foo, > except foo/bar. If "git diff -- ^foo" is given, then it implies > everything except foo, which could surprise users that > "bar" in "git diff -- bar ^foo" has no effect at all. I really like the work here. There are just two things that I think are missing: * It doesn't handle files with leading carats in their name * It handles some nested include/exclude cases (e.g. dir ^dir/subdir) but not more complicated ones. You could add these three testcases (on top of your 8/8 patch) to see what I mean: test_expect_failure 'diff ^one one/two' ' printf "file\none/two/file\n" >expected && git diff --name-only HEAD^ HEAD -- ^one one/two >result && test_cmp expected result ' test_expect_failure 'diff ^funny-filename' ' touch ^funny-filename && git add ^funny-filename && git commit -m "Add a filename with a leading carat" && git ls-files >expected && git diff --name-only HEAD^^ HEAD -- ^funny-filename >result && test_cmp expected result && echo ^funny-filename >expected && git diff --name-only HEAD^^ HEAD -- ^^funny-filename >result && test_cmp expected result && git ls-files | grep -v funny-filename >expected && git diff --name-only HEAD^^ HEAD -- ^^^funny-filename >result && test_cmp expected result ' test_expect_failure 'deeper nested exclude/include' ' touch one/two/zoo && for i in one/file one/zoo one/two/file; do echo 2 >>$i; done && git add one && git commit -m 4 && printf "one/file\none/two/file\none/zoo\n" > expected && git diff --name-only HEAD^ HEAD -- one ^one/two one/two/file >result && test_cmp expected result && printf "one/two/zoo\n" > expected && git diff --name-only HEAD^ HEAD -- ^one one/two ^one/two/file >result && test_cmp expected result ' Note: In the second test, I used: * "^funny" to search for all files EXCEPT "funny" * "^^funny" to search for a file named "^funny" * "^^^funny" to search for all files EXCEPT "^funny" I'm not sure if that's really the syntax we want to adopt, but it should be easy to change if we decide on some other syntax. -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html