X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=git-checkout-script;h=4b3ae4adc262a7255882d4faff09c0e3a5f5afad;hb=180926636e47ecfe28d03cec493af75899994f0f;hp=e8e777f1f23e71fde909ce0d831d4a319993c0ab;hpb=303e5f4c325d008c68e5e70e901ab68b289ade2e;p=git.git diff --git a/git-checkout-script b/git-checkout-script index e8e777f1..4b3ae4ad 100755 --- a/git-checkout-script +++ b/git-checkout-script @@ -1,30 +1,51 @@ #!/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 "$@")) - -i=0 -force=0 -while [ $i -lt ${#args} ]; do - case "${args[$i]}" in +new= +force= +branch= +while [ "$#" != "0" ]; do + arg="$1" + shift + case "$arg" in "-f") - force=1;; - "") + force=1 ;; *) - echo "unknown flag ${args[$i]}" - exit 1;; + rev=$(git-rev-parse "$arg") + 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 [ "$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 + [ "$branch" ] && ln -sf "refs/heads/$branch" "$GIT_DIR/HEAD" + rm -f "$GIT_DIR/MERGE_HEAD" fi