Index: build/android/play_services/preprocess.py |
diff --git a/build/android/preprocess_google_play_services.py b/build/android/play_services/preprocess.py |
similarity index 52% |
rename from build/android/preprocess_google_play_services.py |
rename to build/android/play_services/preprocess.py |
index eb106a1628bf9f7c10543379a922c3a9b03d2876..e109898fd2104255600625447933991f7e18be5c 100755 |
--- a/build/android/preprocess_google_play_services.py |
+++ b/build/android/play_services/preprocess.py |
@@ -29,20 +29,6 @@ look like: |
+-- CLIENT_2 |
+-- etc. |
-The json config (see the -c argument) file should provide the following fields: |
- |
-- lib_version: String. Used when building from the maven repository. It should |
- be the package's version (e.g. "7.3.0"). Unused with extracted repositories. |
- |
-- clients: String array. List of clients to pick. For example, when building |
- from the maven repository, it's the artifactId (e.g. "play-services-base") of |
- each client. With an extracted repository, it's the name of the |
- subdirectories. |
- |
-- locale_whitelist: String array. Locales that should be allowed in the final |
- resources. They are specified the same way they are appended to the `values` |
- directory in android resources (e.g. "us-GB", "it", "fil"). |
- |
The output is a directory with the following structure: |
OUT_DIR |
@@ -65,66 +51,69 @@ Requires the `jar` utility in the path. |
import argparse |
import glob |
import itertools |
-import json |
import os |
-import re |
import shutil |
import stat |
import sys |
+import tempfile |
+import zipfile |
from datetime import datetime |
-from devil.utils import cmd_helper |
-from pylib import constants |
-sys.path.append( |
- os.path.join(constants.DIR_SOURCE_ROOT, 'build', 'android', 'gyp')) |
-from util import build_utils # pylint: disable=import-error |
+sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir)) |
+from devil.utils import cmd_helper |
+from play_services import utils |
+from pylib.utils import argparse_utils |
M2_PKG_PATH = os.path.join('com', 'google', 'android', 'gms') |
-OUTPUT_FORMAT_VERSION = 1 |
-VERSION_FILE_NAME = 'version_info.json' |
-VERSION_NUMBER_PATTERN = re.compile( |
- r'<integer name="google_play_services_version">(\d+)<\/integer>') |
+ |
def main(): |
- parser = argparse.ArgumentParser(description=("Prepares the Google Play " |
- "services split client libraries before usage by Chrome's build system. " |
- "See the script's documentation for more a detailed help.")) |
- parser.add_argument('-r', |
- '--repository', |
- help='The Google Play services repository location', |
- required=True, |
- metavar='FILE') |
- parser.add_argument('-o', |
- '--out-dir', |
- help='The output directory', |
- required=True, |
- metavar='FILE') |
- parser.add_argument('-c', |
- '--config-file', |
- help='Config file path', |
- required=True, |
- metavar='FILE') |
+ parser = argparse.ArgumentParser(description=( |
+ "Prepares the Google Play services split client libraries before usage " |
+ "by Chrome's build system. See the script's documentation for more a " |
+ "detailed help.")) |
+ argparse_utils.CustomHelpAction.EnableFor(parser) |
+ required_args = parser.add_argument_group('required named arguments') |
+ required_args.add_argument('-r', |
+ '--repository', |
+ help=('the Google Play services repository ' |
+ 'location'), |
+ required=True, |
+ metavar='FILE') |
+ required_args.add_argument('-o', |
+ '--out-dir', |
+ help='the output directory', |
+ required=True, |
+ metavar='FILE') |
+ required_args.add_argument('-c', |
+ '--config-file', |
+ help='the config file path', |
+ required=True, |
+ metavar='FILE') |
parser.add_argument('-x', |
'--is-extracted-repo', |
action='store_true', |
- default=False, |
- help='The provided repository is not made of AAR files.') |
+ help='the provided repository is not made of AAR files') |
+ parser.add_argument('--config-help', |
+ action='custom_help', |
+ custom_help_text=utils.ConfigParser.__doc__, |
+ help='show the configuration file format help') |
args = parser.parse_args() |
- ProcessGooglePlayServices(args.repository, |
- args.out_dir, |
- args.config_file, |
- args.is_extracted_repo) |
+ return ProcessGooglePlayServices(args.repository, |
+ args.out_dir, |
+ args.config_file, |
+ args.is_extracted_repo) |
def ProcessGooglePlayServices(repo, out_dir, config_path, is_extracted_repo): |
- with open(config_path, 'r') as json_file: |
- config = json.load(json_file) |
+ config = utils.ConfigParser(config_path) |
- with build_utils.TempDir() as tmp_root: |
+ tmp_root = tempfile.mkdtemp() |
+ try: |
tmp_paths = _SetupTempDir(tmp_root) |
if is_extracted_repo: |
@@ -134,20 +123,19 @@ def ProcessGooglePlayServices(repo, out_dir, config_path, is_extracted_repo): |
_GenerateCombinedJar(tmp_paths) |
_ProcessResources(config, tmp_paths) |
+ _BuildOutput(config, tmp_paths, out_dir) |
+ finally: |
+ shutil.rmtree(tmp_root) |
- if is_extracted_repo: |
- printable_repo = repo |
- else: |
- printable_repo = 'm2repository - ' + config['lib_version'] |
- _BuildOutput(config, tmp_paths, out_dir, printable_repo) |
+ return 0 |
def _SetupTempDir(tmp_root): |
tmp_paths = { |
- 'root': tmp_root, |
- 'imported_clients': os.path.join(tmp_root, 'imported_clients'), |
- 'extracted_jars': os.path.join(tmp_root, 'jar'), |
- 'combined_jar': os.path.join(tmp_root, 'google-play-services.jar'), |
+ 'root': tmp_root, |
+ 'imported_clients': os.path.join(tmp_root, 'imported_clients'), |
+ 'extracted_jars': os.path.join(tmp_root, 'jar'), |
+ 'combined_jar': os.path.join(tmp_root, 'google-play-services.jar'), |
} |
os.mkdir(tmp_paths['imported_clients']) |
os.mkdir(tmp_paths['extracted_jars']) |
@@ -157,10 +145,10 @@ def _SetupTempDir(tmp_root): |
def _SetupOutputDir(out_dir): |
out_paths = { |
- 'root': out_dir, |
- 'res': os.path.join(out_dir, 'res'), |
- 'jar': os.path.join(out_dir, 'google-play-services.jar'), |
- 'stub': os.path.join(out_dir, 'stub'), |
+ 'root': out_dir, |
+ 'res': os.path.join(out_dir, 'res'), |
+ 'jar': os.path.join(out_dir, 'google-play-services.jar'), |
+ 'stub': os.path.join(out_dir, 'stub'), |
} |
shutil.rmtree(out_paths['jar'], ignore_errors=True) |
@@ -178,28 +166,26 @@ def _MakeWritable(dir_path): |
def _ImportFromAars(config, tmp_paths, repo): |
- for client in config['clients']: |
- aar_name = '%s-%s.aar' % (client, config['lib_version']) |
+ for client in config.clients: |
+ aar_name = '%s-%s.aar' % (client, config.sdk_version) |
aar_path = os.path.join(repo, M2_PKG_PATH, client, |
- config['lib_version'], aar_name) |
+ config.sdk_version, aar_name) |
aar_out_path = os.path.join(tmp_paths['imported_clients'], client) |
- build_utils.ExtractAll(aar_path, aar_out_path) |
+ _ExtractAll(aar_path, aar_out_path) |
client_jar_path = os.path.join(aar_out_path, 'classes.jar') |
- build_utils.ExtractAll(client_jar_path, tmp_paths['extracted_jars'], |
- no_clobber=False) |
+ _ExtractAll(client_jar_path, tmp_paths['extracted_jars']) |
def _ImportFromExtractedRepo(config, tmp_paths, repo): |
# Import the clients |
try: |
- for client in config['clients']: |
+ for client in config.clients: |
client_out_dir = os.path.join(tmp_paths['imported_clients'], client) |
shutil.copytree(os.path.join(repo, client), client_out_dir) |
client_jar_path = os.path.join(client_out_dir, 'classes.jar') |
- build_utils.ExtractAll(client_jar_path, tmp_paths['extracted_jars'], |
- no_clobber=False) |
+ _ExtractAll(client_jar_path, tmp_paths['extracted_jars']) |
finally: |
_MakeWritable(tmp_paths['imported_clients']) |
@@ -212,7 +198,7 @@ def _GenerateCombinedJar(tmp_paths): |
def _ProcessResources(config, tmp_paths): |
LOCALIZED_VALUES_BASE_NAME = 'values-' |
- locale_whitelist = set(config['locale_whitelist']) |
+ locale_whitelist = set(config.locale_whitelist) |
glob_pattern = os.path.join(tmp_paths['imported_clients'], '*', 'res', '*') |
for res_dir in glob.glob(glob_pattern): |
@@ -228,45 +214,17 @@ def _ProcessResources(config, tmp_paths): |
shutil.rmtree(res_dir) |
-def _GetVersionNumber(config, tmp_paths): |
- version_file_path = os.path.join(tmp_paths['imported_clients'], |
- config['base_client'], |
- 'res', |
- 'values', |
- 'version.xml') |
- |
- with open(version_file_path, 'r') as version_file: |
- version_file_content = version_file.read() |
- |
- match = VERSION_NUMBER_PATTERN.search(version_file_content) |
- if not match: |
- raise AttributeError('A value for google_play_services_version was not ' |
- 'found in ' + version_file_path) |
- |
- return match.group(1) |
- |
- |
-def _BuildOutput(config, tmp_paths, out_dir, printable_repo): |
+def _BuildOutput(config, tmp_paths, out_dir): |
generation_date = datetime.utcnow() |
- play_services_full_version = _GetVersionNumber(config, tmp_paths) |
- |
- # Create a version text file to allow quickly checking the version |
- gen_info = { |
- '@Description@': 'Preprocessed Google Play services clients for chrome', |
- 'Generator script': os.path.basename(__file__), |
- 'Repository source': printable_repo, |
- 'Library version': play_services_full_version, |
- 'Directory format version': OUTPUT_FORMAT_VERSION, |
- 'Generation Date (UTC)': str(generation_date) |
- } |
- tmp_version_file_path = os.path.join(tmp_paths['root'], VERSION_FILE_NAME) |
- with open(tmp_version_file_path, 'w') as version_file: |
- json.dump(gen_info, version_file, indent=2, sort_keys=True) |
+ version_xml_path = os.path.join(tmp_paths['imported_clients'], |
+ config.version_xml_path) |
+ play_services_full_version = utils.GetVersionNumberFromLibraryResources( |
+ version_xml_path) |
out_paths = _SetupOutputDir(out_dir) |
# Copy the resources to the output dir |
- for client in config['clients']: |
+ for client in config.clients: |
res_in_tmp_dir = os.path.join(tmp_paths['imported_clients'], client, 'res') |
if os.path.isdir(res_in_tmp_dir) and os.listdir(res_in_tmp_dir): |
res_in_final_dir = os.path.join(out_paths['res'], client) |
@@ -291,9 +249,12 @@ def _BuildOutput(config, tmp_paths, out_dir, printable_repo): |
content_str = 'google_play_services_version: %s\nutc_date: %s\n' |
stamp.write(content_str % (play_services_full_version, generation_date)) |
- shutil.copyfile(tmp_version_file_path, |
- os.path.join(out_paths['root'], VERSION_FILE_NAME)) |
+ config.UpdateVersionNumber(play_services_full_version) |
+ |
+def _ExtractAll(zip_path, out_path): |
+ with zipfile.ZipFile(zip_path, 'r') as zip_file: |
+ zip_file.extractall(out_path) |
if __name__ == '__main__': |
sys.exit(main()) |