From ade1885989f346f7a052336b641d9230a7eb1b1d Mon Sep 17 00:00:00 2001 From: Eric Holscher Date: Wed, 13 Jan 2016 15:43:12 -0800 Subject: [PATCH 01/11] Use implied version in all python env logic. --- .../doc_builder/python_environments.py | 36 +++++++++---------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/readthedocs/doc_builder/python_environments.py b/readthedocs/doc_builder/python_environments.py index 0e86c209741..e4af6e3b274 100644 --- a/readthedocs/doc_builder/python_environments.py +++ b/readthedocs/doc_builder/python_environments.py @@ -4,7 +4,6 @@ from django.conf import settings -from readthedocs.builds.constants import LATEST from readthedocs.doc_builder.config import ConfigWrapper from readthedocs.doc_builder.loader import get_builder_class from readthedocs.projects.constants import LOG_TEMPLATE @@ -35,7 +34,7 @@ def delete_existing_build_dir(self): # Handle deleting old build dir build_dir = os.path.join( - self.venv_path(version=self.version.slug), + self.venv_path(), 'build') if os.path.exists(build_dir): self._log('Removing existing build directory') @@ -47,14 +46,14 @@ def install_package(self): if getattr(settings, 'USE_PIP_INSTALL', False): self.build_env.run( 'python', - self.venv_bin(version=self.version.slug, filename='pip'), + self.venv_bin(filename='pip'), 'install', '--ignore-installed', '--cache-dir', self.project.pip_cache_path, '.', cwd=self.checkout_path, - bin_path=self.venv_bin(version=self.version.slug) + bin_path=self.venv_bin() ) else: self.build_env.run( @@ -63,17 +62,16 @@ def install_package(self): 'install', '--force', cwd=self.checkout_path, - bin_path=self.venv_bin(version=self.version.slug) + bin_path=self.venv_bin() ) - def venv_bin(self, version=LATEST, filename=None): + def venv_bin(self, filename=None): """Return path to the virtualenv bin path, or a specific binary - :param version: Version slug to use in path name :param filename: If specified, add this filename to the path return :returns: Path to virtualenv bin or filename in virtualenv bin """ - parts = [self.venv_path(version), 'bin'] + parts = [self.venv_path(), 'bin'] if filename is not None: parts.append(filename) return os.path.join(*parts) @@ -81,14 +79,14 @@ def venv_bin(self, version=LATEST, filename=None): class Virtualenv(PythonEnvironment): - def venv_path(self, version=LATEST): - return os.path.join(self.project.doc_path, 'envs', version) + def venv_path(self): + return os.path.join(self.project.doc_path, 'envs', self.version.slug) def setup_base(self): site_packages = '--no-site-packages' if self.config.use_system_site_packages: site_packages = '--system-site-packages' - env_path = self.venv_path(version=self.version.slug) + env_path = self.venv_path() self.build_env.run( self.config.python_interpreter, '-mvirtualenv', @@ -114,7 +112,7 @@ def install_core_requirements(self): cmd = [ 'python', - self.venv_bin(version=self.version.slug, filename='pip'), + self.venv_bin(filename='pip'), 'install', '--use-wheel', '-U', @@ -130,7 +128,7 @@ def install_core_requirements(self): cmd.extend(requirements) self.build_env.run( *cmd, - bin_path=self.venv_bin(version=self.version.slug) + bin_path=self.venv_bin() ) def install_user_requirements(self): @@ -149,21 +147,21 @@ def install_user_requirements(self): if requirements_file_path: self.build_env.run( 'python', - self.venv_bin(version=self.version.slug, filename='pip'), + self.venv_bin(filename='pip'), 'install', '--exists-action=w', '--cache-dir', self.project.pip_cache_path, '-r{0}'.format(requirements_file_path), cwd=self.checkout_path, - bin_path=self.venv_bin(version=self.version.slug) + bin_path=self.venv_bin() ) class Conda(PythonEnvironment): - def venv_path(self, version=LATEST): - return os.path.join(self.project.doc_path, 'conda', version) + def venv_path(self): + return os.path.join(self.project.doc_path, 'conda', self.version.slug) def setup_base(self): conda_env_path = os.path.join(self.project.doc_path, 'conda') @@ -220,7 +218,7 @@ def install_core_requirements(self): pip_cmd = [ 'python', - self.venv_bin(version=self.version.slug, filename='pip'), + self.venv_bin(filename='pip'), 'install', '-U', '--cache-dir', @@ -229,7 +227,7 @@ def install_core_requirements(self): pip_cmd.extend(pip_requirements) self.build_env.run( *pip_cmd, - bin_path=self.venv_bin(version=self.version.slug) + bin_path=self.venv_bin() ) def install_user_requirements(self): From 9f14fd9c7c242a444f8786da86dbd6d6d1772896 Mon Sep 17 00:00:00 2001 From: Eric Holscher Date: Wed, 13 Jan 2016 16:22:23 -0800 Subject: [PATCH 02/11] Use the Local environment for checkout & config reading. --- readthedocs/projects/tasks.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/readthedocs/projects/tasks.py b/readthedocs/projects/tasks.py index 77d1ad8b526..4ddafc513ea 100644 --- a/readthedocs/projects/tasks.py +++ b/readthedocs/projects/tasks.py @@ -108,12 +108,11 @@ def run(self, pk, version_pk=None, build_pk=None, record=True, docker=False, self.build_force = force env_cls = LocalEnvironment - if docker or settings.DOCKER_ENABLE: - env_cls = DockerEnvironment - self.build_env = env_cls(project=self.project, version=self.version, + self.setup_env = env_cls(project=self.project, version=self.version, build=self.build, record=record) - with self.build_env: + # Environment used for code checkout & initial configuration reading + with self.setup_env: if self.project.skip: raise BuildEnvironmentError( _('Builds for this project are temporarily disabled')) @@ -126,12 +125,19 @@ def run(self, pk, version_pk=None, build_pk=None, record=True, docker=False, status_code=423 ) + self.config = load_yaml_config(version=self.version) + + if docker or settings.DOCKER_ENABLE: + env_cls = DockerEnvironment + self.build_env = env_cls(project=self.project, version=self.version, + build=self.build, record=record, environment=env) + + # Environment used for building code, usually with Docker + with self.build_env: + if self.project.documentation_type == 'auto': self.update_documentation_type() - # Read YAML config after code checkout has been run - self.config = load_yaml_config(version=self.version) - python_env_cls = Virtualenv if self.config.use_conda: self._log('Using conda') @@ -217,7 +223,7 @@ def setup_vcs(self): :param build_env: Build environment """ - self.build_env.update_build(state=BUILD_STATE_CLONING) + self.setup_env.update_build(state=BUILD_STATE_CLONING) self._log(msg='Updating docs from VCS') try: From 7785bdfaa902fa7292bf7e38a65a9f1d3578dd10 Mon Sep 17 00:00:00 2001 From: Eric Holscher Date: Wed, 13 Jan 2016 16:29:07 -0800 Subject: [PATCH 03/11] =?UTF-8?q?Don=E2=80=99t=20wrap=20exception.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readthedocs/doc_builder/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readthedocs/doc_builder/config.py b/readthedocs/doc_builder/config.py index 9eb5f39baf5..05da03cddc7 100644 --- a/readthedocs/doc_builder/config.py +++ b/readthedocs/doc_builder/config.py @@ -108,8 +108,8 @@ def load_yaml_config(version): 'name': version.slug, }, )[0] - except InvalidConfig as e: # This is a subclass of ConfigError, so has to come first - raise ProjectImportError(e.message) + except InvalidConfig: # This is a subclass of ConfigError, so has to come first + raise except ConfigError: config = BuildConfig( env_config={}, From c0e08dd6e72d9811f263353c49ff0f8a2e7c2573 Mon Sep 17 00:00:00 2001 From: Eric Holscher Date: Wed, 13 Jan 2016 16:30:19 -0800 Subject: [PATCH 04/11] Add environment passing and respect it. --- readthedocs/doc_builder/environments.py | 12 ++++-- readthedocs/projects/tasks.py | 52 +++++++++++++++++-------- 2 files changed, 45 insertions(+), 19 deletions(-) diff --git a/readthedocs/doc_builder/environments.py b/readthedocs/doc_builder/environments.py index be033a48107..770c1422aed 100644 --- a/readthedocs/doc_builder/environments.py +++ b/readthedocs/doc_builder/environments.py @@ -36,6 +36,7 @@ class BuildCommand(BuildCommandResultMixin): + '''Wrap command execution for execution in build environments This wraps subprocess commands with some logic to handle exceptions, @@ -177,6 +178,7 @@ def save(self): class DockerBuildCommand(BuildCommand): + '''Create a docker container and run a command inside the container Build command to execute in docker container @@ -248,6 +250,7 @@ def get_wrapped_command(self): class BuildEnvironment(object): + ''' Base build environment @@ -259,11 +262,13 @@ class BuildEnvironment(object): :param record: Record status of build object ''' - def __init__(self, project=None, version=None, build=None, record=True): + def __init__(self, project=None, version=None, build=None, record=True, environment=None): self.project = project self.version = version self.build = build self.record = record + self.environment = environment or {} + self.commands = [] self.failure = None self.start_time = datetime.utcnow() @@ -408,11 +413,13 @@ def update_build(self, state=None): class LocalEnvironment(BuildEnvironment): + '''Local execution environment''' command_class = BuildCommand class DockerEnvironment(BuildEnvironment): + ''' Docker build environment, uses docker to contain builds @@ -597,8 +604,7 @@ def create_container(self): }, }), detach=True, - environment={'READTHEDOCS_VERSION': self.version.slug, - 'READTHEDOCS_PROJECT': self.project.slug}, + environment=self.environment, mem_limit=self.container_mem_limit, ) client.start(container=self.container_id) diff --git a/readthedocs/projects/tasks.py b/readthedocs/projects/tasks.py index 4ddafc513ea..9aae7364683 100644 --- a/readthedocs/projects/tasks.py +++ b/readthedocs/projects/tasks.py @@ -107,6 +107,7 @@ def run(self, pk, version_pk=None, build_pk=None, record=True, docker=False, self.build_localmedia = localmedia self.build_force = force + env_cls = LocalEnvironment self.setup_env = env_cls(project=self.project, version=self.version, build=self.build, record=record) @@ -127,10 +128,11 @@ def run(self, pk, version_pk=None, build_pk=None, record=True, docker=False, self.config = load_yaml_config(version=self.version) + bash_env = self.get_bash_env() if docker or settings.DOCKER_ENABLE: env_cls = DockerEnvironment self.build_env = env_cls(project=self.project, version=self.version, - build=self.build, record=record, environment=env) + build=self.build, record=record, environment=bash_env) # Environment used for building code, usually with Docker with self.build_env: @@ -200,21 +202,7 @@ def get_build(build_pk): return dict((key, val) for (key, val) in build.items() if key not in ['project', 'version', 'resource_uri', 'absolute_uri']) - - def update_documentation_type(self): - """ - Force Sphinx for 'auto' documentation type - - This used to determine the type and automatically set the documentation - type to Sphinx for rST and Mkdocs for markdown. It now just forces - Sphinx, due to markdown support. - """ - ret = 'sphinx' - project_data = api_v2.project(self.project.pk).get() - project_data['documentation_type'] = ret - api_v2.project(self.project.pk).put(project_data) - self.project.documentation_type = ret - + def setup_vcs(self): """ Update the checkout of the repo to make sure it's the latest. @@ -235,6 +223,38 @@ def setup_vcs(self): raise BuildEnvironmentError('Failed to import project', status_code=404) + def get_bash_env(self): + """ + Get bash environment variables used for all builder commands. + """ + env = { + 'READTHEDOCS': True, + 'READTHEDOCS_VERSION': self.version.slug, + 'READTHEDOCS_PROJECT': self.project.slug + } + + if self.config.use_conda: + env.update({ + 'CONDA_ENVS_PATH': os.path.join(self.project.doc_path, 'conda'), + 'CONDA_DEFAULT_ENV': self.version.slug, + }) + return env + + + def update_documentation_type(self): + """ + Force Sphinx for 'auto' documentation type + + This used to determine the type and automatically set the documentation + type to Sphinx for rST and Mkdocs for markdown. It now just forces + Sphinx, due to markdown support. + """ + ret = 'sphinx' + project_data = api_v2.project(self.project.pk).get() + project_data['documentation_type'] = ret + api_v2.project(self.project.pk).put(project_data) + self.project.documentation_type = ret + def setup_environment(self): """ Build the virtualenv and install the project into it. From bccc2176ccfca4c7690b0f44b6dabe1693459d44 Mon Sep 17 00:00:00 2001 From: Eric Holscher Date: Wed, 13 Jan 2016 16:40:50 -0800 Subject: [PATCH 05/11] Properly pass bash env around. --- readthedocs/doc_builder/environments.py | 10 +++++++--- readthedocs/doc_builder/python_environments.py | 5 +---- readthedocs/projects/tasks.py | 3 ++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/readthedocs/doc_builder/environments.py b/readthedocs/doc_builder/environments.py index 770c1422aed..b88d431367b 100644 --- a/readthedocs/doc_builder/environments.py +++ b/readthedocs/doc_builder/environments.py @@ -236,11 +236,9 @@ def get_wrapped_command(self): """ bash_escape_re = re.compile(r"([\t\ \!\"\#\$\&\'\(\)\*\:\;\<\>\?\@" r"\[\\\]\^\`\{\|\}\~])") - prefix = 'READTHEDOCS=True ' + prefix = '' if self.bin_path: prefix += 'PATH={0}:$PATH '.format(self.bin_path) - if 'CONDA_ENVS_PATH' in self.environment: - prefix += 'CONDA_ENVS_PATH={0} '.format(self.environment['CONDA_ENVS_PATH']) return ("/bin/sh -c 'cd {cwd} && {prefix}{cmd}'" .format( cwd=self.cwd, @@ -322,6 +320,12 @@ def run_command_class(self, cls, cmd, **kwargs): :param warn_only: Don't raise an exception on command failure ''' warn_only = kwargs.pop('warn_only', False) + # Remove PATH from env, and set it to bin_path if it isn't passed in + env_path = self.environment.pop('PATH', None) + if 'bin_path' not in kwargs and env_path: + kwargs['bin_path'] = env_path + assert 'environment' not in kwargs, "environment can't be passed in via commands." + kwargs['environment'] = self.environment kwargs['build_env'] = self build_cmd = cls(cmd, **kwargs) self.commands.append(build_cmd) diff --git a/readthedocs/doc_builder/python_environments.py b/readthedocs/doc_builder/python_environments.py index e4af6e3b274..46bbdac3c51 100644 --- a/readthedocs/doc_builder/python_environments.py +++ b/readthedocs/doc_builder/python_environments.py @@ -178,7 +178,6 @@ def setup_base(self): '--name', self.version.slug, 'python={python_version}'.format(python_version=self.config.python_version), - environment={'CONDA_ENVS_PATH': conda_env_path} ) def install_core_requirements(self): @@ -204,8 +203,7 @@ def install_core_requirements(self): ] cmd.extend(requirements) self.build_env.run( - *cmd, - environment={'CONDA_ENVS_PATH': conda_env_path} + *cmd ) # Install pip-only things. @@ -240,5 +238,4 @@ def install_user_requirements(self): self.version.slug, '--file', self.config.conda_file, - environment={'CONDA_ENVS_PATH': conda_env_path} ) diff --git a/readthedocs/projects/tasks.py b/readthedocs/projects/tasks.py index 9aae7364683..6fca320ea91 100644 --- a/readthedocs/projects/tasks.py +++ b/readthedocs/projects/tasks.py @@ -202,7 +202,7 @@ def get_build(build_pk): return dict((key, val) for (key, val) in build.items() if key not in ['project', 'version', 'resource_uri', 'absolute_uri']) - + def setup_vcs(self): """ Update the checkout of the repo to make sure it's the latest. @@ -237,6 +237,7 @@ def get_bash_env(self): env.update({ 'CONDA_ENVS_PATH': os.path.join(self.project.doc_path, 'conda'), 'CONDA_DEFAULT_ENV': self.version.slug, + 'PATH': os.path.join(self.project.doc_path, 'conda', self.version.slug, 'bin') }) return env From 7d2d54b53e5bd41998678a30dba7f8c8980e45d7 Mon Sep 17 00:00:00 2001 From: Eric Holscher Date: Wed, 13 Jan 2016 16:47:42 -0800 Subject: [PATCH 06/11] Revert "Use implied version in all python env logic." This reverts commit ade1885989f346f7a052336b641d9230a7eb1b1d. --- .../doc_builder/python_environments.py | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/readthedocs/doc_builder/python_environments.py b/readthedocs/doc_builder/python_environments.py index 46bbdac3c51..985dae1aed8 100644 --- a/readthedocs/doc_builder/python_environments.py +++ b/readthedocs/doc_builder/python_environments.py @@ -4,6 +4,7 @@ from django.conf import settings +from readthedocs.builds.constants import LATEST from readthedocs.doc_builder.config import ConfigWrapper from readthedocs.doc_builder.loader import get_builder_class from readthedocs.projects.constants import LOG_TEMPLATE @@ -34,7 +35,7 @@ def delete_existing_build_dir(self): # Handle deleting old build dir build_dir = os.path.join( - self.venv_path(), + self.venv_path(version=self.version.slug), 'build') if os.path.exists(build_dir): self._log('Removing existing build directory') @@ -46,14 +47,14 @@ def install_package(self): if getattr(settings, 'USE_PIP_INSTALL', False): self.build_env.run( 'python', - self.venv_bin(filename='pip'), + self.venv_bin(version=self.version.slug, filename='pip'), 'install', '--ignore-installed', '--cache-dir', self.project.pip_cache_path, '.', cwd=self.checkout_path, - bin_path=self.venv_bin() + bin_path=self.venv_bin(version=self.version.slug) ) else: self.build_env.run( @@ -62,16 +63,17 @@ def install_package(self): 'install', '--force', cwd=self.checkout_path, - bin_path=self.venv_bin() + bin_path=self.venv_bin(version=self.version.slug) ) - def venv_bin(self, filename=None): + def venv_bin(self, version=LATEST, filename=None): """Return path to the virtualenv bin path, or a specific binary + :param version: Version slug to use in path name :param filename: If specified, add this filename to the path return :returns: Path to virtualenv bin or filename in virtualenv bin """ - parts = [self.venv_path(), 'bin'] + parts = [self.venv_path(version), 'bin'] if filename is not None: parts.append(filename) return os.path.join(*parts) @@ -79,14 +81,14 @@ def venv_bin(self, filename=None): class Virtualenv(PythonEnvironment): - def venv_path(self): - return os.path.join(self.project.doc_path, 'envs', self.version.slug) + def venv_path(self, version=LATEST): + return os.path.join(self.project.doc_path, 'envs', version) def setup_base(self): site_packages = '--no-site-packages' if self.config.use_system_site_packages: site_packages = '--system-site-packages' - env_path = self.venv_path() + env_path = self.venv_path(version=self.version.slug) self.build_env.run( self.config.python_interpreter, '-mvirtualenv', @@ -112,7 +114,7 @@ def install_core_requirements(self): cmd = [ 'python', - self.venv_bin(filename='pip'), + self.venv_bin(version=self.version.slug, filename='pip'), 'install', '--use-wheel', '-U', @@ -128,7 +130,7 @@ def install_core_requirements(self): cmd.extend(requirements) self.build_env.run( *cmd, - bin_path=self.venv_bin() + bin_path=self.venv_bin(version=self.version.slug) ) def install_user_requirements(self): @@ -147,21 +149,21 @@ def install_user_requirements(self): if requirements_file_path: self.build_env.run( 'python', - self.venv_bin(filename='pip'), + self.venv_bin(version=self.version.slug, filename='pip'), 'install', '--exists-action=w', '--cache-dir', self.project.pip_cache_path, '-r{0}'.format(requirements_file_path), cwd=self.checkout_path, - bin_path=self.venv_bin() + bin_path=self.venv_bin(version=self.version.slug) ) class Conda(PythonEnvironment): - def venv_path(self): - return os.path.join(self.project.doc_path, 'conda', self.version.slug) + def venv_path(self, version=LATEST): + return os.path.join(self.project.doc_path, 'conda', version) def setup_base(self): conda_env_path = os.path.join(self.project.doc_path, 'conda') @@ -216,7 +218,7 @@ def install_core_requirements(self): pip_cmd = [ 'python', - self.venv_bin(filename='pip'), + self.venv_bin(version=self.version.slug, filename='pip'), 'install', '-U', '--cache-dir', @@ -225,7 +227,7 @@ def install_core_requirements(self): pip_cmd.extend(pip_requirements) self.build_env.run( *pip_cmd, - bin_path=self.venv_bin() + bin_path=self.venv_bin(version=self.version.slug) ) def install_user_requirements(self): From cd0313813d887b4f3ae45921099609e774862ec4 Mon Sep 17 00:00:00 2001 From: Eric Holscher Date: Wed, 13 Jan 2016 16:59:55 -0800 Subject: [PATCH 07/11] Remove READTHEDOCS bit --- readthedocs/rtd_tests/tests/test_doc_building.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/readthedocs/rtd_tests/tests/test_doc_building.py b/readthedocs/rtd_tests/tests/test_doc_building.py index 3c3c95e2412..e6619cc60c3 100644 --- a/readthedocs/rtd_tests/tests/test_doc_building.py +++ b/readthedocs/rtd_tests/tests/test_doc_building.py @@ -169,7 +169,7 @@ def test_command_execution(self): self.mocks.docker_client.exec_create.assert_called_with( container='version-foobar-of-pip-20', - cmd="/bin/sh -c 'cd /tmp && READTHEDOCS=True echo\\ test'", + cmd="/bin/sh -c 'cd /tmp && echo\\ test'", stderr=True, stdout=True ) @@ -344,7 +344,7 @@ def test_wrapped_command(self): cmd.get_wrapped_command(), ("/bin/sh -c " "'cd /tmp/foobar && " - "READTHEDOCS=True pip install requests'")) + "pip install requests'")) cmd = DockerBuildCommand(['python', '/tmp/foo/pip', 'install', 'Django>1.7'], cwd='/tmp/foobar', @@ -352,7 +352,7 @@ def test_wrapped_command(self): self.assertEqual( cmd.get_wrapped_command(), ("/bin/sh -c " - "'cd /tmp/foobar && READTHEDOCS=True PATH=/tmp/foo:$PATH " + "'cd /tmp/foobar && PATH=/tmp/foo:$PATH " "python /tmp/foo/pip install Django\>1.7'")) def test_unicode_output(self): From 9b6cef61b3d75321cce25bc320565cf9393c2495 Mon Sep 17 00:00:00 2001 From: Eric Holscher Date: Wed, 13 Jan 2016 17:08:46 -0800 Subject: [PATCH 08/11] Fix linting --- readthedocs/projects/tasks.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/readthedocs/projects/tasks.py b/readthedocs/projects/tasks.py index 6fca320ea91..cf6b178b6c5 100644 --- a/readthedocs/projects/tasks.py +++ b/readthedocs/projects/tasks.py @@ -107,7 +107,6 @@ def run(self, pk, version_pk=None, build_pk=None, record=True, docker=False, self.build_localmedia = localmedia self.build_force = force - env_cls = LocalEnvironment self.setup_env = env_cls(project=self.project, version=self.version, build=self.build, record=record) @@ -240,7 +239,6 @@ def get_bash_env(self): 'PATH': os.path.join(self.project.doc_path, 'conda', self.version.slug, 'bin') }) return env - def update_documentation_type(self): """ From fbfe56f809056f07fc627d0f507efad68745138b Mon Sep 17 00:00:00 2001 From: Eric Holscher Date: Thu, 14 Jan 2016 09:43:48 -0800 Subject: [PATCH 09/11] Add default virtualenv PATH as well --- readthedocs/projects/tasks.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/readthedocs/projects/tasks.py b/readthedocs/projects/tasks.py index cf6b178b6c5..722b865cf0c 100644 --- a/readthedocs/projects/tasks.py +++ b/readthedocs/projects/tasks.py @@ -238,6 +238,11 @@ def get_bash_env(self): 'CONDA_DEFAULT_ENV': self.version.slug, 'PATH': os.path.join(self.project.doc_path, 'conda', self.version.slug, 'bin') }) + else: + env.update({ + 'PATH': os.path.join(self.project.doc_path, 'envs', self.version.slug, 'bin') + }) + return env def update_documentation_type(self): From 0865b3688dd819969b48d9e5cd36781fdd945a43 Mon Sep 17 00:00:00 2001 From: Eric Holscher Date: Thu, 14 Jan 2016 16:09:26 -0800 Subject: [PATCH 10/11] Fix naming bash_env -> env_vars --- readthedocs/projects/tasks.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/readthedocs/projects/tasks.py b/readthedocs/projects/tasks.py index 722b865cf0c..8a6f027f6d0 100644 --- a/readthedocs/projects/tasks.py +++ b/readthedocs/projects/tasks.py @@ -127,11 +127,11 @@ def run(self, pk, version_pk=None, build_pk=None, record=True, docker=False, self.config = load_yaml_config(version=self.version) - bash_env = self.get_bash_env() + env_vars = self.get_env_vars() if docker or settings.DOCKER_ENABLE: env_cls = DockerEnvironment self.build_env = env_cls(project=self.project, version=self.version, - build=self.build, record=record, environment=bash_env) + build=self.build, record=record, environment=env_vars) # Environment used for building code, usually with Docker with self.build_env: @@ -222,7 +222,7 @@ def setup_vcs(self): raise BuildEnvironmentError('Failed to import project', status_code=404) - def get_bash_env(self): + def get_env_vars(self): """ Get bash environment variables used for all builder commands. """ From af81a01578781a6d81096b5e8d2b225dca79cf98 Mon Sep 17 00:00:00 2001 From: Eric Holscher Date: Thu, 14 Jan 2016 16:23:06 -0800 Subject: [PATCH 11/11] Pass empty bin_path's for environment creation --- readthedocs/doc_builder/python_environments.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/readthedocs/doc_builder/python_environments.py b/readthedocs/doc_builder/python_environments.py index 985dae1aed8..0c11df1f930 100644 --- a/readthedocs/doc_builder/python_environments.py +++ b/readthedocs/doc_builder/python_environments.py @@ -94,6 +94,7 @@ def setup_base(self): '-mvirtualenv', site_packages, env_path, + bin_path=None, # Don't use virtualenv bin that doesn't exist yet ) def install_core_requirements(self): @@ -180,6 +181,7 @@ def setup_base(self): '--name', self.version.slug, 'python={python_version}'.format(python_version=self.config.python_version), + bin_path=None, # Don't use conda bin that doesn't exist yet ) def install_core_requirements(self):