about summary refs log tree commit diff
path: root/Functions/VCS_Info/vcs_info
blob: 5a421dfede356db1514f6171422863fcc1490d61 (plain) (blame)
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
## vim:ft=zsh:foldmethod=marker
##
## vcs_info - provide version control information
##
## Written by Frank Terbeck <ft@bewatermyfriend.org>
##
## This file and all corresponding files in Functions/VCS_Info/ are
## distributed under the same BSD-ish license as zsh itself.
##

setopt localoptions noksharrays extendedglob NO_shwordsplit
local file func sys
local -a static_functions

static_functions=(
    VCS_INFO_adjust
    VCS_INFO_bydir_detect
    VCS_INFO_check_com
    VCS_INFO_formats
    VCS_INFO_get_cmd
    VCS_INFO_hook
    VCS_INFO_maxexports
    VCS_INFO_nvcsformats
    VCS_INFO_quilt
    VCS_INFO_realpath
    VCS_INFO_reposub
    VCS_INFO_set

    vcs_info_hookadd
    vcs_info_hookdel
    vcs_info_lastmsg
    vcs_info_printsys
    vcs_info_setsys
)

for func in ${static_functions} ; do
    autoload -Uz ${func}
done

[[ -n ${(Mk)parameters:#vcs_info_msg_<->_} ]] && unset ${parameters[(I)vcs_info_msg_<->_]}
VCS_INFO_set --nvcs '-preinit-'
vcs_info_setsys

# and now, finally create the real vcs_info function
vcs_info () {
    emulate -L zsh
    setopt extendedglob NO_warn_create_global

    [[ -r . ]] || return 0

    local pat
    local -i found retval
    local -a enabled disabled dps
    local -x usercontext vcs rrn quiltmode LC_MESSAGES
    local -ix maxexports
    local -ax msgs
    local -Ax vcs_comm hook_com backend_misc user_data

    LC_MESSAGES=C
    if [[ -n ${LC_ALL} ]]; then
        local -x LANG
        LANG=${LC_ALL}
        local -x LC_ALL
    fi
    vcs='-init-'; rrn='-all-'; quiltmode='addon'
    usercontext=${1:-default}

    VCS_INFO_hook "start-up"
    retval=$?
    if (( retval == 1 )); then
        return 0
    elif (( retval == 2 )); then
        # This needs `max-exports' set. We're still setting it again later
        # for more specific contexts.
        VCS_INFO_maxexports
        VCS_INFO_set --nvcs
        return 0
    fi

    zstyle -a ":vcs_info:${vcs}:${usercontext}:${rrn}" "enable" enabled
    (( ${#enabled} == 0 )) && enabled=( all )

    if [[ -n ${(M)enabled:#(#i)none} ]] ; then
        [[ -n ${vcs_info_msg_0_} ]] && VCS_INFO_set --nvcs
        return 0
    fi

    if [[ -n ${(M)enabled:#(#i)all} ]] ; then
        enabled=( ${VCS_INFO_backends} )
        zstyle -a ":vcs_info:${vcs}:${usercontext}:${rrn}" "disable" disabled
    fi

    zstyle -a ":vcs_info:${vcs}:${usercontext}:${rrn}" "disable-patterns" dps

    for pat in ${dps} ; do
        if [[ ${PWD} == ${~pat} ]] ; then
            [[ -n ${vcs_info_msg_0_} ]] && VCS_INFO_set --nvcs
            return 0
        fi
    done

    VCS_INFO_maxexports

    (( found = 0 ))
    for vcs in ${enabled} ; do
        [[ -n ${(M)disabled:#${vcs}} ]] && continue
        if (( ${+functions[VCS_INFO_detect_${vcs}]} == 0 )) ; then
            printf 'vcs_info: configured unknown backend: '\''%s'\''\n' ${vcs}
            printf 'vcs_info: use '\''vcs_info_printsys'\'' to find supported systems.\n'
            continue
        fi
        vcs_comm=()
        VCS_INFO_get_cmd
        VCS_INFO_detect_${vcs} && (( found = 1 )) && break
    done

    (( found == 0 )) && {
        vcs='-quilt-'; quiltmode='standalone'
        VCS_INFO_quilt standalone || VCS_INFO_set --nvcs
        return 0
    }

    VCS_INFO_hook "pre-get-data"
    retval=$?
    if (( retval == 1 )); then
        return 0
    elif (( retval == 2 )); then
        VCS_INFO_set --nvcs
        return 0
    fi

    VCS_INFO_get_data_${vcs} || {
        VCS_INFO_set --nvcs
        return 1
    }

    VCS_INFO_set
    return 0
}

vcs_info "$@"