summaryrefslogtreecommitdiff
path: root/scripts/aosp_tag_preupload.py
blob: bfcdbd6a9ffc6bb56399da3175d610049595a151 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/usr/bin/python

import re
import subprocess
import sys

# Looks for a string of the form [aosp/branch-name]
AOSP_BRANCH_REGEX = "\[aosp/[^\]]+\]"

AOSP_COMMIT_TAG_REGEX = "AOSP:"
AOSP_COMMIT_LINK_REGEX = "aosp/\d+"
AOSP_INFEASIBLE_REGEX = "Infeasible[ ]?\S+"

ERROR_MESSAGE = """
The source of truth for this project is AOSP. If you are uploading something to
a non-AOSP branch first, please provide a link in your commit message to the
corresponding patch in AOSP. The link should be formatted as follows:

  AOSP: aosp/<patch number>

If it's infeasible for the change to be included in AOSP (for example, if a
change contains confidential or security-sensitive information), please state
that it's infeasible and provide reasoning as follows:

  AOSP: Infeasible <your reasoning here>

If you need to cherry-pick your change from an internal branch to AOSP before
uploading, you can do so locally by adding the internal branch as a remote in
AOSP:
  git remote add goog-master /path/to/your/remote/branch/.git
starting a new branch in AOSP:
  repo start <your-branch-name>-cp
then fetching and cherry-picking the change:
  git fetch goog-master your-branch-name && git cherry-pick FETCH_HEAD
"""

def main():
  if _is_in_aosp():
    sys.exit(0)

  commit_msg = subprocess.check_output(["git", "show",
                                        sys.argv[1], "--no-notes"])
  for commit_line in commit_msg.splitlines():
    # Some lines in the commit message will be given to us as bytes
    commit_line_str = str(commit_line)
    if re.search(AOSP_COMMIT_TAG_REGEX, str(commit_line_str), re.IGNORECASE):
      _check_aosp_message(commit_line_str)

  print(ERROR_MESSAGE)
  # Print the warning, but do not fail the presubmit check.
  sys.exit(77)

def _is_in_aosp():
  branch_info = subprocess.check_output(["git", "branch", "-vv"])
  return re.search(AOSP_BRANCH_REGEX, str(branch_info)) is not None

def _check_aosp_message(aosp_line):
  if re.search(AOSP_COMMIT_LINK_REGEX, aosp_line):
    sys.exit(0)

  if re.search(AOSP_INFEASIBLE_REGEX, aosp_line, re.IGNORECASE):
    sys.exit(0)

  print(ERROR_MESSAGE)
  # Print the warning, but do not fail the presubmit check.
  sys.exit(77)

if __name__ == '__main__':
  main()