[Android log] Promote using hardcoded string tags
This is to avoid static initializers that would make the code slower.
See the linked bug for discussion.
This patch deprecates Log#makeTag(String) and adds presubmit checks
to enforce at submit time what makeTag was trying to do: length and
naming rules
BUG=485772
Review URL: https://codereview.chromium.org/1131903007
Cr-Commit-Position: refs/heads/master@{#333710}
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 4d5c853..515da1d 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -1304,6 +1304,77 @@
black_list=_EXCLUDED_PATHS + input_api.DEFAULT_BLACK_LIST)
+def _CheckAndroidCrLogUsage(input_api, output_api):
+ """Checks that new logs using org.chromium.base.Log:
+ - Are using 'TAG' as variable name for the tags (warn)
+ - Are using the suggested name format for the tags: "cr.<PackageTag>" (warn)
+ - Are using a tag that is shorter than 23 characters (error)
+ """
+ cr_log_import_pattern = input_api.re.compile(
+ r'^import org\.chromium\.base\.Log;$', input_api.re.MULTILINE);
+ # Extract the tag from lines like `Log.d(TAG, "*");` or `Log.d("TAG", "*");`
+ cr_log_pattern = input_api.re.compile(r'^\s*Log\.\w\((?P<tag>\"?\w+\"?)\,')
+ log_decl_pattern = input_api.re.compile(
+ r'^\s*private static final String TAG = "(?P<name>(.*)")',
+ input_api.re.MULTILINE)
+ log_name_pattern = input_api.re.compile(r'^cr[.\w]*')
+
+ REF_MSG = ('See base/android/java/src/org/chromium/base/README_logging.md '
+ 'or contact [email protected] for more info.')
+ sources = lambda x: input_api.FilterSourceFile(x, white_list=(r'.*\.java$',))
+ tag_errors = []
+ tag_decl_errors = []
+ tag_length_errors = []
+
+ for f in input_api.AffectedSourceFiles(sources):
+ file_content = input_api.ReadFile(f)
+ has_modified_logs = False
+
+ # Per line checks
+ if cr_log_import_pattern.search(file_content):
+ for line_num, line in f.ChangedContents():
+
+ # Check if the new line is doing some logging
+ match = cr_log_pattern.search(line)
+ if match:
+ has_modified_logs = True
+
+ # Make sure it uses "TAG"
+ if not match.group('tag') == 'TAG':
+ tag_errors.append("%s:%d" % (f.LocalPath(), line_num))
+
+ # Per file checks
+ if has_modified_logs:
+ # Make sure the tag is using the "cr" prefix and is not too long
+ match = log_decl_pattern.search(file_content)
+ tag_name = match.group('name') if match else ''
+ if not log_name_pattern.search(tag_name ):
+ tag_decl_errors.append(f.LocalPath())
+ if len(tag_name) > 23:
+ tag_length_errors.append(f.LocalPath())
+
+ results = []
+ if tag_decl_errors:
+ results.append(output_api.PresubmitPromptWarning(
+ 'Please define your tags using the suggested format: .\n'
+ '"private static final String TAG = "cr.<package tag>".\n' + REF_MSG,
+ tag_decl_errors))
+
+ if tag_length_errors:
+ results.append(output_api.PresubmitError(
+ 'The tag length is restricted by the system to be at most '
+ '23 characters.\n' + REF_MSG,
+ tag_length_errors))
+
+ if tag_errors:
+ results.append(output_api.PresubmitPromptWarning(
+ 'Please use a variable named "TAG" for your log tags.\n' + REF_MSG,
+ tag_errors))
+
+ return results
+
+
+# TODO(dgn): refactor with _CheckAndroidCrLogUsage
def _CheckNoNewUtilLogUsage(input_api, output_api):
"""Checks that new logs are using org.chromium.base.Log."""
@@ -1456,6 +1527,14 @@
return results
+def _AndroidSpecificOnUploadChecks(input_api, output_api):
+ """Groups checks that target android code."""
+ results = []
+ results.extend(_CheckNoNewUtilLogUsage(input_api, output_api))
+ results.extend(_CheckAndroidCrLogUsage(input_api, output_api))
+ return results
+
+
def _CommonChecks(input_api, output_api):
"""Checks common to both upload and commit."""
results = []
@@ -1728,7 +1807,7 @@
results.extend(
input_api.canned_checks.CheckGNFormatted(input_api, output_api))
results.extend(_CheckUmaHistogramChanges(input_api, output_api))
- results.extend(_CheckNoNewUtilLogUsage(input_api, output_api))
+ results.extend(_AndroidSpecificOnUploadChecks(input_api, output_api))
return results