]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Meta/RP: Replace patch series
authorJunio C Hamano <gitster@pobox.com>
Tue, 30 Oct 2007 08:30:08 +0000 (01:30 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 30 Oct 2007 08:30:08 +0000 (01:30 -0700)
RP [new file with mode: 0755]

diff --git a/RP b/RP
new file mode 100755 (executable)
index 0000000..917cca2
--- /dev/null
+++ b/RP
@@ -0,0 +1,73 @@
+#!/bin/sh
+# Replace patch series
+
+usage="$0 branch [base-branch] <patchfile"
+
+if test -d .dotest
+then
+       echo >&2 "still in the middle of rebase/am"
+       exit 1
+fi
+
+case "$#,$1" in
+1,--continue)
+       ;;
+*)
+       rm -f .rp-state
+       target_branch="$1"
+       case $# in
+       1)
+               base_branch=master
+               ;;
+       2)
+               base_branch=$(git-rev-parse --verify "$2") || exit
+               ;;
+       *)
+               echo >&2 "$usage"
+               exit 1
+               ;;
+       esac
+
+       # find branch point
+       branch_point=$(git merge-base "$base_branch" "$target_branch") || {
+               echo >&2 "failed to compute the branch point"
+               exit 1
+       }
+
+       # safety -- never rewind/replace what's merged to next
+       in_branch=$(git rev-list $branch_point..$target_branch) &&
+       not_in_next=$(git rev-list $branch_point..$target_branch ^next) &&
+       test "z$in_branch" = "z$not_in_next" || {
+               echo >&2 "should not be rewinding part of $target_branch that is already in next"
+               exit 1
+       }
+
+       # detach the HEAD
+       git checkout "$branch_point" || {
+               echo >&2 "detaching the head at $branch_point"
+               exit 1
+       }
+
+       {
+               echo "target_branch=$target_branch"
+               echo "branch_point=$branch_point"
+       } >.rp-state
+       # apply patches
+       git am -3 -s -u || {
+               echo >&2 "finish the am and say $0 --continue"
+               exit 1
+       }
+       ;;
+esac
+
+branch_point=$(sed -ne 's/^branch_point=//p' .rp-state) &&
+target_branch=$(sed -ne 's/^target_branch=//p' .rp-state) || {
+       echo >&2 "no replace-patch session"
+       exit 1
+}
+rm -f .rp-state
+
+git branch -f "$target_branch" HEAD
+git checkout "$target_branch"
+git -p show-branch "$target_branch@{1}" "$target_branch"
+git diff --stat -p "$target_branch@{1}" "$target_branch"