The order or possible completion words in the COMPREPLY array doesn't
actually matter, as long as all the right words are in there, because
Bash will sort them anyway.  Yet, our tests looking at the elements of
COMPREPLY always expect them to be in a specific order.

Now, this hasn't been an issue before, but the next patch is about to
optimize a bit more our git-aware path completion, and as a harmless
side effect the order of elements in COMPREPLY will change.  Worse,
the order will be downright undefined, because after the next patch
path components will come directly from iterating through an
associative array in 'awk', and the order of iteration over the
elements in those arrays is undefined, and indeed different 'awk'
implementations produce different order.  Consequently, we can't get
away with simply adjusting the expected results in the affected tests.

Modify the 'test_completion' helper function to sort both the expected
and the actual results, i.e. the elements in COMPREPLY, before
comparing them, so the tests using this helper function will work
regardless of the order of elements.

Note that this change still leaves a bunch of tests depending on the
order of elements in COMPREPLY, tests that focus on a specific helper
function and therefore don't use the 'test_completion' helper.  I
would rather deal with those later, when (if ever) the need actually
arises, than create unnecessary code churn now.

Signed-off-by: SZEDER Gábor <>
 t/ | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/t/ b/t/
index f7a9dd446d..a747998d6c 100755
--- a/t/
+++ b/t/
@@ -84,10 +84,11 @@ test_completion ()
                printf '%s\n' "$2" >expected
-               sed -e 's/Z$//' >expected
+               sed -e 's/Z$//' |sort >expected
        fi &&
        run_completion "$1" &&
-       test_cmp expected out
+       sort out >out_sorted &&
+       test_cmp expected out_sorted
 # Test __gitcomp.
@@ -1405,6 +1406,7 @@ test_expect_success 'complete files' '
        echo "expected" > .gitignore &&
        echo "out" >> .gitignore &&
+       echo "out_sorted" >> .gitignore &&
        git add .gitignore &&
        test_completion "git commit " ".gitignore" &&

Reply via email to