diff options
Diffstat (limited to 'cros_utils/misc.py')
-rw-r--r-- | cros_utils/misc.py | 786 |
1 files changed, 417 insertions, 369 deletions
diff --git a/cros_utils/misc.py b/cros_utils/misc.py index a0d0de73..aabb5ad7 100644 --- a/cros_utils/misc.py +++ b/cros_utils/misc.py @@ -1,14 +1,12 @@ # -*- coding: utf-8 -*- -# Copyright 2013 The Chromium OS Authors. All rights reserved. +# Copyright 2013 The ChromiumOS Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Utilities for toolchain build.""" -from __future__ import division -from __future__ import print_function -__author__ = 'asharif@google.com (Ahmad Sharif)' +__author__ = "asharif@google.com (Ahmad Sharif)" from contextlib import contextmanager import os @@ -19,495 +17,545 @@ import sys from cros_utils import command_executer from cros_utils import logger -CHROMEOS_SCRIPTS_DIR = '/mnt/host/source/src/scripts' -TOOLCHAIN_UTILS_PATH = ('/mnt/host/source/src/third_party/toolchain-utils/' - 'cros_utils/toolchain_utils.sh') + +CHROMEOS_SCRIPTS_DIR = "/mnt/host/source/src/scripts" +TOOLCHAIN_UTILS_PATH = ( + "/mnt/host/source/src/third_party/toolchain-utils/" + "cros_utils/toolchain_utils.sh" +) def GetChromeOSVersionFromLSBVersion(lsb_version): - """Get Chromeos version from Lsb version.""" - ce = command_executer.GetCommandExecuter() - command = ('git ls-remote ' - 'https://chromium.googlesource.com/chromiumos/manifest.git ' - 'refs/heads/release-R*') - ret, out, _ = ce.RunCommandWOutput(command, print_to_console=False) - assert ret == 0, 'Command %s failed' % command - lower = [] - for line in out.splitlines(): - mo = re.search(r'refs/heads/release-R(\d+)-(\d+)\.B', line) - if mo: - revision = int(mo.group(1)) - build = int(mo.group(2)) - lsb_build = int(lsb_version.split('.')[0]) - if lsb_build > build: - lower.append(revision) - lower = sorted(lower) - if lower: - return 'R%d-%s' % (lower[-1] + 1, lsb_version) - else: - return 'Unknown' + """Get Chromeos version from Lsb version.""" + ce = command_executer.GetCommandExecuter() + command = ( + "git ls-remote " + "https://chromium.googlesource.com/chromiumos/manifest.git " + "refs/heads/release-R*" + ) + ret, out, _ = ce.RunCommandWOutput(command, print_to_console=False) + assert ret == 0, "Command %s failed" % command + lower = [] + for line in out.splitlines(): + mo = re.search(r"refs/heads/release-R(\d+)-(\d+)\.B", line) + if mo: + revision = int(mo.group(1)) + build = int(mo.group(2)) + lsb_build = int(lsb_version.split(".")[0]) + if lsb_build > build: + lower.append(revision) + lower = sorted(lower) + if lower: + return "R%d-%s" % (lower[-1] + 1, lsb_version) + else: + return "Unknown" def ApplySubs(string, *substitutions): - for pattern, replacement in substitutions: - string = re.sub(pattern, replacement, string) - return string + for pattern, replacement in substitutions: + string = re.sub(pattern, replacement, string) + return string def UnitToNumber(unit_num, base=1000): - """Convert a number with unit to float.""" - unit_dict = {'kilo': base, 'mega': base**2, 'giga': base**3} - unit_num = unit_num.lower() - mo = re.search(r'(\d*)(.+)?', unit_num) - number = mo.group(1) - unit = mo.group(2) - if not unit: - return float(number) - for k, v in unit_dict.items(): - if k.startswith(unit): - return float(number) * v - raise RuntimeError('Unit: %s not found in byte: %s!' % (unit, unit_num)) + """Convert a number with unit to float.""" + unit_dict = {"kilo": base, "mega": base ** 2, "giga": base ** 3} + unit_num = unit_num.lower() + mo = re.search(r"(\d*)(.+)?", unit_num) + number = mo.group(1) + unit = mo.group(2) + if not unit: + return float(number) + for k, v in unit_dict.items(): + if k.startswith(unit): + return float(number) * v + raise RuntimeError("Unit: %s not found in byte: %s!" % (unit, unit_num)) def GetFilenameFromString(string): - return ApplySubs( - string, - (r'/', '__'), - (r'\s', '_'), - (r'[\\$="?^]', ''), - ) + return ApplySubs( + string, + (r"/", "__"), + (r"\s", "_"), + (r'[\\$="?^]', ""), + ) def GetRoot(scr_name): - """Break up pathname into (dir+name).""" - abs_path = os.path.abspath(scr_name) - return (os.path.dirname(abs_path), os.path.basename(abs_path)) + """Break up pathname into (dir+name).""" + abs_path = os.path.abspath(scr_name) + return (os.path.dirname(abs_path), os.path.basename(abs_path)) def GetChromeOSKeyFile(chromeos_root): - return os.path.join(chromeos_root, 'src', 'scripts', 'mod_for_test_scripts', - 'ssh_keys', 'testing_rsa') + return os.path.join( + chromeos_root, + "src", + "scripts", + "mod_for_test_scripts", + "ssh_keys", + "testing_rsa", + ) def GetChrootPath(chromeos_root): - return os.path.join(chromeos_root, 'chroot') + return os.path.join(chromeos_root, "chroot") def GetInsideChrootPath(chromeos_root, file_path): - if not file_path.startswith(GetChrootPath(chromeos_root)): - raise RuntimeError("File: %s doesn't seem to be in the chroot: %s" % - (file_path, chromeos_root)) - return file_path[len(GetChrootPath(chromeos_root)):] + if not file_path.startswith(GetChrootPath(chromeos_root)): + raise RuntimeError( + "File: %s doesn't seem to be in the chroot: %s" + % (file_path, chromeos_root) + ) + return file_path[len(GetChrootPath(chromeos_root)) :] def GetOutsideChrootPath(chromeos_root, file_path): - return os.path.join(GetChrootPath(chromeos_root), file_path.lstrip('/')) + return os.path.join(GetChrootPath(chromeos_root), file_path.lstrip("/")) def FormatQuotedCommand(command): - return ApplySubs(command, ('"', r'\"')) + return ApplySubs(command, ('"', r"\"")) def FormatCommands(commands): - return ApplySubs(str(commands), ('&&', '&&\n'), (';', ';\n'), - (r'\n+\s*', '\n')) + return ApplySubs( + str(commands), ("&&", "&&\n"), (";", ";\n"), (r"\n+\s*", "\n") + ) def GetImageDir(chromeos_root, board): - return os.path.join(chromeos_root, 'src', 'build', 'images', board) + return os.path.join(chromeos_root, "src", "build", "images", board) def LabelLatestImage(chromeos_root, board, label, vanilla_path=None): - image_dir = GetImageDir(chromeos_root, board) - latest_image_dir = os.path.join(image_dir, 'latest') - latest_image_dir = os.path.realpath(latest_image_dir) - latest_image_dir = os.path.basename(latest_image_dir) - retval = 0 - with WorkingDirectory(image_dir): - command = 'ln -sf -T %s %s' % (latest_image_dir, label) - ce = command_executer.GetCommandExecuter() - retval = ce.RunCommand(command) - if retval: - return retval - if vanilla_path: - command = 'ln -sf -T %s %s' % (vanilla_path, 'vanilla') - retval2 = ce.RunCommand(command) - return retval2 - return retval + image_dir = GetImageDir(chromeos_root, board) + latest_image_dir = os.path.join(image_dir, "latest") + latest_image_dir = os.path.realpath(latest_image_dir) + latest_image_dir = os.path.basename(latest_image_dir) + retval = 0 + with WorkingDirectory(image_dir): + command = "ln -sf -T %s %s" % (latest_image_dir, label) + ce = command_executer.GetCommandExecuter() + retval = ce.RunCommand(command) + if retval: + return retval + if vanilla_path: + command = "ln -sf -T %s %s" % (vanilla_path, "vanilla") + retval2 = ce.RunCommand(command) + return retval2 + return retval def DoesLabelExist(chromeos_root, board, label): - image_label = os.path.join(GetImageDir(chromeos_root, board), label) - return os.path.exists(image_label) + image_label = os.path.join(GetImageDir(chromeos_root, board), label) + return os.path.exists(image_label) def GetBuildPackagesCommand(board, usepkg=False, debug=False): - if usepkg: - usepkg_flag = '--usepkg' - else: - usepkg_flag = '--nousepkg' - if debug: - withdebug_flag = '--withdebug' - else: - withdebug_flag = '--nowithdebug' - return ('%s/build_packages %s --withdev --withtest --withautotest ' - '--skip_toolchain_update %s --board=%s ' - '--accept_licenses=@CHROMEOS' % - (CHROMEOS_SCRIPTS_DIR, usepkg_flag, withdebug_flag, board)) + if usepkg: + usepkg_flag = "--usepkg" + else: + usepkg_flag = "--nousepkg" + if debug: + withdebug_flag = "--withdebug" + else: + withdebug_flag = "--nowithdebug" + return ( + "%s/build_packages %s --withdev --withtest --withautotest " + "--skip_toolchain_update %s --board=%s " + "--accept_licenses=@CHROMEOS" + % (CHROMEOS_SCRIPTS_DIR, usepkg_flag, withdebug_flag, board) + ) def GetBuildImageCommand(board, dev=False): - dev_args = '' - if dev: - dev_args = '--noenable_rootfs_verification --disk_layout=2gb-rootfs' - return ('%s/build_image --board=%s %s test' % - (CHROMEOS_SCRIPTS_DIR, board, dev_args)) + dev_args = "" + if dev: + dev_args = "--noenable_rootfs_verification --disk_layout=2gb-rootfs" + return "%s/build_image --board=%s %s test" % ( + CHROMEOS_SCRIPTS_DIR, + board, + dev_args, + ) def GetSetupBoardCommand(board, usepkg=None, force=None): - """Get setup_board command.""" - options = [] + """Get setup_board command.""" + options = [] - if usepkg: - options.append('--usepkg') - else: - options.append('--nousepkg') + if usepkg: + options.append("--usepkg") + else: + options.append("--nousepkg") - if force: - options.append('--force') + if force: + options.append("--force") - options.append('--accept-licenses=@CHROMEOS') + options.append("--accept-licenses=@CHROMEOS") - return 'setup_board --board=%s %s' % (board, ' '.join(options)) + return "setup_board --board=%s %s" % (board, " ".join(options)) def CanonicalizePath(path): - path = os.path.expanduser(path) - path = os.path.realpath(path) - return path + path = os.path.expanduser(path) + path = os.path.realpath(path) + return path def GetCtargetFromBoard(board, chromeos_root): - """Get Ctarget from board.""" - base_board = board.split('_')[0] - command = ('source %s; get_ctarget_from_board %s' % - (TOOLCHAIN_UTILS_PATH, base_board)) - ce = command_executer.GetCommandExecuter() - ret, out, _ = ce.ChrootRunCommandWOutput(chromeos_root, command) - if ret != 0: - raise ValueError('Board %s is invalid!' % board) - # Remove ANSI escape sequences. - out = StripANSIEscapeSequences(out) - return out.strip() + """Get Ctarget from board.""" + base_board = board.split("_")[0] + command = "source %s; get_ctarget_from_board %s" % ( + TOOLCHAIN_UTILS_PATH, + base_board, + ) + ce = command_executer.GetCommandExecuter() + ret, out, _ = ce.ChrootRunCommandWOutput(chromeos_root, command) + if ret != 0: + raise ValueError("Board %s is invalid!" % board) + # Remove ANSI escape sequences. + out = StripANSIEscapeSequences(out) + return out.strip() def GetArchFromBoard(board, chromeos_root): - """Get Arch from board.""" - base_board = board.split('_')[0] - command = ('source %s; get_board_arch %s' % - (TOOLCHAIN_UTILS_PATH, base_board)) - ce = command_executer.GetCommandExecuter() - ret, out, _ = ce.ChrootRunCommandWOutput(chromeos_root, command) - if ret != 0: - raise ValueError('Board %s is invalid!' % board) - # Remove ANSI escape sequences. - out = StripANSIEscapeSequences(out) - return out.strip() + """Get Arch from board.""" + base_board = board.split("_")[0] + command = "source %s; get_board_arch %s" % ( + TOOLCHAIN_UTILS_PATH, + base_board, + ) + ce = command_executer.GetCommandExecuter() + ret, out, _ = ce.ChrootRunCommandWOutput(chromeos_root, command) + if ret != 0: + raise ValueError("Board %s is invalid!" % board) + # Remove ANSI escape sequences. + out = StripANSIEscapeSequences(out) + return out.strip() def GetGccLibsDestForBoard(board, chromeos_root): - """Get gcc libs destination from board.""" - arch = GetArchFromBoard(board, chromeos_root) - if arch == 'x86': - return '/build/%s/usr/lib/gcc/' % board - if arch == 'amd64': - return '/build/%s/usr/lib64/gcc/' % board - if arch == 'arm': - return '/build/%s/usr/lib/gcc/' % board - if arch == 'arm64': - return '/build/%s/usr/lib/gcc/' % board - raise ValueError('Arch %s is invalid!' % arch) + """Get gcc libs destination from board.""" + arch = GetArchFromBoard(board, chromeos_root) + if arch == "x86": + return "/build/%s/usr/lib/gcc/" % board + if arch == "amd64": + return "/build/%s/usr/lib64/gcc/" % board + if arch == "arm": + return "/build/%s/usr/lib/gcc/" % board + if arch == "arm64": + return "/build/%s/usr/lib/gcc/" % board + raise ValueError("Arch %s is invalid!" % arch) def StripANSIEscapeSequences(string): - string = re.sub(r'\x1b\[[0-9]*[a-zA-Z]', '', string) - return string + string = re.sub(r"\x1b\[[0-9]*[a-zA-Z]", "", string) + return string def GetChromeSrcDir(): - return 'var/cache/distfiles/target/chrome-src/src' + return "var/cache/distfiles/target/chrome-src/src" def GetEnvStringFromDict(env_dict): - return ' '.join(['%s="%s"' % var for var in env_dict.items()]) + return " ".join(['%s="%s"' % var for var in env_dict.items()]) def MergeEnvStringWithDict(env_string, env_dict, prepend=True): - """Merge env string with dict.""" - if not env_string.strip(): - return GetEnvStringFromDict(env_dict) - override_env_list = [] - ce = command_executer.GetCommandExecuter() - for k, v in env_dict.items(): - v = v.strip('"\'') - if prepend: - new_env = '%s="%s $%s"' % (k, v, k) - else: - new_env = '%s="$%s %s"' % (k, k, v) - command = '; '.join([env_string, new_env, 'echo $%s' % k]) - ret, out, _ = ce.RunCommandWOutput(command) - override_env_list.append('%s=%r' % (k, out.strip())) - ret = env_string + ' ' + ' '.join(override_env_list) - return ret.strip() + """Merge env string with dict.""" + if not env_string.strip(): + return GetEnvStringFromDict(env_dict) + override_env_list = [] + ce = command_executer.GetCommandExecuter() + for k, v in env_dict.items(): + v = v.strip("\"'") + if prepend: + new_env = '%s="%s $%s"' % (k, v, k) + else: + new_env = '%s="$%s %s"' % (k, k, v) + command = "; ".join([env_string, new_env, "echo $%s" % k]) + ret, out, _ = ce.RunCommandWOutput(command) + override_env_list.append("%s=%r" % (k, out.strip())) + ret = env_string + " " + " ".join(override_env_list) + return ret.strip() def GetAllImages(chromeos_root, board): - ce = command_executer.GetCommandExecuter() - command = ('find %s/src/build/images/%s -name chromiumos_test_image.bin' % - (chromeos_root, board)) - ret, out, _ = ce.RunCommandWOutput(command) - assert ret == 0, 'Could not run command: %s' % command - return out.splitlines() + ce = command_executer.GetCommandExecuter() + command = "find %s/src/build/images/%s -name chromiumos_test_image.bin" % ( + chromeos_root, + board, + ) + ret, out, _ = ce.RunCommandWOutput(command) + assert ret == 0, "Could not run command: %s" % command + return out.splitlines() def IsFloat(text): - if text is None: - return False - try: - float(text) - return True - except ValueError: - return False + if text is None: + return False + try: + float(text) + return True + except ValueError: + return False def RemoveChromeBrowserObjectFiles(chromeos_root, board): - """Remove any object files from all the posible locations.""" - out_dir = os.path.join( - GetChrootPath(chromeos_root), - 'var/cache/chromeos-chrome/chrome-src/src/out_%s' % board) - if os.path.exists(out_dir): - shutil.rmtree(out_dir) - logger.GetLogger().LogCmd('rm -rf %s' % out_dir) - out_dir = os.path.join( - GetChrootPath(chromeos_root), - 'var/cache/chromeos-chrome/chrome-src-internal/src/out_%s' % board) - if os.path.exists(out_dir): - shutil.rmtree(out_dir) - logger.GetLogger().LogCmd('rm -rf %s' % out_dir) + """Remove any object files from all the posible locations.""" + out_dir = os.path.join( + GetChrootPath(chromeos_root), + "var/cache/chromeos-chrome/chrome-src/src/out_%s" % board, + ) + if os.path.exists(out_dir): + shutil.rmtree(out_dir) + logger.GetLogger().LogCmd("rm -rf %s" % out_dir) + out_dir = os.path.join( + GetChrootPath(chromeos_root), + "var/cache/chromeos-chrome/chrome-src-internal/src/out_%s" % board, + ) + if os.path.exists(out_dir): + shutil.rmtree(out_dir) + logger.GetLogger().LogCmd("rm -rf %s" % out_dir) @contextmanager def WorkingDirectory(new_dir): - """Get the working directory.""" - old_dir = os.getcwd() - if old_dir != new_dir: - msg = 'cd %s' % new_dir - logger.GetLogger().LogCmd(msg) - os.chdir(new_dir) - yield new_dir - if old_dir != new_dir: - msg = 'cd %s' % old_dir - logger.GetLogger().LogCmd(msg) - os.chdir(old_dir) + """Get the working directory.""" + old_dir = os.getcwd() + if old_dir != new_dir: + msg = "cd %s" % new_dir + logger.GetLogger().LogCmd(msg) + os.chdir(new_dir) + yield new_dir + if old_dir != new_dir: + msg = "cd %s" % old_dir + logger.GetLogger().LogCmd(msg) + os.chdir(old_dir) def HasGitStagedChanges(git_dir): - """Return True if git repository has staged changes.""" - command = f'cd {git_dir} && git diff --quiet --cached --exit-code HEAD' - return command_executer.GetCommandExecuter().RunCommand( - command, print_to_console=False) + """Return True if git repository has staged changes.""" + command = f"cd {git_dir} && git diff --quiet --cached --exit-code HEAD" + return command_executer.GetCommandExecuter().RunCommand( + command, print_to_console=False + ) def HasGitUnstagedChanges(git_dir): - """Return True if git repository has un-staged changes.""" - command = f'cd {git_dir} && git diff --quiet --exit-code HEAD' - return command_executer.GetCommandExecuter().RunCommand( - command, print_to_console=False) + """Return True if git repository has un-staged changes.""" + command = f"cd {git_dir} && git diff --quiet --exit-code HEAD" + return command_executer.GetCommandExecuter().RunCommand( + command, print_to_console=False + ) def HasGitUntrackedChanges(git_dir): - """Return True if git repository has un-tracked changes.""" - command = (f'cd {git_dir} && test -z ' - '$(git ls-files --exclude-standard --others)') - return command_executer.GetCommandExecuter().RunCommand( - command, print_to_console=False) + """Return True if git repository has un-tracked changes.""" + command = ( + f"cd {git_dir} && test -z " + "$(git ls-files --exclude-standard --others)" + ) + return command_executer.GetCommandExecuter().RunCommand( + command, print_to_console=False + ) def GitGetCommitHash(git_dir, commit_symbolic_name): - """Return githash for the symbolic git commit. + """Return githash for the symbolic git commit. - For example, commit_symbolic_name could be - "cros/gcc.gnu.org/branches/gcc/gcc-4_8-mobile, this function returns the git - hash for this symbolic name. + For example, commit_symbolic_name could be + "cros/gcc.gnu.org/branches/gcc/gcc-4_8-mobile, this function returns the git + hash for this symbolic name. - Args: - git_dir: a git working tree. - commit_symbolic_name: a symbolic name for a particular git commit. + Args: + git_dir: a git working tree. + commit_symbolic_name: a symbolic name for a particular git commit. - Returns: - The git hash for the symbolic name or None if fails. - """ + Returns: + The git hash for the symbolic name or None if fails. + """ - command = (f'cd {git_dir} && git log -n 1' - f' --pretty="format:%H" {commit_symbolic_name}') - rv, out, _ = command_executer.GetCommandExecuter().RunCommandWOutput( - command, print_to_console=False) - if rv == 0: - return out.strip() - return None + command = ( + f"cd {git_dir} && git log -n 1" + f' --pretty="format:%H" {commit_symbolic_name}' + ) + rv, out, _ = command_executer.GetCommandExecuter().RunCommandWOutput( + command, print_to_console=False + ) + if rv == 0: + return out.strip() + return None def IsGitTreeClean(git_dir): - """Test if git tree has no local changes. - - Args: - git_dir: git tree directory. - - Returns: - True if git dir is clean. - """ - if HasGitStagedChanges(git_dir): - logger.GetLogger().LogWarning('Git tree has staged changes.') - return False - if HasGitUnstagedChanges(git_dir): - logger.GetLogger().LogWarning('Git tree has unstaged changes.') - return False - if HasGitUntrackedChanges(git_dir): - logger.GetLogger().LogWarning('Git tree has un-tracked changes.') - return False - return True + """Test if git tree has no local changes. + + Args: + git_dir: git tree directory. + + Returns: + True if git dir is clean. + """ + if HasGitStagedChanges(git_dir): + logger.GetLogger().LogWarning("Git tree has staged changes.") + return False + if HasGitUnstagedChanges(git_dir): + logger.GetLogger().LogWarning("Git tree has unstaged changes.") + return False + if HasGitUntrackedChanges(git_dir): + logger.GetLogger().LogWarning("Git tree has un-tracked changes.") + return False + return True def GetGitChangesAsList(git_dir, path=None, staged=False): - """Get changed files as a list. - - Args: - git_dir: git tree directory. - path: a relative path that is part of the tree directory, could be null. - staged: whether to include staged files as well. - - Returns: - A list containing all the changed files. - """ - command = f'cd {git_dir} && git diff --name-only' - if staged: - command += ' --cached' - if path: - command += ' -- ' + path - _, out, _ = command_executer.GetCommandExecuter().RunCommandWOutput( - command, print_to_console=False) - rv = [] - for line in out.splitlines(): - rv.append(line) - return rv + """Get changed files as a list. + + Args: + git_dir: git tree directory. + path: a relative path that is part of the tree directory, could be null. + staged: whether to include staged files as well. + + Returns: + A list containing all the changed files. + """ + command = f"cd {git_dir} && git diff --name-only" + if staged: + command += " --cached" + if path: + command += " -- " + path + _, out, _ = command_executer.GetCommandExecuter().RunCommandWOutput( + command, print_to_console=False + ) + rv = [] + for line in out.splitlines(): + rv.append(line) + return rv def IsChromeOsTree(chromeos_root): - return (os.path.isdir( - os.path.join(chromeos_root, 'src/third_party/chromiumos-overlay')) - and os.path.isdir(os.path.join(chromeos_root, 'manifest'))) + return os.path.isdir( + os.path.join(chromeos_root, "src/third_party/chromiumos-overlay") + ) and os.path.isdir(os.path.join(chromeos_root, "manifest")) def DeleteChromeOsTree(chromeos_root, dry_run=False): - """Delete a ChromeOs tree *safely*. - - Args: - chromeos_root: dir of the tree, could be a relative one (but be careful) - dry_run: only prints out the command if True - - Returns: - True if everything is ok. - """ - if not IsChromeOsTree(chromeos_root): - logger.GetLogger().LogWarning(f'"{chromeos_root}" does not seem to be a' - ' valid chromeos tree, do nothing.') - return False - cmd0 = f'cd {chromeos_root} && cros_sdk --delete' - if dry_run: - print(cmd0) - else: - if command_executer.GetCommandExecuter().RunCommand( - cmd0, print_to_console=True) != 0: - return False - - cmd1 = ( - f'export CHROMEOSDIRNAME="$(dirname $(cd {chromeos_root} && pwd))" && ' - f'export CHROMEOSBASENAME="$(basename $(cd {chromeos_root} && pwd))" && ' - 'cd $CHROMEOSDIRNAME && sudo rm -fr $CHROMEOSBASENAME') - if dry_run: - print(cmd1) - return True - - return command_executer.GetCommandExecuter().RunCommand( - cmd1, print_to_console=True) == 0 - - -def BooleanPrompt(prompt='Do you want to continue?', - default=True, - true_value='yes', - false_value='no', - prolog=None): - """Helper function for processing boolean choice prompts. - - Args: - prompt: The question to present to the user. - default: Boolean to return if the user just presses enter. - true_value: The text to display that represents a True returned. - false_value: The text to display that represents a False returned. - prolog: The text to display before prompt. - - Returns: - True or False. - """ - true_value, false_value = true_value.lower(), false_value.lower() - true_text, false_text = true_value, false_value - if true_value == false_value: - raise ValueError('true_value and false_value must differ: got %r' % - true_value) - - if default: - true_text = true_text[0].upper() + true_text[1:] - else: - false_text = false_text[0].upper() + false_text[1:] - - prompt = ('\n%s (%s/%s)? ' % (prompt, true_text, false_text)) - - if prolog: - prompt = ('\n%s\n%s' % (prolog, prompt)) - - while True: - try: - # pylint: disable=input-builtin, bad-builtin - response = input(prompt).lower() - except EOFError: - # If the user hits CTRL+D, or stdin is disabled, use the default. - print() - response = None - except KeyboardInterrupt: - # If the user hits CTRL+C, just exit the process. - print() - print('CTRL+C detected; exiting') - sys.exit() - - if not response: - return default - if true_value.startswith(response): - if not false_value.startswith(response): + """Delete a ChromeOs tree *safely*. + + Args: + chromeos_root: dir of the tree, could be a relative one (but be careful) + dry_run: only prints out the command if True + + Returns: + True if everything is ok. + """ + if not IsChromeOsTree(chromeos_root): + logger.GetLogger().LogWarning( + f'"{chromeos_root}" does not seem to be a' + " valid chromeos tree, do nothing." + ) + return False + cmd0 = f"cd {chromeos_root} && cros_sdk --delete" + if dry_run: + print(cmd0) + else: + if ( + command_executer.GetCommandExecuter().RunCommand( + cmd0, print_to_console=True + ) + != 0 + ): + return False + + cmd1 = ( + f'export CHROMEOSDIRNAME="$(dirname $(cd {chromeos_root} && pwd))" && ' + f'export CHROMEOSBASENAME="$(basename $(cd {chromeos_root} && pwd))" && ' + "cd $CHROMEOSDIRNAME && sudo rm -fr $CHROMEOSBASENAME" + ) + if dry_run: + print(cmd1) return True - # common prefix between the two... - elif false_value.startswith(response): - return False + + return ( + command_executer.GetCommandExecuter().RunCommand( + cmd1, print_to_console=True + ) + == 0 + ) + + +def BooleanPrompt( + prompt="Do you want to continue?", + default=True, + true_value="yes", + false_value="no", + prolog=None, +): + """Helper function for processing boolean choice prompts. + + Args: + prompt: The question to present to the user. + default: Boolean to return if the user just presses enter. + true_value: The text to display that represents a True returned. + false_value: The text to display that represents a False returned. + prolog: The text to display before prompt. + + Returns: + True or False. + """ + true_value, false_value = true_value.lower(), false_value.lower() + true_text, false_text = true_value, false_value + if true_value == false_value: + raise ValueError( + "true_value and false_value must differ: got %r" % true_value + ) + + if default: + true_text = true_text[0].upper() + true_text[1:] + else: + false_text = false_text[0].upper() + false_text[1:] + + prompt = "\n%s (%s/%s)? " % (prompt, true_text, false_text) + + if prolog: + prompt = "\n%s\n%s" % (prolog, prompt) + + while True: + try: + # pylint: disable=input-builtin, bad-builtin + response = input(prompt).lower() + except EOFError: + # If the user hits CTRL+D, or stdin is disabled, use the default. + print() + response = None + except KeyboardInterrupt: + # If the user hits CTRL+C, just exit the process. + print() + print("CTRL+C detected; exiting") + sys.exit() + + if not response: + return default + if true_value.startswith(response): + if not false_value.startswith(response): + return True + # common prefix between the two... + elif false_value.startswith(response): + return False # pylint: disable=unused-argument def rgb2short(r, g, b): - """Converts RGB values to xterm-256 color.""" + """Converts RGB values to xterm-256 color.""" - redcolor = [255, 124, 160, 196, 9] - greencolor = [255, 118, 82, 46, 10] + redcolor = [255, 124, 160, 196, 9] + greencolor = [255, 118, 82, 46, 10] - if g == 0: - return redcolor[r // 52] - if r == 0: - return greencolor[g // 52] - return 4 + if g == 0: + return redcolor[r // 52] + if r == 0: + return greencolor[g // 52] + return 4 |