diff --git a/functions-common b/functions-common index 24a462ac21..e6af662069 100644 --- a/functions-common +++ b/functions-common @@ -1621,14 +1621,38 @@ function disable_all_services { # Uses global ``ENABLED_SERVICES`` # disable_negated_services function disable_negated_services { - local tmpsvcs="${ENABLED_SERVICES}" + local to_remove="" + local remaining="" + local enabled="" local service - for service in ${tmpsvcs//,/ }; do + + # build up list of services that should be removed; i.e. they + # begin with "-" + for service in ${ENABLED_SERVICES//,/ }; do if [[ ${service} == -* ]]; then - tmpsvcs=$(echo ${tmpsvcs}|sed -r "s/(,)?(-)?${service#-}(,)?/,/g") + to_remove+=",${service#-}" + else + remaining+=",${service}" fi done - ENABLED_SERVICES=$(_cleanup_service_list "$tmpsvcs") + + # go through the service list. if this service appears in the "to + # be removed" list, drop it + for service in ${remaining//,/ }; do + local remove + local add=1 + for remove in ${to_remove//,/ }; do + if [[ ${remove} == ${service} ]]; then + add=0 + break + fi + done + if [[ $add == 1 ]]; then + enabled="${enabled},$service" + fi + done + + ENABLED_SERVICES=$(_cleanup_service_list "$enabled") } # disable_service() removes the services passed as argument to the diff --git a/tests/test_functions.sh b/tests/test_functions.sh index a7914f7a1b..4ebb00085e 100755 --- a/tests/test_functions.sh +++ b/tests/test_functions.sh @@ -130,7 +130,15 @@ test_disable_negated_services 'a,-a' '' test_disable_negated_services 'b,a,-a' 'b' test_disable_negated_services 'a,b,-a' 'b' test_disable_negated_services 'a,-a,b' 'b' - +test_disable_negated_services 'a,aa,-a' 'aa' +test_disable_negated_services 'aa,-a' 'aa' +test_disable_negated_services 'a_a, -a_a' '' +test_disable_negated_services 'a-b, -a-b' '' +test_disable_negated_services 'a-b, b, -a-b' 'b' +test_disable_negated_services 'a,-a,av2,b' 'av2,b' +test_disable_negated_services 'a,aa,-a' 'aa' +test_disable_negated_services 'a,av2,-a,a' 'av2' +test_disable_negated_services 'a,-a,av2' 'av2' echo "Testing is_package_installed()"