Vincent Ladeuil wrote:
> Vincent Ladeuil has proposed merging lp:~bzr/bzr/412930-plugin-path into lp:bzr.
>
> Requested reviews:
> bzr-core (bzr-core)
>
> This patch add the capability to fully control BZR_PLUGIN_PATH by defining magic values
> for user, core and site directories and a way to remove them from the search path.
>
> It's compatible with the actual implementation.
>
> This will allow the test/build farm to test:
> - the core plugins (the test are currently run with --no-plugins),
> - a chosen set of plugins
>
> Thanks in advance to the reviewer :-)
>
So does this break the existing BZR_PLUGIN_PATH behavior? At first I
thought it did, but it looks like the existing code says "if
BZR_PLUGIN_PATH is set, override default location". Which matches your
"+user" version.
+By default all directories specified in ``BZR_PLUGIN_PATH``
+replace 'user' in the but keep searching in 'core' then 'site'.
^- bad grammar here.
By default if BZR_PLUGIN_PATH is set, it replaces searching in 'user'.
However it will continue to search in 'core' and 'site' unless they are
explicitly removed.
...
+ # Handle removals first
+ def unset_ref(p):
+ if p.startswith('-'):
+ key = p[1:]
+ if key in refs: # Needed to handle multiple removals
+ refs[key] = None
+ p = None
+ return p
+
+ defaults = [p for p in defaults if unset_ref(p) is not None]
+ env_paths = [p for p in env_paths if unset_ref(p) is not None]
^- This doesn't look right to me.
defaults = [p for p in defaults if unset_ref(p) is not None]
Specifically:
1) I don't think you would ever have '-site' in defaults, for one
thing, it is a local variable.
2) If you did have '-site' in the list, then it would see that it is
present in refs, set p to None, and then the 'if unset_ref(p) is not
None' would return True, and '-site' is then included in the final
defaults list.
I'm not 100% sure that doing:
BZR_PLUGIN_PATH='-site:+site'
Should ignore the site path. I would actually say 'last value wins'. So
that you can just do:
BZR_PLUGIN_PATH="$BZR_PLUGIN_PATH:+site" bzr test
I'm not stuck on this, but I certainly find it hard to follow exactly
what is going on in your get_standard_plugins_path() function. (The diff
makes things worse, because it mixes statements a little bit.)
I believe you are also trying to allow for altering the order of the
switch. So doing:
BZR_PLUGIN_PATH='+site:+user'
Would then search site locations before user locations.
if default_core:
plugin_paths.append('+core')
if default_site:
plugin_paths.append('+site')
# Now expand +core and +site and +user into the real values
def expand(p):
if p.startswith('+'):
...
plugin_paths = [expand(p) for p in plugin_paths]
This is complex enough, that I would also like to see it in a simple
helper function, that probably has direct unit tests.
But the basic idea is:
1) If nothing is said about site, then it just gets appended where
appropriate.
2) If + or - site is given, then the default is unset.
3) If +site is given, then its position is reset to the current
location. So doing:
BZR_PLUGIN_PATH='+site:+user:+site'
Would end up loading site last, albeit before +core because that
was not explicitly specified.
review: needs_fixing
John
=:->
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Vincent Ladeuil wrote:
> Vincent Ladeuil has proposed merging lp:~bzr/bzr/412930-plugin-path into lp:bzr.
>
> Requested reviews:
> bzr-core (bzr-core)
>
> This patch add the capability to fully control BZR_PLUGIN_PATH by defining magic values
> for user, core and site directories and a way to remove them from the search path.
>
> It's compatible with the actual implementation.
>
> This will allow the test/build farm to test:
> - the core plugins (the test are currently run with --no-plugins),
> - a chosen set of plugins
>
> Thanks in advance to the reviewer :-)
>
So does this break the existing BZR_PLUGIN_PATH behavior? At first I
thought it did, but it looks like the existing code says "if
BZR_PLUGIN_PATH is set, override default location". Which matches your
"+user" version.
+By default all directories specified in ``BZR_PLUGIN_PATH``
+replace 'user' in the but keep searching in 'core' then 'site'.
^- bad grammar here.
By default if BZR_PLUGIN_PATH is set, it replaces searching in 'user'.
However it will continue to search in 'core' and 'site' unless they are
explicitly removed.
...
+ # Handle removals first
+ def unset_ref(p):
+ if p.startswith('-'):
+ key = p[1:]
+ if key in refs: # Needed to handle multiple removals
+ refs[key] = None
+ p = None
+ return p
+
+ defaults = [p for p in defaults if unset_ref(p) is not None]
+ env_paths = [p for p in env_paths if unset_ref(p) is not None]
^- This doesn't look right to me.
defaults = [p for p in defaults if unset_ref(p) is not None]
Specifically:
1) I don't think you would ever have '-site' in defaults, for one
thing, it is a local variable.
2) If you did have '-site' in the list, then it would see that it is
present in refs, set p to None, and then the 'if unset_ref(p) is not
None' would return True, and '-site' is then included in the final
defaults list.
I'm not 100% sure that doing:
BZR_PLUGIN_ PATH='- site:+site'
Should ignore the site path. I would actually say 'last value wins'. So
that you can just do:
BZR_PLUGIN_ PATH="$ BZR_PLUGIN_ PATH:+site" bzr test
I'm not stuck on this, but I certainly find it hard to follow exactly plugins_ path() function. (The diff
what is going on in your get_standard_
makes things worse, because it mixes statements a little bit.)
I believe you are also trying to allow for altering the order of the
switch. So doing:
BZR_PLUGIN_ PATH='+ site:+user'
Would then search site locations before user locations.
I would probably do something more like:
env_path = os.environ. get('BZR_ PLUGIN_ PATH', '+user' ).split( os.pathsep)
default_core = True ('-'):
plugin_ paths.remove( '+site' ) ('+'):
plugin_ paths.remove( '+site' )
default_site = True
plugin_paths = []
for path in env_path:
if path.startswith
if path == '-site':
default_site = False
if '+site' in plugin_paths:
elif path == '-core':
...
elif path.startswith
if path == '+site':
default_site = False
if '+site' in plugin_paths:
elif path == '+core':
...
plugin_ paths.append( path) paths.append( path)
else:
plugin_
if default_core: paths.append( '+core' ) paths.append( '+site' )
plugin_
if default_site:
plugin_
# Now expand +core and +site and +user into the real values
def expand(p):
if p.startswith('+'):
...
plugin_paths = [expand(p) for p in plugin_paths]
This is complex enough, that I would also like to see it in a simple
helper function, that probably has direct unit tests.
But the basic idea is:
1) If nothing is said about site, then it just gets appended where
appropriate.
2) If + or - site is given, then the default is unset.
3) If +site is given, then its position is reset to the current
location. So doing:
Would end up loading site last, albeit before +core because that
was not explicitly specified.
review: needs_fixing
John enigmail. mozdev. org/
=:->
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Using GnuPG with Mozilla - http://
iEYEARECAAYFAkq NejsACgkQJdeBCY SNAAMbOgCdH1zqp 2Gc8RNy9P8Iu0YF D6bi 40dceioRLBMN4a+ eN0tCgMIV
7q0AoNV/
=Xm08
-----END PGP SIGNATURE-----