[PATCH 3 of 3 V2] shelve: support sharing of shelves when using a shared repository

Oleg Afanasyev olegaf at fb.com
Sat Apr 9 13:34:10 EDT 2016


# HG changeset patch
# User Oleg Afanasyev <olegaf at fb.com>
# Date 1460186357 25200
#      Sat Apr 09 00:19:17 2016 -0700
# Node ID 2ff1d244b437194883fc1b7fea956a8712f34e39
# Parent  3794055fbea2c129666292fb69df6c980fd886fb
shelve: support sharing of shelves when using a shared repository

Shelve is using shared data instead of its own shelves. That allows
moving changes from share to share using shelve extension.

When unshare is performed shelve will not be cloned to new repo. That
changes behaviour from what it is doing now e.g. shelves created
in share will disappear when unshare is performed.

diff --git a/hgext/shelve.py b/hgext/shelve.py
--- a/hgext/shelve.py
+++ b/hgext/shelve.py
@@ -70,7 +70,7 @@
     def __init__(self, repo, name, filetype=None):
         self.repo = repo
         self.name = name
-        self.vfs = scmutil.vfs(repo.join(shelvedir))
+        self.vfs = scmutil.vfs(repo.sharedvfs().join(shelvedir))
         self.backupvfs = scmutil.vfs(repo.join(backupdir))
         self.ui = self.repo.ui
         if filetype:
@@ -409,7 +409,7 @@
     """subcommand that deletes all shelves"""
 
     with repo.wlock():
-        for (name, _type) in repo.vfs.readdir(shelvedir):
+        for (name, _type) in repo.sharedvfs().readdir(shelvedir):
             suffix = name.rsplit('.', 1)[-1]
             if suffix in ('hg', 'patch'):
                 shelvedfile(repo, name).movetobackup()
@@ -433,7 +433,7 @@
 def listshelves(repo):
     """return all shelves in repo as list of (time, filename)"""
     try:
-        names = repo.vfs.readdir(shelvedir)
+        names = repo.sharedvfs().readdir(shelvedir)
     except OSError as err:
         if err.errno != errno.ENOENT:
             raise
diff --git a/tests/test-share.t b/tests/test-share.t
--- a/tests/test-share.t
+++ b/tests/test-share.t
@@ -2,6 +2,7 @@
 
   $ echo "[extensions]"      >> $HGRCPATH
   $ echo "share = "          >> $HGRCPATH
+  $ echo "shelve = "         >> $HGRCPATH
 
 prepare repo1
 
@@ -297,6 +298,101 @@
      bm4                       5:92793bfc8cad
   $ cd ..
 
+test sharing shelve
+
+  $ hg init shelfrepo1
+  $ cd shelfrepo1
+  $ echo a > a
+  $ hg commit -A -m'init'
+  adding a
+
+  $ cd ..
+  $ hg share shelfrepo1 shelfrepo2
+  updating working directory
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+shelve changes in original repo
+
+  $ cd shelfrepo1
+  $ echo b > b
+  $ hg add b
+  $ hg shelve
+  shelved as default
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+shelve changes in shared repo
+
+  $ cd ../shelfrepo2
+  $ echo c > c
+  $ hg add c
+  $ hg shelve
+  shelved as default-01
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+test if all shelves are visible in both repos
+
+  $ hg shelve -l
+  default-01      (* ago)    changes to: init (glob)
+  default         (* ago)    changes to: init (glob)
+  $ cd ../shelfrepo1
+  $ hg shelve -l
+  default-01      (* ago)    changes to: init (glob)
+  default         (* ago)    changes to: init (glob)
+
+test if shared changes are unshelved in original repo
+
+  $ hg unshelve
+  unshelving change 'default-01'
+  $ test -f c
+  $ hg shelve -l
+  default         (* ago)    changes to: init (glob)
+
+test if original changes are unshelved in shared repo
+
+  $ cd ../shelfrepo2
+  $ hg shelve -l
+  default         (* ago)    changes to: init (glob)
+  $ hg unshelve
+  unshelving change 'default'
+  $ test -f b
+  $ hg shelve -l
+
+test if first shelf is unshelved in original repo
+
+  $ cd ../shelfrepo1
+  $ hg shelve -l
+  $ hg revert --all
+  forgetting c
+  $ cd ..
+
+test shelf behaviour after unshare.
+each share to submit a shelve and check that shelves stick to original repo
+
+  $ hg share shelfrepo1 shelfrepo3
+  updating working directory
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd shelfrepo1
+  $ echo d > d
+  $ hg add d
+  $ hg shelve
+  shelved as default
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ cd ../shelfrepo3
+  $ echo e > e
+  $ hg add e
+  $ hg shelve
+  shelved as default-01
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg unshare
+  $ hg shelve -l
+  $ hg unshelve
+  abort: no shelved changes to apply!
+  [255]
+  $ cd ../shelfrepo1
+  $ hg shelve -l
+  default-01      (* ago)    changes to: init (glob)
+  default         (* ago)    changes to: init (glob)
+
 Explicitly kill daemons to let the test exit on Windows
 
   $ killdaemons.py


More information about the Mercurial-devel mailing list