[PATCH 1 of 1 STABLE?] subrepo: only do clean update when overwrite is set (issue3276)

Simon Heimberg simohe at besonet.ch
Wed Oct 24 11:43:07 CDT 2012


# HG changeset patch
# User Simon Heimberg <simohe at besonet.ch>
# Date 1351091247 -7200
# Node ID 85a0f842114bdd8c45f91440af6c0d876e3f35a0
# Parent  23fdaac2b4549a14f0015a5bc5fc16f6491372c0
subrepo: only do clean update when overwrite is set (issue3276)

Files in a subrepo were overwritten on update. But this should only happen on a
clean update (example: -C is specified).
Use the overwrite parameter introduced for svn subrepos in c19b9282d3a7 to
decide whether to merge changes (as update) or remove them (as clean).

test-subrepo.t is extended to test if an untracked file is overwritten
(issue3276). (Update -C is already tested in many places.)
The first two chunks are debugging output which has changed. (Because overwrite
is not always true anymore for subrepos)
All other tests still pass without any change.

diff -r 23fdaac2b454 -r 85a0f842114b mercurial/hg.py
--- a/mercurial/hg.py	Mit Okt 24 17:07:27 2012 +0200
+++ b/mercurial/hg.py	Mit Okt 24 17:07:27 2012 +0200
@@ -435,11 +435,12 @@
     repo.ui.status(_("%d files updated, %d files merged, "
                      "%d files removed, %d files unresolved\n") % stats)
 
-def update(repo, node):
+def update(repo, node, show_stats=True, warn_resolve=True):
     """update the working directory to node, merging linear changes"""
     stats = mergemod.update(repo, node, False, False, None)
-    _showstats(repo, stats)
-    if stats[3]:
+    if show_stats:
+        _showstats(repo, stats)
+    if warn_resolve and stats[3]:
         repo.ui.status(_("use 'hg resolve' to retry unresolved file merges\n"))
     return stats[3] > 0
 
diff -r 23fdaac2b454 -r 85a0f842114b mercurial/subrepo.py
--- a/mercurial/subrepo.py	Mit Okt 24 17:07:27 2012 +0200
+++ b/mercurial/subrepo.py	Mit Okt 24 17:07:27 2012 +0200
@@ -519,7 +519,10 @@
         self._get(state)
         source, revision, kind = state
         self._repo.ui.debug("getting subrepo %s\n" % self._path)
-        hg.clean(self._repo, revision, False)
+        if overwrite:
+            hg.clean(self._repo, revision, False)
+        else:
+            hg.update(self._repo, revision, False, False)
 
     def merge(self, state):
         self._get(state)
diff -r 23fdaac2b454 -r 85a0f842114b tests/test-subrepo.t
--- a/tests/test-subrepo.t	Mit Okt 24 17:07:27 2012 +0200
+++ b/tests/test-subrepo.t	Mit Okt 24 17:07:27 2012 +0200
@@ -210,9 +210,10 @@
   subrepo merge f0d2028bf86d+ 1831e14459c4 1f14a2e2d3ec
     subrepo t: other changed, get t:6747d179aa9a688023c4b0cad32e4c92bb7f34ad:hg
   getting subrepo t
+    searching for copies back to rev 1
   resolving manifests
-   overwrite: True, partial: False
-   ancestor: 60ca1237c194+, local: 60ca1237c194+, remote: 6747d179aa9a
+   overwrite: False, partial: False
+   ancestor: 60ca1237c194, local: 60ca1237c194+, remote: 6747d179aa9a
    t: remote is newer -> g
   updating: t 1/1 files (100.00%)
   getting t
@@ -580,16 +581,37 @@
   $ hg -q -R repo2/s push
   $ hg -R repo2/s up -C 0
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ echo 2 > repo2/s/a
-  $ hg -R repo2/s ci -m3
+  $ echo 2 > repo2/s/b
+  $ hg -R repo2/s ci -m3 -A
+  adding b
   created new head
   $ hg -R repo2 ci -m3
   $ hg -q -R repo2 push
-  abort: push creates new remote head 9d66565e64e1!
+  abort: push creates new remote head cc505f09a8b2!
   (did you forget to merge? use push -f to force)
   [255]
   $ hg -R repo update
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+test if untracked file is not overwritten
+
+  $ echo issue3276_ok > repo/s/b
+  $ hg -R repo2 push -f -q
+  $ hg -R repo update
+  b: untracked file differs
+  abort: untracked files in working directory differ from files in requested revision
+  [255]
+
+  $ cat repo/s/b
+  issue3276_ok
+  $ rm repo/s/b
+  $ hg -R repo revert --all
+  reverting repo/.hgsubstate
+  reverting subrepo s
+  $ hg -R repo update
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cat repo/s/b
+  2
   $ rm -rf repo2 repo
 
 


More information about the Mercurial-devel mailing list