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 | 7ea2fc4 | 2005-11-27 23:19:06 -0800 | [diff] [blame] | 4 | GIT_DIR=`git-rev-parse --git-dir` || exit $? |
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 () { |
Kai Ruemmler | 61f8151 | 2005-11-08 11:44:33 +0100 | [diff] [blame] | 7 | echo >&2 "Usage: git-tag [-a | -s | -u <key-id>] [-f | -d] [-m <msg>] <tagname> [<head>]" |
Junio C Hamano | 0fad0fd | 2005-07-25 15:18:35 -0700 | [diff] [blame] | 8 | exit 1 |
| 9 | } |
| 10 | |
Junio C Hamano | d165fa1 | 2005-11-27 23:33:54 -0800 | [diff] [blame^] | 11 | die () { |
| 12 | echo >&2 "$*" |
| 13 | exit 1 |
| 14 | } |
| 15 | |
Junio C Hamano | 0fad0fd | 2005-07-25 15:18:35 -0700 | [diff] [blame] | 16 | annotate= |
Linus Torvalds | d727782 | 2005-07-23 15:21:22 -0700 | [diff] [blame] | 17 | signed= |
| 18 | force= |
Chris Wright | c882bc9 | 2005-08-08 17:04:42 -0700 | [diff] [blame] | 19 | message= |
Linus Torvalds | bc162e4 | 2005-10-06 14:10:39 -0700 | [diff] [blame] | 20 | username= |
Linus Torvalds | d727782 | 2005-07-23 15:21:22 -0700 | [diff] [blame] | 21 | while case "$#" in 0) break ;; esac |
| 22 | do |
| 23 | case "$1" in |
Junio C Hamano | 0fad0fd | 2005-07-25 15:18:35 -0700 | [diff] [blame] | 24 | -a) |
| 25 | annotate=1 |
| 26 | ;; |
Linus Torvalds | d727782 | 2005-07-23 15:21:22 -0700 | [diff] [blame] | 27 | -s) |
Junio C Hamano | 0fad0fd | 2005-07-25 15:18:35 -0700 | [diff] [blame] | 28 | annotate=1 |
Linus Torvalds | d727782 | 2005-07-23 15:21:22 -0700 | [diff] [blame] | 29 | signed=1 |
| 30 | ;; |
| 31 | -f) |
| 32 | force=1 |
| 33 | ;; |
Chris Wright | c882bc9 | 2005-08-08 17:04:42 -0700 | [diff] [blame] | 34 | -m) |
| 35 | annotate=1 |
| 36 | shift |
| 37 | message="$1" |
| 38 | ;; |
Linus Torvalds | bc162e4 | 2005-10-06 14:10:39 -0700 | [diff] [blame] | 39 | -u) |
| 40 | annotate=1 |
| 41 | signed=1 |
| 42 | shift |
| 43 | username="$1" |
| 44 | ;; |
Kai Ruemmler | 61f8151 | 2005-11-08 11:44:33 +0100 | [diff] [blame] | 45 | -d) |
| 46 | shift |
| 47 | tag_name="$1" |
| 48 | rm "$GIT_DIR/refs/tags/$tag_name" && \ |
| 49 | echo "Deleted tag $tag_name." |
| 50 | exit $? |
| 51 | ;; |
Junio C Hamano | 0fad0fd | 2005-07-25 15:18:35 -0700 | [diff] [blame] | 52 | -*) |
| 53 | usage |
| 54 | ;; |
Linus Torvalds | d727782 | 2005-07-23 15:21:22 -0700 | [diff] [blame] | 55 | *) |
| 56 | break |
| 57 | ;; |
| 58 | esac |
| 59 | shift |
| 60 | done |
| 61 | |
Linus Torvalds | 918c05f | 2005-07-08 18:23:06 -0700 | [diff] [blame] | 62 | name="$1" |
Junio C Hamano | 0fad0fd | 2005-07-25 15:18:35 -0700 | [diff] [blame] | 63 | [ "$name" ] || usage |
| 64 | if [ -e "$GIT_DIR/refs/tags/$name" -a -z "$force" ]; then |
| 65 | die "tag '$name' already exists" |
| 66 | fi |
Linus Torvalds | d727782 | 2005-07-23 15:21:22 -0700 | [diff] [blame] | 67 | shift |
Junio C Hamano | 03feddd | 2005-10-13 18:57:39 -0700 | [diff] [blame] | 68 | git-check-ref-format "tags/$name" || |
| 69 | die "we do not like '$name' as a tag name." |
Junio C Hamano | 8ac069a | 2005-05-09 22:57:58 -0700 | [diff] [blame] | 70 | |
Junio C Hamano | 2ad77e6 | 2005-08-15 15:37:37 -0700 | [diff] [blame] | 71 | object=$(git-rev-parse --verify --default HEAD "$@") || exit 1 |
Junio C Hamano | 0fc65a4 | 2005-04-29 16:25:05 -0700 | [diff] [blame] | 72 | type=$(git-cat-file -t $object) || exit 1 |
Eric W. Biederman | c818566 | 2005-07-14 19:02:10 -0600 | [diff] [blame] | 73 | tagger=$(git-var GIT_COMMITTER_IDENT) || exit 1 |
Linus Torvalds | bc162e4 | 2005-10-06 14:10:39 -0700 | [diff] [blame] | 74 | : ${username:=$(expr "$tagger" : '\(.*>\)')} |
Linus Torvalds | 918c05f | 2005-07-08 18:23:06 -0700 | [diff] [blame] | 75 | |
Junio C Hamano | a10aad6 | 2005-11-03 15:26:43 -0800 | [diff] [blame] | 76 | trap 'rm -f "$GIT_DIR"/TAG_TMP* "$GIT_DIR"/TAG_FINALMSG "$GIT_DIR"/TAG_EDITMSG' 0 |
Junio C Hamano | 0fad0fd | 2005-07-25 15:18:35 -0700 | [diff] [blame] | 77 | |
| 78 | if [ "$annotate" ]; then |
Chris Wright | c882bc9 | 2005-08-08 17:04:42 -0700 | [diff] [blame] | 79 | if [ -z "$message" ]; then |
| 80 | ( echo "#" |
| 81 | echo "# Write a tag message" |
Junio C Hamano | a10aad6 | 2005-11-03 15:26:43 -0800 | [diff] [blame] | 82 | echo "#" ) > "$GIT_DIR"/TAG_EDITMSG |
| 83 | ${VISUAL:-${EDITOR:-vi}} "$GIT_DIR"/TAG_EDITMSG || exit |
Chris Wright | c882bc9 | 2005-08-08 17:04:42 -0700 | [diff] [blame] | 84 | else |
Junio C Hamano | a10aad6 | 2005-11-03 15:26:43 -0800 | [diff] [blame] | 85 | echo "$message" >"$GIT_DIR"/TAG_EDITMSG |
Chris Wright | c882bc9 | 2005-08-08 17:04:42 -0700 | [diff] [blame] | 86 | fi |
Linus Torvalds | 918c05f | 2005-07-08 18:23:06 -0700 | [diff] [blame] | 87 | |
Junio C Hamano | a10aad6 | 2005-11-03 15:26:43 -0800 | [diff] [blame] | 88 | grep -v '^#' <"$GIT_DIR"/TAG_EDITMSG | |
| 89 | git-stripspace >"$GIT_DIR"/TAG_FINALMSG |
Linus Torvalds | 918c05f | 2005-07-08 18:23:06 -0700 | [diff] [blame] | 90 | |
Junio C Hamano | a10aad6 | 2005-11-03 15:26:43 -0800 | [diff] [blame] | 91 | [ -s "$GIT_DIR"/TAG_FINALMSG ] || { |
Linus Torvalds | bc162e4 | 2005-10-06 14:10:39 -0700 | [diff] [blame] | 92 | echo >&2 "No tag message?" |
| 93 | exit 1 |
| 94 | } |
Linus Torvalds | 918c05f | 2005-07-08 18:23:06 -0700 | [diff] [blame] | 95 | |
Junio C Hamano | a10aad6 | 2005-11-03 15:26:43 -0800 | [diff] [blame] | 96 | ( echo -e "object $object\ntype $type\ntag $name\ntagger $tagger\n"; |
| 97 | cat "$GIT_DIR"/TAG_FINALMSG ) >"$GIT_DIR"/TAG_TMP |
| 98 | rm -f "$GIT_DIR"/TAG_TMP.asc "$GIT_DIR"/TAG_FINALMSG |
Junio C Hamano | 0fad0fd | 2005-07-25 15:18:35 -0700 | [diff] [blame] | 99 | if [ "$signed" ]; then |
Junio C Hamano | a10aad6 | 2005-11-03 15:26:43 -0800 | [diff] [blame] | 100 | gpg -bsa -u "$username" "$GIT_DIR"/TAG_TMP && |
| 101 | cat "$GIT_DIR"/TAG_TMP.asc >>"$GIT_DIR"/TAG_TMP || |
Junio C Hamano | 0fad0fd | 2005-07-25 15:18:35 -0700 | [diff] [blame] | 102 | die "failed to sign the tag with GPG." |
| 103 | fi |
Junio C Hamano | a10aad6 | 2005-11-03 15:26:43 -0800 | [diff] [blame] | 104 | object=$(git-mktag < "$GIT_DIR"/TAG_TMP) |
Linus Torvalds | d727782 | 2005-07-23 15:21:22 -0700 | [diff] [blame] | 105 | fi |
| 106 | |
Junio C Hamano | 52963a7 | 2005-11-07 16:22:34 -0800 | [diff] [blame] | 107 | leading=`expr "refs/tags/$name" : '\(.*\)/'` && |
| 108 | mkdir -p "$GIT_DIR/$leading" && |
Linus Torvalds | d727782 | 2005-07-23 15:21:22 -0700 | [diff] [blame] | 109 | echo $object > "$GIT_DIR/refs/tags/$name" |