subrepos: support adding files in git subrepos
This support includes correct matching, so includes,
excludes and patterns are all supported.
--- a/mercurial/help/subrepos.txt Sun Feb 15 17:29:10 2015 -0500
+++ b/mercurial/help/subrepos.txt Tue Feb 24 08:49:22 2015 +0100
@@ -78,7 +78,7 @@
:add: add does not recurse in subrepos unless -S/--subrepos is
specified. However, if you specify the full path of a file in a
subrepo, it will be added even without -S/--subrepos specified.
- Git and Subversion subrepositories are currently silently
+ Subversion subrepositories are currently silently
ignored.
:addremove: addremove does not recurse into subrepos unless
--- a/mercurial/subrepo.py Sun Feb 15 17:29:10 2015 -0500
+++ b/mercurial/subrepo.py Tue Feb 24 08:49:22 2015 +0100
@@ -1523,6 +1523,29 @@
return False
@annotatesubrepoerror
+ def add(self, ui, match, prefix, explicitonly, **opts):
+ if self._gitmissing():
+ return []
+ if match.files():
+ files = match.files()
+ else:
+ (modified, added, removed,
+ deleted, unknown, ignored, clean) = self.status(None)
+ files = unknown
+
+ files = [f for f in files if match(f)]
+ for f in files:
+ exact = match.exact(f)
+ command = ["add"]
+ if exact:
+ command.append("-f") #should be added, even if ignored
+ if ui.verbose or not exact:
+ ui.status(_('adding %s\n') % match.rel(f))
+ if not opts.get('dry_run'):
+ self._gitcommand(command + [f])
+ return []
+
+ @annotatesubrepoerror
def remove(self):
if self._gitmissing():
return
--- a/tests/test-subrepo-git.t Sun Feb 15 17:29:10 2015 -0500
+++ b/tests/test-subrepo-git.t Tue Feb 24 08:49:22 2015 +0100
@@ -134,6 +134,7 @@
$ hg status --subrepos
? s/f
$ hg add .
+ adding f
$ git add f
$ cd ..
@@ -850,4 +851,130 @@
$ hg cat -r "parents(.)" --output tmp/%b/foobar s/foobar
$ diff tmp/tc/foobar catparents
+cleanup
+ $ rm -r tmp
+ $ rm catparents
+
+add git files, using either files or patterns
+ $ echo "hsss! hsssssssh!" > s/snake.python
+ $ echo "ccc" > s/c.c
+ $ echo "cpp" > s/cpp.cpp
+
+ $ hg add s/snake.python s/c.c s/cpp.cpp
+ $ hg st --subrepos s
+ M s/foobar
+ A s/c.c
+ A s/cpp.cpp
+ A s/snake.python
+ ? s/barfoo
+ $ hg revert s
+ reverting subrepo ../gitroot
+
+ $ hg add --subrepos "glob:**.python"
+ adding s/snake.python (glob)
+ $ hg st --subrepos s
+ A s/snake.python
+ ? s/barfoo
+ ? s/c.c
+ ? s/cpp.cpp
+ ? s/foobar.orig
+ $ hg revert s
+ reverting subrepo ../gitroot
+
+ $ hg add --subrepos s
+ adding s/barfoo (glob)
+ adding s/c.c (glob)
+ adding s/cpp.cpp (glob)
+ adding s/foobar.orig (glob)
+ adding s/snake.python (glob)
+ $ hg st --subrepos s
+ A s/barfoo
+ A s/c.c
+ A s/cpp.cpp
+ A s/foobar.orig
+ A s/snake.python
+ $ hg revert s
+ reverting subrepo ../gitroot
+make sure everything is reverted correctly
+ $ hg st --subrepos s
+ ? s/barfoo
+ ? s/c.c
+ ? s/cpp.cpp
+ ? s/foobar.orig
+ ? s/snake.python
+
+ $ hg add --subrepos --exclude "path:s/c.c"
+ adding s/barfoo (glob)
+ adding s/cpp.cpp (glob)
+ adding s/foobar.orig (glob)
+ adding s/snake.python (glob)
+ $ hg st --subrepos s
+ A s/barfoo
+ A s/cpp.cpp
+ A s/foobar.orig
+ A s/snake.python
+ ? s/c.c
+ $ hg revert --all -q
+
+.hgignore should not have influence in subrepos
+ $ cat > .hgignore << EOF
+ > syntax: glob
+ > *.python
+ > EOF
+ $ hg add .hgignore
+ $ hg add --subrepos "glob:**.python"
+ adding s/snake.python (glob)
+ $ hg st --subrepos s
+ A s/snake.python
+ ? s/barfoo
+ ? s/c.c
+ ? s/cpp.cpp
+ ? s/foobar.orig
+ $ hg revert --all -q
+
+.gitignore should have influence,
+except for explicitly added files (no patterns)
+ $ cat > s/.gitignore << EOF
+ > *.python
+ > EOF
+ $ hg add s/.gitignore
+ $ hg st --subrepos s
+ A s/.gitignore
+ ? s/barfoo
+ ? s/c.c
+ ? s/cpp.cpp
+ ? s/foobar.orig
+ $ hg add --subrepos "glob:**.python"
+ $ hg st --subrepos s
+ A s/.gitignore
+ ? s/barfoo
+ ? s/c.c
+ ? s/cpp.cpp
+ ? s/foobar.orig
+ $ hg add --subrepos s/snake.python
+ $ hg st --subrepos s
+ A s/.gitignore
+ A s/snake.python
+ ? s/barfoo
+ ? s/c.c
+ ? s/cpp.cpp
+ ? s/foobar.orig
+
+correctly do a dry run
+ $ hg add --subrepos s --dry-run
+ adding s/barfoo (glob)
+ adding s/c.c (glob)
+ adding s/cpp.cpp (glob)
+ adding s/foobar.orig (glob)
+ $ hg st --subrepos s
+ A s/.gitignore
+ A s/snake.python
+ ? s/barfoo
+ ? s/c.c
+ ? s/cpp.cpp
+ ? s/foobar.orig
+
+currently no error given when adding an already tracked file
+ $ hg add s/.gitignore
+
$ cd ..