[PATCH] largefiles: improve repo wrapping detection

Matt Mackall mpm at selenic.com
Tue Apr 9 17:40:30 CDT 2013


On Wed, 2013-04-10 at 02:36 +0900, FUJIWARA Katsunori wrote:
> # HG changeset patch
> # User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
> # Date 1365528455 -32400
> # Node ID 89f37fa1de2fe25f6359043e89adbffbd58274e4
> # Parent  bd6aed2ad5eed666319bc3bdad1c1e37582cf4b1
> largefiles: improve repo wrapping detection

Is this http://bz.selenic.com/show_bug.cgi?id=3861 ?

> 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
> 
> diff --git a/hgext/largefiles/reposetup.py b/hgext/largefiles/reposetup.py
> --- a/hgext/largefiles/reposetup.py
> +++ b/hgext/largefiles/reposetup.py
> @@ -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')
> diff --git a/tests/test-largefiles.t b/tests/test-largefiles.t
> --- a/tests/test-largefiles.t
> +++ b/tests/test-largefiles.t
> @@ -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 ..
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel


-- 
Mathematics is the supreme nostalgia of our time.




More information about the Mercurial-devel mailing list