X-Git-Url: https://git.octo.it/?a=blobdiff_plain;ds=sidebyside;f=git-checkout-script;h=a37740713ed747a18b7ee5415e41e5bd57834c48;hb=623c8a1460125f66274f451691b3576b0d0f7a4c;hp=e8e777f1f23e71fde909ce0d831d4a319993c0ab;hpb=303e5f4c325d008c68e5e70e901ab68b289ade2e;p=git.git diff --git a/git-checkout-script b/git-checkout-script index e8e777f1..a3774071 100755 --- a/git-checkout-script +++ b/git-checkout-script @@ -1,30 +1,75 @@ #!/bin/sh -: ${GIT_DIR=.git} -old=$(git-rev-parse HEAD) -new=$(git-rev-parse --revs-only "$@") -new=${new:-$old} -args=($(git-rev-parse --no-revs "$@")) +. git-sh-setup-script || die "Not a git archive" -i=0 -force=0 -while [ $i -lt ${#args} ]; do - case "${args[$i]}" in +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;; - "") + force=1 ;; *) - echo "unknown flag ${args[$i]}" - exit 1;; + rev=$(git-rev-parse --verify "$arg^0") || exit + if [ -z "$rev" ]; then + echo "unknown flag $arg" + exit 1 + fi + if [ "$new" ]; then + echo "Multiple revisions?" + exit 1 + fi + new="$rev" + if [ -f "$GIT_DIR/refs/heads/$arg" ]; then + branch="$arg" + fi + ;; esac i=$(($i+1)) done +[ -z "$new" ] && new=$old -if $force +# +# 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 && - git-checkout-cache -q -f -u -a && - echo $new > "$GIT_DIR/HEAD" + git-checkout-cache -q -f -u -a else - git-read-tree -m -u $old $new && echo $new > "$GIT_DIR/HEAD" + git-read-tree -m -u $old $new +fi + +# +# Switch the HEAD pointer to the new branch if it we +# checked out a branch head, and remove any potential +# old MERGE_HEAD's (subsequent commits will clearly not +# 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" fi