mirror of
https://github.com/facebook/sapling.git
synced 2024-10-07 15:27:13 +03:00
largefiles: setup "largefiles" feature in each repositories individually
Before this patch, if largefiles extension is enabled once in any of target repositories, commands handling multiple repositories at a time like below misunderstand that "largefiles" feature is supported also in all other local repositories: - clone/pull from or push to localhost - recursive execution in subrepo tree This patch registers "featuresetup()" into "featuresetupfuncs" of "localrepository" to support "largefiles" features only in repositories enabling largefiles extension, instead of adding "largefiles" feature to class variable "_basesupported" of "localrepository". This patch also adds checking below to the largefiles specific class derived from "localrepository": - push to localhost: whether features supported in the local(= dst) repository satisfies ones required in the remote(= src) This can prevent useless looking up in the remote repository, when supported and required features are mismatched: "push()" of "localrepository" also checks it, but it is executed after looking up in the remote.
This commit is contained in:
parent
c1e7da5d4f
commit
0b216b06c5
@ -105,16 +105,26 @@ explicitly do so with the --large flag passed to the :hg:`add`
|
||||
command.
|
||||
'''
|
||||
|
||||
from mercurial import commands
|
||||
from mercurial import commands, localrepo, extensions
|
||||
|
||||
import lfcommands
|
||||
import reposetup
|
||||
import uisetup
|
||||
import uisetup as uisetupmod
|
||||
|
||||
testedwith = 'internal'
|
||||
|
||||
reposetup = reposetup.reposetup
|
||||
uisetup = uisetup.uisetup
|
||||
|
||||
def featuresetup(ui, supported):
|
||||
for name, module in extensions.extensions(ui):
|
||||
if __name__ == module.__name__:
|
||||
# don't die on seeing a repo with the largefiles requirement
|
||||
supported |= set(['largefiles'])
|
||||
return
|
||||
|
||||
def uisetup(ui):
|
||||
localrepo.localrepository.featuresetupfuncs.add(featuresetup)
|
||||
uisetupmod.uisetup(ui)
|
||||
|
||||
commands.norepo += " lfconvert"
|
||||
|
||||
|
@ -407,6 +407,14 @@ def reposetup(ui, repo):
|
||||
wlock.release()
|
||||
|
||||
def push(self, remote, force=False, revs=None, newbranch=False):
|
||||
if remote.local():
|
||||
missing = set(self.requirements) - remote.local().supported
|
||||
if missing:
|
||||
msg = _("required features are not"
|
||||
" supported in the destination:"
|
||||
" %s") % (', '.join(sorted(missing)))
|
||||
raise util.Abort(msg)
|
||||
|
||||
outgoing = discovery.findcommonoutgoing(repo, remote.peer(),
|
||||
force=force)
|
||||
if outgoing.missing:
|
||||
|
@ -9,7 +9,7 @@
|
||||
'''setup for largefiles extension: uisetup'''
|
||||
|
||||
from mercurial import archival, cmdutil, commands, extensions, filemerge, hg, \
|
||||
httppeer, localrepo, merge, scmutil, sshpeer, wireproto, revset
|
||||
httppeer, merge, scmutil, sshpeer, wireproto, revset
|
||||
from mercurial.i18n import _
|
||||
from mercurial.hgweb import hgweb_mod, webcommands
|
||||
from mercurial.subrepo import hgsubrepo
|
||||
@ -152,9 +152,6 @@ def uisetup(ui):
|
||||
sshpeer.sshpeer._callstream = proto.sshrepocallstream
|
||||
httppeer.httppeer._callstream = proto.httprepocallstream
|
||||
|
||||
# don't die on seeing a repo with the largefiles requirement
|
||||
localrepo.localrepository._basesupported |= set(['largefiles'])
|
||||
|
||||
# override some extensions' stuff as well
|
||||
for name, module in extensions.extensions():
|
||||
if name == 'fetch':
|
||||
|
@ -2190,4 +2190,65 @@ check messages when there are files to upload:
|
||||
b
|
||||
|
||||
|
||||
$ cd ..
|
||||
|
||||
Check whether "largefiles" feature is supported only in repositories
|
||||
enabling largefiles extension.
|
||||
|
||||
$ mkdir individualenabling
|
||||
$ cd individualenabling
|
||||
|
||||
$ hg init enabledlocally
|
||||
$ echo large > enabledlocally/large
|
||||
$ hg -R enabledlocally add --large enabledlocally/large
|
||||
$ hg -R enabledlocally commit -m '#0'
|
||||
Invoking status precommit hook
|
||||
A large
|
||||
|
||||
$ hg init notenabledlocally
|
||||
$ echo large > notenabledlocally/large
|
||||
$ hg -R notenabledlocally add --large notenabledlocally/large
|
||||
$ hg -R notenabledlocally commit -m '#0'
|
||||
Invoking status precommit hook
|
||||
A large
|
||||
|
||||
$ cat >> $HGRCPATH <<EOF
|
||||
> [extensions]
|
||||
> # disable globally
|
||||
> largefiles=!
|
||||
> EOF
|
||||
$ cat >> enabledlocally/.hg/hgrc <<EOF
|
||||
> [extensions]
|
||||
> # enable locally
|
||||
> largefiles=
|
||||
> EOF
|
||||
$ hg -R enabledlocally root
|
||||
$TESTTMP/individualenabling/enabledlocally
|
||||
$ hg -R notenabledlocally root
|
||||
abort: unknown repository format: requires features 'largefiles' (upgrade Mercurial)!
|
||||
[255]
|
||||
|
||||
$ hg init push-dst
|
||||
$ hg -R enabledlocally push push-dst
|
||||
pushing to push-dst
|
||||
abort: required features are not supported in the destination: largefiles
|
||||
[255]
|
||||
|
||||
$ hg init pull-src
|
||||
$ hg -R pull-src pull enabledlocally
|
||||
pulling from enabledlocally
|
||||
abort: required features are not supported in the destination: largefiles
|
||||
[255]
|
||||
|
||||
$ hg clone enabledlocally clone-dst
|
||||
abort: unknown repository format: requires features 'largefiles' (upgrade Mercurial)!
|
||||
[255]
|
||||
$ test -d clone-dst
|
||||
[1]
|
||||
$ hg clone --pull enabledlocally clone-pull-dst
|
||||
abort: required features are not supported in the destination: largefiles
|
||||
[255]
|
||||
$ test -d clone-pull-dst
|
||||
[1]
|
||||
|
||||
$ cd ..
|
||||
|
Loading…
Reference in New Issue
Block a user