[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