Change-Id: Ia40543e5585845e5e6c178a620052c6a25927a5c Signed-off-by: Patrick Georgi <pgeorgi@chromium.org> Reviewed-on: https://review.coreboot.org/17102 Tested-by: build bot (Jenkins) Reviewed-by: Martin Roth <martinroth@google.com> Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
		
			
				
	
	
		
			75 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| 
 | |
| # Copyright 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.
 | |
| 
 | |
| # $0 from-branch to-branch
 | |
| #
 | |
| # applies all commits that from-branch has over to-branch,
 | |
| # based on a common ancestor and gerrit meta-data
 | |
| from=$1
 | |
| to=$2
 | |
| 
 | |
| # match string: this is the git commit line that is used to
 | |
| # identify commits that were already copied over.
 | |
| #
 | |
| # Must not contain spaces except for leading and trailing.
 | |
| #
 | |
| # The first pick was Change-Id, but it was lost too often,
 | |
| # so go for Reviewed-on instead. It's also unique because it
 | |
| # contains the gerrit instance's host name and the change's number
 | |
| # on that system.
 | |
| match_string='^    [-A-Za-z]*[Rr]eviewed-on: '
 | |
| 
 | |
| # fetch common ancestor
 | |
| common_base=$(git merge-base ${from} ${to} 2>/dev/null)
 | |
| 
 | |
| if [ -z "${common_base}" ]; then
 | |
| 	echo \"${from}\" or \"${to}\" is not a valid branch name.
 | |
| 	exit 1
 | |
| fi
 | |
| 
 | |
| # collect matches that are present on the target side
 | |
| to_matches="$(git log ${common_base}..${to} | \
 | |
| 	grep "${match_string}" | \
 | |
| 	cut -d: -f2-)"
 | |
| 
 | |
| # start rebase process, but fail immediately by enforcing an invalid todo
 | |
| GIT_SEQUENCE_EDITOR="echo foo >" \
 | |
| 	git rebase -i --onto ${to} ${from} ${to} 2>/dev/null
 | |
| 
 | |
| # write new rebase todo
 | |
| # the appended "commit" line triggers handling of the last log entry
 | |
| commit=""
 | |
| (git log --reverse ${common_base}..${from} | \
 | |
| 	grep -E "(^commit [0-9a-f]{40}\$|${match_string})"; \
 | |
| 	echo "commit") | \
 | |
| while read key value; do
 | |
| 	if [ "${key}" = "commit" ]; then
 | |
| 		if [ -n "${commit}" ]; then
 | |
| 			git log -n 1 --pretty="pick %h %s" ${commit}
 | |
| 		fi
 | |
| 		commit="${value}"
 | |
| 	else
 | |
| 		# if value was already found on the "to" side, skip this
 | |
| 		# commit
 | |
| 		if [[ ${to_matches} == *"${value}"* ]]; then
 | |
| 			commit=""
 | |
| 		fi
 | |
| 	fi
 | |
| done | GIT_SEQUENCE_EDITOR="cat >" git rebase --edit-todo
 | |
| 
 | |
| # allow user to edit todo
 | |
| git rebase --edit-todo
 | |
| 
 | |
| # start processing todo to mimick git rebase -i behavior
 | |
| git rebase --continue
 |