From 70eb08be84afff413d908afae7c5a5856f06a916 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damian=20Kr=C3=B3lik?= <66667989+Damian-Nordic@users.noreply.github.com> Date: Thu, 12 Jan 2023 15:27:59 +0100 Subject: [PATCH] Reduce number of checked out submodules (#24383) When bootstrap.sh is run on a respository that has pigweed submodule already checked out, only update user-initialized submodules but do not initialize new ones. When checkout_submodules.py script is called without specifying platforms, by default only checkout common submodules, not associated with any specific platform. By the way, reduce the number of debug logs in the script. Signed-off-by: Damian Krolik Signed-off-by: Damian Krolik --- scripts/bootstrap.sh | 7 +++++-- scripts/checkout_submodules.py | 25 ++++++++++++++----------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/scripts/bootstrap.sh b/scripts/bootstrap.sh index f6d52e09c73122..67cad2a82d2b58 100644 --- a/scripts/bootstrap.sh +++ b/scripts/bootstrap.sh @@ -30,11 +30,14 @@ _bootstrap_or_activate() { _CONFIG_FILE="$PW_CONFIG_FILE" fi - if [ "$_BOOTSTRAP_NAME" = "bootstrap.sh" ] || - [ ! -f "$_CHIP_ROOT/third_party/pigweed/repo/pw_env_setup/util.sh" ]; then + if [ ! -f "$_CHIP_ROOT/third_party/pigweed/repo/pw_env_setup/util.sh" ]; then # Make sure our submodule remotes are correct for this revision. git submodule sync --recursive git submodule update --init + elif [ "$_BOOTSTRAP_NAME" = "bootstrap.sh" ]; then + # In this case, only update already checked out submodules. + git submodule sync --recursive + git submodule update fi PW_BRANDING_BANNER="$_CHIP_ROOT/scripts/matter_banner.txt" diff --git a/scripts/checkout_submodules.py b/scripts/checkout_submodules.py index 858fc7cbf17509..e7e3058b7d2df8 100755 --- a/scripts/checkout_submodules.py +++ b/scripts/checkout_submodules.py @@ -60,28 +60,31 @@ def load_module_info() -> None: platforms = module.get('platforms', '').split(',') platforms = set(filter(None, platforms)) assert not (platforms - ALL_PLATFORMS), "Submodule's platform not contained in ALL_PLATFORMS" + name = name.replace('submodule "', '').replace('"', '') yield Module(name=name, path=module['path'], platforms=platforms) def module_matches_platforms(module: Module, platforms: set) -> bool: - # If no platforms have been selected, or the module is not associated with any specific - # platforms, treat it as a match. - if not platforms or not module.platforms: + # If the module is not associated with any specific platform, treat it as a match. + if not module.platforms: return True return bool(platforms & module.platforms) +def module_initialized(module: Module) -> bool: + return bool(os.listdir(module.path)) + + def make_chip_root_safe_directory() -> None: # ensure no errors regarding ownership in the directory. Newer GIT seems to require this: subprocess.check_call(['git', 'config', '--global', '--add', 'safe.directory', CHIP_ROOT]) def checkout_modules(modules: list, shallow: bool, force: bool, recursive: bool) -> None: - names = [module.name.replace('submodule "', '').replace('"', '') for module in modules] - names = ', '.join(names) + names = ', '.join([module.name for module in modules]) logging.info(f'Checking out: {names}') - cmd = ['git', '-C', CHIP_ROOT, 'submodule', 'update', '--init'] + cmd = ['git', '-C', CHIP_ROOT, 'submodule', '--quiet', 'update', '--init'] cmd += ['--depth', '1'] if shallow else [] cmd += ['--force'] if force else [] cmd += ['--recursive'] if recursive else [] @@ -91,11 +94,10 @@ def checkout_modules(modules: list, shallow: bool, force: bool, recursive: bool) def deinit_modules(modules: list, force: bool) -> None: - names = [module.name.replace('submodule "', '').replace('"', '') for module in modules] - names = ', '.join(names) + names = ', '.join([module.name for module in modules]) logging.info(f'Deinitializing: {names}') - cmd = ['git', '-C', CHIP_ROOT, 'submodule', 'deinit'] + cmd = ['git', '-C', CHIP_ROOT, 'submodule', '--quiet', 'deinit'] cmd += ['--force'] if force else [] cmd += [module.path for module in modules] @@ -118,12 +120,13 @@ def main(): modules = list(load_module_info()) selected_platforms = set(args.platform) selected_modules = [m for m in modules if module_matches_platforms(m, selected_platforms)] - unmatched_modules = [m for m in modules if not module_matches_platforms(m, selected_platforms)] + unmatched_modules = [m for m in modules if not module_matches_platforms( + m, selected_platforms) and module_initialized(m)] make_chip_root_safe_directory() checkout_modules(selected_modules, args.shallow, args.force, args.recursive) - if args.deinit_unmatched: + if args.deinit_unmatched and unmatched_modules: deinit_modules(unmatched_modules, args.force)