clone: do not turn hidden changeset public on publishing clone (issue3935) stable
authorPierre-Yves David <pierre-yves.david@logilab.fr>
Thu, 30 Jan 2014 11:52:38 -0800
branchstable
changeset 20332 a959f7167077
parent 20331 1d155582a8ea
child 20333 fa6cb300ded4
child 20336 8f63b2880f1f
clone: do not turn hidden changeset public on publishing clone (issue3935) Before this changeset local clone of a repo with hidden changeset would include then in the clone (why not) and turn them public (plain wrong). This happened because the copy clone publish by dropping the phaseroot file entirely making everything in the repo public (and therefore immune to obsolescence marker). This changeset takes the simplest fix, we deny the copy clone in the case of hidden changeset falling back to pull clone that will exclude them from the clone and therefore not turning them public. A smarter version of copy clone could be done, but I prefer to go for the simplest solution first.
mercurial/localrepo.py
tests/test-phases.t
--- a/mercurial/localrepo.py	Tue Jan 28 14:00:23 2014 +1100
+++ b/mercurial/localrepo.py	Thu Jan 30 11:52:38 2014 -0800
@@ -692,7 +692,13 @@
         return self
 
     def cancopy(self):
-        return self.local() # so statichttprepo's override of local() works
+        # so statichttprepo's override of local() works
+        if not self.local():
+            return False
+        if not self.ui.configbool('phases', 'publish', True):
+            return True
+        # if publishing we can't copy if there is filtered content
+        return not self.filtered('visible').changelog.filteredrevs
 
     def join(self, f):
         return os.path.join(self.path, f)
--- a/tests/test-phases.t	Tue Jan 28 14:00:23 2014 +1100
+++ b/tests/test-phases.t	Thu Jan 30 11:52:38 2014 -0800
@@ -507,3 +507,46 @@
   [1]
 
   $ cd ..
+
+test hidden changeset are not cloned as public (issue3935)
+
+  $ cd initialrepo
+
+(enabling evolution)
+  $ cat > ../obs.py << EOF
+  > import mercurial.obsolete
+  > mercurial.obsolete._enabled = True
+  > EOF
+  $ echo '[extensions]' >> $HGRCPATH
+  $ echo "obs=${TESTTMP}/obs.py" >> $HGRCPATH
+
+(making a changeset hidden; H in that case)
+  $ hg debugobsolete `hg id --debug -r 5`
+
+  $ cd ..
+  $ hg clone initialrepo clonewithobs
+  requesting all changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 7 changesets with 6 changes to 6 files
+  updating to branch default
+  6 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd clonewithobs
+  $ hg log -G --template "{rev} {phase} {desc}\n"
+  @    6 public merge B' and E
+  |\
+  | o  5 public B'
+  | |
+  o |  4 public E
+  | |
+  o |  3 public D
+  | |
+  o |  2 public C
+  |/
+  o  1 public B
+  |
+  o  0 public A
+  
+
+