diff --git a/ryu/hooks.py b/ryu/hooks.py index c2414cdb..3883a7d2 100644 --- a/ryu/hooks.py +++ b/ryu/hooks.py @@ -16,9 +16,25 @@ # under the License. import sys +from setuptools.command import easy_install from ryu import version +# Global variables in this module doesn't work as we expect +# because, during the setup procedure, this module seems to be +# copied (as a file) and can be loaded multiple times. +# We save them into __main__ module instead. +def _main_module(): + return sys.modules['__main__'] + + +def save_orig(): + """Save original easy_install.get_script_args. + This is necessary because pbr's setup_hook is sometimes called + before ours.""" + _main_module()._orig_get_script_args = easy_install.get_script_args + + def setup_hook(config): """Filter config parsed from a setup.cfg to inject our defaults.""" metadata = config['metadata'] @@ -31,3 +47,16 @@ def setup_hook(config): config['metadata'] = metadata metadata['version'] = str(version) + + # pbr's setup_hook replaces easy_install.get_script_args with + # their own version, override_get_script_args, prefering simpler + # scripts which are not aware of multi-version. + # prevent that by doing the opposite. it's a horrible hack + # but we are in patching wars already... + from pbr import packaging + + def my_get_script_args(*args, **kwargs): + return _main_module()._orig_get_script_args(*args, **kwargs) + + packaging.override_get_script_args = my_get_script_args + easy_install.get_script_args = my_get_script_args diff --git a/setup.py b/setup.py index 768ac73a..cf2a404d 100644 --- a/setup.py +++ b/setup.py @@ -21,8 +21,10 @@ except ImportError: pass import setuptools +import ryu.hooks +ryu.hooks.save_orig() setuptools.setup(name='ryu', setup_requires=['pbr'], pbr=True)