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

Erik Zielke ez at aragost.com
Wed Jan 26 06:20:15 CST 2011


# HG changeset patch
# User Erik Zielke <ez at aragost.com>
# Date 1294241235 -3600
# Node ID 63c76fed1e6b482eeec7b19496bc673da3cd2038
# Parent  4c003dc9ab3cd8f379f9f761931bddcf03bce21e
subrepos: make subrepositories sticky

Making subrepositories sticky means that if we have the following
links between main repository and subrepository:

r0 - s0
r1 - s1
r2 - s2

and have updated so the revisions are not at the linked states, e.g.
we are at r1 in the main repository and s2 in the sub repository. Then
when we update the main repository, the subrepository stays at s2,
unless we use clean when updating.

Example:

    Current state: r1/s2
    hg up 0
    Current state: r0/s2
    hg up 0 --clean
    Current state: r0/s0

diff --git a/mercurial/subrepo.py b/mercurial/subrepo.py
--- a/mercurial/subrepo.py
+++ b/mercurial/subrepo.py
@@ -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,16 +437,37 @@
         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])
+            elif dst != cur:
+                self._repo.ui.warn(_('warning: subrepository %s left at '
+                                     'revision %s\n') %
+                                     (subrelpath(self), cur))
+                w = self._repo[None]
+                if w.dirty():
+                    self._repo.ui.warn(_('commit dirty subrepository or use '
+                                         '"hg update -C" to discard changes and'
+                                         ' update\n'))
+                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))
             hg.merge(self._repo, state[1], remind=False)
@@ -607,11 +628,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 at '
+                                         'revision %s\n') %
+                                         (subrelpath(self),
+                                          old))
+            if self._wcchanged()[0]:
+                self._ui.warn(_('commit dirty subrepository or use '
+                                '"hg update -C" to discard changes and update\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
@@ -841,12 +874,26 @@
         # 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
+            elif self._gitstate() != revision:
+                self._ui.warn(_('warning: subrepository %s left at '
+                                'revision %s\n') %
+                                (subrelpath(self), self._gitstate()))
+                out, code = self._gitdir(['diff-index', '--quiet', 'HEAD'])
+                if code == 1:
+                    self._ui.warn(_('commit dirty subrepository or use '
+                                    '"hg update -C" to discard changes and '
+                                    'update\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 --git a/tests/test-subrepo-sticky-git.t b/tests/test-subrepo-sticky-git.t
new file mode 100644
--- /dev/null
+++ b/tests/test-subrepo-sticky-git.t
@@ -0,0 +1,306 @@
+  $ "$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 minus1
+  $ 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:7dda36e8e9bd
+  tag:         tip
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     2
+  
+  changeset:   1:0f892b49931c
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     1
+  
+  changeset:   0:a80fe6e7665b
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     0
+  
+  $ cd sub
+  $ git log
+  commit a471774bbd5b51470e6c0f996e63d8f4bb5b3fcc
+  Author: test <test at example.org>
+  Date:   Thu Jan 1 00:00:00 1970 +0000
+  
+      2
+  
+  commit 210b28015aec453336e0e20a78e0fa429d4f67a3
+  Author: test <test at example.org>
+  Date:   Thu Jan 1 00:00:00 1970 +0000
+  
+      1
+  
+  commit 01e91de0bcd7f00ee81661828ccedd91e2a94883
+  Author: test <test at example.org>
+  Date:   Thu Jan 1 00:00:00 1970 +0000
+  
+      0
+  
+  commit 1587b6be2b7a63f0cc3948ff357ae19b7179ff52
+  Author: test <test at example.org>
+  Date:   Fri Feb 13 23:31:31 2009 +0000
+  
+      minus1
+  $ 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
+  0f892b49931c
+  $ cd sub
+  $ git rev-parse HEAD
+  210b28015aec453336e0e20a78e0fa429d4f67a3
+  $ cd ..
+  $ hg update -C 2
+  Previous HEAD position was 210b280... 1
+  HEAD is now at a471774... 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
+  0f892b49931c+
+  $ cd sub
+  $ git rev-parse HEAD
+  210b28015aec453336e0e20a78e0fa429d4f67a3
+  $ cd ..
+  $ hg update -C 2
+  Previous HEAD position was 210b280... 1
+  HEAD is now at a471774... 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
+  a471774bbd5b51470e6c0f996e63d8f4bb5b3fcc
+  $ git checkout 01e91de0bcd7f00ee81661828ccedd91e2a94883
+  Previous HEAD position was a471774... 2
+  HEAD is now at 01e91de... 0
+  $ git rev-parse HEAD
+  01e91de0bcd7f00ee81661828ccedd91e2a94883
+  $ cd ..
+  $ hg update 1
+  warning: subrepository sub left at revision 01e91de0bcd7f00ee81661828ccedd91e2a94883
+  use "hg update -C" to update sub to the intended revision 210b28015aec453336e0e20a78e0fa429d4f67a3
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ cd sub
+  $ git rev-parse HEAD
+  01e91de0bcd7f00ee81661828ccedd91e2a94883
+  $ cd ..
+  $ hg update -C 2
+  Previous HEAD position was 01e91de... 0
+  HEAD is now at a471774... 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
+  a471774bbd5b51470e6c0f996e63d8f4bb5b3fcc
+  $ git checkout 01e91de0bcd7f00ee81661828ccedd91e2a94883 -q
+  $ git rev-parse HEAD
+  01e91de0bcd7f00ee81661828ccedd91e2a94883
+  $ echo c > f5
+  $ git add f5
+  $ cd ..
+  $ hg update 1
+  warning: subrepository sub left at revision 01e91de0bcd7f00ee81661828ccedd91e2a94883
+  commit dirty subrepository or use "hg update -C" to discard changes and update
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ cd sub
+  $ git rev-parse HEAD
+  01e91de0bcd7f00ee81661828ccedd91e2a94883
+  $ cd ..
+  $ hg update -C 2
+  Previous HEAD position was 01e91de... 0
+  HEAD is now at a471774... 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
+  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
+  0f892b49931c
+  $ cd sub
+  $ git rev-parse HEAD
+  210b28015aec453336e0e20a78e0fa429d4f67a3
+  $ cd ..
+  $ hg update -C 2
+  Previous HEAD position was 210b280... 1
+  HEAD is now at a471774... 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
+  0f892b49931c
+  $ cd sub
+  $ git rev-parse HEAD
+  210b28015aec453336e0e20a78e0fa429d4f67a3
+  $ cd ..
+  $ hg update -C 2
+  Previous HEAD position was 210b280... 1
+  HEAD is now at a471774... 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cat sub/f0
+  c
+
+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
+  a80fe6e7665b
+  $ 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
+  210b28015aec453336e0e20a78e0fa429d4f67a3
+  $ cd ..
+  $ hg update -C 2
+  Previous HEAD position was 210b280... 1
+  HEAD is now at a471774... 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
+  a471774bbd5b51470e6c0f996e63d8f4bb5b3fcc
+  $ 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
+  a80fe6e7665b
+  $ 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
+  210b28015aec453336e0e20a78e0fa429d4f67a3
+  $ cd ..
+  $ hg update -C 2
+  Previous HEAD position was 210b280... 1
+  HEAD is now at a471774... 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Test subrepo already at intended revision:
+
+  $ cd sub
+  $ git checkout 210b28015aec453336e0e20a78e0fa429d4f67a3
+  Previous HEAD position was a471774... 2
+  HEAD is now at 210b280... 1
+  $ git rev-parse HEAD
+  210b28015aec453336e0e20a78e0fa429d4f67a3
+  $ 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
+  210b28015aec453336e0e20a78e0fa429d4f67a3
+  $ cd ..
diff --git a/tests/test-subrepo-sticky-svn.t b/tests/test-subrepo-sticky-svn.t
new file mode 100644
--- /dev/null
+++ b/tests/test-subrepo-sticky-svn.t
@@ -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 at 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 at revision 3
+  commit dirty subrepository or use "hg update -C" to discard changes and update
+  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 --git a/tests/test-subrepo-sticky.t b/tests/test-subrepo-sticky.t
new file mode 100644
--- /dev/null
+++ b/tests/test-subrepo-sticky.t
@@ -0,0 +1,250 @@
+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 at 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 at revision d90e2fc6d043
+  commit dirty subrepository or use "hg update -C" to discard changes and update
+  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
+  $ cd sub
+  $ ls
+  f0
+  f1
+  $ hg status
+  $ cd ..
+  $ 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