restarted= # Set to 1 if we are picking up in the middle of base setup
merge= # List of branches to be merged; subset of $deps
name=
+rname= # Remote branch to base this one on
## Parse options
while [ -n "$1" ]; do
arg="$1"; shift
case "$arg" in
+ -r)
+ rname="$1"; shift;;
-*)
- echo "Usage: tg create NAME [DEPS...]" >&2
+ echo "Usage: tg [...] create NAME [DEPS...|-r RNAME]" >&2
exit 1;;
*)
if [ -z "$name" ]; then
done
+## Fast-track creating branches based on remote ones
+
+if [ -n "$rname" ]; then
+ [ -n "$name" ] || die "no branch name given"
+ ! ref_exists "$name" || die "branch '$name' already exists"
+ has_remote "$rname" || die "no branch $rname in remote $base_remote"
+
+ git update-ref "refs/top-bases/$name" "refs/remotes/$base_remote/top-bases/$rname"
+ git update-ref "refs/heads/$name" "refs/remotes/$base_remote/$rname"
+ info "Topic branch $name based on $base_remote : $rname set up."
+ exit 0
+fi
+
+
## Auto-guess dependencies
deps="${deps# }"
[ -n "$merge" -o -n "$restarted" ] || merge="$deps "
for d in $deps; do
- git rev-parse --verify "$d" >/dev/null 2>&1 ||
+ ref_exists "$d" ||
die "unknown branch dependency '$d'"
done
-! git rev-parse --verify "$name" >/dev/null 2>&1 ||
+! ref_exists "$name" ||
die "branch '$name' already exists"
# Clean up any stale stuff
rm -f "$git_dir/top-name" "$git_dir/top-deps" "$git_dir/top-merge"
-## Create base
+## Find starting commit to create the base
-if [ -n "$merge" ]; then
+if [ -n "$merge" -a -z "$restarted" ]; then
# Unshift the first item from the to-merge list
branch="${merge%% *}"
merge="${merge#* }"
info "Merging $name base with $branch..."
if ! git merge "$branch"; then
- info "Please commit merge resolution and call: tg create"
+ info "Please commit merge resolution and call: $tg create"
info "It is also safe to abort this operation using:"
info "git reset --hard some_branch"
info "(You are on a detached HEAD now.)"
info "Topic branch $name set up. Please fill .topmsg now and make initial commit."
-info "To abort: git rm -f .top* && git checkout ${deps%% *} && tg delete $name"
+info "To abort: git rm -f .top* && git checkout ${deps%% *} && $tg delete $name"
+
+# vim:noet