]>
Commit | Line | Data |
---|---|---|
65f0d0ee | 1 | #!/bin/sh |
8ac069ac JH |
2 | # Copyright (c) 2005 Linus Torvalds |
3 | ||
7ea2fc47 | 4 | GIT_DIR=`git-rev-parse --git-dir` || exit $? |
d727782e | 5 | |
0fad0fdd | 6 | usage () { |
61f81518 | 7 | echo >&2 "Usage: git-tag [-a | -s | -u <key-id>] [-f | -d] [-m <msg>] <tagname> [<head>]" |
0fad0fdd JH |
8 | exit 1 |
9 | } | |
10 | ||
d165fa14 JH |
11 | die () { |
12 | echo >&2 "$*" | |
13 | exit 1 | |
14 | } | |
15 | ||
0fad0fdd | 16 | annotate= |
d727782e LT |
17 | signed= |
18 | force= | |
c882bc93 | 19 | message= |
bc162e40 | 20 | username= |
d727782e LT |
21 | while case "$#" in 0) break ;; esac |
22 | do | |
23 | case "$1" in | |
0fad0fdd JH |
24 | -a) |
25 | annotate=1 | |
26 | ;; | |
d727782e | 27 | -s) |
0fad0fdd | 28 | annotate=1 |
d727782e LT |
29 | signed=1 |
30 | ;; | |
31 | -f) | |
32 | force=1 | |
33 | ;; | |
c882bc93 CW |
34 | -m) |
35 | annotate=1 | |
36 | shift | |
37 | message="$1" | |
38 | ;; | |
bc162e40 LT |
39 | -u) |
40 | annotate=1 | |
41 | signed=1 | |
42 | shift | |
43 | username="$1" | |
44 | ;; | |
61f81518 KR |
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 | ;; | |
0fad0fdd JH |
52 | -*) |
53 | usage | |
54 | ;; | |
d727782e LT |
55 | *) |
56 | break | |
57 | ;; | |
58 | esac | |
59 | shift | |
60 | done | |
61 | ||
918c05f1 | 62 | name="$1" |
0fad0fdd JH |
63 | [ "$name" ] || usage |
64 | if [ -e "$GIT_DIR/refs/tags/$name" -a -z "$force" ]; then | |
65 | die "tag '$name' already exists" | |
66 | fi | |
d727782e | 67 | shift |
03feddd6 JH |
68 | git-check-ref-format "tags/$name" || |
69 | die "we do not like '$name' as a tag name." | |
8ac069ac | 70 | |
2ad77e67 | 71 | object=$(git-rev-parse --verify --default HEAD "$@") || exit 1 |
0fc65a45 | 72 | type=$(git-cat-file -t $object) || exit 1 |
c818566d | 73 | tagger=$(git-var GIT_COMMITTER_IDENT) || exit 1 |
bc162e40 | 74 | : ${username:=$(expr "$tagger" : '\(.*>\)')} |
918c05f1 | 75 | |
a10aad6a | 76 | trap 'rm -f "$GIT_DIR"/TAG_TMP* "$GIT_DIR"/TAG_FINALMSG "$GIT_DIR"/TAG_EDITMSG' 0 |
0fad0fdd JH |
77 | |
78 | if [ "$annotate" ]; then | |
c882bc93 CW |
79 | if [ -z "$message" ]; then |
80 | ( echo "#" | |
81 | echo "# Write a tag message" | |
a10aad6a JH |
82 | echo "#" ) > "$GIT_DIR"/TAG_EDITMSG |
83 | ${VISUAL:-${EDITOR:-vi}} "$GIT_DIR"/TAG_EDITMSG || exit | |
c882bc93 | 84 | else |
a10aad6a | 85 | echo "$message" >"$GIT_DIR"/TAG_EDITMSG |
c882bc93 | 86 | fi |
d727782e | 87 | |
a10aad6a JH |
88 | grep -v '^#' <"$GIT_DIR"/TAG_EDITMSG | |
89 | git-stripspace >"$GIT_DIR"/TAG_FINALMSG | |
918c05f1 | 90 | |
a10aad6a | 91 | [ -s "$GIT_DIR"/TAG_FINALMSG ] || { |
bc162e40 LT |
92 | echo >&2 "No tag message?" |
93 | exit 1 | |
94 | } | |
918c05f1 | 95 | |
a10aad6a JH |
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 | |
0fad0fdd | 99 | if [ "$signed" ]; then |
a10aad6a JH |
100 | gpg -bsa -u "$username" "$GIT_DIR"/TAG_TMP && |
101 | cat "$GIT_DIR"/TAG_TMP.asc >>"$GIT_DIR"/TAG_TMP || | |
0fad0fdd JH |
102 | die "failed to sign the tag with GPG." |
103 | fi | |
a10aad6a | 104 | object=$(git-mktag < "$GIT_DIR"/TAG_TMP) |
d727782e | 105 | fi |
918c05f1 | 106 | |
52963a7a JH |
107 | leading=`expr "refs/tags/$name" : '\(.*\)/'` && |
108 | mkdir -p "$GIT_DIR/$leading" && | |
d727782e | 109 | echo $object > "$GIT_DIR/refs/tags/$name" |