X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=git-branch.sh;h=5306b2719ffbedfa077f4d5489ab46448ef5c186;hb=4275df517022604f5c33ba05ae45a885b84e3472;hp=dcec2a9f2f0e379cff152cb70ddf6c2c942d1c99;hpb=c1067050ce58b5b39f528fe634732da858664603;p=git.git diff --git a/git-branch.sh b/git-branch.sh index dcec2a9f..5306b271 100755 --- a/git-branch.sh +++ b/git-branch.sh @@ -1,9 +1,14 @@ #!/bin/sh -. git-sh-setup || die "Not a git archive" +GIT_DIR=`git-rev-parse --git-dir` || exit $? + +die () { + echo >&2 "$*" + exit 1 +} usage () { - echo >&2 "usage: $(basename $0)"' [-d ] | [ [start-point]] + echo >&2 "usage: $(basename $0)"' [-d ] | [[-f] [start-point]] If no arguments, show available branches and mark current branch with a star. If one argument, create a new branch based off of current HEAD. @@ -12,48 +17,57 @@ If two arguments, create a new branch based off of . exit 1 } +headref=$(git-symbolic-ref HEAD | sed -e 's|^refs/heads/||') + delete_branch () { - option="$1" branch_name="$2" - headref=$(readlink "$GIT_DIR/HEAD" | sed -e 's|^refs/heads/||') - case ",$headref," in - ",$branch_name,") - die "Cannot delete the branch you are on." ;; - ,,) - die "What branch are you on anyway?" ;; - esac - branch=$(cat "$GIT_DIR/refs/heads/$branch_name") && - branch=$(git-rev-parse --verify "$branch^0") || - die "Seriously, what branch are you talking about?" - case "$option" in - -D) - ;; - *) - mbs=$(git-merge-base -a "$branch" HEAD | tr '\012' ' ') - case " $mbs " in - *' '$branch' '*) - # the merge base of branch and HEAD contains branch -- - # which means that the HEAD contains everything in the HEAD. + option="$1" + shift + for branch_name + do + case ",$headref," in + ",$branch_name,") + die "Cannot delete the branch you are on." ;; + ,,) + die "What branch are you on anyway?" ;; + esac + branch=$(cat "$GIT_DIR/refs/heads/$branch_name") && + branch=$(git-rev-parse --verify "$branch^0") || + die "Seriously, what branch are you talking about?" + case "$option" in + -D) ;; *) - echo >&2 "The branch '$branch_name' is not a strict subset of your current HEAD. -If you are sure you want to delete it, run 'git branch -D $branch_name'." - exit 1 + mbs=$(git-merge-base -a "$branch" HEAD | tr '\012' ' ') + case " $mbs " in + *' '$branch' '*) + # the merge base of branch and HEAD contains branch -- + # which means that the HEAD contains everything in the HEAD. + ;; + *) + echo >&2 "The branch '$branch_name' is not a strict subset of your current HEAD. + If you are sure you want to delete it, run 'git branch -D $branch_name'." + exit 1 + ;; + esac ;; esac - ;; - esac - rm -f "$GIT_DIR/refs/heads/$branch_name" - echo "Deleted branch $branch_name." + rm -f "$GIT_DIR/refs/heads/$branch_name" + echo "Deleted branch $branch_name." + done exit 0 } +force= while case "$#,$1" in 0,*) break ;; *,-*) ;; *) break ;; esac do case "$1" in -d | -D) - delete_branch "$1" "$2" + delete_branch "$@" exit ;; + -f) + force="$1" + ;; --) shift break @@ -67,7 +81,6 @@ done case "$#" in 0) - headref=$(readlink "$GIT_DIR/HEAD" | sed -e 's|^refs/heads/||') git-rev-parse --symbolic --all | sed -ne 's|^refs/heads/||p' | sort | @@ -91,6 +104,17 @@ branchname="$1" rev=$(git-rev-parse --verify "$head") || exit -[ -e "$GIT_DIR/refs/heads/$branchname" ] && die "$branchname already exists" +git-check-ref-format "heads/$branchname" || + die "we do not like '$branchname' as a branch name." -echo $rev > "$GIT_DIR/refs/heads/$branchname" +if [ -e "$GIT_DIR/refs/heads/$branchname" ] +then + if test '' = "$force" + then + die "$branchname already exists." + elif test "$branchname" = "$headref" + then + die "cannot force-update the current branch." + fi +fi +git update-ref "refs/heads/$branchname" $rev