]>
Commit | Line | Data |
---|---|---|
65f0d0ee | 1 | #!/bin/sh |
8ac069ac JH |
2 | # Copyright (c) 2005 Linus Torvalds |
3 | ||
b867c7c2 | 4 | USAGE='-l [<pattern>] | [-a | -s | -u <key-id>] [-f | -d] [-m <msg>] <tagname> [<head>]' |
806f36d4 FK |
5 | SUBDIRECTORY_OK='Yes' |
6 | . git-sh-setup | |
d165fa14 | 7 | |
aabd7693 | 8 | message_given= |
0fad0fdd | 9 | annotate= |
d727782e LT |
10 | signed= |
11 | force= | |
c882bc93 | 12 | message= |
bc162e40 | 13 | username= |
b867c7c2 | 14 | list= |
d727782e LT |
15 | while case "$#" in 0) break ;; esac |
16 | do | |
17 | case "$1" in | |
0fad0fdd JH |
18 | -a) |
19 | annotate=1 | |
20 | ;; | |
d727782e | 21 | -s) |
0fad0fdd | 22 | annotate=1 |
d727782e LT |
23 | signed=1 |
24 | ;; | |
25 | -f) | |
26 | force=1 | |
27 | ;; | |
b867c7c2 | 28 | -l) |
b867c7c2 JH |
29 | case "$#" in |
30 | 1) | |
e6ebb8a3 | 31 | set x . ;; |
b867c7c2 | 32 | esac |
e6ebb8a3 SE |
33 | shift |
34 | git rev-parse --symbolic --tags | sort | grep "$@" | |
b867c7c2 JH |
35 | exit $? |
36 | ;; | |
c882bc93 CW |
37 | -m) |
38 | annotate=1 | |
39 | shift | |
40 | message="$1" | |
aabd7693 HWN |
41 | if test "$#" = "0"; then |
42 | die "error: option -m needs an argument" | |
aabd7693 HWN |
43 | else |
44 | message_given=1 | |
45 | fi | |
c882bc93 | 46 | ;; |
f79c73ce JS |
47 | -F) |
48 | annotate=1 | |
49 | shift | |
50 | if test "$#" = "0"; then | |
51 | die "error: option -F needs an argument" | |
f79c73ce JS |
52 | else |
53 | message="$(cat "$1")" | |
54 | message_given=1 | |
55 | fi | |
56 | ;; | |
bc162e40 LT |
57 | -u) |
58 | annotate=1 | |
59 | signed=1 | |
60 | shift | |
61 | username="$1" | |
62 | ;; | |
61f81518 KR |
63 | -d) |
64 | shift | |
65 | tag_name="$1" | |
d3d0013c CC |
66 | tag=$(git-show-ref --verify --hash -- "refs/tags/$tag_name") || |
67 | die "Seriously, what tag are you talking about?" | |
68 | git-update-ref -m 'tag: delete' -d "refs/tags/$tag_name" "$tag" && | |
69 | echo "Deleted tag $tag_name." | |
61f81518 KR |
70 | exit $? |
71 | ;; | |
0fad0fdd JH |
72 | -*) |
73 | usage | |
74 | ;; | |
d727782e LT |
75 | *) |
76 | break | |
77 | ;; | |
78 | esac | |
79 | shift | |
80 | done | |
81 | ||
918c05f1 | 82 | name="$1" |
0fad0fdd | 83 | [ "$name" ] || usage |
cede7526 | 84 | prev=0000000000000000000000000000000000000000 |
b431b282 | 85 | if git-show-ref --verify --quiet -- "refs/tags/$name" |
cede7526 JH |
86 | then |
87 | test -n "$force" || die "tag '$name' already exists" | |
88 | prev=`git rev-parse "refs/tags/$name"` | |
0fad0fdd | 89 | fi |
d727782e | 90 | shift |
03feddd6 JH |
91 | git-check-ref-format "tags/$name" || |
92 | die "we do not like '$name' as a tag name." | |
8ac069ac | 93 | |
2ad77e67 | 94 | object=$(git-rev-parse --verify --default HEAD "$@") || exit 1 |
0fc65a45 | 95 | type=$(git-cat-file -t $object) || exit 1 |
c818566d | 96 | tagger=$(git-var GIT_COMMITTER_IDENT) || exit 1 |
f327dbce | 97 | : ${username:=$(expr "z$tagger" : 'z\(.*>\)')} |
918c05f1 | 98 | |
a10aad6a | 99 | trap 'rm -f "$GIT_DIR"/TAG_TMP* "$GIT_DIR"/TAG_FINALMSG "$GIT_DIR"/TAG_EDITMSG' 0 |
0fad0fdd JH |
100 | |
101 | if [ "$annotate" ]; then | |
aabd7693 | 102 | if [ -z "$message_given" ]; then |
c882bc93 CW |
103 | ( echo "#" |
104 | echo "# Write a tag message" | |
a10aad6a JH |
105 | echo "#" ) > "$GIT_DIR"/TAG_EDITMSG |
106 | ${VISUAL:-${EDITOR:-vi}} "$GIT_DIR"/TAG_EDITMSG || exit | |
c882bc93 | 107 | else |
a10aad6a | 108 | echo "$message" >"$GIT_DIR"/TAG_EDITMSG |
c882bc93 | 109 | fi |
d727782e | 110 | |
a10aad6a JH |
111 | grep -v '^#' <"$GIT_DIR"/TAG_EDITMSG | |
112 | git-stripspace >"$GIT_DIR"/TAG_FINALMSG | |
918c05f1 | 113 | |
aabd7693 | 114 | [ -s "$GIT_DIR"/TAG_FINALMSG -o -n "$message_given" ] || { |
bc162e40 LT |
115 | echo >&2 "No tag message?" |
116 | exit 1 | |
117 | } | |
918c05f1 | 118 | |
0dbc4e89 AR |
119 | ( printf 'object %s\ntype %s\ntag %s\ntagger %s\n\n' \ |
120 | "$object" "$type" "$name" "$tagger"; | |
a10aad6a JH |
121 | cat "$GIT_DIR"/TAG_FINALMSG ) >"$GIT_DIR"/TAG_TMP |
122 | rm -f "$GIT_DIR"/TAG_TMP.asc "$GIT_DIR"/TAG_FINALMSG | |
0fad0fdd | 123 | if [ "$signed" ]; then |
a10aad6a JH |
124 | gpg -bsa -u "$username" "$GIT_DIR"/TAG_TMP && |
125 | cat "$GIT_DIR"/TAG_TMP.asc >>"$GIT_DIR"/TAG_TMP || | |
0fad0fdd JH |
126 | die "failed to sign the tag with GPG." |
127 | fi | |
a10aad6a | 128 | object=$(git-mktag < "$GIT_DIR"/TAG_TMP) |
d727782e | 129 | fi |
918c05f1 | 130 | |
36733704 CC |
131 | git update-ref "refs/tags/$name" "$object" "$prev" |
132 |