Skip to content

Commit 8e030f7

Browse files
committed
flags to ignore Android/iOS packages and directories.
--ignore_android_packages, --ignore_ios_pods, --ignore_directories
1 parent e0a8458 commit 8e030f7

File tree

1 file changed

+90
-21
lines changed

1 file changed

+90
-21
lines changed

scripts/update_android_ios_dependencies.py

Lines changed: 90 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,14 @@
4646
python3 scripts/update_ios_android_dependencies.py --podfiles foo/Podfile
4747
dir_with_podfiles
4848
49+
# Update all Android packages except any names containing androidx and auth
50+
python3 scripts/update_ios_android_dependencies.py --skip_ios
51+
--ignore_android_packages auth androidx
52+
53+
# Ignore updating any files in gameloop_android and test directories
54+
python3 scripts/update_ios_android_dependencies.py --ignore_directories test
55+
gameloop_android
56+
4957
Other similar flags:
5058
--depfiles
5159
--readmefiles
@@ -71,7 +79,7 @@
7179

7280

7381
def get_files_from_directory(dirpath, file_extension, file_name=None,
74-
absolute_paths=True):
82+
absolute_paths=True, ignore_directories=None):
7583
"""Helper function to filter files in directories.
7684
7785
Args:
@@ -83,27 +91,35 @@ def get_files_from_directory(dirpath, file_extension, file_name=None,
8391
absolute_paths (bool, optional): Return absolute paths to files.
8492
Defaults to True.
8593
If False, just filenames are returned.
94+
ignore_directories (list[str], optional): Directory names to ignore.
95+
Eg: ['gameloop_android', 'do_not_scan_this_directory']
8696
8797
Returns:
8898
list(str): List of files matching the specified criteria.
8999
List of filenames (if absolute_paths=False), or
90100
a list of absolute paths (if absolute_paths=True)
91101
"""
102+
if ignore_directories is None:
103+
ignore_directories = []
104+
92105
files = []
93-
for dirpath, _, filenames in os.walk(dirpath):
106+
for root, dirs, filenames in os.walk(dirpath):
107+
dirs[:] = [directory for directory in dirs
108+
if directory not in ignore_directories]
94109
for filename in filenames:
95110
if not filename.endswith(file_extension):
96111
continue
97112
if file_name and not file_name == filename:
98113
continue
99114
if absolute_paths:
100-
files.append(os.path.join(dirpath, filename))
115+
files.append(os.path.join(root, filename))
101116
else:
102117
files.append(filename)
103118
return files
104119

105120

106-
def get_files(dirs_and_files, file_extension, file_name=None):
121+
def get_files(dirs_and_files, file_extension, file_name=None,
122+
ignore_directories=None):
107123
"""Gets the final flat list of files after searching directories.
108124
109125
If a directory is passed, it is searched recursively.
@@ -115,6 +131,8 @@ def get_files(dirs_and_files, file_extension, file_name=None):
115131
Eg: '.gradle'
116132
file_name (str, optional): Exact file name to search for.
117133
Defaults to None. Eg: 'foo.gradle'
134+
ignore_directories (list[str], optional): Directory names to ignore.
135+
Eg: ['gameloop_android', 'do_not_scan_this_directory']
118136
119137
Returns:
120138
iterable(str): Final list of files after recursively searching dirs.
@@ -125,9 +143,11 @@ def get_files(dirs_and_files, file_extension, file_name=None):
125143
if not os.path.exists(abspath):
126144
continue
127145
if os.path.isdir(abspath):
128-
files = files + get_files_from_directory(abspath,
129-
file_extension=file_extension,
130-
file_name=file_name)
146+
files = files + get_files_from_directory(
147+
abspath,
148+
file_extension=file_extension,
149+
file_name=file_name,
150+
ignore_directories=ignore_directories)
131151
elif os.path.isfile(abspath):
132152
files.append(abspath)
133153
return files
@@ -158,27 +178,36 @@ def get_files(dirs_and_files, file_extension, file_name=None):
158178
)
159179

160180

161-
def get_pod_versions(specs_repo, pods=PODS):
181+
def get_pod_versions(specs_repo, pods=PODS, ignore_pods=None):
162182
"""Get available pods and their versions from the specs repo
163183
164184
Args:
165185
local_repo_dir (str): Directory mirroring Cocoapods specs repo
166186
pods (iterable(str), optional): List of pods whose versions we need.
167187
Defaults to PODS.
168-
188+
ignore_pods (list[str], optional): Case insensitive list of substrings
189+
If any of these substrings are present in the pod name, it will not be
190+
updated.
191+
Eg: ['foo', 'bar'] will ignore all pods that have 'foo' or
192+
'bar' in their name. For example, 'test_foo', 'test_foo_baz'
169193
Returns:
170194
dict: Map of the form {<str>:list(str)}
171195
Containing a mapping of podnames to available versions.
172196
"""
197+
if ignore_pods is None:
198+
ignore_pods = []
199+
173200
all_versions = defaultdict(list)
174201
logging.info('Fetching pod versions from Specs repo...')
175202
podspec_files = get_files_from_directory(specs_repo,
176203
file_extension='.podspec.json')
177204
for podspec_file in podspec_files:
178205
filename = os.path.basename(podspec_file)
179-
# Example: FirebaseAuth.podspec.json
206+
# Example: FirebaseAuth.podspec.json --> FirebaseAuth
180207
podname = filename.split('.')[0]
181-
if not podname in pods:
208+
if podname not in pods:
209+
continue
210+
if any(ignore_pod.lower() in podname.lower() for ignore_pod in ignore_pods):
182211
continue
183212
parent_dir = os.path.dirname(podspec_file)
184213
version = os.path.basename(parent_dir)
@@ -187,18 +216,26 @@ def get_pod_versions(specs_repo, pods=PODS):
187216
return all_versions
188217

189218

190-
def get_latest_pod_versions(specs_repo=None, pods=PODS):
219+
def get_latest_pod_versions(specs_repo=None, pods=PODS, ignore_pods=None):
191220
"""Get latest versions for specified pods.
192221
193222
Args:
194223
pods (iterable(str) optional): Pods for which we need latest version.
195224
Defaults to PODS.
196225
specs_repo (str optional): Local checkout of Cocoapods specs repo.
226+
ignore_pods (list[str], optional): Case insensitive list of substrings
227+
If any of these substrings are present in the pod name, it will not be
228+
updated.
229+
Eg: ['Foo', 'bar'] will ignore all pods that have 'foo' or
230+
'bar' in their name. For example, 'test_foo', 'test_foo_baz'
197231
198232
Returns:
199233
dict: Map of the form {<str>:<str>} containing a mapping of podnames to
200234
latest version.
201235
"""
236+
if ignore_pods is None:
237+
ignore_pods = []
238+
202239
cleanup_required = False
203240
if specs_repo is None:
204241
specs_repo = tempfile.mkdtemp(suffix='pods')
@@ -209,7 +246,7 @@ def get_latest_pod_versions(specs_repo=None, pods=PODS):
209246
# Temporary directory should be cleaned up after use.
210247
cleanup_required = True
211248

212-
all_versions = get_pod_versions(specs_repo, pods)
249+
all_versions = get_pod_versions(specs_repo, pods, ignore_pods)
213250
if cleanup_required:
214251
shutil.rmtree(specs_repo)
215252

@@ -373,7 +410,23 @@ def replace_pod_line(m):
373410
GMAVEN_GROUP_INDEX = "https://dl.google.com/dl/android/maven2/{0}/group-index.xml"
374411

375412

376-
def get_latest_maven_versions():
413+
def get_latest_maven_versions(ignore_packages=None):
414+
"""Gets latest versions of android packages from google Maven repository.
415+
416+
Args:
417+
ignore_packages (list[str], optional): Case insensitive list of substrings
418+
If any of these substrings are present in the android package name, it
419+
will not be updated.
420+
Eg: ['Foo', 'bar'] will ignore all android packages that have 'foo' or
421+
'bar' in their name. For example, 'my.android.foo.package',
422+
'myfoo.android.package'
423+
424+
Returns:
425+
[type]: [description]
426+
"""
427+
if ignore_packages is None:
428+
ignore_packages = []
429+
377430
latest_versions = {}
378431
response = requests.get(GMAVEN_MASTER_INDEX)
379432
index_xml = ElementTree.fromstring(response.content)
@@ -385,6 +438,9 @@ def get_latest_maven_versions():
385438
for group_child in group_xml:
386439
package_name = group_child.tag.replace('-', '_')
387440
package_full_name = group_name + "." + package_name
441+
if any(ignore_package.lower() in package_full_name.lower()
442+
for ignore_package in ignore_packages):
443+
continue
388444
package_version = group_child.attrib['versions'].split(',')[-1]
389445
latest_versions[package_full_name] = package_version
390446
return latest_versions
@@ -580,16 +636,24 @@ def parse_cmdline_args():
580636
help='Just print the replaced lines, DO NOT overwrite any files')
581637
parser.add_argument( "--log_level", default="info",
582638
help="Logging level (debug, warning, info)")
639+
parser.add_argument('--ignore_directories', nargs='+',
640+
help='Ignore updating any files in these directories (names).')
583641
# iOS options
584642
parser.add_argument('--skip_ios', action='store_true',
585-
help='Skip iOS pod version update.')
643+
help='Skip iOS pod version update completely.')
644+
parser.add_argument('--ignore_ios_pods', nargs='+',
645+
help='Ignore iOS pods which have any of the items specified in '
646+
'this list as substrings.')
586647
parser.add_argument('--podfiles', nargs='+', default=(os.getcwd(),),
587648
help= 'List of pod files or directories containing podfiles')
588649
parser.add_argument('--specs_repo',
589650
help= 'Local checkout of github Cocoapods Specs repository')
590651
# Android options
591652
parser.add_argument('--skip_android', action='store_true',
592-
help='Skip Android libraries version update.')
653+
help='Skip Android libraries version update completely.')
654+
parser.add_argument('--ignore_android_packages', nargs='+',
655+
help='Ignore Android packages which have any of the items '
656+
'specified in this list as substrings.')
593657
parser.add_argument('--depfiles', nargs='+',
594658
default=('Android/firebase_dependencies.gradle',
595659
'release_build_files/Android/firebase_dependencies.gradle'),
@@ -630,17 +694,21 @@ def main():
630694
file_name='readme')
631695

632696
if not args.skip_ios:
633-
latest_pod_versions_map = get_latest_pod_versions(args.specs_repo, PODS)
634-
pod_files = get_files(args.podfiles, file_extension='', file_name='Podfile')
697+
latest_pod_versions_map = get_latest_pod_versions(args.specs_repo, PODS,
698+
set(args.ignore_ios_pods))
699+
pod_files = get_files(args.podfiles, file_extension='', file_name='Podfile',
700+
ignore_directories=set(args.ignore_directories))
635701
for pod_file in pod_files:
636702
modify_pod_file(pod_file, latest_pod_versions_map, args.dryrun)
637703
for readme_file in readme_files:
638704
modify_readme_file_pods(readme_file, latest_pod_versions_map, args.dryrun)
639705

640706
if not args.skip_android:
641-
latest_android_versions_map = get_latest_maven_versions()
707+
latest_android_versions_map = get_latest_maven_versions(
708+
args.ignore_android_packages)
642709
dep_files = get_files(args.depfiles, file_extension='.gradle',
643-
file_name='firebase_dependencies.gradle')
710+
file_name='firebase_dependencies.gradle',
711+
ignore_directories=set(args.ignore_directories))
644712
for dep_file in dep_files:
645713
modify_dependency_file(dep_file, latest_android_versions_map, args.dryrun)
646714

@@ -649,7 +717,8 @@ def main():
649717
args.dryrun)
650718

651719
gradle_files = get_files(args.gradlefiles, file_extension='.gradle',
652-
file_name='build.gradle')
720+
file_name='build.gradle',
721+
ignore_directories=set(args.ignore_directories))
653722
for gradle_file in gradle_files:
654723
modify_gradle_file(gradle_file, latest_android_versions_map, args.dryrun)
655724

0 commit comments

Comments
 (0)