chiark / gitweb /
help: use pager
[topgit.git] / tg-create.sh
index 2cab492d2be88aad03e5b5aa7b4101162ee645a7..2edd5379d54c9cc533a0904dafc51b6f566e728c 100644 (file)
@@ -7,6 +7,7 @@ deps= # List of dependent branches
 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
@@ -14,8 +15,10 @@ name=
 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
@@ -27,6 +30,20 @@ while [ -n "$1" ]; do
 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# }"
@@ -61,9 +78,9 @@ done
 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#* }"
@@ -124,3 +141,5 @@ git add -f "$root_dir/.topmsg"
 
 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"
+
+# vim:noet