X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=git-checkout-script;h=9feff149acc87326e13f96db17257235e78c42db;hb=ff3412ee1f74cc267e6d65c03c5fd8ea2214fbe7;hp=870b1a3ef9ad71699ee0a6c967e91eaab0932573;hpb=ef0bfa25e99627b809c0902d21072821955db3fe;p=git.git diff --git a/git-checkout-script b/git-checkout-script index 870b1a3e..9feff149 100755 --- a/git-checkout-script +++ b/git-checkout-script @@ -1,18 +1,28 @@ #!/bin/sh -: ${GIT_DIR=.git} +. git-sh-setup-script || die "Not a git archive" + old=$(git-rev-parse HEAD) new= force= branch= +newbranch= while [ "$#" != "0" ]; do arg="$1" shift case "$arg" in + "-b") + newbranch="$1" + shift + [ -z "$newbranch" ] && + die "git checkout: -b needs a branch name" + [ -e "$GIT_DIR/refs/heads/$newbranch" ] && + die "git checkout: branch $newbranch already exists" + ;; "-f") force=1 ;; *) - rev=$(git-rev-parse "$arg") + rev=$(git-rev-parse --verify "$arg^0") || exit if [ -z "$rev" ]; then echo "unknown flag $arg" exit 1 @@ -22,7 +32,7 @@ while [ "$#" != "0" ]; do exit 1 fi new="$rev" - if [ -f "$GIT_DIR/revs/heads/$arg" ]; then + if [ -f "$GIT_DIR/refs/heads/$arg" ]; then branch="$arg" fi ;; @@ -31,6 +41,16 @@ while [ "$#" != "0" ]; do done [ -z "$new" ] && new=$old +# +# If we don't have an old branch that we're switching to, +# and we don't have a new branch name for the target we +# are switching to, then we'd better just be checking out +# what we already had +# +[ -z "$branch$newbranch" ] && + [ "$new" != "$old" ] && + die "git checkout: you need to specify a new branch name" + if [ "$force" ] then git-read-tree --reset $new && @@ -46,6 +66,12 @@ fi # be based on them, since we re-set the index) # if [ "$?" -eq 0 ]; then + if [ "$newbranch" ]; then + echo $new > "$GIT_DIR/refs/heads/$newbranch" + branch="$newbranch" + fi [ "$branch" ] && ln -sf "refs/heads/$branch" "$GIT_DIR/HEAD" rm -f "$GIT_DIR/MERGE_HEAD" +else + exit 1 fi