| Linus Torvalds | 37f1a51 | 2005-07-12 04:30:23 | [diff] [blame] | 1 | #!/bin/sh |
| 2 | |
| Fredrik Kuivinen | 075dd8e | 2006-01-29 14:02:51 | [diff] [blame] | 3 | USAGE='[(-d | -D) <branchname>] | [[-f] <branchname> [<start-point>]]' |
| Fredrik Kuivinen | d025524 | 2005-12-11 09:55:49 | [diff] [blame] | 4 | LONG_USAGE='If no arguments, show available branches and mark current branch with a star. |
| Amos Waterland | a3b427b | 2005-09-08 02:13:26 | [diff] [blame] | 5 | If one argument, create a new branch <branchname> based off of current HEAD. |
| Fredrik Kuivinen | d025524 | 2005-12-11 09:55:49 | [diff] [blame] | 6 | If two arguments, create a new branch <branchname> based off of <start-point>.' |
| 7 | |
| 8 | SUBDIRECTORY_OK='Yes' |
| 9 | . git-sh-setup |
| Amos Waterland | a3b427b | 2005-09-08 02:13:26 | [diff] [blame] | 10 | |
| Junio C Hamano | 9cc2527 | 2005-11-28 07:16:15 | [diff] [blame] | 11 | headref=$(git-symbolic-ref HEAD | sed -e 's|^refs/heads/||') |
| Junio C Hamano | eb77761 | 2005-11-11 19:12:50 | [diff] [blame] | 12 | |
| Junio C Hamano | ba65af9 | 2005-09-14 08:43:53 | [diff] [blame] | 13 | delete_branch () { |
| Junio C Hamano | 03feddd | 2005-10-14 01:57:39 | [diff] [blame] | 14 | option="$1" |
| 15 | shift |
| Junio C Hamano | 03feddd | 2005-10-14 01:57:39 | [diff] [blame] | 16 | for branch_name |
| 17 | do |
| 18 | case ",$headref," in |
| 19 | ",$branch_name,") |
| 20 | die "Cannot delete the branch you are on." ;; |
| 21 | ,,) |
| 22 | die "What branch are you on anyway?" ;; |
| 23 | esac |
| 24 | branch=$(cat "$GIT_DIR/refs/heads/$branch_name") && |
| 25 | branch=$(git-rev-parse --verify "$branch^0") || |
| 26 | die "Seriously, what branch are you talking about?" |
| 27 | case "$option" in |
| 28 | -D) |
| Junio C Hamano | ba65af9 | 2005-09-14 08:43:53 | [diff] [blame] | 29 | ;; |
| 30 | *) |
| Junio C Hamano | 03feddd | 2005-10-14 01:57:39 | [diff] [blame] | 31 | mbs=$(git-merge-base -a "$branch" HEAD | tr '\012' ' ') |
| 32 | case " $mbs " in |
| 33 | *' '$branch' '*) |
| 34 | # the merge base of branch and HEAD contains branch -- |
| Junio C Hamano | 01385e2 | 2005-12-17 07:12:33 | [diff] [blame] | 35 | # which means that the HEAD contains everything in both. |
| Junio C Hamano | 03feddd | 2005-10-14 01:57:39 | [diff] [blame] | 36 | ;; |
| 37 | *) |
| 38 | echo >&2 "The branch '$branch_name' is not a strict subset of your current HEAD. |
| Junio C Hamano | 01385e2 | 2005-12-17 07:12:33 | [diff] [blame] | 39 | If you are sure you want to delete it, run 'git branch -D $branch_name'." |
| Junio C Hamano | 03feddd | 2005-10-14 01:57:39 | [diff] [blame] | 40 | exit 1 |
| 41 | ;; |
| 42 | esac |
| Junio C Hamano | ba65af9 | 2005-09-14 08:43:53 | [diff] [blame] | 43 | ;; |
| 44 | esac |
| Junio C Hamano | 03feddd | 2005-10-14 01:57:39 | [diff] [blame] | 45 | rm -f "$GIT_DIR/refs/heads/$branch_name" |
| 46 | echo "Deleted branch $branch_name." |
| 47 | done |
| Junio C Hamano | ba65af9 | 2005-09-14 08:43:53 | [diff] [blame] | 48 | exit 0 |
| 49 | } |
| 50 | |
| Junio C Hamano | eb77761 | 2005-11-11 19:12:50 | [diff] [blame] | 51 | force= |
| Junio C Hamano | ba65af9 | 2005-09-14 08:43:53 | [diff] [blame] | 52 | while case "$#,$1" in 0,*) break ;; *,-*) ;; *) break ;; esac |
| 53 | do |
| 54 | case "$1" in |
| 55 | -d | -D) |
| Junio C Hamano | 03feddd | 2005-10-14 01:57:39 | [diff] [blame] | 56 | delete_branch "$@" |
| Junio C Hamano | ba65af9 | 2005-09-14 08:43:53 | [diff] [blame] | 57 | exit |
| 58 | ;; |
| Junio C Hamano | eb77761 | 2005-11-11 19:12:50 | [diff] [blame] | 59 | -f) |
| 60 | force="$1" |
| 61 | ;; |
| Junio C Hamano | ba65af9 | 2005-09-14 08:43:53 | [diff] [blame] | 62 | --) |
| 63 | shift |
| 64 | break |
| 65 | ;; |
| 66 | -*) |
| 67 | usage |
| 68 | ;; |
| 69 | esac |
| 70 | shift |
| 71 | done |
| 72 | |
| Kalle Valo | e4aec26 | 2005-08-16 17:58:10 | [diff] [blame] | 73 | case "$#" in |
| 74 | 0) |
| Kalle Valo | e4aec26 | 2005-08-16 17:58:10 | [diff] [blame] | 75 | git-rev-parse --symbolic --all | |
| 76 | sed -ne 's|^refs/heads/||p' | |
| 77 | sort | |
| 78 | while read ref |
| 79 | do |
| 80 | if test "$headref" = "$ref" |
| 81 | then |
| 82 | pfx='*' |
| 83 | else |
| 84 | pfx=' ' |
| 85 | fi |
| 86 | echo "$pfx $ref" |
| 87 | done |
| 88 | exit 0 ;; |
| 89 | 1) |
| Junio C Hamano | a38e727 | 2005-07-23 02:08:47 | [diff] [blame] | 90 | head=HEAD ;; |
| Kalle Valo | e4aec26 | 2005-08-16 17:58:10 | [diff] [blame] | 91 | 2) |
| Junio C Hamano | a38e727 | 2005-07-23 02:08:47 | [diff] [blame] | 92 | head="$2^0" ;; |
| 93 | esac |
| Kalle Valo | e4aec26 | 2005-08-16 17:58:10 | [diff] [blame] | 94 | branchname="$1" |
| Amos Waterland | a3b427b | 2005-09-08 02:13:26 | [diff] [blame] | 95 | |
| Junio C Hamano | ff84d32 | 2005-08-24 21:31:36 | [diff] [blame] | 96 | rev=$(git-rev-parse --verify "$head") || exit |
| Linus Torvalds | 37f1a51 | 2005-07-12 04:30:23 | [diff] [blame] | 97 | |
| Junio C Hamano | 03feddd | 2005-10-14 01:57:39 | [diff] [blame] | 98 | git-check-ref-format "heads/$branchname" || |
| 99 | die "we do not like '$branchname' as a branch name." |
| Linus Torvalds | 37f1a51 | 2005-07-12 04:30:23 | [diff] [blame] | 100 | |
| Junio C Hamano | eb77761 | 2005-11-11 19:12:50 | [diff] [blame] | 101 | if [ -e "$GIT_DIR/refs/heads/$branchname" ] |
| 102 | then |
| 103 | if test '' = "$force" |
| 104 | then |
| 105 | die "$branchname already exists." |
| 106 | elif test "$branchname" = "$headref" |
| 107 | then |
| 108 | die "cannot force-update the current branch." |
| 109 | fi |
| 110 | fi |
| Alex Riesen | 08db81a | 2005-11-14 22:10:59 | [diff] [blame] | 111 | git update-ref "refs/heads/$branchname" $rev |