Use shFlags to parse flags given to main and subcommands.
Implement the flags for each of the 'feature' subcommands.
This commit is contained in:
parent
ea58d0f1de
commit
1b8192362e
2 changed files with 51 additions and 40 deletions
13
git-flow
13
git-flow
|
@ -80,12 +80,13 @@ main() {
|
|||
# run command
|
||||
. "$GITFLOW_DIR/git-flow-$SUBCOMMAND"
|
||||
|
||||
#
|
||||
# TODO: How to handle 'git flow feature --verbose'
|
||||
# instead of 'git flow feature list --verbose'
|
||||
# "--verbose" is not a subcommand!
|
||||
#
|
||||
SUBACTION="${1:-default}"; shift
|
||||
# test if the first argument is a flag (i.e. starts with '-')
|
||||
# in that case, we interpret this arg as a flag for the default
|
||||
# command
|
||||
SUBACTION="default"
|
||||
if [ "$1" != "" ] && ! echo "$1" | grep -q "^-"; then
|
||||
SUBACTION="$1"; shift
|
||||
fi
|
||||
if ! typeset -f cmd_$SUBACTION 2>&1 >/dev/null; then
|
||||
warn "Unknown subcommand: '$1'"
|
||||
usage
|
||||
|
|
|
@ -13,7 +13,6 @@
|
|||
#
|
||||
|
||||
PREFIX=$(git config --get gitflow.prefix.feature || echo feature/)
|
||||
FLAG_FETCH=0
|
||||
|
||||
usage() {
|
||||
echo "usage: git flow feature [list]"
|
||||
|
@ -42,6 +41,9 @@ cmd_default() {
|
|||
}
|
||||
|
||||
cmd_list() {
|
||||
DEFINE_boolean verbose 0 'verbose (more) output' v
|
||||
parse_args "$@"
|
||||
|
||||
FEATURE_BRANCHES="$(echo "$LOCAL_BRANCHES" | grep "^$PREFIX")"
|
||||
if [ -z "$FEATURE_BRANCHES" ]; then
|
||||
warn "No feature branches exist."
|
||||
|
@ -64,13 +66,14 @@ resolve_name_by_prefix() {
|
|||
|
||||
MATCHES="$(echo "$LOCAL_BRANCHES" | grep "^$PREFIX$1")"
|
||||
NUM_MATCHES=$(echo "$MATCHES" | wc -l)
|
||||
if [ -z "$MATCHES" ]; then
|
||||
# no prefix match, so take it literally
|
||||
echo "$1"
|
||||
else
|
||||
if [ $NUM_MATCHES -eq 1 ]; then
|
||||
# sed arg looks a bit weird, but $PREFIX should not contain spaces,
|
||||
# so this one is safe
|
||||
echo "$MATCHES" | sed "s $PREFIX g"
|
||||
elif [ $NUM_MATCHES -eq 0 ]; then
|
||||
# no prefix match, so take it literally
|
||||
echo "$1"
|
||||
else
|
||||
# multiple matches, cannot decide
|
||||
warn "Multiple branches match for prefix '$1':"
|
||||
|
@ -79,48 +82,47 @@ resolve_name_by_prefix() {
|
|||
done
|
||||
die "Aborting. Use an unambiguous prefix."
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
get_name_by_prefix() {
|
||||
NAME=$(resolve_name_by_prefix "$1")
|
||||
if [ -z "$NAME" ]; then
|
||||
require_name() {
|
||||
if [ "$NAME" = "" ]; then
|
||||
echo "Missing argument <name>"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
parse_args_common() {
|
||||
# TODO: When we have a nice structured way of parsing flags with getopt,
|
||||
# implement the following flags:
|
||||
# --fetch, to set FLAG_FETCH=1
|
||||
# --no-fetch, to set FLAG_FETCH=0
|
||||
BASE="${2:-$DEVELOP_BRANCH}"
|
||||
if [ "$NAME" = "" ]; then
|
||||
echo "Missing argument <name>."
|
||||
usage
|
||||
expand_name_arg_prefix() {
|
||||
require_name
|
||||
NAME=$(resolve_name_by_prefix "$NAME")
|
||||
if echo "$NAME" | grep -q "^[ \t\n\r]+$"; then
|
||||
exit 1
|
||||
fi
|
||||
BRANCH=$PREFIX$NAME
|
||||
}
|
||||
|
||||
parse_args_with_name_prefix() {
|
||||
get_name_by_prefix "$1"
|
||||
parse_args_common
|
||||
}
|
||||
|
||||
parse_args() {
|
||||
# parse options
|
||||
FLAGS "$@" || exit $?
|
||||
eval set -- "${FLAGS_ARGV}"
|
||||
|
||||
# read arguments into global variables
|
||||
NAME="$1"
|
||||
parse_args_common
|
||||
BASE="${2:-$DEVELOP_BRANCH}"
|
||||
}
|
||||
|
||||
cmd_start() {
|
||||
DEFINE_boolean fetch 0 'fetch from origin before performing local operation' F
|
||||
parse_args "$@"
|
||||
require_name
|
||||
|
||||
# sanity checks
|
||||
gitflow_require_clean_working_tree
|
||||
gitflow_require_branch_absent $BRANCH
|
||||
|
||||
# update the local repo with remote changes, if asked
|
||||
if [ $FLAG_FETCH -eq 1 ]; then
|
||||
if [ $FLAGS_fetch -eq 1 ]; then
|
||||
git fetch -q $ORIGIN $DEVELOP_BRANCH
|
||||
fi
|
||||
|
||||
|
@ -141,7 +143,11 @@ cmd_start() {
|
|||
}
|
||||
|
||||
cmd_finish() {
|
||||
parse_args_with_name_prefix "$@"
|
||||
DEFINE_boolean fetch 0 'fetch from origin before performing local operation' F
|
||||
DEFINE_boolean rebase 0 'rebase instead of merge' r
|
||||
DEFINE_boolean squash 0 'squash all commits when rebasing (implies --rebase)' s
|
||||
parse_args "$@"
|
||||
expand_name_arg_prefix
|
||||
|
||||
# sanity checks
|
||||
gitflow_require_branch $BRANCH
|
||||
|
@ -190,7 +196,7 @@ cmd_finish() {
|
|||
gitflow_require_clean_working_tree
|
||||
|
||||
# update local repo with remote changes first, if asked
|
||||
if [ $FLAG_FETCH -eq 1 ]; then
|
||||
if [ $FLAGS_fetch -eq 1 ]; then
|
||||
git fetch -q $ORIGIN $BRANCH
|
||||
fi
|
||||
|
||||
|
@ -249,6 +255,7 @@ helper_finish_cleanup() {
|
|||
|
||||
cmd_publish() {
|
||||
parse_args "$@"
|
||||
expand_name_arg_prefix
|
||||
|
||||
# sanity checks
|
||||
gitflow_require_clean_working_tree
|
||||
|
@ -275,6 +282,7 @@ cmd_publish() {
|
|||
|
||||
cmd_track() {
|
||||
parse_args "$@"
|
||||
require_name
|
||||
|
||||
# sanity checks
|
||||
gitflow_require_clean_working_tree
|
||||
|
@ -293,7 +301,9 @@ cmd_track() {
|
|||
}
|
||||
|
||||
cmd_diff() {
|
||||
parse_args_with_name_prefix "$@"
|
||||
parse_args "$@"
|
||||
expand_name_arg_prefix
|
||||
|
||||
# TODO: if this feature has been based on a non-develop branch, we really
|
||||
# should not be comparing to $DEVELOP. How to deal with this?
|
||||
git diff $DEVELOP_BRANCH..$BRANCH
|
||||
|
|
Loading…
Reference in a new issue