From 259689281279282b577e282a612629e5999e9fe8 Mon Sep 17 00:00:00 2001 From: JensDiemer Date: Sun, 18 Mar 2018 12:37:48 +0100 Subject: [PATCH 1/2] poc for https://github.com/pybee/briefcase/issues/73 --- briefcase/app.py | 71 +++++++++++++++++++++++++++++++-------------- briefcase/django.py | 1 - 2 files changed, 49 insertions(+), 23 deletions(-) diff --git a/briefcase/app.py b/briefcase/app.py index 426742355..edb31691e 100644 --- a/briefcase/app.py +++ b/briefcase/app.py @@ -258,38 +258,66 @@ def _git_pull(self, path): print('Unable to update template {}, using unpulled.'.format(template_name)) print(error_message) + def _install_requirement(self, requirements, target): + if not requirements: + print("No requirements.") + return + + class UglyHack: + """ + TODO: Use a more direct way to get the information ;) + """ + def __init__(self): + from pip.operations.freeze import freeze + self.freeze_lines = [line for line in freeze()] + + def get(self, requirement): + """ + return the 'pip freeze' line for the given requirement + e.g.: + --editable=git+https://github.com/pybee/toga.git@02a47d27d32d16b54800b658d9afd2b316924fd1#egg=toga_gtk&subdirectory=src/gtk + """ + egg_name = requirement.replace("-", "_") + for line in self.freeze_lines: + if egg_name in line: + line=line.replace("-e ", "--editable=") + return line + + ugly = UglyHack() + + final_requirements = [] + + for requirement in requirements: + print("Install %r to: %r" % (requirement, target)) + final_requirements.append( + ugly.get(requirement) or requirement + ) + + pip.main([ + 'install', + '--upgrade', + '--target={}'.format(target) + ] + final_requirements, + ) + def install_app_requirements(self): print(" * Installing requirements...") - if self.distribution.install_requires: - pip.main([ - 'install', - '--upgrade', - '--force-reinstall', - '--target={}'.format(self.app_packages_dir) - ] + self.distribution.install_requires, - ) - else: - print("No requirements.") + self._install_requirement( + self.distribution.install_requires, + target=self.app_packages_dir + ) def install_platform_requirements(self): print(" * Installing platform requirements...") - if self.app_requires: - pip.main([ - 'install', - '--upgrade', - '--force-reinstall', - '--target={}'.format(self.app_packages_dir), - ] + self.app_requires - ) - else: - print("No platform requirements.") + self._install_requirement(self.app_requires, + target=self.app_packages_dir + ) def install_code(self): print(" * Installing project code...") pip.main([ 'install', '--upgrade', - '--force-reinstall', '--no-dependencies', # We just want the code, not the dependencies '--target={}'.format(self.app_dir), '.' @@ -316,7 +344,6 @@ def install_launch_scripts(self): pip.main([ 'install', '--upgrade', - '--force-reinstall', '--target=%s' % self.app_packages_dir, 'setuptools' ]) diff --git a/briefcase/django.py b/briefcase/django.py index a4f3c6a78..2b7ee480a 100644 --- a/briefcase/django.py +++ b/briefcase/django.py @@ -74,7 +74,6 @@ def install_platform_requirements(self): pip.main([ 'install', '--upgrade', - '--force-reinstall', ] + self.app_requires ) else: From 02209e9e9f7baa826c6c9979ba95b6766f38e2d4 Mon Sep 17 00:00:00 2001 From: JensDiemer Date: Sun, 18 Mar 2018 13:07:19 +0100 Subject: [PATCH 2/2] try to install toga packages with "--no-deps" first --- briefcase/app.py | 46 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/briefcase/app.py b/briefcase/app.py index edb31691e..db333dfed 100644 --- a/briefcase/app.py +++ b/briefcase/app.py @@ -267,7 +267,9 @@ class UglyHack: """ TODO: Use a more direct way to get the information ;) """ - def __init__(self): + def __init__(self, requirements): + self.requirements = requirements + from pip.operations.freeze import freeze self.freeze_lines = [line for line in freeze()] @@ -283,21 +285,47 @@ def get(self, requirement): line=line.replace("-e ", "--editable=") return line - ugly = UglyHack() - - final_requirements = [] + def get_all_toga_req(self): + requirements = [] + for line in self.freeze_lines: + if "toga" in line:# and not "toga_dummy" in line: + line=line.replace("-e ", "--editable=") + requirements.append(line) + return requirements + + def transform(self): + toga_used = False + final_requirements = [] + for requirement in requirements: + if "toga" in requirement: + toga_used = True + else: + final_requirements.append( + self.get(requirement) or requirement + ) + + if toga_used: + toga_requirements = self.get_all_toga_req() + else: + toga_requirements = None + return toga_requirements, final_requirements - for requirement in requirements: - print("Install %r to: %r" % (requirement, target)) - final_requirements.append( - ugly.get(requirement) or requirement + toga_requirements, requirements = UglyHack(requirements).transform() + if toga_requirements: + pip.main([ + 'install', + '--no-deps', + '--force-reinstall', + '--target={}'.format(target) + ] + toga_requirements, ) pip.main([ 'install', '--upgrade', + '--force-reinstall', '--target={}'.format(target) - ] + final_requirements, + ] + toga_requirements + requirements, ) def install_app_requirements(self):