From 34e4a1c01a0082d50a789a3fdf4847dd33d4d114 Mon Sep 17 00:00:00 2001 From: Martin Roth Date: Wed, 3 Aug 2016 22:50:46 -0600 Subject: [PATCH] util/gitconfig: add cborg2cros.py script This is a python script that does basically the same thing as the rebase.sh script, but in the other direction. rebase.sh takes files from the chromium tree (cros) and pulls them to the coreboot.org tree. cborg2cros, as the name implies, updates patches to go into the cros tree from coreboot. It adds the 'UPSTREAM: ' identifier to the start of the commit message, and uses the text '(cherry-picked from commit #####)' instead of 'Original-Commit-Id: #####' It also adds the 'TEST=', 'BRANCH=', and 'BUG=' lines if they aren't there. Change-Id: Ibad9a5f0d0d2c713cf08e103c463e2e82768c436 Signed-off-by: Martin Roth Reviewed-on: https://review.coreboot.org/15323 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer --- util/gitconfig/cborg2cros.py | 126 +++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100755 util/gitconfig/cborg2cros.py diff --git a/util/gitconfig/cborg2cros.py b/util/gitconfig/cborg2cros.py new file mode 100755 index 0000000000..133b00a398 --- /dev/null +++ b/util/gitconfig/cborg2cros.py @@ -0,0 +1,126 @@ +#!/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()