| #!/usr/bin/env python |
| |
| # This file is part of the coreboot project. |
| # |
| # Copyright (C) 2016 Google, Inc. |
| # |
| # This program is free software; you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as published by |
| # the Free Software Foundation; version 2 of the License. |
| # |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| |
| import sys |
| import re |
| import subprocess |
| |
| # Regular expression patterns |
| pat_change_id = re.compile('^Change-Id: (.*)$') |
| pat_orig_lines = re.compile('^(Signed-off-by|Reviewed-on|Reviewed-by)') |
| pat_uninteresting = re.compile('^Tested-by') |
| pat_quotes = re.compile('"') |
| pat_leading_space = re.compile('^ ') |
| pat_bug_line = re.compile('^bug\s*=', re.IGNORECASE) |
| pat_branch_line = re.compile('branch\s*=', re.IGNORECASE) |
| pat_test_line = re.compile('test\s*=', re.IGNORECASE) |
| |
| def main(): |
| branch = "" |
| new_commit_message = "" |
| change_id = "" |
| commit_id = "" |
| bug_line = "BUG=None\n" |
| branch_line = "BRANCH=None\n" |
| test_line = "TEST=Build tested at coreboot.org\n" |
| |
| # Check command line arguments |
| if len(sys.argv) > 1: |
| if sys.argv[1] == "-h" or sys.argv[1] == "--help": |
| print "Update the commit message to submit to the Chrome OS tree." |
| print "Usage: " + sys.argv[1] + " [Remote branch]\n" |
| else: |
| branch = sys.argv[1] |
| else: |
| branch = "cborg/master" |
| |
| # Get the last commit message, then loop through looking at each line |
| commit_message = subprocess.check_output(["git", "log", "-n1"]).split("\n") |
| for line in commit_message: |
| |
| # Skip the initial few lines of the commit message |
| m = pat_leading_space.match(line) |
| if not m: |
| continue |
| |
| # Remove initial whitespace |
| line = line.lstrip(' ') |
| |
| # Add the 'UPSTREAM' comment to the subject line |
| if len(new_commit_message) == 0: |
| new_commit_message += "UPSTREAM: " + line + "\n" |
| continue |
| |
| # If we've found a TEST, BRANCH, or BUG line, mark it as found |
| if pat_test_line.match(line): |
| test_line = "" |
| if pat_bug_line.match(line): |
| bug_line = "" |
| if pat_branch_line.match(line): |
| branch_line = "" |
| |
| # Grab the Change-Id |
| chid = pat_change_id.match(line) |
| if chid: |
| change_id = chid.group(1) |
| |
| # Add 'Original-' to all of the coreboot.org gerrit messages |
| grrt = pat_orig_lines.match(line) |
| if grrt: |
| line = "Original-" + line |
| |
| # if we've reached the end of the real commit message text and we don't |
| # have the required TEST= BUG= and BRANCH= lines, add them. |
| if (chid or grrt) and (bug_line or branch_line or test_line): |
| new_commit_message += bug_line + branch_line + test_line + "\n" |
| bug_line = branch_line = test_line = "" |
| |
| # Remove uninteresting gerrit messages |
| if pat_uninteresting.match(line): |
| continue |
| |
| # Add the current line to the updated commit message |
| new_commit_message += line + "\n" |
| |
| # Error out if no Change-Id was located |
| if not change_id: |
| print "Error: No Change-Id found" |
| sys.exit(1) |
| |
| # Get the Commit ID based on the Change-Id and the branch. |
| # Error out if git returns an error |
| try: |
| commit_id = subprocess.check_output(["git", "log", "-n1", "--grep", change_id, '--pretty=%H', branch, "--"]).rstrip('\n') |
| except: |
| print "Error: invalid branch - " + branch + ".\n" |
| sys.exit(1) |
| |
| # To find the Commit-Id, we've looked through the git log for a particular Change-Id |
| # Error out if the Commit-Id wasn't found, with the message that we couldn't find the Change-Id |
| if not commit_id: |
| print "Error: Could not find Change-Id: " + change_id + " in branch " + branch + ".\n" |
| sys.exit(1) |
| |
| # Add the Commit-Id that this change came from to the new commit message. |
| new_commit_message += "(cherry-picked from commit " + commit_id + ")\n" |
| |
| # Update the commit message |
| amend_output = subprocess.check_output(["git", "commit", "-s", "--amend", "-m", new_commit_message ]) |
| |
| print "----------\n" |
| print amend_output |
| |
| if __name__ == "__main__": |
| main() |