Skip to content

Commit

Permalink
Use shFlags to parse flags given to main and subcommands.
Browse files Browse the repository at this point in the history
Implement the flags for each of the 'feature' subcommands.
  • Loading branch information
nvie committed Feb 1, 2010
1 parent ea58d0f commit 1b81923
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 40 deletions.
13 changes: 7 additions & 6 deletions git-flow
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
78 changes: 44 additions & 34 deletions git-flow-feature
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
#

PREFIX=$(git config --get gitflow.prefix.feature || echo feature/)
FLAG_FETCH=0

usage() {
echo "usage: git flow feature [list]"
Expand Down Expand Up @@ -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."
Expand All @@ -64,63 +66,63 @@ resolve_name_by_prefix() {

MATCHES="$(echo "$LOCAL_BRANCHES" | grep "^$PREFIX$1")"
NUM_MATCHES=$(echo "$MATCHES" | wc -l)
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
if [ -z "$MATCHES" ]; then
# no prefix match, so take it literally
echo "$1"
else
# multiple matches, cannot decide
warn "Multiple branches match for prefix '$1':"
for match in $MATCHES; do
warn "- $match"
done
die "Aborting. Use an unambiguous prefix."
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"
else
# multiple matches, cannot decide
warn "Multiple branches match for prefix '$1':"
for match in $MATCHES; do
warn "- $match"
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

Expand All @@ -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
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -249,6 +255,7 @@ helper_finish_cleanup() {

cmd_publish() {
parse_args "$@"
expand_name_arg_prefix

# sanity checks
gitflow_require_clean_working_tree
Expand All @@ -275,6 +282,7 @@ cmd_publish() {

cmd_track() {
parse_args "$@"
require_name

# sanity checks
gitflow_require_clean_working_tree
Expand All @@ -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
Expand Down

0 comments on commit 1b81923

Please sign in to comment.