Linus Torvalds | 65f0d0e | 2005-04-25 15:23:53 -0700 | [diff] [blame] | 1 | #!/bin/sh |
Junio C Hamano | 8ac069a | 2005-05-09 22:57:58 -0700 | [diff] [blame] | 2 | # Copyright (c) 2005 Linus Torvalds |
| 3 | |
Junio C Hamano | 215a7ad | 2005-09-07 17:26:23 -0700 | [diff] [blame] | 4 | . git-sh-setup || die "Not a git archive" |
Linus Torvalds | d727782 | 2005-07-23 15:21:22 -0700 | [diff] [blame] | 5 | |
Junio C Hamano | 0fad0fd | 2005-07-25 15:18:35 -0700 | [diff] [blame] | 6 | usage () { |
Junio C Hamano | 215a7ad | 2005-09-07 17:26:23 -0700 | [diff] [blame] | 7 | echo >&2 "Usage: git-tag [-a | -s] [-f] [-m "tag message"] tagname" |
Junio C Hamano | 0fad0fd | 2005-07-25 15:18:35 -0700 | [diff] [blame] | 8 | exit 1 |
| 9 | } |
| 10 | |
| 11 | annotate= |
Linus Torvalds | d727782 | 2005-07-23 15:21:22 -0700 | [diff] [blame] | 12 | signed= |
| 13 | force= |
Chris Wright | c882bc9 | 2005-08-08 17:04:42 -0700 | [diff] [blame] | 14 | message= |
Linus Torvalds | d727782 | 2005-07-23 15:21:22 -0700 | [diff] [blame] | 15 | while case "$#" in 0) break ;; esac |
| 16 | do |
| 17 | case "$1" in |
Junio C Hamano | 0fad0fd | 2005-07-25 15:18:35 -0700 | [diff] [blame] | 18 | -a) |
| 19 | annotate=1 |
| 20 | ;; |
Linus Torvalds | d727782 | 2005-07-23 15:21:22 -0700 | [diff] [blame] | 21 | -s) |
Junio C Hamano | 0fad0fd | 2005-07-25 15:18:35 -0700 | [diff] [blame] | 22 | annotate=1 |
Linus Torvalds | d727782 | 2005-07-23 15:21:22 -0700 | [diff] [blame] | 23 | signed=1 |
| 24 | ;; |
| 25 | -f) |
| 26 | force=1 |
| 27 | ;; |
Chris Wright | c882bc9 | 2005-08-08 17:04:42 -0700 | [diff] [blame] | 28 | -m) |
| 29 | annotate=1 |
| 30 | shift |
| 31 | message="$1" |
| 32 | ;; |
Junio C Hamano | 0fad0fd | 2005-07-25 15:18:35 -0700 | [diff] [blame] | 33 | -*) |
| 34 | usage |
| 35 | ;; |
Linus Torvalds | d727782 | 2005-07-23 15:21:22 -0700 | [diff] [blame] | 36 | *) |
| 37 | break |
| 38 | ;; |
| 39 | esac |
| 40 | shift |
| 41 | done |
| 42 | |
Linus Torvalds | 918c05f | 2005-07-08 18:23:06 -0700 | [diff] [blame] | 43 | name="$1" |
Junio C Hamano | 0fad0fd | 2005-07-25 15:18:35 -0700 | [diff] [blame] | 44 | [ "$name" ] || usage |
| 45 | if [ -e "$GIT_DIR/refs/tags/$name" -a -z "$force" ]; then |
| 46 | die "tag '$name' already exists" |
| 47 | fi |
Linus Torvalds | d727782 | 2005-07-23 15:21:22 -0700 | [diff] [blame] | 48 | shift |
Junio C Hamano | 8ac069a | 2005-05-09 22:57:58 -0700 | [diff] [blame] | 49 | |
Junio C Hamano | 2ad77e6 | 2005-08-15 15:37:37 -0700 | [diff] [blame] | 50 | object=$(git-rev-parse --verify --default HEAD "$@") || exit 1 |
Junio C Hamano | 0fc65a4 | 2005-04-29 16:25:05 -0700 | [diff] [blame] | 51 | type=$(git-cat-file -t $object) || exit 1 |
Eric W. Biederman | c818566 | 2005-07-14 19:02:10 -0600 | [diff] [blame] | 52 | tagger=$(git-var GIT_COMMITTER_IDENT) || exit 1 |
Linus Torvalds | 918c05f | 2005-07-08 18:23:06 -0700 | [diff] [blame] | 53 | |
Junio C Hamano | 0fad0fd | 2005-07-25 15:18:35 -0700 | [diff] [blame] | 54 | trap 'rm -f .tmp-tag* .tagmsg .editmsg' 0 |
| 55 | |
| 56 | if [ "$annotate" ]; then |
Chris Wright | c882bc9 | 2005-08-08 17:04:42 -0700 | [diff] [blame] | 57 | if [ -z "$message" ]; then |
| 58 | ( echo "#" |
| 59 | echo "# Write a tag message" |
| 60 | echo "#" ) > .editmsg |
| 61 | ${VISUAL:-${EDITOR:-vi}} .editmsg || exit |
| 62 | else |
| 63 | echo "$message" > .editmsg |
| 64 | fi |
Linus Torvalds | 918c05f | 2005-07-08 18:23:06 -0700 | [diff] [blame] | 65 | |
Linus Torvalds | d727782 | 2005-07-23 15:21:22 -0700 | [diff] [blame] | 66 | grep -v '^#' < .editmsg | git-stripspace > .tagmsg |
Linus Torvalds | 918c05f | 2005-07-08 18:23:06 -0700 | [diff] [blame] | 67 | |
Linus Torvalds | d727782 | 2005-07-23 15:21:22 -0700 | [diff] [blame] | 68 | [ -s .tagmsg ] || exit |
Linus Torvalds | 918c05f | 2005-07-08 18:23:06 -0700 | [diff] [blame] | 69 | |
Linus Torvalds | d727782 | 2005-07-23 15:21:22 -0700 | [diff] [blame] | 70 | ( echo -e "object $object\ntype $type\ntag $name\ntagger $tagger\n"; cat .tagmsg ) > .tmp-tag |
| 71 | rm -f .tmp-tag.asc .tagmsg |
Junio C Hamano | 0fad0fd | 2005-07-25 15:18:35 -0700 | [diff] [blame] | 72 | if [ "$signed" ]; then |
| 73 | me=$(expr "$tagger" : '\(.*>\)') && |
| 74 | gpg -bsa -u "$me" .tmp-tag && |
| 75 | cat .tmp-tag.asc >>.tmp-tag || |
| 76 | die "failed to sign the tag with GPG." |
| 77 | fi |
Linus Torvalds | d727782 | 2005-07-23 15:21:22 -0700 | [diff] [blame] | 78 | object=$(git-mktag < .tmp-tag) |
Linus Torvalds | d727782 | 2005-07-23 15:21:22 -0700 | [diff] [blame] | 79 | fi |
| 80 | |
Eric W. Biederman | ec3f5a4 | 2005-07-14 19:00:15 -0600 | [diff] [blame] | 81 | mkdir -p "$GIT_DIR/refs/tags" |
Linus Torvalds | d727782 | 2005-07-23 15:21:22 -0700 | [diff] [blame] | 82 | echo $object > "$GIT_DIR/refs/tags/$name" |