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

Ryan McElroy rm at fb.com
Mon Apr 11 12:50:48 EDT 2016


On 4/9/2016 6:34 PM, Oleg Afanasyev wrote:
> # 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.

I "pre-reviewed" this series on an fb-internal mailing list and I think 
it's good. I've also verified that the tests all pass with this series 
applied.

>
> 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