46
46
python3 scripts/update_ios_android_dependencies.py --podfiles foo/Podfile
47
47
dir_with_podfiles
48
48
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
+
49
57
Other similar flags:
50
58
--depfiles
51
59
--readmefiles
71
79
72
80
73
81
def get_files_from_directory (dirpath , file_extension , file_name = None ,
74
- absolute_paths = True ):
82
+ absolute_paths = True , ignore_directories = None ):
75
83
"""Helper function to filter files in directories.
76
84
77
85
Args:
@@ -83,27 +91,35 @@ def get_files_from_directory(dirpath, file_extension, file_name=None,
83
91
absolute_paths (bool, optional): Return absolute paths to files.
84
92
Defaults to True.
85
93
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']
86
96
87
97
Returns:
88
98
list(str): List of files matching the specified criteria.
89
99
List of filenames (if absolute_paths=False), or
90
100
a list of absolute paths (if absolute_paths=True)
91
101
"""
102
+ if ignore_directories is None :
103
+ ignore_directories = []
104
+
92
105
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 ]
94
109
for filename in filenames :
95
110
if not filename .endswith (file_extension ):
96
111
continue
97
112
if file_name and not file_name == filename :
98
113
continue
99
114
if absolute_paths :
100
- files .append (os .path .join (dirpath , filename ))
115
+ files .append (os .path .join (root , filename ))
101
116
else :
102
117
files .append (filename )
103
118
return files
104
119
105
120
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 ):
107
123
"""Gets the final flat list of files after searching directories.
108
124
109
125
If a directory is passed, it is searched recursively.
@@ -115,6 +131,8 @@ def get_files(dirs_and_files, file_extension, file_name=None):
115
131
Eg: '.gradle'
116
132
file_name (str, optional): Exact file name to search for.
117
133
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']
118
136
119
137
Returns:
120
138
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):
125
143
if not os .path .exists (abspath ):
126
144
continue
127
145
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 )
131
151
elif os .path .isfile (abspath ):
132
152
files .append (abspath )
133
153
return files
@@ -158,27 +178,36 @@ def get_files(dirs_and_files, file_extension, file_name=None):
158
178
)
159
179
160
180
161
- def get_pod_versions (specs_repo , pods = PODS ):
181
+ def get_pod_versions (specs_repo , pods = PODS , ignore_pods = None ):
162
182
"""Get available pods and their versions from the specs repo
163
183
164
184
Args:
165
185
local_repo_dir (str): Directory mirroring Cocoapods specs repo
166
186
pods (iterable(str), optional): List of pods whose versions we need.
167
187
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'
169
193
Returns:
170
194
dict: Map of the form {<str>:list(str)}
171
195
Containing a mapping of podnames to available versions.
172
196
"""
197
+ if ignore_pods is None :
198
+ ignore_pods = []
199
+
173
200
all_versions = defaultdict (list )
174
201
logging .info ('Fetching pod versions from Specs repo...' )
175
202
podspec_files = get_files_from_directory (specs_repo ,
176
203
file_extension = '.podspec.json' )
177
204
for podspec_file in podspec_files :
178
205
filename = os .path .basename (podspec_file )
179
- # Example: FirebaseAuth.podspec.json
206
+ # Example: FirebaseAuth.podspec.json --> FirebaseAuth
180
207
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 ):
182
211
continue
183
212
parent_dir = os .path .dirname (podspec_file )
184
213
version = os .path .basename (parent_dir )
@@ -187,18 +216,26 @@ def get_pod_versions(specs_repo, pods=PODS):
187
216
return all_versions
188
217
189
218
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 ):
191
220
"""Get latest versions for specified pods.
192
221
193
222
Args:
194
223
pods (iterable(str) optional): Pods for which we need latest version.
195
224
Defaults to PODS.
196
225
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'
197
231
198
232
Returns:
199
233
dict: Map of the form {<str>:<str>} containing a mapping of podnames to
200
234
latest version.
201
235
"""
236
+ if ignore_pods is None :
237
+ ignore_pods = []
238
+
202
239
cleanup_required = False
203
240
if specs_repo is None :
204
241
specs_repo = tempfile .mkdtemp (suffix = 'pods' )
@@ -209,7 +246,7 @@ def get_latest_pod_versions(specs_repo=None, pods=PODS):
209
246
# Temporary directory should be cleaned up after use.
210
247
cleanup_required = True
211
248
212
- all_versions = get_pod_versions (specs_repo , pods )
249
+ all_versions = get_pod_versions (specs_repo , pods , ignore_pods )
213
250
if cleanup_required :
214
251
shutil .rmtree (specs_repo )
215
252
@@ -373,7 +410,23 @@ def replace_pod_line(m):
373
410
GMAVEN_GROUP_INDEX = "https://dl.google.com/dl/android/maven2/{0}/group-index.xml"
374
411
375
412
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
+
377
430
latest_versions = {}
378
431
response = requests .get (GMAVEN_MASTER_INDEX )
379
432
index_xml = ElementTree .fromstring (response .content )
@@ -385,6 +438,9 @@ def get_latest_maven_versions():
385
438
for group_child in group_xml :
386
439
package_name = group_child .tag .replace ('-' , '_' )
387
440
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
388
444
package_version = group_child .attrib ['versions' ].split (',' )[- 1 ]
389
445
latest_versions [package_full_name ] = package_version
390
446
return latest_versions
@@ -580,16 +636,24 @@ def parse_cmdline_args():
580
636
help = 'Just print the replaced lines, DO NOT overwrite any files' )
581
637
parser .add_argument ( "--log_level" , default = "info" ,
582
638
help = "Logging level (debug, warning, info)" )
639
+ parser .add_argument ('--ignore_directories' , nargs = '+' ,
640
+ help = 'Ignore updating any files in these directories (names).' )
583
641
# iOS options
584
642
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.' )
586
647
parser .add_argument ('--podfiles' , nargs = '+' , default = (os .getcwd (),),
587
648
help = 'List of pod files or directories containing podfiles' )
588
649
parser .add_argument ('--specs_repo' ,
589
650
help = 'Local checkout of github Cocoapods Specs repository' )
590
651
# Android options
591
652
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.' )
593
657
parser .add_argument ('--depfiles' , nargs = '+' ,
594
658
default = ('Android/firebase_dependencies.gradle' ,
595
659
'release_build_files/Android/firebase_dependencies.gradle' ),
@@ -630,17 +694,21 @@ def main():
630
694
file_name = 'readme' )
631
695
632
696
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 ))
635
701
for pod_file in pod_files :
636
702
modify_pod_file (pod_file , latest_pod_versions_map , args .dryrun )
637
703
for readme_file in readme_files :
638
704
modify_readme_file_pods (readme_file , latest_pod_versions_map , args .dryrun )
639
705
640
706
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 )
642
709
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 ))
644
712
for dep_file in dep_files :
645
713
modify_dependency_file (dep_file , latest_android_versions_map , args .dryrun )
646
714
@@ -649,7 +717,8 @@ def main():
649
717
args .dryrun )
650
718
651
719
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 ))
653
722
for gradle_file in gradle_files :
654
723
modify_gradle_file (gradle_file , latest_android_versions_map , args .dryrun )
655
724
0 commit comments