zephyr/scripts/meta/west/util.py
Marti Bolivar 55b462cdfa scripts: update west to latest upstream version.
Update to the latest west. This includes a new 'attach' command. There
are also multi-repo commands, but those won't get exposed to the user
unless they install Zephyr using "west init" + "west fetch" (and not,
say, "git clone").

Replace the launchers; they now detect whether zephyr is part of a
multi-repo installation, and run the west code in its own repository
if that is the case.

This also requires an update to:

- the flash/debug CMakeLists.txt, as the new west package is no longer
  executable as a module and must have its main script run by the
  interpreter instead.

- the documentation, to reflect a rename and with a hack to fix
  the automodule directive in flash-debug.rst for now

Signed-off-by: Marti Bolivar <marti@foundries.io>
2018-09-25 17:51:22 +02:00

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