summaryrefslogtreecommitdiffstats
path: root/ci/test_complete.sh
blob: 5f00f79bdb5197cdb6460cac209ddd0fa96a24ef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#!/bin/sh

# Compares options in `rg --help` output to options in zsh completion function

set -e

main() {
    local rg="target/${TARGET}/release/rg"
    local _rg='complete/_rg'
    local ret='0'
    local helpTemp="$( mktemp )"
    local compTemp="$( mktemp )"
    local diff

    [ -e "${rg}" ] || rg="target/${TARGET}/debug/rg"

    if [ ! -e "${rg}" ]; then
        printf 'File not found: %s\n' "${rg}" >&2
        ret='1'
    elif [ ! -e "${_rg}" ]; then
        printf 'File not found: %s\n' "${_rg}" >&2
        ret='1'
    else
        # 'Parse' options out of the `--help` output. To prevent false positives
        # we only look at lines where the first non-white-space character is `-`
        "${rg}" --help |
        "${rg}" -- '^\s*-' |
        "${rg}" -io -- '[\t ,](-[a-z0-9]|--[a-z0-9-]+)\b' |
        tr -d '\t ,' |
        sort -u > "${helpTemp}"

        # 'Parse' options out of the completion-function file. To prevent false
        # negatives, we:
        #
        # * Exclude lines that look like comments
        # * Exclude lines that don't appear to have a bracketed description
        #   suitable for `_arguments`
        # * Exclude those bracketed descriptions so we don't match options
        #   which might be referenced in them
        # * Exclude parenthetical lists of exclusive options so we don't match
        #   those
        #
        # This does of course make the following assumptions:
        #
        # * Each option definition is on its own (single) line
        # * Each option definition has a description
        # * Option names are static — i.e., they aren't constructed from
        #   variables or command substitutions. Brace expansion is OK as long as
        #   each component of the expression is a complete option flag — in
        #   other words, `{--foo,--bar}` is valid, but `--{foo,bar}` is not
        "${rg}" -v -- '^\s*#' "${_rg}" |
        "${rg}" --replace '$1' -- '^.*?(?:\(.+?\).*?)?(-.+)\[.+\].*' |
        tr -d "\t (){}*=+:'\"" |
        tr ',' '\n' |
        sort -u > "${compTemp}"

        diff="$(
            if diff --help 2>&1 | grep -qF -- '--label'; then
                diff -U2 \
                    --label '`rg --help`' \
                    --label "${_rg}" \
                    "${helpTemp}" "${compTemp}" || true
            else
                diff -U2 \
                    -L '`rg --help`' \
                    -L "${_rg}" \
                    "${helpTemp}" "${compTemp}" || true
            fi
        )"

        [ -n "${diff}" ] && {
            printf '%s\n' 'zsh completion options differ from `--help` options:' >&2
            printf '%s\n' "${diff}" >&2
            ret='1'
        }
    fi

    rm -f "${helpTemp}" "${compTemp}"

    return "${ret}"
}

main "${@}"