Skip to content

Commit 90f9549

Browse files
committed
android version script
1 parent 40ca566 commit 90f9549

File tree

1 file changed

+182
-0
lines changed

1 file changed

+182
-0
lines changed

scripts/update_android_versions.py

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
import argparse
2+
import logging
3+
import requests
4+
import os
5+
import re
6+
import sys
7+
from xml.etree import ElementTree
8+
9+
GMAVEN_MASTER_INDEX = "https://dl.google.com/dl/android/maven2/master-index.xml"
10+
GMAVEN_GROUP_INDEX = "https://dl.google.com/dl/android/maven2/{0}/group-index.xml"
11+
12+
def get_latest_maven_versions():
13+
latest_versions = {}
14+
response = requests.get(GMAVEN_MASTER_INDEX)
15+
index_xml = ElementTree.fromstring(response.content)
16+
for index_child in index_xml:
17+
group_name = index_child.tag
18+
group_path = group_name.replace('.', '/')
19+
response = requests.get(GMAVEN_GROUP_INDEX.format(group_path))
20+
group_xml = ElementTree.fromstring(response.content)
21+
for group_child in group_xml:
22+
package_name = group_child.tag.replace('-', '_')
23+
package_full_name = group_name + "." + package_name
24+
package_version = group_child.attrib['versions'].split(',')[-1]
25+
latest_versions[package_full_name] = package_version
26+
return latest_versions
27+
28+
# Regex to match lines like:
29+
# 'com.google.firebase:firebase-auth:1.2.3'
30+
RE_GENERIC_DEPENDENCY_MODULE = re.compile(
31+
r"(?P<quote>[\'\"])(?P<pkg>[a-zA-Z0-9._-]+:[a-zA-Z0-9._-]+):([0-9.]+)[\'\"]"
32+
)
33+
34+
def modify_dependency_file(dependency_filepath, version_map):
35+
"""Modify a dependency file to reference the correct module versions.
36+
37+
Looks for lines like: 'com.google.firebase:firebase-auth:1.2.3'
38+
for modules matching the ones in the version map, and modifies them in-place.
39+
40+
Args:
41+
dependency_filename: Relative path to the dependency file to edit.
42+
version_map: Dictionary of packages to version numbers, e.g. {
43+
'com.google.firebase.firebase_auth': '15.0.0' }
44+
"""
45+
logging.debug('Reading dependency file: {0}'.format(dependency_filepath))
46+
lines = None
47+
with open(dependency_filepath, "r") as dependency_file:
48+
lines = dependency_file.readlines()
49+
if not lines:
50+
logging.fatal('Could not read contents of file %s', dependency_filepath)
51+
52+
output_lines = []
53+
54+
# Replacement function, look up the version number of the given pkg.
55+
def replace_dependency(m):
56+
if not m.group('pkg'):
57+
return m.group(0)
58+
pkg = m.group('pkg').replace('-', '_').replace(':', '.')
59+
if pkg not in version_map:
60+
return m.group(0)
61+
quote_type = m.group('quote')
62+
if not quote_type:
63+
quote_type = "'"
64+
return '%s%s:%s%s' % (quote_type, m.group('pkg'), version_map[pkg],
65+
quote_type)
66+
67+
for line in lines:
68+
output_lines.append(
69+
re.sub(RE_GENERIC_DEPENDENCY_MODULE, replace_dependency, line))
70+
71+
if lines == output_lines:
72+
logging.debug('No changes to dependency file: %s', dependency_filepath)
73+
return
74+
75+
with open(dependency_filepath, 'w') as dependency_file:
76+
if not dependency_file:
77+
logging.fatal('Could not open dependency file %s for writing',
78+
dependency_filepath)
79+
dependency_file.writelines(output_lines)
80+
81+
RE_README_ANDROID_VERSION = re.compile(
82+
r"<br>(?P<pkg>[a-zA-Z0-9._-]+:[a-zA-Z0-9._-]+):([0-9.]+)<br>")
83+
84+
85+
def modify_readme_file(readme_filename, version_map):
86+
"""Modify a readme Markdown file to reference correct module versions.
87+
88+
Looks for lines like:
89+
| | com.google.firebase:firebase-core:15.0.0 |
90+
for modules matching the ones in the version map, and modifies them in-place.
91+
92+
Args:
93+
readme_filename: Relative path to readme file to edit.
94+
version_map: Dictionary of packages to version numbers, e.g. {
95+
'com.google.firebase.firebase_auth': '15.0.0' }
96+
"""
97+
logging.debug('Reading readme file: {0}'.format(readme_filename))
98+
99+
lines = None
100+
with open(readme_filename, "r") as readme_file:
101+
lines = readme_file.readlines()
102+
if not lines:
103+
logging.fatal('Could not read contents of file %s', readme_filename)
104+
105+
output_lines = []
106+
107+
# Replacement function, look up the version number of the given pkg.
108+
def replace_module_line(m):
109+
if not m.group('pkg'):
110+
return m.group(0)
111+
pkg = m.group('pkg').replace('-', '_').replace(':', '.')
112+
if pkg not in version_map:
113+
return m.group(0)
114+
repl = '%s:%s' % (m.group('pkg'), version_map[pkg])
115+
return '<br>{0}<br>'.format(repl)
116+
117+
for line in lines:
118+
output_lines.append(
119+
re.sub(RE_README_ANDROID_VERSION, replace_module_line, line))
120+
121+
if lines == output_lines:
122+
logging.debug('No changes to readme file: %s', readme_filename)
123+
return
124+
logging.debug('Writing readme file: %s', readme_filename)
125+
with open(readme_filename, 'w') as readme_file:
126+
if not readme_file:
127+
logging.fatal('Could not open readme file %s for writing', readme_filename)
128+
readme_file.writelines(output_lines)
129+
130+
131+
def main():
132+
args = parse_cmdline_args()
133+
if not args.files_or_dirs:
134+
args.files_or_dirs = [os.getcwd()]
135+
#latest_versions_map = get_latest_maven_versions()
136+
latest_versions_map = {
137+
'com.google.firebase.firebase_auth': '6.6.6',
138+
'com.google.firebase.firebase_database': '9.9.9',
139+
140+
}
141+
dep = "/Users/vimanyujain/dev/cpp/firebase/firebase-cpp-sdk/Android/firebase_dependencies.gradle"
142+
readme = "/Users/vimanyujain/dev/cpp/firebase/firebase-cpp-sdk/release_build_files/readme.md"
143+
# modify_dependency_file(dep, latest_versions_map)
144+
modify_readme_file(readme, latest_versions_map)
145+
# android_dependencies_files = get_android_dependencies_files(args.files_or_dirs)
146+
# update_android_dependencies_files(android_dependencies_files,
147+
# latest_versions_map, args.dryrun)
148+
149+
def parse_cmdline_args():
150+
parser = argparse.ArgumentParser(description='Update pod files with '
151+
'latest pod versions')
152+
parser.add_argument('--dryrun', action='store_true',
153+
help='Just print the replaced lines, '
154+
'DO NOT overwrite any files')
155+
parser.add_argument('files_or_dirs', nargs='*', metavar='file',
156+
help= 'List of pod files or directories containing podfiles')
157+
parser.add_argument( "--log_level", default="info",
158+
help="Logging level (debug, warning, info)")
159+
args = parser.parse_args()
160+
161+
# Special handling for log level argument
162+
log_levels = {
163+
'critical': logging.CRITICAL,
164+
'error': logging.ERROR,
165+
'warning': logging.WARNING,
166+
'info': logging.INFO,
167+
'debug': logging.DEBUG
168+
}
169+
170+
level = log_levels.get(args.log_level.lower())
171+
if level is None:
172+
raise ValueError('Please use one of the following as'
173+
'log levels:\n{0}'.format(','.join(log_levels.keys())))
174+
logging.basicConfig(level=level)
175+
logger = logging.getLogger(__name__)
176+
return args
177+
178+
179+
if __name__ == '__main__':
180+
main()
181+
# from IPython import embed
182+
# embed()

0 commit comments

Comments
 (0)