Merge branch 'feature/subcmd-structure' into develop

Conflicts:
	git-flow-feature
	git-flow-hotfix
	git-flow-release
	git-flow-support
diff --git a/git-flow b/git-flow
index 6923f96..5af7681 100755
--- a/git-flow
+++ b/git-flow
@@ -80,6 +80,10 @@
 	fi
 
 	# run the specified action
+	# if the subcommand declares a setup() function, call that first
+	if typeset -f setup >/dev/null; then
+		setup
+	fi
 	cmd_$SUBACTION "$@"
 }
 
diff --git a/git-flow-feature b/git-flow-feature
index 058a832..72e62b4 100644
--- a/git-flow-feature
+++ b/git-flow-feature
@@ -15,7 +15,7 @@
 PREFIX=$(git config --get gitflow.prefix.feature || echo feature/)
 
 usage() {
-	echo "usage: git flow feature"
+	echo "usage: git flow feature [list]"
 	echo "       git flow feature start <name> [<base>]"
 	echo "       git flow feature finish <name> [<base>]"
 	echo "       git flow feature publish <name>"
@@ -36,18 +36,11 @@
 	#echo "--push      Push to the origin repo when finished"
 }
 
-parse_args() {
-	NAME="$1"
-	BASE="${2:-$DEVELOP_BRANCH}"
-	if [ "$NAME" = "" ]; then
-		echo "Missing argument <name>."
-		usage
-		exit 1
-	fi
-	BRANCH=$PREFIX$NAME
+cmd_default() {
+	cmd_list "$@"
 }
 
-cmd_default() {
+cmd_list() {
 	FEATURE_BRANCHES="$(echo "$LOCAL_BRANCHES" | grep "^$PREFIX")"
 	if [ -z "$FEATURE_BRANCHES" ]; then
 		warn "No feature branches exist."
@@ -61,6 +54,17 @@
 	exit 0
 }
 
+parse_args() {
+	NAME="$1"
+	BASE="${2:-$DEVELOP_BRANCH}"
+	if [ "$NAME" = "" ]; then
+		echo "Missing argument <name>."
+		usage
+		exit 1
+	fi
+	BRANCH=$PREFIX$NAME
+}
+
 cmd_start() {
 	parse_args "$@"
 
diff --git a/git-flow-hotfix b/git-flow-hotfix
index 8134605..7cc1c77 100644
--- a/git-flow-hotfix
+++ b/git-flow-hotfix
@@ -15,7 +15,7 @@
 PREFIX=$(git config --get gitflow.prefix.hotfix || echo hotfix/)
 
 usage() {
-	echo "usage: git flow hotfix"
+	echo "usage: git flow hotfix [list]"
 	echo "       git flow hotfix start <version> [<base>]"
 	echo "       git flow hotfix finish <version> [<base>]"
 	# TODO
@@ -30,18 +30,11 @@
 	#echo "--push      Push to the origin repo when finished"
 }
 
-parse_args() {
-	VERSION="$1"
-	BASE="${2:-$MASTER_BRANCH}"
-	if [ "$VERSION" = "" ]; then
-		echo "Missing argument <version>."
-		usage
-		exit 1
-	fi
-	BRANCH=$PREFIX$VERSION
+cmd_default() {
+	cmd_list "$@"
 }
 
-cmd_default() {
+cmd_list() {
 	HOTFIX_BRANCHES="$(echo "$LOCAL_BRANCHES" | grep "^$PREFIX")"
 	if [ -z "$HOTFIX_BRANCHES" ]; then
 		warn "No hotfix branches exist."
@@ -55,6 +48,17 @@
 	exit 0
 }
 
+parse_args() {
+	VERSION="$1"
+	BASE="${2:-$MASTER_BRANCH}"
+	if [ "$VERSION" = "" ]; then
+		echo "Missing argument <version>."
+		usage
+		exit 1
+	fi
+	BRANCH=$PREFIX$VERSION
+}
+
 cmd_start() {
 	parse_args "$@"
 
diff --git a/git-flow-init b/git-flow-init
index 84ba142..7b1b4b6 100644
--- a/git-flow-init
+++ b/git-flow-init
@@ -16,11 +16,6 @@
 	echo "usage: git flow init"
 }
 
-cmd_help() {
-	usage
-	exit 0
-}
-
 # Default entry when no SUBACTION is given
 cmd_default() {
 	echo
@@ -76,3 +71,7 @@
 	fi
 }
 
+cmd_help() {
+	usage
+	exit 0
+}
diff --git a/git-flow-release b/git-flow-release
index 7e088c8..cc861a9 100644
--- a/git-flow-release
+++ b/git-flow-release
@@ -16,7 +16,7 @@
 PREFIX=$(git config --get gitflow.prefix.release || echo release/)
 
 usage() {
-	echo "usage: git flow release"
+	echo "usage: git flow release [list]"
 	echo "       git flow release start <version>"
 	echo "       git flow release finish <version>"
 	# TODO
@@ -32,17 +32,11 @@
 	#echo "--push      Push to the origin repo when finished"
 }
 
-parse_args() {
-	VERSION="$1"
-	if [ "$VERSION" = "" ]; then
-		echo "Missing argument <version>."
-		usage
-		exit 1
-	fi
-	BRANCH=$PREFIX$VERSION
+cmd_default() {
+	cmd_list "$@"
 }
 
-cmd_default() {
+cmd_list() {
 	RELEASE_BRANCHES="$(echo "$LOCAL_BRANCHES" | grep "^$PREFIX")"
 	if [ -z "$RELEASE_BRANCHES" ]; then
 		warn "No release branches exist."
@@ -56,6 +50,16 @@
 	exit 0
 }
 
+parse_args() {
+	VERSION="$1"
+	if [ "$VERSION" = "" ]; then
+		echo "Missing argument <version>."
+		usage
+		exit 1
+	fi
+	BRANCH=$PREFIX$VERSION
+}
+
 cmd_start() {
 	parse_args "$@"
 
diff --git a/git-flow-support b/git-flow-support
index 739ddfd..a36b956 100644
--- a/git-flow-support
+++ b/git-flow-support
@@ -16,22 +16,15 @@
 PREFIX=$(git config --get gitflow.prefix.support || echo support/)
 
 usage() {
-	echo "usage: git flow support"
+	echo "usage: git flow support [list]"
 	echo "       git flow support start <version> [<base>]"
 }
 
-parse_args() {
-	VERSION="$1"
-	BASE="${2:-${VERSION_PREFIX}${VERSION}}"
-	if [ "$VERSION" = "" ]; then
-		echo "Missing argument <version>."
-		usage
-		exit 1
-	fi
-	BRANCH=$PREFIX$VERSION
+cmd_default() {
+	cmd_list "$@"
 }
 
-cmd_default() {
+cmd_list() {
 	SUPPORT_BRANCHES="$(echo "$LOCAL_BRANCHES" | grep "^$PREFIX")"
 	if [ -z "$SUPPORT_BRANCHES" ]; then
 		warn "No support branches exist."
@@ -45,6 +38,17 @@
 	exit 0
 }
 
+parse_args() {
+	VERSION="$1"
+	BASE="${2:-${VERSION_PREFIX}${VERSION}}"
+	if [ "$VERSION" = "" ]; then
+		echo "Missing argument <version>."
+		usage
+		exit 1
+	fi
+	BRANCH=$PREFIX$VERSION
+}
+
 cmd_start() {
 	parse_args "$@"
 
diff --git a/git-flow-version b/git-flow-version
index cbb66b6..e394de9 100644
--- a/git-flow-version
+++ b/git-flow-version
@@ -17,11 +17,11 @@
 	echo "usage: git flow version"
 }
 
+cmd_default() {
+	echo "$GITFLOW_VERSION"
+}
+
 cmd_help() {
 	usage
 	exit 0
 }
-
-cmd_default() {
-	echo "$GITFLOW_VERSION"
-}