Browse Source

new: correctly implement the arguments pass-through to docker-compose.

raw-remaining-args
Valentin Lab 9 years ago
parent
commit
c0020f82a9
  1. 50
      bin/compose

50
bin/compose

@ -1649,15 +1649,16 @@ _setup_state_dir() {
trap_add EXIT "rm -rf \"$state_tmpdir\""
}
## Returns arg list of an docker-compose
get_docker_compose_opts_list() {
local cache_file="$state_tmpdir/$FUNCNAME.cache.$(echo "$*" | md5_compat)"
local cache_file="$CACHEDIR/$FUNCNAME.cache.$(cat "$(which docker-compose)" | md5_compat)"
if [ -e "$cache_file" ]; then
debug "$FUNCNAME: cache hit ($*)"
# debug "$FUNCNAME: cache hit ($*)"
cat "$cache_file"
return 0
fi
docker-compose "$@" --help | grep '^Options:' -A 20000 |
docker_compose_help_msg=$(docker-compose "$@" --help 2>/dev/null) || return 1
echo "$docker_compose_help_msg" | grep '^Options:' -A 20000 |
tail -n +2 |
egrep "^\s+-" |
sed -r 's/\s+((((-[a-zA-Z]|--[a-zA-Z0-9-]+)( [A-Z=]+|=[^ ]+)?)(, )?)+)\s+.*$/\1/g' |
@ -1668,14 +1669,14 @@ _MULTIOPTION_REGEX='^((-[a-zA-Z]|--[a-zA-Z0-9-]+)(, )?)+'
_MULTIOPTION_REGEX_LINE_FILTER=$_MULTIOPTION_REGEX'(\s|=)'
get_docker_compose_multi_opts_list() {
opts_list=$(get_docker_compose_opts_list "$@")
opts_list=$(get_docker_compose_opts_list "$@") || return 1
echo "$opts_list" | egrep "$_MULTIOPTION_REGEX_LINE_FILTER" |
sed -r "s/^($_MULTIOPTION_REGEX)(\s|=).*$/\1/g" |
tr ',' "\n" | xargs echo
}
get_docker_compose_single_opts_list() {
opts_list=$(get_docker_compose_opts_list "$@")
opts_list=$(get_docker_compose_opts_list "$@") || return 1
echo "$opts_list" | egrep -v "$_MULTIOPTION_REGEX_LINE_FILTER" |
tr ',' "\n" | xargs echo
}
@ -1691,6 +1692,15 @@ clean_cache() {
fi
}
str_matches() {
local str="$1"
shift
for pattern in "$@"; do
eval "[[ \"$str\" == $pattern ]]" && return 0
done
return 1
}
[ "$SOURCED" ] && return 0
@ -1722,8 +1732,9 @@ no_hooks=
no_init=
action=
stage="main" ## switches from 'main', to 'action', 'remainder'
# DC_MATCH_MULTI=
# DC_MATCH_SINGLE=
is_docker_compose_action=
DC_MATCH_MULTI=
DC_MATCH_SINGLE=
while [ "$#" != 0 ]; do
case "$stage" in
"main")
@ -1764,8 +1775,10 @@ while [ "$#" != 0 ]; do
*)
action="$1"
stage="action"
# DC_MATCH_MULTI=$(get_docker_compose_multi_opts_list "$action") || return 1
# DC_MATCH_SINGLE="$(get_docker_compose_single_opts_list "$action") $(echo "$DC_MATCH_MULTI" | sed -r 's/( |$)/=\* /g')"
DC_MATCH_MULTI=$(get_docker_compose_multi_opts_list "$action") &&
DC_MATCH_SINGLE="$(get_docker_compose_single_opts_list "$action") $(echo "$DC_MATCH_MULTI" | sed -r 's/( |$)/=\* /g')" &&
is_docker_compose_action=true
;;
esac
;;
@ -1775,12 +1788,19 @@ while [ "$#" != 0 ]; do
no_init=true ; no_hooks=true ; no_relations=true
action_opts+=("$1")
;;
--verbose|-v)
export VERBOSE=true
action_opts+=("$1")
;;
--*|-*)
action_opts+=("$1")
if [ "$is_docker_compose_action" ]; then
if str_matches "$1" DC_MATCH_MULTI; then
action_opts=("$1" "$2")
shift;
elif str_matches "$1" DC_MATCH_SINGLE; then
action_opts=("$1")
else
err "Unknown option '$1'. Please check help."
docker-compose "$action" --help >&2
exit 1
fi
fi
;;
*)
action_posargs+=("$1")

Loading…
Cancel
Save