Add tag annotation and tag signing to both release and hotfix.

Require branch and tag to be absent when start is run (for release/hotfix)

Require branch to exist when trying to finish (for release/hotfix)

Die the finish script when either the fetch, checkout or tagging fails.
diff --git a/git-flow-release b/git-flow-release
index 8fb4061..03832b7 100644
--- a/git-flow-release
+++ b/git-flow-release
@@ -127,11 +127,12 @@
 
 	# sanity checks
 	gitflow_require_clean_working_tree
+	gitflow_require_branch_absent $BRANCH
+	gitflow_require_tag_absent $VERSION_PREFIX$VERSION
 	if flag fetch; then
 		git fetch -q $ORIGIN $DEVELOP_BRANCH
 	fi
 	gitflow_require_branches_equal $DEVELOP_BRANCH $ORIGIN/$DEVELOP_BRANCH
-	gitflow_require_branch_absent $BRANCH
 
 	# create branch
 	git checkout -b $BRANCH $BASE
@@ -152,26 +153,45 @@
 
 cmd_finish() {
 	DEFINE_boolean fetch true "fetch from $ORIGIN before performing finish" F
+	DEFINE_boolean sign false "sign the release tag cryptographically" s
+	DEFINE_string signingkey "" "use the given GPG-key for the digital signature (implies -s)" u
+	DEFINE_string message "" "use the given tag message" m
 	parse_args "$@"
 	require_version_arg
 
+	# handle flags that imply other flags
+	if [ "$FLAGS_signingkey" != "" ]; then
+		FLAGS_sign=$FLAGS_TRUE
+	fi
+
 	# sanity checks
+	gitflow_require_branch $BRANCH
 	gitflow_require_clean_working_tree
 	if flag fetch; then
-		git fetch -q $ORIGIN $MASTER_BRANCH
-		git fetch -q $ORIGIN $DEVELOP_BRANCH
+		git fetch -q $ORIGIN $MASTER_BRANCH || \
+		  die "Could not fetch $MASTER_BRANCH from $ORIGIN."
+		git fetch -q $ORIGIN $DEVELOP_BRANCH || \
+		  die "Could not fetch $DEVELOP_BRANCH from $ORIGIN."
 	fi
 	gitflow_require_branches_equal $MASTER_BRANCH $ORIGIN/$MASTER_BRANCH
 	gitflow_require_branches_equal $DEVELOP_BRANCH $ORIGIN/$DEVELOP_BRANCH
 
 	# merge into master
-	git checkout $MASTER_BRANCH
-	git merge --no-ff $BRANCH
-	git tag $VERSION_PREFIX$VERSION
+	git checkout $MASTER_BRANCH || \
+	  die "Could not check out $MASTER_BRANCH."
+	git merge --no-ff $BRANCH	# TODO: This can fail!
+
+	typeset opts="-a"
+	flag sign && opts="$opts -s"
+	[ "$FLAGS_signingkey" != "" ] && opts="$opts -u '$FLAGS_signingkey'"
+	[ "$FLAGS_message" != "" ] && opts="$opts -m '$FLAGS_message'"
+	git tag $opts "$VERSION_PREFIX$VERSION" || \
+	  die "Tagging failed. Please run finish again to retry."
 
 	# merge into develop
-	git checkout $DEVELOP_BRANCH
-	git merge --no-ff $BRANCH
+	git checkout $DEVELOP_BRANCH || \
+	  die "Could not check out $DEVELOP_BRANCH."
+	git merge --no-ff $BRANCH	# TODO: This can fail!
 
 	# delete branch
 	git branch -d $BRANCH