Commits

Eric Roshan Eisner  committed 3a42651

subrepo: removing (and restoring) git subrepo state

  • Participants
  • Parent commits d90fc91

Comments (0)

Files changed (2)

File mercurial/subrepo.py

     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:
                             '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,

File tests/test-subrepo-git.t

   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