Mercurial > hg
changeset 18969:257afe5489d4
largefiles: improve repo wrapping detection
Before this patch, repo wrapping detection in "reposetup()" of
largefiles can detect only limited repo wrapping: replacing target
functions by another one named as "wrap".
So, it can't detect repo wrapping even in recommended style: replacing
"__class__" of repo by derived class.
This patch can detect repo wrapping in both styles below:
- replacing "__class__" of repo by derived class (recommended style):
class derived(repo.__class__):
def push(self, *args, **kwargs):
return super(derived, self).push(*args, **kwargs)
repo.__class__ = derived
- replacing function of repo by another one (not recommended style):
orgpush = repo.push
def push(*args, **kwargs):
return orgpush(*args, **kwargs)
repo.push = push
author | FUJIWARA Katsunori <foozy@lares.dti.ne.jp> |
---|---|
date | Wed, 10 Apr 2013 02:27:35 +0900 |
parents | 7d2a7f8e9da4 |
children | 3cdb6f2f6789 |
files | hgext/largefiles/reposetup.py tests/test-largefiles.t |
diffstat | 2 files changed, 32 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/hgext/largefiles/reposetup.py Thu Mar 21 23:27:37 2013 +0100 +++ b/hgext/largefiles/reposetup.py Wed Apr 10 02:27:35 2013 +0900 @@ -27,10 +27,11 @@ if not repo.local(): return proto.wirereposetup(ui, repo) + origclass = localrepo.localrepository + repoclass = repo.__class__ for name in ('status', 'commitctx', 'commit', 'push'): - method = getattr(repo, name) - if (isinstance(method, types.FunctionType) and - method.func_name == 'wrap'): + if (getattr(origclass, name) != getattr(repoclass, name) or + isinstance(getattr(repo, name), types.FunctionType)): ui.warn(_('largefiles: repo method %r appears to have already been' ' wrapped by another extension: ' 'largefiles may behave incorrectly\n')
--- a/tests/test-largefiles.t Thu Mar 21 23:27:37 2013 +0100 +++ b/tests/test-largefiles.t Wed Apr 10 02:27:35 2013 +0900 @@ -180,6 +180,34 @@ $ cat sub/large4 large22 +Test repo method wrapping detection + + $ cat > $TESTTMP/wrapping1.py <<EOF + > from hgext import largefiles + > def reposetup(ui, repo): + > class derived(repo.__class__): + > def push(self, *args, **kwargs): + > return super(derived, self).push(*args, **kwargs) + > repo.__class__ = derived + > largefiles.reposetup(ui, repo) + > uisetup = largefiles.uisetup + > EOF + $ hg --config extensions.largefiles=$TESTTMP/wrapping1.py status + largefiles: repo method 'push' appears to have already been wrapped by another extension: largefiles may behave incorrectly + + $ cat > $TESTTMP/wrapping2.py <<EOF + > from hgext import largefiles + > def reposetup(ui, repo): + > orgpush = repo.push + > def push(*args, **kwargs): + > return orgpush(*args, **kwargs) + > repo.push = push + > largefiles.reposetup(ui, repo) + > uisetup = largefiles.uisetup + > EOF + $ hg --config extensions.largefiles=$TESTTMP/wrapping2.py status + largefiles: repo method 'push' appears to have already been wrapped by another extension: largefiles may behave incorrectly + Test copies and moves from a directory other than root (issue3516) $ cd ..