Re: [PATCH 7/8] setup_tree_pathspec(): interpret '^' as negative pathspec
- From
Elijah Newren <newren@gmail.com>
- Date
- Sep 11, 2010, 17:29 UTC
- Message-ID
- <AANLkTin_m+zjHND5AwFhkrZM-VEkn70qgCTwpB2B+RA+@mail.gmail.com>
- In-Reply-To
- <1283961023-4491-8-git-send-email-pclouds@gmail.com>
2010/9/8 Nguyễn Thái Ngọc Duy <pclouds@gmail.com>:
Show 9 quoted lines
> 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.