[PATCH 5 of 5 VERSION2] subrepo: removing (and restoring) git subrepo state

Eric Eisner ede at MIT.EDU
Sun Nov 14 17:45:03 CST 2010


# HG changeset patch
# User Eric Eisner <ede at mit.edu>
# Date 1289777500 18000
# Node ID 409d03424755c354bb7f1eb2cc1812cadf9c0faf
# Parent  3a9ac41494337e32f41d458b1320af9ea116e01b
subrepo: removing (and restoring) git subrepo state

diff --git a/mercurial/subrepo.py b/mercurial/subrepo.py
--- a/mercurial/subrepo.py
+++ b/mercurial/subrepo.py
@@ -678,7 +678,14 @@ class gitsubrepo(object):
     def get(self, state):
         source, revision, kind = state
         self._fetch(source, revision)
-        if self._gitstate() == revision:
+        # if the repo was set to be bare, unbare it
+        if self._gitcommand(['config', '--get', 'core.bare']
+                            ).strip() == 'true':
+            self._gitcommand(['config', 'core.bare', 'false'])
+            if self._gitstate() == revision:
+                self._gitcommand(['reset', '--hard', 'HEAD'])
+                return
+        elif self._gitstate() == revision:
             return
         current, bm = self._gitbranchmap()
         if revision not in bm:
@@ -742,6 +749,24 @@ class gitsubrepo(object):
                             'nothing to push') % self._relpath)
             return False
 
+    def remove(self):
+        if self.dirty():
+            self._ui.warn(_('not removing repo %s because '
+                            'it has changes.\n') % self._path)
+            return
+        # we can't fully delete the repository as it may contain
+        # local-only history
+        self._ui.note(_('removing subrepo %s\n') % self._path)
+        self._gitcommand(['config', 'core.bare', 'true'])
+        for f in os.listdir(self._path):
+            if f == '.git':
+                continue
+            path = os.path.join(self._path, f)
+            if os.path.isdir(path) and not os.path.islink(path):
+                shutil.rmtree(path)
+            else:
+                os.remove(path)
+
 types = {
     'hg': hgsubrepo,
     'svn': svnsubrepo,
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
@@ -175,3 +175,21 @@ user a pulls, merges, commits
   adding manifests
   adding file changes
   added 2 changesets with 2 changes to 1 files
+
+update to a revision without the subrepo, keeping the local git repository
+
+  $ cd ../t
+  $ hg up 0
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ ls s -a
+  .
+  ..
+  .git
+
+  $ hg up 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ ls s -a
+  .
+  ..
+  .git
+  g


More information about the Mercurial-devel mailing list