1*6777b538SAndroid Build Coastguard Worker#!/usr/bin/env vpython3 2*6777b538SAndroid Build Coastguard Worker# Copyright 2022 The Chromium Authors 3*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 4*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 5*6777b538SAndroid Build Coastguard Worker"""Implements commands for managing Fuchsia repos via the ffx tool.""" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Workerimport argparse 8*6777b538SAndroid Build Coastguard Workerimport sys 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Workerfrom typing import Iterable 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Workerfrom common import make_clean_directory, read_package_paths, \ 13*6777b538SAndroid Build Coastguard Worker register_common_args, run_ffx_command 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Workerdef publish_packages(packages: Iterable[str], 17*6777b538SAndroid Build Coastguard Worker repo: str, 18*6777b538SAndroid Build Coastguard Worker new_repo: bool = False) -> None: 19*6777b538SAndroid Build Coastguard Worker """Publish packages to a repo directory, initializing it if necessary.""" 20*6777b538SAndroid Build Coastguard Worker if new_repo: 21*6777b538SAndroid Build Coastguard Worker run_ffx_command(cmd=['repository', 'create', repo], check=True) 22*6777b538SAndroid Build Coastguard Worker 23*6777b538SAndroid Build Coastguard Worker args = ['repository', 'publish'] 24*6777b538SAndroid Build Coastguard Worker for package in packages: 25*6777b538SAndroid Build Coastguard Worker args += ['--package-archive', package] 26*6777b538SAndroid Build Coastguard Worker args += [repo] 27*6777b538SAndroid Build Coastguard Worker run_ffx_command(cmd=args, check=True) 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Workerdef register_package_args(parser: argparse.ArgumentParser, 31*6777b538SAndroid Build Coastguard Worker allow_temp_repo: bool = False) -> None: 32*6777b538SAndroid Build Coastguard Worker """Register common arguments for package publishing.""" 33*6777b538SAndroid Build Coastguard Worker package_args = parser.add_argument_group( 34*6777b538SAndroid Build Coastguard Worker 'package', 'Arguments for package publishing.') 35*6777b538SAndroid Build Coastguard Worker package_args.add_argument('--packages', 36*6777b538SAndroid Build Coastguard Worker action='append', 37*6777b538SAndroid Build Coastguard Worker help='Paths of the package archives to install') 38*6777b538SAndroid Build Coastguard Worker package_args.add_argument('--repo', 39*6777b538SAndroid Build Coastguard Worker help='Directory packages will be published to.') 40*6777b538SAndroid Build Coastguard Worker package_args.add_argument('--purge-repo', 41*6777b538SAndroid Build Coastguard Worker action='store_true', 42*6777b538SAndroid Build Coastguard Worker help='If clear the content in the repo.') 43*6777b538SAndroid Build Coastguard Worker if allow_temp_repo: 44*6777b538SAndroid Build Coastguard Worker package_args.add_argument( 45*6777b538SAndroid Build Coastguard Worker '--no-repo-init', 46*6777b538SAndroid Build Coastguard Worker action='store_true', 47*6777b538SAndroid Build Coastguard Worker default=False, 48*6777b538SAndroid Build Coastguard Worker help='Do not initialize the package repository.') 49*6777b538SAndroid Build Coastguard Worker 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Workerdef main(): 52*6777b538SAndroid Build Coastguard Worker """Stand-alone function for publishing packages.""" 53*6777b538SAndroid Build Coastguard Worker parser = argparse.ArgumentParser() 54*6777b538SAndroid Build Coastguard Worker register_package_args(parser) 55*6777b538SAndroid Build Coastguard Worker register_common_args(parser) 56*6777b538SAndroid Build Coastguard Worker args = parser.parse_args() 57*6777b538SAndroid Build Coastguard Worker if not args.repo: 58*6777b538SAndroid Build Coastguard Worker raise ValueError('Must specify directory to publish packages.') 59*6777b538SAndroid Build Coastguard Worker if not args.packages: 60*6777b538SAndroid Build Coastguard Worker raise ValueError('Must specify packages to publish.') 61*6777b538SAndroid Build Coastguard Worker if args.out_dir: 62*6777b538SAndroid Build Coastguard Worker package_paths = [] 63*6777b538SAndroid Build Coastguard Worker for package in args.packages: 64*6777b538SAndroid Build Coastguard Worker package_paths.extend(read_package_paths(args.out_dir, package)) 65*6777b538SAndroid Build Coastguard Worker else: 66*6777b538SAndroid Build Coastguard Worker package_paths = args.packages 67*6777b538SAndroid Build Coastguard Worker if args.purge_repo: 68*6777b538SAndroid Build Coastguard Worker make_clean_directory(args.repo) 69*6777b538SAndroid Build Coastguard Worker publish_packages(package_paths, args.repo, args.purge_repo) 70*6777b538SAndroid Build Coastguard Worker 71*6777b538SAndroid Build Coastguard Worker 72*6777b538SAndroid Build Coastguard Workerif __name__ == '__main__': 73*6777b538SAndroid Build Coastguard Worker sys.exit(main()) 74