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:
FUJIWARA Katsunori 2013-09-21 21:33:29 +09:00
parent c1e7da5d4f
commit 0b216b06c5
4 changed files with 83 additions and 7 deletions

View File

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

View File

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

View File

@ -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':

View File

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