Skip to content

Commit

Permalink
Add tag annotation and tag signing to both release and hotfix.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
nvie committed Feb 8, 2010
1 parent ca73caf commit 1a2868b
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 20 deletions.
44 changes: 32 additions & 12 deletions git-flow-hotfix
Expand Up @@ -113,19 +113,20 @@ require_base_is_on_master() {
}

cmd_start() {
DEFINE_boolean fetch true "fetch from $ORIGIN before finishing hotfix" F
DEFINE_boolean fetch true "fetch from $ORIGIN before performing finish" F
parse_args "$@"
BASE="${2:-$MASTER_BRANCH}"
require_version_arg
require_base_is_on_master

# 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 $MASTER_BRANCH
fi
gitflow_require_branches_equal $MASTER_BRANCH $ORIGIN/$MASTER_BRANCH
gitflow_require_branch_absent $BRANCH

# create branch
git checkout -b $BRANCH $BASE
Expand All @@ -145,27 +146,46 @@ cmd_start() {
}

cmd_finish() {
DEFINE_boolean fetch true "fetch from $ORIGIN before finishing hotfix" F
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

# merge into develop if we fixed a master issue
git checkout $DEVELOP_BRANCH
git merge --no-ff $BRANCH
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 || \
die "Could not check out $DEVELOP_BRANCH."
git merge --no-ff $BRANCH # TODO: This can fail!

# delete branch
git branch -d $BRANCH
Expand Down
36 changes: 28 additions & 8 deletions git-flow-release
Expand Up @@ -127,11 +127,12 @@ cmd_start() {

# 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
Expand All @@ -152,26 +153,45 @@ cmd_start() {

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
Expand Down
7 changes: 7 additions & 0 deletions gitflow-common
Expand Up @@ -42,6 +42,7 @@ noflag() { typeset FLAG; eval FLAG='$FLAGS_'$1; [ $FLAG -ne $FLAGS_TRUE ]; }
LOCAL_BRANCHES=$(git branch | sed 's/^[* ] //')
REMOTE_BRANCHES=$(git branch -r | sed 's/^[* ] //')
ALL_BRANCHES="$LOCAL_BRANCHES $REMOTE_BRANCHES"
ALL_TAGS=$(git tag)

#
# resolve_nameprefix
Expand Down Expand Up @@ -141,6 +142,12 @@ gitflow_require_branch_absent() {
fi
}

gitflow_require_tag_absent() {
if has $1 $ALL_TAGS; then
die "Tag '$1' already exists. Pick another name."
fi
}

#
# gitflow_test_branches_equal()
#
Expand Down

0 comments on commit 1a2868b

Please sign in to comment.