changeset 20319:427d672c0e4e stable

subrepo: make it possible to update to hidden subrepo revisions When a subrepo revision was hidden it was considered missing and mercurial was unable to update to the corresponding parent revision. Instead warn the user of the problem and let it choose what to do (the default is to udpate anyway).
author Angel Ezquerra <angel.ezquerra@gmail.com>
date Sun, 24 Nov 2013 02:17:17 +0100
parents c5aef7a66607
children 5d1e1a4c4a88
files mercurial/subrepo.py tests/test-subrepo-missing.t
diffstat 2 files changed, 45 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/subrepo.py	Sun Nov 24 02:13:00 2013 +0100
+++ b/mercurial/subrepo.py	Sun Nov 24 02:17:17 2013 +0100
@@ -702,7 +702,7 @@
     def _get(self, state):
         source, revision, kind = state
         if revision in self._repo.unfiltered():
-            return
+            return True
         self._repo._subsource = source
         srcurl = _abssource(self._repo)
         other = hg.peer(self._repo, {}, srcurl)
@@ -728,13 +728,23 @@
             if cleansub:
                 # keep the repo clean after pull
                 self._cachestorehash(srcurl)
+        return False
 
     @annotatesubrepoerror
     def get(self, state, overwrite=False):
-        self._get(state)
+        inrepo = self._get(state)
         source, revision, kind = state
-        self._repo.ui.debug("getting subrepo %s\n" % self._path)
-        hg.updaterepo(self._repo, revision, overwrite)
+        repo = self._repo
+        repo.ui.debug("getting subrepo %s\n" % self._path)
+        if inrepo:
+            urepo = repo.unfiltered()
+            ctx = urepo[revision]
+            if ctx.hidden():
+                urepo.ui.warn(
+                    _('revision %s in subrepo %s is hidden\n') \
+                    % (revision[0:12], self._path))
+                repo = urepo
+        hg.updaterepo(repo, revision, overwrite)
 
     @annotatesubrepoerror
     def merge(self, state):
--- a/tests/test-subrepo-missing.t	Sun Nov 24 02:13:00 2013 +0100
+++ b/tests/test-subrepo-missing.t	Sun Nov 24 02:17:17 2013 +0100
@@ -68,4 +68,35 @@
   $ ls subrepo
   a
 
+Enable obsolete
+
+  $ cat > ${TESTTMP}/obs.py << EOF
+  > import mercurial.obsolete
+  > mercurial.obsolete._enabled = True
+  > EOF
+  $ cat >> $HGRCPATH << EOF
+  > [ui]
+  > logtemplate= {rev}:{node|short} {desc|firstline}
+  > [phases]
+  > publish=False
+  > [extensions]'
+  > obs=${TESTTMP}/obs.py
+  > EOF
+
+check that we can update parent repo with missing (amended) subrepo revision
+
+  $ hg up --repository subrepo -r tip
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg ci -m "updated subrepo to tip"
+  created new head
+  $ cd subrepo
+  $ hg update -r tip
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ echo foo > a
+  $ hg commit --amend -m "addb (amended)"
   $ cd ..
+  $ hg update --clean .
+  revision 102a90ea7b4a in subrepo subrepo is hidden
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+  $ cd ..