mirror of
https://fuchsia.googlesource.com/third_party/pigweed.googlesource.com/pigweed/pigweed
synced 2024-09-21 22:28:10 +00:00
81 lines
2.5 KiB
Python
81 lines
2.5 KiB
Python
|
# Copyright 2019 The Pigweed Authors
|
||
|
#
|
||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||
|
# use this file except in compliance with the License. You may obtain a copy of
|
||
|
# the License at
|
||
|
#
|
||
|
# https://www.apache.org/licenses/LICENSE-2.0
|
||
|
#
|
||
|
# Unless required by applicable law or agreed to in writing, software
|
||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||
|
# License for the specific language governing permissions and limitations under
|
||
|
# the License.
|
||
|
"""Sets up a Python 3 virtualenv for Pigweed."""
|
||
|
|
||
|
import argparse
|
||
|
import subprocess
|
||
|
import venv
|
||
|
import os
|
||
|
import shlex
|
||
|
import sys
|
||
|
from typing import Sequence
|
||
|
|
||
|
|
||
|
def git_stdout(*args, **kwargs) -> str:
|
||
|
return subprocess.run(('git', *args),
|
||
|
stdout=subprocess.PIPE,
|
||
|
check=True,
|
||
|
**kwargs).stdout.decode().strip()
|
||
|
|
||
|
|
||
|
def git_list_files(*args, **kwargs) -> Sequence[str]:
|
||
|
return git_stdout('ls-files', *args, **kwargs).split()
|
||
|
|
||
|
|
||
|
def git_repo_root(path: str = './') -> str:
|
||
|
return git_stdout('-C', path, 'rev-parse', '--show-toplevel')
|
||
|
|
||
|
|
||
|
def init(venv_path, requirements=()) -> None:
|
||
|
"""Creates a venv and installs all packages in this Git repo."""
|
||
|
|
||
|
print('Creating venv at', venv_path)
|
||
|
venv.create(venv_path, clear=True, with_pip=True)
|
||
|
|
||
|
venv_python = os.path.join(venv_path, 'bin', 'python')
|
||
|
|
||
|
def pip_install(*args):
|
||
|
cmd = venv_python, '-m', 'pip', 'install', *args
|
||
|
print(shlex.join(cmd))
|
||
|
return subprocess.run(cmd, check=True)
|
||
|
|
||
|
pip_install('--upgrade', 'pip')
|
||
|
|
||
|
package_args = tuple(
|
||
|
f'--editable={os.path.dirname(path)}' for path in git_list_files(
|
||
|
'setup.py', '*/setup.py', cwd=git_repo_root()))
|
||
|
|
||
|
requirement_args = tuple(f'--requirement={req}' for req in requirements)
|
||
|
|
||
|
pip_install('--log', os.path.join(venv_path, 'pip.log'), *requirement_args,
|
||
|
*package_args)
|
||
|
|
||
|
|
||
|
def _main() -> None:
|
||
|
parser = argparse.ArgumentParser(description=__doc__)
|
||
|
parser.add_argument('--venv_path',
|
||
|
required=True,
|
||
|
help='Path at which to create the venv')
|
||
|
parser.add_argument('-r',
|
||
|
'--requirements',
|
||
|
default=[],
|
||
|
action='append',
|
||
|
help='requirements.txt files to install')
|
||
|
|
||
|
init(**vars(parser.parse_args()))
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
_main()
|