#!/usr/bin/env python
import argparse
import logging
import os
import re
import shutil
from genmakefiles import GenerateMakefiles
AOSP_PATH = os.getcwd()
UNWANTED_DIRS = [
'build/',
'test/',
'third_party/',
'buildtools/',
'tools/gyp',
'tools/swarming_client'
]
parser = argparse.ArgumentParser(description='Merge a new version of V8.')
parser.add_argument('--v8_path', \
required=True, help='Absolute path to the new version of V8 to be merged.')
args = parser.parse_args()
# Find all the files that are in both the old and the new repo; remove them
# (ie. leave the Android-only files in place)
new_files = [f for f in os.listdir(args.v8_path) if not f.startswith(".")]
current_files = [f for f in os.listdir(AOSP_PATH) if not f.startswith(".")]
to_remove = [f for f in current_files if f in new_files]
for file in to_remove:
path = os.path.join(AOSP_PATH, file)
if os.path.isfile(path):
os.remove(path)
else:
shutil.rmtree(path)
# Copy accross the new files.
all_new_v8 = os.path.join(args.v8_path, "*")
rsync_cmd = "rsync -r --exclude=\"*.git*\" " + all_new_v8 + \
" . > /dev/null"
if os.system(rsync_cmd) != 0:
raise RuntimeError("Could not rsync the new V8.")
# Now remove extra stuff that AOSP doesn't want (to save space)
for file in UNWANTED_DIRS:
path = os.path.join(AOSP_PATH, file)
shutil.rmtree(path)
# Create new makefiles
GenerateMakefiles()
# Update V8_MERGE_REVISION
major_version = 0
minor_version = 0
build_number = 0
patch_level = 0
success = True
with open(os.path.join(AOSP_PATH, "include/v8-version.h"), 'r') as f:
content = f.read()
result = re.search("V8_MAJOR_VERSION (\\d*)", content)
if result != None:
major_version = result.group(1)
else:
success = False
result = re.search("V8_MINOR_VERSION (\\d*)", content)
if result != None:
minor_version = result.group(1)
else:
success = False
result = re.search("V8_BUILD_NUMBER (\\d*)", content)
if result != None:
build_number = result.group(1)
else:
success = False
result = re.search("V8_PATCH_LEVEL (\\d*)", content)
if result != None:
patch_level = result.group(1)
else:
success = False
version_string = major_version + "." + \
minor_version + "." + \
build_number + "." + \
patch_level
if not success:
logging.warning("Couldn't extract V8 version to update V8_MERGE_REVISION." + \
" Got " + version_string)
else:
with open(os.path.join(AOSP_PATH, "V8_MERGE_REVISION"), 'w') as f:
f.write("v8 " + version_string + "\n")
f.write("https://chromium.googlesource.com/v8/v8/+/" + version_string)
# Done!
print "Merged V8 " + version_string + ". Test, commit and upload!"