diff --git a/mercurial/subrepo.py b/mercurial/subrepo.py --- a/mercurial/subrepo.py +++ b/mercurial/subrepo.py @@ -1779,17 +1779,15 @@ class gitsubrepo(abstractsubrepo): if node2: cmd.append(node2) - if match.anypats(): - return #No support for include/exclude yet - output = "" if match.always(): output += self._gitcommand(cmd) + '\n' - elif match.files(): - for f in match.files(): - output += self._gitcommand(cmd + [f]) + '\n' - elif match(gitprefix): #Subrepo is matched - output += self._gitcommand(cmd) + '\n' + else: + st = self.status(node2)[:3] + files = [f for sublist in st for f in sublist] + for f in files: + if match(f): + output += self._gitcommand(cmd + ['--', f]) + '\n' if output.strip(): ui.write(output) diff --git a/tests/test-subrepo-git.t b/tests/test-subrepo-git.t --- a/tests/test-subrepo-git.t +++ b/tests/test-subrepo-git.t @@ -785,9 +785,57 @@ the output contains a regex, because git \s*foobar |\s*2 +- (re) 2 files changed, 2 insertions\(\+\), 1 deletions?\(-\) (re) -ensure adding include/exclude ignores the subrepo +adding an include should ignore the other elements $ hg diff --subrepos -I s/foobar + diff --git a/s/foobar b/s/foobar + index 8a5a5e2..bd5812a 100644 + --- a/s/foobar + +++ b/s/foobar + @@ -1,4 +1,4 @@ + -woopwoop + +woop woop + + foo + bar + +adding an exclude should ignore this element $ hg diff --subrepos -X s/foobar + diff --git a/s/barfoo b/s/barfoo + new file mode 100644 + index 0000000..257cc56 + --- /dev/null + +++ b/s/barfoo + @@ -0,0 +1 @@ + +foo + +moving a file should show a removal and an add + $ hg revert --all + reverting subrepo ../gitroot + $ cd s + $ git mv foobar woop + $ cd .. + $ hg diff --subrepos + diff --git a/s/foobar b/s/foobar + deleted file mode 100644 + index 8a5a5e2..0000000 + --- a/s/foobar + +++ /dev/null + @@ -1,4 +0,0 @@ + -woopwoop + - + -foo + -bar + diff --git a/s/woop b/s/woop + new file mode 100644 + index 0000000..8a5a5e2 + --- /dev/null + +++ b/s/woop + @@ -0,0 +1,4 @@ + +woopwoop + + + +foo + +bar + $ rm s/woop revert the subrepository $ hg revert --all