diff options
Diffstat (limited to 'update.py')
-rwxr-xr-x | update.py | 211 |
1 files changed, 76 insertions, 135 deletions
@@ -15,16 +15,16 @@ # limitations under the License. # import argparse +import glob import logging import os -from pathlib import Path import shutil import subprocess from tempfile import TemporaryDirectory import textwrap -THIS_DIR = Path(__file__).resolve().parent +THIS_DIR = os.path.realpath(os.path.dirname(__file__)) def logger(): @@ -32,212 +32,153 @@ def logger(): def check_call(cmd): - logger().debug("Running `%s`", " ".join(cmd)) + logger().debug('Running `%s`', ' '.join(cmd)) subprocess.check_call(cmd) def remove(path): - logger().debug("remove `%s`", path) + logger().debug('remove `%s`', path) os.remove(path) -def fetch_artifact(branch: str, build: str, pattern: str) -> None: - """Fetches an artifact from the build server. - - Use OAuth2 authentication and the gLinux android-fetch-artifact package, - which work with both on-corp and off-corp workstations.""" - fetch_artifact_path = shutil.which("fetch_artifact") - if fetch_artifact_path is None: - raise RuntimeError( - "error: cannot find fetch_artifact in PATH. Install it using:\n" - " sudo glinux-add-repo android\n" - " sudo apt update\n" - " sudo apt install android-fetch-artifact\n" - ) - cmd = [ - fetch_artifact_path, - "--use_oauth2", - "--branch", - branch, - "--target=linux", - "--bid", - build, - pattern, - ] +def fetch_artifact(branch, build, pattern): + fetch_artifact_path = '/google/data/ro/projects/android/fetch_artifact' + cmd = [fetch_artifact_path, '--branch', branch, '--target=linux', + '--bid', build, pattern] check_call(cmd) def api_str(api_level): - return f"android-{api_level}" + return 'android-{}'.format(api_level) def start_branch(build): - branch_name = "update-" + (build or "latest") - logger().info("Creating branch %s", branch_name) - check_call(["repo", "start", branch_name, "."]) + branch_name = 'update-' + (build or 'latest') + logger().info('Creating branch %s', branch_name) + check_call(['repo', 'start', branch_name, '.']) -def remove_old_release(install_dir: Path) -> None: - if (install_dir / ".git").exists(): +def remove_old_release(install_dir): + if os.path.exists(os.path.join(install_dir, '.git')): logger().info('Removing old install directory "%s"', install_dir) - check_call(["git", "rm", "-rf", install_dir]) + check_call(['git', 'rm', '-rf', install_dir]) # Need to check again because git won't remove directories if they have # non-git files in them. - if install_dir.exists(): + if os.path.exists(install_dir): shutil.rmtree(install_dir) -LIBUNWIND_GLOB = "toolchains/llvm/prebuilt/*/lib64/clang/*/lib/linux/*/libunwind.a" -LIBCXX_SHARED_GLOB = ( - "toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/*/libc++_shared.so" +LIBUNWIND_GLOB = ( + 'toolchains/llvm/prebuilt/*/lib64/clang/*/lib/linux/*/libunwind.a' ) -LIBCXX_STATIC_GLOB = ( - "toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/*/libc++_static.a" -) -LIBCXXABI_GLOB = "toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/*/libc++abi.a" -def unzip_single_directory(artifact: Path, destination: Path) -> None: +def unzip_single_directory(artifact, destination): # Use cwd so that we can use rename without having to worry about crossing # file systems. with TemporaryDirectory(dir=os.getcwd()) as temp_dir: cmd = [ - "unzip", - str(artifact), - "-d", + 'unzip', + artifact, + '-d', temp_dir, - "*/sources/android/cpufeatures/*", - "*/sources/android/native_app_glue/*", - "*/sources/android/support/*", - "*/sources/cxx-stl/*", - "*/source.properties", - os.path.join("*", LIBUNWIND_GLOB), - os.path.join("*", LIBCXX_SHARED_GLOB), - os.path.join("*", LIBCXX_STATIC_GLOB), - os.path.join("*", LIBCXXABI_GLOB), + '*/sources/android/cpufeatures/*', + '*/sources/android/native_app_glue/*', + '*/sources/android/support/*', + '*/sources/cxx-stl/*', + '*/source.properties', + os.path.join('*', LIBUNWIND_GLOB), ] check_call(cmd) dirs = os.listdir(temp_dir) assert len(dirs) == 1 - ndk_dir = Path(temp_dir) / dirs[0] - for child in ndk_dir.iterdir(): - child.rename(destination / child.name) - - -def relocate_libcxx(install_dir: Path) -> None: - """Copies the libc++ libraries from the toolchain to sources. - - New versions of the NDK have removed the libraries in the sources directory because - they are duplicates and they aren't needed in typical builds. Soong still expects to - find them in that directory though. We could fix Soong, but since this whole - directory should be dead soon we'll just fix-up the install for now. - """ - dest_base = install_dir / "sources/cxx-stl/llvm-libc++/libs" - for glob in {LIBCXX_SHARED_GLOB, LIBCXX_STATIC_GLOB, LIBCXXABI_GLOB}: - file_name = Path(glob).name - for file_path in install_dir.glob(glob): - triple = file_path.parent.name - abi = { - "arm-linux-androideabi": "armeabi-v7a", - "aarch64-linux-android": "arm64-v8a", - "i686-linux-android": "x86", - "x86_64-linux-android": "x86_64", - }[triple] - dest_dir = dest_base / abi - dest_dir.mkdir(parents=True, exist_ok=True) - dest = dest_dir / file_name - logger().info("Relocating %s to %s", file_path, dest) - file_path.rename(dest) - - -def relocate_libunwind(install_dir: Path) -> None: - dest_base = install_dir / "sources/cxx-stl/llvm-libc++/libs" - for libunwind in install_dir.glob(LIBUNWIND_GLOB): - arch = libunwind.parent.name - abi = { - "arm": "armeabi-v7a", - "aarch64": "arm64-v8a", - "i386": "x86", - "x86_64": "x86_64", - }[arch] - dest_dir = dest_base / abi - dest = dest_dir / "libunwind.a" - logger().info("Relocating %s to %s", libunwind, dest) - libunwind.rename(dest) + ndk_dir = os.path.join(temp_dir, dirs[0]) + for child in os.listdir(ndk_dir): + os.rename(os.path.join(ndk_dir, child), + os.path.join(destination, child)) -def delete_android_mks(install_dir: Path) -> None: - for android_mk in install_dir.glob("**/Android.mk"): - android_mk.unlink() +def relocate_libunwind(install_dir): + unwinds = glob.glob(os.path.join(install_dir, LIBUNWIND_GLOB)) + dest_base = os.path.join(install_dir, 'sources/cxx-stl/llvm-libc++/libs') + for libunwind in unwinds: + arch = os.path.basename(os.path.dirname(libunwind)) + abi = { + 'arm': 'armeabi-v7a', + 'aarch64': 'arm64-v8a', + 'i386': 'x86', + 'x86_64': 'x86_64', + }[arch] + dest_dir = os.path.join(dest_base, abi) + dest = os.path.join(dest_dir, 'libunwind.a') + logger().info('Relocating %s to %s', libunwind, dest) + os.rename(libunwind, dest) -def install_new_release(branch: str, build: str, install_dir: Path) -> None: - install_dir.mkdir() +def install_new_release(branch, build, install_dir): + os.makedirs(install_dir) - artifact_pattern = "android-ndk-*.zip" - logger().info( - "Fetching %s from %s (artifacts matching %s)", build, branch, artifact_pattern - ) + artifact_pattern = 'android-ndk-*.zip' + logger().info('Fetching %s from %s (artifacts matching %s)', build, branch, + artifact_pattern) fetch_artifact(branch, build, artifact_pattern) - artifacts = list(Path().glob("android-ndk-*.zip")) + artifacts = glob.glob('android-ndk-*.zip') try: assert len(artifacts) == 1 artifact = artifacts[0] - logger().info("Extracting release") + logger().info('Extracting release') unzip_single_directory(artifact, install_dir) - relocate_libcxx(install_dir) relocate_libunwind(install_dir) - delete_android_mks(install_dir) finally: for artifact in artifacts: - artifact.unlink() + os.unlink(artifact) -def commit(branch: str, build: str, install_dir: Path) -> None: - logger().info("Making commit") - check_call(["git", "add", str(install_dir)]) - message = textwrap.dedent( - f"""\ +def commit(branch, build, install_dir): + logger().info('Making commit') + check_call(['git', 'add', install_dir]) + message = textwrap.dedent("""\ Update NDK prebuilts to build {build}. Taken from branch {branch}. Bug: None Test: treehugger - """ - ) - check_call(["git", "commit", "-m", message]) + """).format(branch=branch, build=build) + check_call(['git', 'commit', '-m', message]) def get_args(): parser = argparse.ArgumentParser() parser.add_argument( - "-b", "--branch", default="master-ndk", help="Branch to pull build from." - ) - parser.add_argument("--build", required=True, help="Build number to pull.") + '-b', '--branch', default='master-ndk', + help='Branch to pull build from.') + parser.add_argument( + 'major_release', help='Major release being installed, e.g. "r11".') + parser.add_argument('--build', required=True, help='Build number to pull.') parser.add_argument( - "--use-current-branch", - action="store_true", - help="Perform the update in the current branch. Do not repo start.", - ) + '--use-current-branch', action='store_true', + help='Perform the update in the current branch. Do not repo start.') parser.add_argument( - "-v", "--verbose", action="count", default=0, help="Increase output verbosity." - ) + '-v', '--verbose', action='count', default=0, + help='Increase output verbosity.') return parser.parse_args() -def main() -> None: +def main(): os.chdir(THIS_DIR) args = get_args() verbose_map = (logging.WARNING, logging.INFO, logging.DEBUG) - verbosity = min(args.verbose, 2) + verbosity = args.verbose + if verbosity > 2: + verbosity = 2 logging.basicConfig(level=verbose_map[verbosity]) - install_dir = THIS_DIR / "current" + install_dir = os.path.realpath(args.major_release) if not args.use_current_branch: start_branch(args.build) @@ -246,5 +187,5 @@ def main() -> None: commit(args.branch, args.build, install_dir) -if __name__ == "__main__": +if __name__ == '__main__': main() |