[PATCH 2 of 2 rfc] subrepos: make subrepositories sticky

Erik Zielke ez at aragost.com
Tue Jan 25 02:51:41 CST 2011


# HG changeset patch
# User Erik Zielke <ez at aragost.com>
# Date 1294241235 -3600
# Node ID a0f44721987f64620669e59ec9d638b74d2c41ec
# Parent  29633b15e5841f444bce6f6b33822d24e91d134f
subrepos: make subrepositories sticky

Sticky subrepositories is that if a subrepository is updated to
something else than recorded in hgsubstate, then let them stay there
on update, together with a warning about not updating it, unless -C
option is specified. Which will then update to the revision recorded
in the .hgsubstate file. On updates where revisions has not been
changed but, there are modifications in the subrepository these will
be merged into the revision updated to.

diff -r 29633b15e584 -r a0f44721987f mercurial/subrepo.py
--- a/mercurial/subrepo.py	Tue Jan 25 09:20:03 2011 +0100
+++ b/mercurial/subrepo.py	Wed Jan 05 16:27:15 2011 +0100
@@ -131,7 +131,7 @@
                 sm[s] = r
             else:
                 debug(s, "both sides changed, merge with", r)
-                wctx.sub(s).merge(r)
+                wctx.sub(s).merge(r, overwrite)
                 sm[s] = l
         elif ld == a: # remote removed, local unchanged
             debug(s, "remote removed, remove")
@@ -437,20 +437,48 @@
         self._repo.ui.debug("getting subrepo %s\n" % self._path)
         hg.clean(self._repo, revision, False)
 
-    def merge(self, state):
+    def merge(self, state, overwrite=False):
         self._get(state)
         cur = self._repo['.']
         dst = self._repo[state[1]]
         anc = dst.ancestor(cur)
         if anc == cur:
-            self._repo.ui.debug("updating subrepo %s\n" % subrelpath(self))
-            hg.update(self._repo, state[1])
+            if not self.dirty():
+                self._repo.ui.debug("updating subrepo %s\n"
+                                    % subrelpath(self))
+                hg.update(self._repo, state[1])
+            else:
+                if dst != cur:
+                    self._repo.ui.warn(_('warning: subrepository %s left in '
+                                         'revision %s\n') %
+                                         (subrelpath(self), cur))
+                    w = self._repo[None]
+                    if w.dirty():
+                        self._repo.ui.warn(_('After committing the'
+                                            ' modifications to %s'
+                                            ' use "hg merge" in %s to '
+                                             'merge them with the intended '
+                                             'revision %s\n') %
+                                              (subrelpath(self),
+                                               subrelpath(self), dst))
+                    else:
+                        self._repo.ui.warn(_('(use "hg update -C" to update %s '
+                                             'to the intended revision %s)\n')
+                                              % (subrelpath(self), dst))
         elif anc == dst:
-            self._repo.ui.debug("skipping subrepo %s\n" % subrelpath(self))
+            if not self.dirty():
+                self._repo.ui.debug("skipping subrepo %s\n"
+                                    % subrelpath(self))
+            else:
+                self._repo.ui.debug("updating subrepo %s\n"
+                                    % subrelpath(self))
+                hg.update(self._repo, state[1])
         else:
-            self._repo.ui.debug("merging subrepo %s\n" % subrelpath(self))
+            self._repo.ui.debug("merging subrepo %s\n"
+                                % subrelpath(self))
             hg.merge(self._repo, state[1], remind=False)
 
+
     def push(self, force):
         # push subrepos depth-first for coherent ordering
         c = self._repo['']
@@ -607,11 +635,23 @@
         if overwrite:
             self._svncommand(['revert', '--recursive', self._path])
 
-    def merge(self, state):
+    def merge(self, state, overwrite=False):
         old = int(self._state[1])
         new = int(state[1])
-        if new > old:
-            self.get(state)
+        if self._wcrev() == self._state[1]:
+            self.get(state, overwrite)
+        else:
+            self._ui.warn(_('warning: subrepository %s left in '
+                                         'revision %s\n') %
+                                         (subrelpath(self),
+                                          old))
+                    
+            if self._wcchanged()[0]:
+                self._ui.warn(_('Some hint???\n'))
+            else:
+                self._ui.warn(_('(use "hg update -C" to update %s '
+                                'to the intended revision %s)\n') % 
+                                 (subrelpath(self), new))
 
     def push(self, force):
         # push is a no-op for SVN
@@ -763,16 +803,16 @@
                 return
         elif self._gitstate() == revision:
             if overwrite:
-#                self._gitcommand(['reset', 'HEAD', '.'])
-#                self._gitcommand(['reset', '--hard', 'HEAD'])
+                self._gitcommand(['reset', 'HEAD', '.'])
+                self._gitcommand(['reset', '--hard', 'HEAD'])
             return
         branch2rev, rev2branch = self._gitbranchmap()
 
         def checkout(args):
             cmd = ['checkout']
             if overwrite:
- #               self._gitcommand(['reset', 'HEAD', '.'])
-  #              cmd.append('-f')
+                self._gitcommand(['reset', 'HEAD', '.'])
+                cmd.append('-f')
             self._gitcommand(cmd + args)
 
         def rawcheckout():
@@ -791,7 +831,7 @@
         for b in branches:
             if b == 'refs/heads/master':
                 # master trumps all other branches
-                checkout(['checkout', 'refs/heads/master'])
+                self._gitcommand(['checkout', 'refs/heads/master'])
                 return
             if not firstlocalbranch and not b.startswith('refs/remotes/'):
                 firstlocalbranch = b
@@ -826,6 +866,7 @@
             # a real merge would be required, just checkout the revision
             rawcheckout()
 
+
     def commit(self, text, user, date):
         cmd = ['commit', '-a', '-m', text]
         env = os.environ.copy()
@@ -841,12 +882,27 @@
         # circumstances
         return self._gitstate()
 
-    def merge(self, state):
+    def merge(self, state, overwrite=False):
         source, revision, kind = state
         self._fetch(source, revision)
         base = self._gitcommand(['merge-base', revision, self._state[1]])
         if base == revision:
-            self.get(state) # fast forward merge
+            if not self._state[1] != self._gitstate():
+                self.get(state) # fast forward merge
+            else:
+               if self._gitstate() != revision:
+                    self._ui.warn(_('warning: subrepository %s left in '
+                                             'revision %s\n') %
+                                             (subrelpath(self),
+                                              self._gitstate()))
+                    out, code = self._gitdir(['diff-index', '--quiet', 'HEAD'])
+                    if code == 1:
+                        self._ui.warn(_('Some hint?\n'))
+                    else:
+                        self._ui.warn(_('(use "hg update -C" to update %s '
+                                        'to the intended revision %s)\n') % 
+                                         (subrelpath(self), revision))
+
         elif base != self._state[1]:
             self._gitcommand(['merge', '--no-commit', revision])
 
diff -r 29633b15e584 -r a0f44721987f mercurial/test-subrepo-sticky-git.t
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial/test-subrepo-sticky-git.t	Wed Jan 05 16:27:15 2011 +0100
@@ -0,0 +1,309 @@
+  $ "$TESTDIR/hghave" git || exit 80
+
+make git commits repeatable
+
+  $ GIT_AUTHOR_NAME='test'; export GIT_AUTHOR_NAME
+  $ GIT_AUTHOR_EMAIL='test at example.org'; export GIT_AUTHOR_EMAIL
+  $ GIT_AUTHOR_DATE='1234567891 +0000'; export GIT_AUTHOR_DATE
+  $ GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; export GIT_COMMITTER_NAME
+  $ GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"; export GIT_COMMITTER_EMAIL
+  $ GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"; export GIT_COMMITTER_DATE
+
+Setting up test environment
+  $ echo abc
+  $ hg init main
+  $ cd main
+  $ git init -q sub
+  $ echo sub = [git]sub > .hgsub
+  $ hg add .hgsub
+  $ cd sub
+  $ echo c > fminus1
+  $ git add fminus1
+  $ git commit -q -m minus0 
+  $ echo c > f0
+  $ git add f0
+  $ cd ..
+  $ echo c > f0
+  $ hg add f0
+  $ hg commit -m0
+  committing subrepository sub
+  $ echo c > f1
+  $ hg add f1
+  $ cd sub
+  $ echo c > f1
+  $ git add f1
+  $ cd ..
+  $ hg commit -m1
+  committing subrepository sub
+  $ echo c > f2
+  $ hg add f2
+  $ cd sub
+  $ echo c > f2
+  $ git add f2
+  $ cd ..
+  $ hg commit -m2
+  committing subrepository sub
+  $ hg log
+  changeset:   2:bec513ce5284
+  tag:         tip
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     2
+  
+  changeset:   1:7a8ebfee84ef
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     1
+  
+  changeset:   0:4124929123d7
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     0
+  
+  $ cd sub
+  $ git log
+  commit 7129cba78d04717043d5867a6098933f2380c0ad
+  Author: test <test at example.org>
+  Date:   Thu Jan 1 00:00:00 1970 +0000
+  
+      2
+  
+  commit 770b988e856a1ea70aa74040df79c18e93233274
+  Author: test <test at example.org>
+  Date:   Thu Jan 1 00:00:00 1970 +0000
+  
+      1
+  
+  commit 7660fa4dfcb23a20d633e9fcd1d2349b7ff5c30a
+  Author: test <test at example.org>
+  Date:   Thu Jan 1 00:00:00 1970 +0000
+  
+      0
+  
+  commit 811f2b261d13947ee93c3552f92f38b0c36cd684
+  Author: test <test at example.org>
+  Date:   Fri Feb 13 23:31:31 2009 +0000
+  
+      minus0
+  $ cd ..
+
+Test subrepo has:
+- no files changes
+- no revision updates
+- without clean parameter
+
+  $ hg update 1
+  checking out detached HEAD in subrepo sub
+  check out a git branch if you intend to make changes
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg id
+  7a8ebfee84ef
+  $ cd sub
+  $ git rev-parse HEAD
+  770b988e856a1ea70aa74040df79c18e93233274
+  $ cd ..
+  $ hg update -C 2
+  Previous HEAD position was 770b988... 1
+  HEAD is now at 7129cba... 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Test subrepo has:
+- file change
+- no revision updates
+- without clean parameter
+
+  $ echo c2 > sub/f0
+  $ hg update 1
+  checking out detached HEAD in subrepo sub
+  check out a git branch if you intend to make changes
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ cat sub/f0
+  c2
+  $ hg id
+  7a8ebfee84ef
+  $ cd sub
+  $ git rev-parse HEAD
+  770b988e856a1ea70aa74040df79c18e93233274
+  $ cd ..
+  $ hg update -C 2
+  Previous HEAD position was 770b988... 1
+  HEAD is now at 7129cba... 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Test subrepo has:
+- no file changes
+- revision updates
+- without clean parameter
+
+  $ cd sub
+  $ hg id
+  bec513ce5284 tip
+  $ hg update 0
+  checking out detached HEAD in subrepo sub
+  check out a git branch if you intend to make changes
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ hg id
+  4124929123d7+
+  $ cd ..
+  $ hg update 1
+  warning: subrepository sub left in revision 7660fa4dfcb23a20d633e9fcd1d2349b7ff5c30a
+   (use "hg update -C"to update revision fetched from revision)
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd sub
+  $ git rev-parse HEAD
+  7660fa4dfcb23a20d633e9fcd1d2349b7ff5c30a
+  $ cd ..
+  $ hg update -C 2
+  Previous HEAD position was 7660fa4... 0
+  HEAD is now at 7129cba... 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Test subrepo has:
+- file changes
+- revision updates
+- without clean parameter
+
+  $ cd sub
+  $ hg id
+  bec513ce5284 tip
+  $ hg update 0
+  checking out detached HEAD in subrepo sub
+  check out a git branch if you intend to make changes
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ hg id
+  4124929123d7+
+  $ echo c > f5
+  $ hg add f5
+  $ cd ..
+  $ hg update 1
+  warning: subrepository sub left in revision 7660fa4dfcb23a20d633e9fcd1d2349b7ff5c30a
+   (use "hg update -C"to update revision fetched from revision)
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd sub
+  $ git rev-parse HEAD
+  7660fa4dfcb23a20d633e9fcd1d2349b7ff5c30a
+  $ cd ..
+  $ hg update -C 2 
+  Previous HEAD position was 7660fa4... 0
+  HEAD is now at 7129cba... 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Test subrepo has:
+- no files changes
+- no revision updates
+- with clean parameter
+
+  $ hg update 1 -C
+  checking out detached HEAD in subrepo sub
+  check out a git branch if you intend to make changes
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg id
+  7a8ebfee84ef
+  $ cd sub
+  $ git rev-parse HEAD
+  770b988e856a1ea70aa74040df79c18e93233274
+  $ cd ..
+  $ hg update -C 2
+  Previous HEAD position was 770b988... 1
+  HEAD is now at 7129cba... 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+
+Test subrepo has:
+- file change
+- no revision updates
+- with clean parameter
+  $ echo abc
+  $ echo c2 > sub/f0
+  $ hg update 1 -C
+  checking out detached HEAD in subrepo sub
+  check out a git branch if you intend to make changes
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ cat sub/f0
+  c24
+  $ hg id
+  7a8ebfee84ef
+  $ cd sub
+  $ git rev-parse HEAD
+  770b988e856a1ea70aa74040df79c18e93233274
+  $ cd ..
+  $ hg update -C 2
+  Previous HEAD position was 770b988... 1
+  HEAD is now at 7129cba... 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cat sub/f0
+  $ cd sub
+  $ git status
+  $ cd ..
+
+Test subrepo has:
+- no file changes
+- revision updates
+- with clean parameter
+
+  $ cd sub
+  $ hg update 0
+  checking out detached HEAD in subrepo sub
+  check out a git branch if you intend to make changes
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ hg id
+  4124929123d7+
+  $ cd ..
+  $ hg update 1 -C
+  checking out detached HEAD in subrepo sub
+  check out a git branch if you intend to make changes
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd sub
+  $ git rev-parse HEAD
+  770b988e856a1ea70aa74040df79c18e93233274
+  $ cd ..
+  $ hg update -C 2
+  Previous HEAD position was 770b988... 1
+  HEAD is now at 7129cba... 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Test subrepo has:
+- file changes
+- revision updates
+- with clean parameter
+
+  $ cd sub
+  $ hg id
+  bec513ce5284 tip
+  $ hg update 0
+  checking out detached HEAD in subrepo sub
+  check out a git branch if you intend to make changes
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ hg id
+  4124929123d7+
+  $ echo c > f5
+  $ hg add f5
+  $ cd ..
+  $ hg -R sub status
+  abort: repository sub not found!
+  [255]
+  $ hg update 1 -C
+  checking out detached HEAD in subrepo sub
+  check out a git branch if you intend to make changes
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd sub
+  $ git rev-parse HEAD
+  770b988e856a1ea70aa74040df79c18e93233274
+  $ git status
+  # Not currently on any branch.
+  # Changed but not updated:
+  #   (use "git add <file>..." to update what will be committed)
+  #   (use "git checkout -- <file>..." to discard changes in working directory)
+  #
+  #	modified:   f0
+  #
+  # Untracked files:
+  #   (use "git add <file>..." to include in what will be committed)
+  #
+  #	f5
+  no changes added to commit (use "git add" and/or "git commit -a")
+  $ cd ..
+  $ hg update -C 2 
+  Previous HEAD position was 770b988... 1
+  HEAD is now at 7129cba... 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
diff -r 29633b15e584 -r a0f44721987f tests/test-subrepo-sticky-git.t
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-subrepo-sticky-git.t	Wed Jan 05 16:27:15 2011 +0100
@@ -0,0 +1,326 @@
+  $ "$TESTDIR/hghave" git || exit 80
+
+make git commits repeatable
+
+  $ GIT_AUTHOR_NAME='test'; export GIT_AUTHOR_NAME
+  $ GIT_AUTHOR_EMAIL='test at example.org'; export GIT_AUTHOR_EMAIL
+  $ GIT_AUTHOR_DATE='1234567891 +0000'; export GIT_AUTHOR_DATE
+  $ GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; export GIT_COMMITTER_NAME
+  $ GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"; export GIT_COMMITTER_EMAIL
+  $ GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"; export GIT_COMMITTER_DATE
+
+Setting up test environment
+  $ hg init main
+  $ cd main
+  $ git init -q sub
+  $ echo sub = [git]sub > .hgsub
+  $ hg add .hgsub
+  $ cd sub
+  $ echo c > fminus1
+  $ git add fminus1
+  $ git commit -q -m minus0 
+  $ echo c > f0
+  $ git add f0
+  $ cd ..
+  $ echo c > f0
+  $ hg add f0
+  $ hg commit -m0
+  committing subrepository sub
+  $ echo c > f1
+  $ hg add f1
+  $ cd sub
+  $ echo c > f1
+  $ git add f1
+  $ cd ..
+  $ hg commit -m1
+  committing subrepository sub
+  $ echo c > f2
+  $ hg add f2
+  $ cd sub
+  $ echo c > f2
+  $ git add f2
+  $ cd ..
+  $ hg commit -m2
+  committing subrepository sub
+  $ hg log
+  changeset:   2:bec513ce5284
+  tag:         tip
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     2
+  
+  changeset:   1:7a8ebfee84ef
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     1
+  
+  changeset:   0:4124929123d7
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     0
+  
+  $ cd sub
+  $ git log
+  commit 7129cba78d04717043d5867a6098933f2380c0ad
+  Author: test <test at example.org>
+  Date:   Thu Jan 1 00:00:00 1970 +0000
+  
+      2
+  
+  commit 770b988e856a1ea70aa74040df79c18e93233274
+  Author: test <test at example.org>
+  Date:   Thu Jan 1 00:00:00 1970 +0000
+  
+      1
+  
+  commit 7660fa4dfcb23a20d633e9fcd1d2349b7ff5c30a
+  Author: test <test at example.org>
+  Date:   Thu Jan 1 00:00:00 1970 +0000
+  
+      0
+  
+  commit 811f2b261d13947ee93c3552f92f38b0c36cd684
+  Author: test <test at example.org>
+  Date:   Fri Feb 13 23:31:31 2009 +0000
+  
+      minus0
+  $ cd ..
+
+Test subrepo has:
+- no files changes
+- no revision updates
+- without clean parameter
+
+  $ hg update 1
+  checking out detached HEAD in subrepo sub
+  check out a git branch if you intend to make changes
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg id
+  7a8ebfee84ef
+  $ cd sub
+  $ git rev-parse HEAD
+  770b988e856a1ea70aa74040df79c18e93233274
+  $ cd ..
+  $ hg update -C 2
+  Previous HEAD position was 770b988... 1
+  HEAD is now at 7129cba... 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Test subrepo has:
+- file change
+- no revision updates
+- without clean parameter
+
+  $ echo c2 > sub/f0
+  $ hg update 1
+  checking out detached HEAD in subrepo sub
+  check out a git branch if you intend to make changes
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ cat sub/f0
+  c2
+  $ hg id
+  7a8ebfee84ef+
+  $ cd sub
+  $ git rev-parse HEAD
+  770b988e856a1ea70aa74040df79c18e93233274
+  $ git reset --hard HEAD 
+  HEAD is now at 770b988 1
+  $ cd ..
+  $ hg update -C 2
+  Previous HEAD position was 770b988... 1
+  HEAD is now at 7129cba... 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Test subrepo has:
+- no file changes
+- revision updates
+- without clean parameter
+
+  $ cd sub
+  $ git rev-parse HEAD
+  7129cba78d04717043d5867a6098933f2380c0ad
+  $ git checkout 7660fa4dfcb23a20d633e9fcd1d2349b7ff5c30a
+  Previous HEAD position was 7129cba... 2
+  HEAD is now at 7660fa4... 0
+  $ git rev-parse HEAD
+  7660fa4dfcb23a20d633e9fcd1d2349b7ff5c30a
+  $ git status
+  # Not currently on any branch.
+  nothing to commit (working directory clean)
+  $ cd ..
+  $ hg update 1
+  warning: subrepository sub left in revision 7660fa4dfcb23a20d633e9fcd1d2349b7ff5c30a
+  (use "hg update -C" to update sub to the intended revision 770b988e856a1ea70aa74040df79c18e93233274)
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ cd sub
+  $ git rev-parse HEAD
+  7660fa4dfcb23a20d633e9fcd1d2349b7ff5c30a
+  $ git reset --hard HEAD
+  HEAD is now at 7660fa4 0
+  $ cd ..
+  $ hg update -C 2
+  Previous HEAD position was 7660fa4... 0
+  HEAD is now at 7129cba... 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Test subrepo has:
+- file changes
+- revision updates
+- without clean parameter
+
+  $ cd sub
+  $ git rev-parse HEAD
+  7129cba78d04717043d5867a6098933f2380c0ad
+  $ git checkout 7660fa4dfcb23a20d633e9fcd1d2349b7ff5c30a -q
+  $ git rev-parse HEAD
+  7660fa4dfcb23a20d633e9fcd1d2349b7ff5c30a
+  $ echo c > f5
+  $ git add f5
+  $ cd ..
+  $ hg update 1
+  warning: subrepository sub left in revision 7660fa4dfcb23a20d633e9fcd1d2349b7ff5c30a
+  Some hint?
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ cd sub
+  $ git rev-parse HEAD
+  7660fa4dfcb23a20d633e9fcd1d2349b7ff5c30a
+  $ git reset --hard HEAD
+  HEAD is now at 7660fa4 0
+  $ cd ..
+  $ hg update -C 2 
+  Previous HEAD position was 7660fa4... 0
+  HEAD is now at 7129cba... 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Test subrepo has:
+- no files changes
+- no revision updates
+- with clean parameter
+
+  $ hg update 1 -C
+  checking out detached HEAD in subrepo sub
+  check out a git branch if you intend to make changes
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg id
+  7a8ebfee84ef
+  $ cd sub
+  $ git rev-parse HEAD
+  770b988e856a1ea70aa74040df79c18e93233274
+  $ cd ..
+  $ hg update -C 2
+  Previous HEAD position was 770b988... 1
+  HEAD is now at 7129cba... 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+
+Test subrepo has:
+- file change
+- no revision updates
+- with clean parameter
+  $ echo c2 > sub/f0
+  $ hg update 1 -C
+  checking out detached HEAD in subrepo sub
+  check out a git branch if you intend to make changes
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ cat sub/f0
+  c
+  $ hg id
+  7a8ebfee84ef
+  $ cd sub
+  $ git rev-parse HEAD
+  770b988e856a1ea70aa74040df79c18e93233274
+  $ cd ..
+  $ hg update -C 2
+  Previous HEAD position was 770b988... 1
+  HEAD is now at 7129cba... 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cat sub/f0
+  c
+  $ cd sub
+  $ git status
+  # Not currently on any branch.
+  nothing to commit (working directory clean)
+  $ cd ..
+
+Test subrepo has:
+- no file changes
+- revision updates
+- with clean parameter
+
+  $ cd sub
+  $ hg update 0
+  checking out detached HEAD in subrepo sub
+  check out a git branch if you intend to make changes
+  1 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ hg id
+  4124929123d7
+  $ cd ..
+  $ hg update 1 -C
+  checking out detached HEAD in subrepo sub
+  check out a git branch if you intend to make changes
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd sub
+  $ git rev-parse HEAD
+  770b988e856a1ea70aa74040df79c18e93233274
+  $ cd ..
+  $ hg update -C 2
+  Previous HEAD position was 770b988... 1
+  HEAD is now at 7129cba... 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Test subrepo has:
+- file changes
+- revision updates
+- with clean parameter
+
+  $ cd sub
+  $ git rev-parse HEAD
+  7129cba78d04717043d5867a6098933f2380c0ad
+  $ hg update 0
+  checking out detached HEAD in subrepo sub
+  check out a git branch if you intend to make changes
+  1 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ hg id
+  4124929123d7
+  $ echo c > f5
+  $ git add f5
+  $ cd ..
+  $ hg update 1 -C
+  checking out detached HEAD in subrepo sub
+  check out a git branch if you intend to make changes
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd sub
+  $ git rev-parse HEAD
+  770b988e856a1ea70aa74040df79c18e93233274
+  $ git status
+  # Not currently on any branch.
+  # Untracked files:
+  #   (use "git add <file>..." to include in what will be committed)
+  #
+  #	f5
+  nothing added to commit but untracked files present (use "git add" to track)
+  $ git reset --hard HEAD
+  HEAD is now at 770b988 1
+  $ cd ..
+  $ hg update -C 2 
+  Previous HEAD position was 770b988... 1
+  HEAD is now at 7129cba... 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+Test subrepo already at intended revision:
+  $ cd sub
+  $ git checkout 770b988e856a1ea70aa74040df79c18e93233274
+  Previous HEAD position was 7129cba... 2
+  HEAD is now at 770b988... 1
+  $ git rev-parse HEAD
+  770b988e856a1ea70aa74040df79c18e93233274
+  $ cd ..
+  $ hg id -n
+  2
+  $ hg update 1
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg id -n
+  1+
+  $ cd sub
+  $ git rev-parse HEAD
+  770b988e856a1ea70aa74040df79c18e93233274
+  $ cd ..
diff -r 29633b15e584 -r a0f44721987f tests/test-subrepo-sticky-svn.t
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-subrepo-sticky-svn.t	Wed Jan 05 16:27:15 2011 +0100
@@ -0,0 +1,336 @@
+  $ "$TESTDIR/hghave" svn || exit 80
+
+create subversion repo
+
+  $ svnadmin create svn-repo
+  $ cat > svn-repo/hooks/pre-revprop-change <<EOF
+  > #!/bin/sh
+  > exit 0
+  > EOF
+  $ chmod +x svn-repo/hooks/pre-revprop-change
+
+  $ svn co file://$TESTTMP/svn-repo -q svnrepo
+  $ cd svnrepo
+  $ echo c > f0
+  $ svn add f0 -q
+  $ svn commit -m0 -q
+  $ echo c > f1
+  $ svn add f1 -q
+  $ svn -q propset --revprop -r HEAD svn:date "2010-03-12T21:25:00.0Z" file://$TESTTMP/svn-repo
+  $ svn -q propset --revprop -r HEAD svn:author "test" file://$TESTTMP/svn-repo
+  $ svn commit -m1 -q
+  $ echo c > f2
+  $ svn add f2 -q
+  $ svn -q propset --revprop -r HEAD svn:date "2010-03-12T21:25:00.0Z" file://$TESTTMP/svn-repo
+  $ svn -q propset --revprop -r HEAD svn:author "test" file://$TESTTMP/svn-repo
+  $ svn commit -m2 -q
+  $ svn -q propset --revprop -r HEAD svn:date "2010-03-12T21:25:00.0Z" file://$TESTTMP/svn-repo
+  $ svn -q propset --revprop -r HEAD svn:author "test" file://$TESTTMP/svn-repo
+  $ cd ..
+
+Setting up test environment
+
+  $ hg init main
+  $ cd main
+  $ mkdir sub
+  $ svn co file://$TESTTMP/svn-repo -q sub
+  $ echo sub = [svn]file://$TESTTMP/svn-repo > .hgsub
+  $ hg add .hgsub
+  $ echo c > f0
+  $ hg add f0
+  $ cd sub
+  $ svn update -r 1 -q
+  $ cd ..
+  $ hg commit -m0
+  committing subrepository sub
+  $ echo c > f1
+  $ hg add f1
+  $ cd sub
+  $ svn update -r 2 -q
+  $ cd ..
+  $ hg commit -m1
+  committing subrepository sub
+  $ echo c > f2
+  $ hg add f2
+  $ cd sub
+  $ svn update -r 3 -q
+  $ cd ..
+  $ hg commit -m2
+  committing subrepository sub
+  $ hg log
+  changeset:   2:* (glob)
+  tag:         tip
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     2
+  
+  changeset:   1:* (glob)
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     1
+  
+  changeset:   0:* (glob)
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     0
+  
+  $ cd sub
+  $ svn log
+  ------------------------------------------------------------------------
+  r3 | test | 2010-03-12 21:25:00 +0000 (Fri, 12 Mar 2010) | 1 line
+  
+  2
+  ------------------------------------------------------------------------
+  r2 | test | 2010-03-12 21:25:00 +0000 (Fri, 12 Mar 2010) | 1 line
+  
+  1
+  ------------------------------------------------------------------------
+  r1 | test | 2010-03-12 21:25:00 +0000 (Fri, 12 Mar 2010) | 1 line
+  
+  0
+  ------------------------------------------------------------------------
+  $ cd ..
+
+Test subrepo has:
+- no files changes
+- no revision updates
+- without clean parameter
+
+  $ hg update 1
+  D    $TESTTMP/main/sub/f2
+  Checked out revision 2.
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg id -n
+  1
+  $ cd sub
+  $ svnversion
+  2
+  $ cd ..
+  $ hg update -C 2
+  A    $TESTTMP/main/sub/f2
+  Checked out revision 3.
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Test subrepo has:
+- file change
+- no revision updates
+- without clean parameter
+
+  $ cd sub
+  $ svnversion
+  3
+  $ echo c2 > f0
+  $ svnversion
+  3M
+  $ cd ..
+  $ hg update 1
+  D    $TESTTMP/main/sub/f2
+  Checked out revision 2.
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ cat sub/f0
+  c2
+  $ hg id -n
+  1+
+  $ cd sub
+  $ svnversion
+  2M
+  $ svn status
+  M       f0
+  $ cd ..
+  $ hg update -C 2
+  A    $TESTTMP/main/sub/f2
+  Checked out revision 3.
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Test subrepo has:
+- no file changes
+- revision updates
+- without clean parameter
+
+  $ cd sub
+  $ svnversion
+  3
+  $ svn update -r 1
+  D    f1
+  D    f2
+  Updated to revision 1.
+  $ svnversion
+  1
+  $ cd ..
+  $ hg update 1
+  warning: subrepository sub left in revision 3
+  (use "hg update -C" to update sub to the intended revision 2)
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg id -n
+  1+
+  $ cd sub
+  $ svnversion
+  1
+  $ cd ..
+  $ hg update -C 2
+  A    $TESTTMP/main/sub/f1
+  A    $TESTTMP/main/sub/f2
+  Checked out revision 3.
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Test subrepo has:
+- file changes
+- revision updates
+- without clean parameter
+
+  $ cd sub
+  $ svnversion
+  3
+  $ svn update -r 1
+  D    f1
+  D    f2
+  Updated to revision 1.
+  $ svnversion
+  1
+  $ echo c > f5 
+  $ svn add f5
+  A         f5
+  $ cd ..
+  $ hg update 1
+  warning: subrepository sub left in revision 3
+  Some hint???
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ cd sub
+  $ svnversion
+  1M
+  $ svn status
+  A       f5
+  $ cd ..
+  $ hg update -C 2 
+  A    $TESTTMP/main/sub/f1
+  A    $TESTTMP/main/sub/f2
+  Checked out revision 3.
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm sub/f5
+
+Test subrepo has:
+- no files changes
+- no revision updates
+- with clean parameter
+
+  $ hg update 1 -C
+  D    $TESTTMP/main/sub/f2
+  Checked out revision 2.
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg id -n
+  1
+  $ cd sub
+  $ svnversion
+  2
+  $ svn status
+  $ cd ..
+  $ hg update -C 2
+  A    $TESTTMP/main/sub/f2
+  Checked out revision 3.
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Test subrepo has:
+- file change
+- no revision updates
+- with clean parameter
+
+  $ echo c2 > sub/f0
+  $ hg status -S
+  $ hg id -n
+  2
+  $ cd sub
+  $ svn status
+  M       f0
+  $ svnversion
+  3M
+  $ cd ..
+  $ hg update 1 -C
+  D    $TESTTMP/main/sub/f2
+  Checked out revision 2.
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg id -n
+  1
+  $ cd sub
+  $ svnversion
+  2
+  $ cd ..
+  $ hg status -S
+  $ cat sub/f0
+  c
+  $ hg update -C 2
+  A    $TESTTMP/main/sub/f2
+  Checked out revision 3.
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Test subrepo has:
+- no file changes
+- revision updates
+- with clean parameter
+
+  $ cd sub
+  $ svn up -r 1
+  D    f1
+  D    f2
+  Updated to revision 1.
+  $ hg id -n
+  2
+  $ cd ..
+  $ hg update 1 -C
+  A    $TESTTMP/main/sub/f1
+  Checked out revision 2.
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg id -n
+  1
+  $ cd sub
+  $ svnversion
+  2
+  $ cd ..
+  $ hg update -C 2
+  A    $TESTTMP/main/sub/f2
+  Checked out revision 3.
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg id -n
+  2
+
+Test subrepo has:
+- file changes
+- revision updates
+- with clean parameter
+
+  $ cd sub
+  $ svnversion
+  3
+  $ svn up -r 1
+  D    f1
+  D    f2
+  Updated to revision 1.
+  $ svnversion
+  1
+  $ echo c > f5
+  $ svn add f5
+  A         f5
+  $ svn status
+  A       f5
+  $ cd ..
+  $ hg update 1 -C
+  A    $TESTTMP/main/sub/f1
+  Checked out revision 2.
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ cd sub
+  $ svnversion
+  2
+  $ svn status
+  ?       f5
+  $ cd ..
+  $ hg update -C 2 
+  A    $TESTTMP/main/sub/f2
+  Checked out revision 3.
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg id -n
+  2
+  $ cd sub
+  $ svnversion
+  3
+  $ svn status
+  ?       f5
+  $ cd ..
diff -r 29633b15e584 -r a0f44721987f tests/test-subrepo-sticky.t
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-subrepo-sticky.t	Wed Jan 05 16:27:15 2011 +0100
@@ -0,0 +1,244 @@
+Setting up test environment
+
+  $ hg init main
+  $ cd main
+  $ hg init sub
+  $ echo sub = sub > .hgsub
+  $ hg add .hgsub
+  $ cd sub
+  $ echo c > f0
+  $ hg add f0
+  $ cd ..
+  $ echo c > f0
+  $ hg add f0
+  $ hg commit -m0
+  committing subrepository sub
+  $ echo c > f1
+  $ hg add f1
+  $ cd sub
+  $ echo c > f1
+  $ hg add f1
+  $ cd ..
+  $ hg commit -m1
+  committing subrepository sub
+  $ echo c > f2
+  $ hg add f2
+  $ cd sub
+  $ echo c > f2
+  $ hg add f2
+  $ cd ..
+  $ hg commit -m2
+  committing subrepository sub
+  $ hg log
+  changeset:   2:c42a03397125
+  tag:         tip
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     2
+  
+  changeset:   1:c502508fae94
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     1
+  
+  changeset:   0:c2d8584419c9
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     0
+  
+  $ hg -R sub log
+  changeset:   2:34d699622247
+  tag:         tip
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     2
+  
+  changeset:   1:6b1c4524d934
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     1
+  
+  changeset:   0:d90e2fc6d043
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     0
+  
+Test subrepo has:
+- no files changes
+- no revision updates
+- without clean parameter
+
+  $ hg update 1
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg id -n
+  1
+  $ hg -R sub id -n
+  1
+  $ hg update -C 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Test subrepo has:
+- file change
+- no revision updates
+- without clean parameter
+
+  $ echo c2 > sub/f0
+  $ hg update 1
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg id -n
+  1+
+  $ hg -R sub id -n
+  1+
+  $ cat sub/f0
+  c2
+  $ hg update -C 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Test subrepo has:
+- no file changes
+- revision updates
+- without clean parameter
+
+  $ cd sub
+  $ hg id -n
+  2
+  $ hg update 0
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ hg id -n
+  0
+  $ cd ..
+  $ hg update 1
+  warning: subrepository sub left in revision d90e2fc6d043
+  (use "hg update -C" to update sub to the intended revision 6b1c4524d934)
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg id -n
+  1+
+  $ hg -R sub id -n
+  0
+  $ hg update -C 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Test subrepo has:
+- file changes
+- revision updates
+- without clean parameter
+
+  $ cd sub
+  $ hg id -n
+  2
+  $ hg update 0
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ hg id -n
+  0
+  $ echo c > f5
+  $ hg add f5
+  $ cd ..
+  $ hg update 1
+  warning: subrepository sub left in revision d90e2fc6d043
+  After committing the modifications to sub use "hg merge" in sub to merge them with the intended revision 6b1c4524d934
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg -R sub id -n
+  0+
+  $ hg -R sub status
+  A f5
+  $ hg update -C 2 
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm sub/f5
+
+Test subrepo has:
+- no files changes
+- no revision updates
+- with clean parameter
+
+  $ hg update 1 -C
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg id -n
+  1
+  $ hg -R sub id -n
+  1
+  $ hg update -C 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+
+Test subrepo has:
+- file change
+- no revision updates
+- with clean parameter
+
+  $ echo c2 > sub/f0
+  $ hg status -S
+  M sub/f0
+  $ hg id -n
+  2
+  $ hg update 1 -C
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg id -n
+  1
+  $ hg status -S
+  $ cat sub/f0
+  c
+  $ hg update -C 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Test subrepo has:
+- no file changes
+- revision updates
+- with clean parameter
+
+  $ cd sub
+  $ hg update 0
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ hg id -n
+  0
+  $ cd ..
+  $ hg update 1 -C
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg id -n
+  1
+  $ hg -R sub id -n
+  1
+  $ hg update -C 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Test subrepo has:
+- file changes
+- revision updates
+- with clean parameter
+
+  $ cd sub
+  $ hg id -n
+  2
+  $ hg update 0
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ hg id -n
+  0
+  $ echo c > f5
+  $ hg add f5
+  $ cd ..
+  $ hg -R sub status
+  A f5
+  $ hg update 1 -C
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg -R sub id -n
+  1
+  $ hg -R sub status
+  ? f5
+  $ hg update -C 2 
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Test subrepo already at intended revision:
+  $ cd sub
+  $ hg update 1
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg id -n
+  1
+  $ cd ..
+  $ hg id -n
+  2
+  $ hg update 1
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg id -n
+  1+
+  $ hg -R sub id -n
+  1


More information about the Mercurial-devel mailing list