Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[scripts] Enhance checkout_submodules.py script #21852

Merged
merged 1 commit into from
Aug 15, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 30 additions & 8 deletions scripts/checkout_submodules.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
Module = namedtuple('Module', 'name path platforms')


def load_module_info() -> list:
def load_module_info() -> None:
config = configparser.ConfigParser()
config.read(os.path.join(CHIP_ROOT, '.gitmodules'))

Expand All @@ -69,17 +69,31 @@ def module_matches_platforms(module: Module, platforms: set) -> bool:
return bool(platforms & module.platforms)


def checkout_modules(modules: list, shallow: bool) -> None:
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) -> None:
names = [module.name.replace('submodule "', '').replace('"', '') for module in modules]
names = ', '.join(names)
logging.info(f'Checking out: {names}')

# 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])

cmd = ['git', '-C', CHIP_ROOT, 'submodule', 'update', '--init']
cmd += ['--depth', '1'] if shallow else []
cmd += ['--force'] if force else []
cmd += [module.path for module in modules]

subprocess.check_call(cmd)


def deinit_modules(modules: list, force: bool) -> None:
names = [module.name.replace('submodule "', '').replace('"', '') for module in modules]
names = ', '.join(names)
logging.info(f'Deinitializing: {names}')

cmd = ['git', '-C', CHIP_ROOT, 'submodule', 'deinit']
cmd += ['--force'] if force else []
cmd += [module.path for module in modules]

subprocess.check_call(cmd)
Expand All @@ -92,13 +106,21 @@ def main():
parser.add_argument('--shallow', action='store_true', help='Fetch submodules without history')
parser.add_argument('--platform', nargs='+', choices=ALL_PLATFORMS, default=[],
help='Process submodules for specific platforms only')
parser.add_argument('--force', action='store_true', help='Perform action despite of warnings')
parser.add_argument('--deinit-unmatched', action='store_true',
help='Deinitialize submodules for non-matching platforms')
args = parser.parse_args()

modules = load_module_info()
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)]

make_chip_root_safe_directory()
checkout_modules(selected_modules, args.shallow, args.force)

checkout_modules(selected_modules, args.shallow)
if args.deinit_unmatched:
deinit_modules(unmatched_modules, args.force)


if __name__ == '__main__':
Expand Down