11import contextlib
22
33from pre_commit .languages import helpers
4- from pre_commit .languages import python
54from pre_commit .prefixed_command_runner import CalledProcessError
65from pre_commit .util import clean_path_on_failure
76
87
98ENVIRONMENT_DIR = 'node_env'
109
1110
12- class NodeEnv (python . PythonEnv ):
11+ class NodeEnv (helpers . Environment ):
1312 @property
1413 def env_prefix (self ):
15- base = super (NodeEnv , self ).env_prefix
16- return ' ' .join ([
17- base ,
18- '. {{prefix}}{0}/bin/activate &&' .format (ENVIRONMENT_DIR )]
19- )
14+ return '. {{prefix}}{0}/bin/activate &&' .format (ENVIRONMENT_DIR )
2015
2116
2217@contextlib .contextmanager
@@ -27,29 +22,31 @@ def in_env(repo_cmd_runner):
2722def install_environment (repo_cmd_runner , version = 'default' ):
2823 assert repo_cmd_runner .exists ('package.json' )
2924
30- with clean_path_on_failure (repo_cmd_runner .path (python .ENVIRONMENT_DIR )):
31- repo_cmd_runner .run (
32- ['virtualenv' , '{{prefix}}{0}' .format (python .ENVIRONMENT_DIR )],
33- )
34-
35- with python .in_env (repo_cmd_runner ) as python_env :
36- python_env .run ('pip install nodeenv' )
37-
38- with clean_path_on_failure (repo_cmd_runner .path (ENVIRONMENT_DIR )):
39- # Try and use the system level node executable first
40- try :
41- with clean_path_on_failure (repo_cmd_runner .path (ENVIRONMENT_DIR )):
42- python_env .run (
43- 'nodeenv -n system {{prefix}}{0}' .format (ENVIRONMENT_DIR ),
44- )
45- except CalledProcessError :
46- # TODO: log failure here
47- python_env .run (
48- 'nodeenv --jobs 4 {{prefix}}{0}' .format (ENVIRONMENT_DIR ),
49- )
50-
51- with in_env (repo_cmd_runner ) as node_env :
52- node_env .run ('cd {prefix} && npm install -g' )
25+ env_dir = repo_cmd_runner .path (ENVIRONMENT_DIR )
26+ with clean_path_on_failure (env_dir ):
27+ if version == 'default' :
28+ # In the default case we attempt to install system node and if that
29+ # doesn't work we use --prebuilt
30+ try :
31+ with clean_path_on_failure (env_dir ):
32+ repo_cmd_runner .run ([
33+ 'nodeenv' , '-n' , 'system' ,
34+ '{{prefix}}{0}' .format (ENVIRONMENT_DIR ),
35+ ])
36+ except CalledProcessError :
37+ # TODO: log failure here
38+ repo_cmd_runner .run ([
39+ 'nodeenv' , '--prebuilt' ,
40+ '{{prefix}}{0}' .format (ENVIRONMENT_DIR )
41+ ])
42+ else :
43+ repo_cmd_runner .run ([
44+ 'nodeenv' , '--prebuilt' , '-n' , version ,
45+ '{{prefix}}{0}' .format (ENVIRONMENT_DIR )
46+ ])
47+
48+ with in_env (repo_cmd_runner ) as node_env :
49+ node_env .run ('cd {prefix} && npm install -g' )
5350
5451
5552def run_hook (repo_cmd_runner , hook , file_args ):
0 commit comments