mirror of
https://github.com/klzgrad/naiveproxy.git
synced 2024-12-01 01:36:09 +03:00
145 lines
4.2 KiB
Python
145 lines
4.2 KiB
Python
|
# Copyright 2015 The Chromium Authors. All rights reserved.
|
||
|
# Use of this source code is governed by a BSD-style license that can be
|
||
|
# found in the LICENSE file.
|
||
|
|
||
|
'''
|
||
|
Utility functions for all things related to manipulating google play services
|
||
|
related files.
|
||
|
'''
|
||
|
|
||
|
import argparse
|
||
|
import filecmp
|
||
|
import json
|
||
|
import os
|
||
|
import re
|
||
|
|
||
|
|
||
|
_XML_VERSION_NUMBER_PATTERN = re.compile(
|
||
|
r'<integer name="google_play_services_version">(\d+)<\/integer>')
|
||
|
|
||
|
|
||
|
class DefaultsRawHelpFormatter(argparse.ArgumentDefaultsHelpFormatter,
|
||
|
argparse.RawDescriptionHelpFormatter):
|
||
|
'''
|
||
|
Combines the features of RawDescriptionHelpFormatter and
|
||
|
ArgumentDefaultsHelpFormatter, providing defaults for the arguments and raw
|
||
|
text for the description.
|
||
|
'''
|
||
|
pass
|
||
|
|
||
|
|
||
|
class ConfigParser(object):
|
||
|
'''Reads and writes the configuration files for play services related scripts
|
||
|
|
||
|
The configuration files are JSON files. Here is the data they are expected
|
||
|
to contain:
|
||
|
|
||
|
- version_number
|
||
|
Number. Mirrors @integer/google_play_services_version from the library.
|
||
|
Example: 815000
|
||
|
|
||
|
- sdk_version
|
||
|
Version of the Play Services SDK to retrieve, when preprocessing the
|
||
|
library from a maven/gradle repository.
|
||
|
Example: "8.1.0"
|
||
|
|
||
|
- clients
|
||
|
List of strings. Name of the clients (or play services modules) to
|
||
|
include when preprocessing the library.
|
||
|
Example: ["play-services-base", "play-services-cast"]
|
||
|
|
||
|
- version_xml_path
|
||
|
String. Path to the version.xml string describing the current version.
|
||
|
Should be relative to the library base directory
|
||
|
Example: "res/values/version.xml"
|
||
|
|
||
|
- locale_whitelist
|
||
|
List of strings. List of locales to keep from the resources. Can be
|
||
|
obtained by generating an android build and looking at the content of
|
||
|
`out/Debug/gen/chrome/java/res`; or looking at the android section in
|
||
|
`//chrome/app/generated_resources.grd`
|
||
|
Example: ["am", "ar", "bg", "ca", "cs"]
|
||
|
|
||
|
- resource_whitelist
|
||
|
List of strings. List of resource files to explicitely keep in the final
|
||
|
output. Use it to keep drawables for example, as we currently remove them
|
||
|
all.
|
||
|
Example: ["play-services-base/res/drawables/foobar.xml"]
|
||
|
'''
|
||
|
_VERSION_NUMBER_KEY = 'version_number'
|
||
|
|
||
|
def __init__(self, path):
|
||
|
self.path = path
|
||
|
self._data = {}
|
||
|
|
||
|
with open(path, 'r') as stream:
|
||
|
self._data = json.load(stream)
|
||
|
|
||
|
@property
|
||
|
def version_number(self):
|
||
|
return self._data.get(self._VERSION_NUMBER_KEY)
|
||
|
|
||
|
@property
|
||
|
def sdk_version(self):
|
||
|
return self._data.get('sdk_version')
|
||
|
|
||
|
@property
|
||
|
def clients(self):
|
||
|
return self._data.get('clients') or []
|
||
|
|
||
|
@property
|
||
|
def version_xml_path(self):
|
||
|
return self._data.get('version_xml_path')
|
||
|
|
||
|
@property
|
||
|
def locale_whitelist(self):
|
||
|
return self._data.get('locale_whitelist') or []
|
||
|
|
||
|
@property
|
||
|
def resource_whitelist(self):
|
||
|
return self._data.get('resource_whitelist') or []
|
||
|
|
||
|
def UpdateVersionNumber(self, new_version_number):
|
||
|
'''Updates the version number and saves it in the configuration file. '''
|
||
|
|
||
|
with open(self.path, 'w') as stream:
|
||
|
self._data[self._VERSION_NUMBER_KEY] = new_version_number
|
||
|
stream.write(DumpTrimmedJson(self._data))
|
||
|
|
||
|
|
||
|
def DumpTrimmedJson(json_data):
|
||
|
'''
|
||
|
Default formatting when dumping json to string has trailing spaces and lacks
|
||
|
a new line at the end. This function fixes that.
|
||
|
'''
|
||
|
|
||
|
out = json.dumps(json_data, sort_keys=True, indent=2)
|
||
|
out = out.replace(' ' + os.linesep, os.linesep)
|
||
|
return out + os.linesep
|
||
|
|
||
|
|
||
|
def FileEquals(expected_file, actual_file):
|
||
|
'''
|
||
|
Returns whether the two files are equal. Returns False if any of the files
|
||
|
doesn't exist.
|
||
|
'''
|
||
|
|
||
|
if not os.path.isfile(actual_file) or not os.path.isfile(expected_file):
|
||
|
return False
|
||
|
return filecmp.cmp(expected_file, actual_file)
|
||
|
|
||
|
|
||
|
def GetVersionNumberFromLibraryResources(version_xml):
|
||
|
'''
|
||
|
Extracts a Google Play services version number from its version.xml file.
|
||
|
'''
|
||
|
|
||
|
with open(version_xml, 'r') as version_file:
|
||
|
version_file_content = version_file.read()
|
||
|
|
||
|
match = _XML_VERSION_NUMBER_PATTERN.search(version_file_content)
|
||
|
if not match:
|
||
|
raise AttributeError('A value for google_play_services_version was not '
|
||
|
'found in ' + version_xml)
|
||
|
return int(match.group(1))
|