zephyr/scripts/meta/west/util.py

81 lines
2.2 KiB
Python

# Copyright 2018 Open Source Foundries Limited.
#
# SPDX-License-Identifier: Apache-2.0
'''Miscellaneous utilities used by west
'''
import os
import shlex
import textwrap
def quote_sh_list(cmd):
'''Transform a command from list into shell string form.'''
fmt = ' '.join('{}' for _ in cmd)
args = [shlex.quote(s) for s in cmd]
return fmt.format(*args)
def wrap(text, indent):
'''Convenience routine for wrapping text to a consistent indent.'''
return textwrap.wrap(text, initial_indent=indent,
subsequent_indent=indent)
class WestNotFound(RuntimeError):
'''Neither the current directory nor any parent has a West installation.'''
def west_dir(start=None):
'''Returns the absolute path of the west/ top level directory.
Starts the search from the start directory, and goes to its
parents. If the start directory is not specified, the current
directory is used.
Raises WestNotFound if no west top-level directory is found.
'''
return os.path.join(west_topdir(start), 'west')
def west_topdir(start=None):
'''
Like west_dir(), but returns the path to the parent directory of the west/
directory instead, where project repositories are stored
'''
# If you change this function, make sure to update the bootstrap
# script's find_west_topdir().
if start is None:
cur_dir = os.getcwd()
else:
cur_dir = start
while True:
if os.path.isfile(os.path.join(cur_dir, 'west', '.west_topdir')):
return cur_dir
parent_dir = os.path.dirname(cur_dir)
if cur_dir == parent_dir:
# At the root
raise WestNotFound('Could not find a West installation '
'in this or any parent directory')
cur_dir = parent_dir
def in_multirepo_install(start=None):
'''Returns True iff the path ``start`` is in a multi-repo installation.
If start is not given, it defaults to the current working directory.
This is equivalent to checking if west_dir() raises an exception
when given the same start kwarg.
'''
try:
west_topdir(start)
result = True
except WestNotFound:
result = False
return result