#!/bin/sh # Copyright (c) 2005 Linus Torvalds setvar USAGE = ''[-n []] -l [] | [-a | -s | -u ] [-f | -d | -v] [-m ] []'' setvar SUBDIRECTORY_OK = ''Yes'' source git-sh-setup setvar message_given = '' setvar annotate = '' setvar signed = '' setvar force = '' setvar message = '' setvar username = '' setvar list = '' setvar verify = '' setvar LINES = '0' while test $# != 0 { case (1) { -a { setvar annotate = '1' shift } -s { setvar annotate = '1' setvar signed = '1' shift } -f { setvar force = '1' shift } -n { case{ 1,* | *,-* { setvar LINES = '1' # no argument } * { shift setvar LINES = $(expr "$1" : '\([0-9]*\)') test -z $LINES && setvar LINES = '1' # 1 line is default when -n is used } } shift } -l { setvar list = '1' shift case (#) { 0 { setvar PATTERN = '' } * { setvar PATTERN = "$1" # select tags by shell pattern, not re shift } } git rev-parse --symbolic --tags | sort | while read TAG { case (TAG) { *$PATTERN* { } * { continue } } test $LINES -le 0 && do { echo $TAG; continue ;} setvar OBJTYPE = $(git cat-file -t "$TAG") case (OBJTYPE) { tag { setvar ANNOTATION = $(git cat-file tag "$TAG" | sed -e '1,/^$/d' | sed -n -e " /^-----BEGIN PGP SIGNATURE-----\$/q 2,\$s/^/ / p ${LINES}q ") printf "%-15s %s\n" $TAG $ANNOTATION } * { echo $TAG } } } } -m { setvar annotate = '1' shift setvar message = "$1" if test "$Argc" = "0" { die "error: option -m needs an argument" } else { setvar message = "$1" setvar message_given = '1' shift } } -F { setvar annotate = '1' shift if test "$Argc" = "0" { die "error: option -F needs an argument" } else { setvar message = "$(cat "$1")" setvar message_given = '1' shift } } -u { setvar annotate = '1' setvar signed = '1' shift if test "$Argc" = "0" { die "error: option -u needs an argument" } else { setvar username = "$1" shift } } -d { shift setvar had_error = '0'for tag in @ARGV { setvar cur = $(git show-ref --verify --hash -- "refs/tags/$tag") || do { echo >&2 "Seriously, what tag are you talking about?>&2 "Seriously, what tag are you talking about?" setvar had_error = '1' continue } git update-ref -m 'tag: delete' -d "refs/tags/$tag" $cur || do { setvar had_error = '1' continue } echo "Deleted tag $tag." } exit $had_error } -v { shift setvar tag_name = "$1" setvar tag = $(git show-ref --verify --hash -- "refs/tags/$tag_name") || die "Seriously, what tag are you talking about?" git-verify-tag -v $tag exit $? } -* { usage } * { break } } } test -n $list && exit 0 setvar name = "$1" test $name || usage setvar prev = '0000000000000000000000000000000000000000' if git show-ref --verify --quiet -- "refs/tags/$name" { test -n $force || die "tag '$name' already exists" setvar prev = $(git rev-parse "refs/tags/$name") } shift git check-ref-format "tags/$name" || die "we do not like '$name' as a tag name." setvar object = $(git rev-parse --verify --default HEAD "$@") || exit 1 setvar type = $(git cat-file -t $object) || exit 1 setvar tagger = $(git var GIT_COMMITTER_IDENT) || exit 1 test -n $username || setvar username = $(git config user.signingkey) || setvar username = $(expr "z$tagger" : 'z\(.*>\)') trap 'rm -f "$GIT_DIR"/TAG_TMP* "$GIT_DIR"/TAG_FINALMSG "$GIT_DIR"/TAG_EDITMSG' 0 if test $annotate { if test -z $message_given { shell { echo "#" echo "# Write a tag message" echo "#" } > "$GIT_DIR"/TAG_EDITMSG git_editor "$GIT_DIR"/TAG_EDITMSG || exit } else { printf '%s\n' $message >"$GIT_DIR"/TAG_EDITMSG } grep -v '^#' <"$GIT_DIR"/TAG_EDITMSG | git stripspace >"$GIT_DIR"/TAG_FINALMSG test -s "$GIT_DIR"/TAG_FINALMSG -o -n $message_given || do { echo >&2 "No tag message?>&2 "No tag message?" exit 1 } shell { printf 'object %s\ntype %s\ntag %s\ntagger %s\n\n' \ $object $type $name $tagger; cat "$GIT_DIR"/TAG_FINALMSG } >"$GIT_DIR"/TAG_TMP rm -f "$GIT_DIR"/TAG_TMP.asc "$GIT_DIR"/TAG_FINALMSG if test $signed { gpg -bsa -u $username "$GIT_DIR"/TAG_TMP && cat "$GIT_DIR"/TAG_TMP.asc >>"$GIT_DIR"/TAG_TMP || die "failed to sign the tag with GPG." } setvar object = $(git-mktag < "$GIT_DIR"/TAG_TMP) } git update-ref "refs/tags/$name" $object $prev