From accf63bd24eb13ce672b3ec856b97cc36a28aa63 Mon Sep 17 00:00:00 2001 From: codealchemy Date: Tue, 19 Mar 2019 11:15:20 -0700 Subject: [PATCH 1/2] Allow for alternate node dist binaries --- .../node/subsystems/node_distribution.py | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/contrib/node/src/python/pants/contrib/node/subsystems/node_distribution.py b/contrib/node/src/python/pants/contrib/node/subsystems/node_distribution.py index eb0243ae8a3..93bbb8a26e3 100644 --- a/contrib/node/src/python/pants/contrib/node/subsystems/node_distribution.py +++ b/contrib/node/src/python/pants/contrib/node/subsystems/node_distribution.py @@ -11,6 +11,7 @@ from pants.base.exceptions import TaskError from pants.binaries.binary_tool import NativeTool +from pants.binaries.binary_util import BinaryToolUrlGenerator from pants.option.custom_types import dir_option, file_option from pants.util.dirutil import safe_mkdir, safe_rmtree from pants.util.memo import memoized_method, memoized_property @@ -28,6 +29,20 @@ logger = logging.getLogger(__name__) +class NodeReleaseUrlGenerator(BinaryToolUrlGenerator): + + _DIST_URL_FMT = 'https://nodejs.org/dist/{version}/node-{version}-{system_id}.tar.xz' + + _SYSTEM_ID = { + 'mac': 'darwin-x64', + 'linux': 'linux-x64', + } + + def generate_urls(self, version, host_platform): + system_id = self._SYSTEM_ID[host_platform.os_name] + return [self._DIST_URL_FMT.format(version=version, system_id=system_id)] + + class NodeDistribution(NativeTool): """Represents a self-bootstrapping Node distribution.""" @@ -36,6 +51,9 @@ class NodeDistribution(NativeTool): default_version = 'v8.11.3' archive_type = 'tgz' + def get_external_url_generator(self): + return NodeReleaseUrlGenerator() + @classmethod def subsystem_dependencies(cls): # Note that we use a YarnpkgDistribution scoped to the NodeDistribution, which may itself @@ -151,7 +169,7 @@ def _configure_eslinter(self, bootstrapped_support_path): def eslint_supportdir(self, task_workdir): """ Returns the path where the ESLint is bootstrapped. - + :param string task_workdir: The task's working directory :returns: The path where ESLint is bootstrapped and whether or not it is configured :rtype: (string, bool) From f79ea3313c845d147c4d27ca3e3eb213ec570d4a Mon Sep 17 00:00:00 2001 From: codealchemy Date: Tue, 26 Mar 2019 09:25:08 -0700 Subject: [PATCH 2/2] Fix node bin path when installed from nodejs sources The binary is extracted into a directory following the naming of the version and system id (ex. node-v8.11.3-darwin-x64) --- .../pants/contrib/node/subsystems/node_distribution.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/contrib/node/src/python/pants/contrib/node/subsystems/node_distribution.py b/contrib/node/src/python/pants/contrib/node/subsystems/node_distribution.py index 93bbb8a26e3..a82f025edb7 100644 --- a/contrib/node/src/python/pants/contrib/node/subsystems/node_distribution.py +++ b/contrib/node/src/python/pants/contrib/node/subsystems/node_distribution.py @@ -13,7 +13,7 @@ from pants.binaries.binary_tool import NativeTool from pants.binaries.binary_util import BinaryToolUrlGenerator from pants.option.custom_types import dir_option, file_option -from pants.util.dirutil import safe_mkdir, safe_rmtree +from pants.util.dirutil import is_readable_dir, safe_mkdir, safe_rmtree from pants.util.memo import memoized_method, memoized_property from pants.contrib.node.subsystems.command import command_gen @@ -31,7 +31,7 @@ class NodeReleaseUrlGenerator(BinaryToolUrlGenerator): - _DIST_URL_FMT = 'https://nodejs.org/dist/{version}/node-{version}-{system_id}.tar.xz' + _DIST_URL_FMT = 'https://nodejs.org/dist/{version}/node-{version}-{system_id}.tar.gz' _SYSTEM_ID = { 'mac': 'darwin-x64', @@ -132,6 +132,10 @@ def _install_node(self): # This line depends on repacked node distribution. # Should change it from 'node/bin' to 'dist/bin' node_bin_path = os.path.join(node_package_path, 'node', 'bin') + if not is_readable_dir(node_bin_path): + # The binary was pulled from nodejs and not our S3, in which + # case it's installed under a different directory. + return os.path.join(node_package_path, os.listdir(node_package_path)[0], 'bin') return node_bin_path @memoized_method