Linus Torvalds | 37f1a51 | 2005-07-11 21:30:23 -0700 | [diff] [blame] | 1 | #!/bin/sh |
| 2 | |
Sean Estabrooks | 2eaf273 | 2006-04-28 09:15:04 -0400 | [diff] [blame] | 3 | USAGE='[(-d | -D) <branchname>] | [[-f] <branchname> [<start-point>]] | -r' |
Fredrik Kuivinen | d025524 | 2005-12-11 10:55:49 +0100 | [diff] [blame] | 4 | LONG_USAGE='If no arguments, show available branches and mark current branch with a star. |
Amos Waterland | a3b427b | 2005-09-07 21:13:26 -0500 | [diff] [blame] | 5 | If one argument, create a new branch <branchname> based off of current HEAD. |
Fredrik Kuivinen | d025524 | 2005-12-11 10:55:49 +0100 | [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-07 21:13:26 -0500 | [diff] [blame] | 10 | |
Junio C Hamano | 9cc2527 | 2005-11-27 23:16:15 -0800 | [diff] [blame] | 11 | headref=$(git-symbolic-ref HEAD | sed -e 's|^refs/heads/||') |
Junio C Hamano | eb77761 | 2005-11-11 11:12:50 -0800 | [diff] [blame] | 12 | |
Junio C Hamano | ba65af9 | 2005-09-14 01:43:53 -0700 | [diff] [blame] | 13 | delete_branch () { |
Junio C Hamano | 03feddd | 2005-10-13 18:57:39 -0700 | [diff] [blame] | 14 | option="$1" |
| 15 | shift |
Junio C Hamano | 03feddd | 2005-10-13 18:57:39 -0700 | [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 01:43:53 -0700 | [diff] [blame] | 29 | ;; |
| 30 | *) |
Junio C Hamano | 03feddd | 2005-10-13 18:57:39 -0700 | [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-16 23:12:33 -0800 | [diff] [blame] | 35 | # which means that the HEAD contains everything in both. |
Junio C Hamano | 03feddd | 2005-10-13 18:57:39 -0700 | [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-16 23:12:33 -0800 | [diff] [blame] | 39 | If you are sure you want to delete it, run 'git branch -D $branch_name'." |
Junio C Hamano | 03feddd | 2005-10-13 18:57:39 -0700 | [diff] [blame] | 40 | exit 1 |
| 41 | ;; |
| 42 | esac |
Junio C Hamano | ba65af9 | 2005-09-14 01:43:53 -0700 | [diff] [blame] | 43 | ;; |
| 44 | esac |
Junio C Hamano | 03feddd | 2005-10-13 18:57:39 -0700 | [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 01:43:53 -0700 | [diff] [blame] | 48 | exit 0 |
| 49 | } |
| 50 | |
Eric Wong | fd8fc4a | 2006-03-02 12:23:17 -0800 | [diff] [blame] | 51 | ls_remote_branches () { |
| 52 | git-rev-parse --symbolic --all | |
| 53 | sed -ne 's|^refs/\(remotes/\)|\1|p' | |
| 54 | sort |
| 55 | } |
| 56 | |
Junio C Hamano | eb77761 | 2005-11-11 11:12:50 -0800 | [diff] [blame] | 57 | force= |
Junio C Hamano | ba65af9 | 2005-09-14 01:43:53 -0700 | [diff] [blame] | 58 | while case "$#,$1" in 0,*) break ;; *,-*) ;; *) break ;; esac |
| 59 | do |
| 60 | case "$1" in |
| 61 | -d | -D) |
Junio C Hamano | 03feddd | 2005-10-13 18:57:39 -0700 | [diff] [blame] | 62 | delete_branch "$@" |
Junio C Hamano | ba65af9 | 2005-09-14 01:43:53 -0700 | [diff] [blame] | 63 | exit |
| 64 | ;; |
Eric Wong | fd8fc4a | 2006-03-02 12:23:17 -0800 | [diff] [blame] | 65 | -r) |
| 66 | ls_remote_branches |
| 67 | exit |
| 68 | ;; |
Junio C Hamano | eb77761 | 2005-11-11 11:12:50 -0800 | [diff] [blame] | 69 | -f) |
| 70 | force="$1" |
| 71 | ;; |
Junio C Hamano | ba65af9 | 2005-09-14 01:43:53 -0700 | [diff] [blame] | 72 | --) |
| 73 | shift |
| 74 | break |
| 75 | ;; |
| 76 | -*) |
| 77 | usage |
| 78 | ;; |
| 79 | esac |
| 80 | shift |
| 81 | done |
| 82 | |
Kalle Valo | e4aec26 | 2005-08-16 20:58:10 +0300 | [diff] [blame] | 83 | case "$#" in |
| 84 | 0) |
Sean | a62be77 | 2006-05-13 21:43:00 -0400 | [diff] [blame] | 85 | git-rev-parse --symbolic --branches | |
Kalle Valo | e4aec26 | 2005-08-16 20:58:10 +0300 | [diff] [blame] | 86 | sort | |
| 87 | while read ref |
| 88 | do |
| 89 | if test "$headref" = "$ref" |
| 90 | then |
| 91 | pfx='*' |
| 92 | else |
| 93 | pfx=' ' |
| 94 | fi |
| 95 | echo "$pfx $ref" |
| 96 | done |
| 97 | exit 0 ;; |
| 98 | 1) |
Junio C Hamano | a38e727 | 2005-07-22 19:08:47 -0700 | [diff] [blame] | 99 | head=HEAD ;; |
Kalle Valo | e4aec26 | 2005-08-16 20:58:10 +0300 | [diff] [blame] | 100 | 2) |
Junio C Hamano | a38e727 | 2005-07-22 19:08:47 -0700 | [diff] [blame] | 101 | head="$2^0" ;; |
| 102 | esac |
Kalle Valo | e4aec26 | 2005-08-16 20:58:10 +0300 | [diff] [blame] | 103 | branchname="$1" |
Amos Waterland | a3b427b | 2005-09-07 21:13:26 -0500 | [diff] [blame] | 104 | |
Junio C Hamano | ff84d32 | 2005-08-24 14:31:36 -0700 | [diff] [blame] | 105 | rev=$(git-rev-parse --verify "$head") || exit |
Linus Torvalds | 37f1a51 | 2005-07-11 21:30:23 -0700 | [diff] [blame] | 106 | |
Junio C Hamano | 03feddd | 2005-10-13 18:57:39 -0700 | [diff] [blame] | 107 | git-check-ref-format "heads/$branchname" || |
| 108 | die "we do not like '$branchname' as a branch name." |
Linus Torvalds | 37f1a51 | 2005-07-11 21:30:23 -0700 | [diff] [blame] | 109 | |
Junio C Hamano | eb77761 | 2005-11-11 11:12:50 -0800 | [diff] [blame] | 110 | if [ -e "$GIT_DIR/refs/heads/$branchname" ] |
| 111 | then |
| 112 | if test '' = "$force" |
| 113 | then |
| 114 | die "$branchname already exists." |
| 115 | elif test "$branchname" = "$headref" |
| 116 | then |
| 117 | die "cannot force-update the current branch." |
| 118 | fi |
| 119 | fi |
Shawn Pearce | 67644a4 | 2006-05-19 05:16:18 -0400 | [diff] [blame^] | 120 | git update-ref -m "branch: Created from $head" "refs/heads/$branchname" $rev |