Skip to content

Commit d05287e

Browse files
authored
Improve --auto_diff mode for when GMA is the only changed SDK. (#1557)
* Improve --auto_diff mode for when GMA is the only change. * Revert version change. * Remove debug lines. * Early out from loop. * Tweak script to handle empty values better.
1 parent d3cdc7a commit d05287e

File tree

1 file changed

+40
-11
lines changed

1 file changed

+40
-11
lines changed

scripts/gha/print_matrix_configuration.py

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -310,18 +310,49 @@ def print_value(value):
310310

311311
print(json.dumps(value))
312312

313+
def scan_changes_in_file(parm_key, auto_diff, path, requested_api_list):
314+
"""Scan for changes in the given file and return APIs that were modified."""
315+
change_lines = subprocess.check_output(['git', 'diff', '-U0', auto_diff, path]).decode('utf-8').rstrip('\n').split('\n')
316+
change_lines = [l for l in change_lines if l.startswith('-') or l.startswith('+')]
317+
change_lines = [l for l in change_lines if not l.startswith('---') and not l.startswith('+++')]
318+
change_lines = [l for l in change_lines if len(l) > 20]
319+
changed_apis = set()
320+
for line in change_lines:
321+
if ("Google-Mobile-Ads" in line or "GoogleUserMessagingPlatform" in line or
322+
"play-services-ads" in line or "user-messaging-platform" in line):
323+
changed_apis.add("gma")
324+
else:
325+
changed_apis.update(requested_api_list)
326+
break
327+
changed_apis.intersection_update(requested_api_list)
328+
return ",".join(sorted(changed_apis)) if changed_apis else None
329+
313330
def filter_values_on_diff(parm_key, value, auto_diff):
314331
"""Filter the given key based on a branch diff.
315332
316333
Remove entries from the list based on what we observe in the
317334
source tree, relative to the given base branch."""
318335
file_list = set(subprocess.check_output(['git', 'diff', '--name-only', auto_diff]).decode('utf-8').rstrip('\n').split('\n'))
319336
if parm_key == 'apis':
337+
file_redirects = {
338+
# Custom handling for specific files, to be treated as a different path,
339+
# ignored completely (set to None), or scan the changes more in-depth (set
340+
# to scan_changes function)
341+
"cmake/external/firestore.cmake": "firestore",
342+
"cmake/external/libuv.cmake": "database",
343+
"cmake/external/uWebSockets.cmake": "database",
344+
"ios_pod/Podfile":scan_changes_in_file,
345+
"Android/firebase_dependencies.gradle":scan_changes_in_file,
346+
"release_build_files/Android/firebase_dependencies.gradle":scan_changes_in_file,
347+
}
320348
custom_triggers = {
321349
# Special handling for several top-level directories.
322350
# Any top-level directories set to None are completely ignored.
323351
"external": None,
324352
"release_build_files": None,
353+
# These two handled by file_redirects above.
354+
"ios_pod": None,
355+
"Android": None,
325356
# Uncomment the two below lines when debugging this script, or GitHub
326357
# actions related to auto-diff mode.
327358
# ".github": None,
@@ -331,23 +362,21 @@ def filter_values_on_diff(parm_key, value, auto_diff):
331362
# database, firestore, and storage.
332363
"auth": "auth,functions,database,firestore,storage",
333364
}
334-
file_redirects = {
335-
# Custom handling for specific files, to be treated as a different path or
336-
# ignored completely (set to None).
337-
"cmake/external/firestore.cmake": "firestore",
338-
"cmake/external/libuv.cmake": "database",
339-
"cmake/external/uWebSockets.cmake": "database",
340-
}
341365
requested_api_list = set(value.split(','))
342366
filtered_api_list = set()
343-
344-
for path in file_list:
367+
file_list_array = list(file_list)
368+
for path in file_list_array:
345369
if len(path) == 0: continue
346370
if path in file_redirects:
347371
if file_redirects[path] is None:
348372
continue
349373
else:
350-
path = os.path.join(file_redirects[path], path)
374+
if callable(file_redirects[path]):
375+
add_paths = file_redirects[path](parm_key, auto_diff, path, requested_api_list)
376+
if add_paths: file_list_array.extend(add_paths.split(","))
377+
continue
378+
else:
379+
path = os.path.join(file_redirects[path], path)
351380
topdir = path.split(os.path.sep)[0]
352381
if topdir in custom_triggers:
353382
if not custom_triggers[topdir]: continue # Skip ones set to None.
@@ -361,7 +390,7 @@ def filter_values_on_diff(parm_key, value, auto_diff):
361390
sys.stderr.write("Path '%s' is outside known directories, defaulting to all APIs: %s\n" % (path, value))
362391
return value
363392
sys.stderr.write("::warning::Autodetected APIs: %s\n" % ','.join(sorted(filtered_api_list)))
364-
return ','.join(sorted(filtered_api_list))
393+
return ','.join(sorted(filtered_api_list if filtered_api_list else requested_api_list))
365394
elif parm_key == 'platform':
366395
# Quick and dirty check:
367396
# For each file:

0 commit comments

Comments
 (0)