summaryrefslogtreecommitdiffstats
path: root/git-follow/git-rebase-subtree.in
diff options
context:
space:
mode:
Diffstat (limited to 'git-follow/git-rebase-subtree.in')
-rw-r--r--git-follow/git-rebase-subtree.in118
1 files changed, 118 insertions, 0 deletions
diff --git a/git-follow/git-rebase-subtree.in b/git-follow/git-rebase-subtree.in
new file mode 100644
index 0000000..d2422ab
--- /dev/null
+++ b/git-follow/git-rebase-subtree.in
@@ -0,0 +1,118 @@
+#!/bin/sh
+#
+
+unset CDPATH
+SED="${SED-sed}"
+
+self=`basename "$0"`
+selfdir=`dirname "$0"`
+selfdir=`cd "$selfdir" && pwd`
+. "$selfdir/git-ndim-sh"
+
+SUBDIRECTORY_OK="yes"
+USAGE="<command> [params...]"
+
+LONG_USAGE="\
+Let a local subtree of branches follow a remote origin without too much merging.
+For more details, see the ${self}(1) man page."
+. git-sh-setup
+
+require_work_tree
+
+# Abort on error
+set -e
+
+
+cmd() {
+ echo "CMD>" "$@"
+ gitk --all
+ "$@"
+}
+
+
+gf_init() {
+ echo "$self: Examining configuration"
+ git config follow.tree | while read from to restofline; do
+ if test "x#" = "x$(echo "$from" | sed -n '1s/^\(.\).*/\1/p')"; then continue; fi
+ echo ""
+ echo " From: $from"
+ echo " To: $to"
+ done
+}
+
+gf_branch() {
+ branch="$1"
+ newbranch="follow-old/$branch"
+ if git-rev-parse --verify "$branch" > /dev/null 2>&1; then
+ # valid branch
+ if git-rev-parse --verify "$newbranch" > /dev/null 2>&1; then
+ : # branch already exists, do nothing
+ else
+ cmd git-branch "${newbranch}" "${branch}"
+ fi
+ else
+ echo "$self: gf_branch called with invalid branch \"$branch\"" >&2
+ exit 1
+ fi
+}
+
+
+gf_rmbranch() {
+ branch="$1"
+ newbranch="follow-old/$branch"
+ if git-rev-parse --verify "$branch" > /dev/null 2>&1; then
+ if git-rev-parse --verify "$newbranch" > /dev/null 2>&1; then
+ cmd git-branch -D "${newbranch}"
+ fi
+ fi
+}
+
+
+gf_rebase_tree() {
+ newroot="$1"
+ test "x$newroot" = "x" && die "Need <newroot> parameter"
+ oldroot="$2"
+ test "x$oldroot" = "x" && die "Need <oldroot> parameter"
+ echo
+ echo "$self: Preparing subtree rebase"
+ git config follow.tree | while read from to restofline; do
+ if test "x#" = "x$(echo "$from" | sed -n '1s/^\(.\).*/\1/p')"; then continue; fi
+ gf_branch "$from"
+ gf_branch "$to"
+ done
+ gitk --all
+ echo
+ echo "$self: Executing subtree rebase"
+ git config follow.tree | while read from to restofline; do
+ if test "x#" = "x$(echo "$from" | sed -n '1s/^\(.\).*/\1/p')"; then continue; fi
+ cmd git-rebase --onto "$from" "follow-old/$from" "$to"
+ done
+ gitk --all
+ echo
+ echo "$self: Cleaning up after subtree rebase"
+ git config follow.tree | while read from to restofline; do
+ if test "x#" = "x$(echo "$from" | sed -n '1s/^\(.\).*/\1/p')"; then continue; fi
+ gf_rmbranch "$from"
+ gf_rmbranch "$to"
+ done
+ gitk --all
+}
+
+
+# The great command case
+command="$1"
+if shift; then
+ case "$command" in
+ rebase-subtree)
+ gf_init
+ gf_rebase_tree "$@"
+ ;;
+ *)
+ die "Invalid command line parameter: \"$command\""
+ ;;
+ esac
+else
+ gf_init
+fi
+
+# End of file.