#!/usr/bin/env python3 # -*- coding: utf-8 -*- """Downloads a new ExoPlayer copy into platform/exoplayer/external. The copy is put in tree_/ directory, where identifies the downloaded commit. """ import argparse import atexit import datetime import logging import os import re import shutil import subprocess import sys import tempfile EXOPLAYER_SOURCE_REPO = "https://github.com/google/ExoPlayer.git" METADATA_FILE = "METADATA" SCRIPT_PARENT_DIRECTORY = os.path.dirname(os.path.abspath(sys.argv[0])) TREE_LOCATION = "tree/" def cd_to_script_parent_directory(): os.chdir(SCRIPT_PARENT_DIRECTORY) def run(command, check=True): logging.info(f"Running: $ {command}") return (subprocess.run( command, shell=True, check=check, capture_output=True, text=True).stdout.strip()) def confirm_deletion_or_exit(files_to_delete): print("The following files will not be added to exoplayer/external: \n" + files_to_delete) while True: print("Please confirm [Y/n] ") choice = input().lower() if choice in ["y", "yes", ""]: return elif choice in ["n", "no"]: sys.exit("User rejected the list of .mk files to exclude from the tree.") else: print("Please select y or n.") logging.basicConfig(level=logging.INFO) parser = argparse.ArgumentParser( description=f"Downloads an ExoPlayer copy into the tree_/ " "directory, where identifies the commit to download. This script " "also stages the changes for commit. Either --tag or --commit must be " "provided.") refGroup = parser.add_mutually_exclusive_group(required=True) refGroup.add_argument( "--tag", help="The tag that identifies the ExoPlayer commit to download.") refGroup.add_argument( "--commit", help="The commit SHA of the ExoPlayer version to download.") parser.add_argument( "--branch", help="The branch to create for the change.", default="download-exoplayer") args = parser.parse_args() cd_to_script_parent_directory() # Check whether the branch exists, and abort if it does. if run(f"git rev-parse --verify --quiet {args.branch}", check=False): sys.exit(f"\nBranch {args.branch} already exists. Please delete, or change " "branch.") if run(f"repo start {args.branch}"): sys.exit(f"\nFailed to repo start {args.branch}. Check you don't have " "uncommited changes in your current branch.") with tempfile.TemporaryDirectory() as tmpdir: logging.info(f"Created temporary directory {tmpdir}") run("git clone --no-checkout --filter=tree:0 " f"{EXOPLAYER_SOURCE_REPO} {tmpdir}") os.chdir(tmpdir) if args.tag: # Get the commit SHA associated to the tag. commit_sha = run(f"git rev-list -n 1 {args.tag}") else: # A commit SHA was provided. commit_sha = args.commit # Checkout the version we want to update to. run(f"git checkout {commit_sha}") # Copy all files in the tree into tree_. shutil.rmtree(".git/", ignore_errors=True) # Remove all Android.mk files in the exoplayer tree to avoid licensing issues. mk_files_to_remove = run("find . -name \"*.mk\"") confirm_deletion_or_exit(mk_files_to_remove) run("find . -name \"*.mk\" -delete") cd_to_script_parent_directory() new_tree_location = f"tree_{commit_sha}" run(f"mv {tmpdir} {new_tree_location}") run(f"git add {new_tree_location}") with open(METADATA_FILE) as metadata_file: metadata_lines = metadata_file.readlines() # Update the metadata file. today = datetime.date.today() with open(METADATA_FILE, "w") as metadata_file: for line in metadata_lines: line = re.sub(r"version: \".+\"", f"version: \"{args.tag or commit_sha}\"", line) line = re.sub( r"last_upgrade_date {.+}", f"last_upgrade_date " f"{{ year: {today.year} month: {today.month} day: {today.day} }}", line) metadata_file.write(line) run(f"git add {METADATA_FILE}") logging.info("All done. Ready to commit.")