# HG changeset patch # User Matt Harbison # Date 2017-10-18 01:48:56 # Node ID 9f7ecc5bbc28e1262a8afadad8b5d78bf134a302 # Parent eb24f1d1b50be7898dbb1a571ed9666021ae6a6d share: move the implementation of 'unshare' to the 'hg' module This will be used to setup unsharing subrepos. Usually cmdutil is used for this purpose. But the implementation needs hg.copystore(), and the hg module already imports cmdutil. diff --git a/hgext/share.py b/hgext/share.py --- a/hgext/share.py +++ b/hgext/share.py @@ -114,28 +114,7 @@ def unshare(ui, repo): if not repo.shared(): raise error.Abort(_("this is not a shared repo")) - destlock = lock = None - lock = repo.lock() - try: - # we use locks here because if we race with commit, we - # can end up with extra data in the cloned revlogs that's - # not pointed to by changesets, thus causing verify to - # fail - - destlock = hg.copystore(ui, repo, repo.path) - - sharefile = repo.vfs.join('sharedpath') - util.rename(sharefile, sharefile + '.old') - - repo.requirements.discard('shared') - repo.requirements.discard('relshared') - repo._writerequirements() - finally: - destlock and destlock.release() - lock and lock.release() - - # update store, spath, svfs and sjoin of repo - repo.unfiltered().__init__(repo.baseui, repo.root) + hg.unshare(ui, repo) # Wrap clone command to pass auto share options. def clone(orig, ui, source, *args, **opts): diff --git a/mercurial/hg.py b/mercurial/hg.py --- a/mercurial/hg.py +++ b/mercurial/hg.py @@ -257,6 +257,35 @@ def share(ui, source, dest=None, update= _postshareupdate(r, update, checkout=checkout) return r +def unshare(ui, repo): + """convert a shared repository to a normal one + + Copy the store data to the repo and remove the sharedpath data. + """ + + destlock = lock = None + lock = repo.lock() + try: + # we use locks here because if we race with commit, we + # can end up with extra data in the cloned revlogs that's + # not pointed to by changesets, thus causing verify to + # fail + + destlock = copystore(ui, repo, repo.path) + + sharefile = repo.vfs.join('sharedpath') + util.rename(sharefile, sharefile + '.old') + + repo.requirements.discard('shared') + repo.requirements.discard('relshared') + repo._writerequirements() + finally: + destlock and destlock.release() + lock and lock.release() + + # update store, spath, svfs and sjoin of repo + repo.unfiltered().__init__(repo.baseui, repo.root) + def postshare(sourcerepo, destrepo, bookmarks=True, defaultpath=None): """Called after a new shared repo is created.