blob: 05f48a62325ab2158d632ac63745e51833f4b173 [file] [log] [blame]
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Downloads a new ExoPlayer copy into platform/exoplayer/external.
The copy is put in tree_<SHA>/ directory, where <SHA> 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_<SHA>/ "
"directory, where <SHA> 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_<SHA>.
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.")