4646python3 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+
4957Other similar flags:
5058--depfiles
5159--readmefiles
7179
7280
7381def 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):
373410GMAVEN_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