1#autoload
2
3_arch_namespace () { #double as arch_namespace_categories
4  local ARCHCMD="$1"
5  shift
6# takes an integer argument specifying how many components:
7# 1: category
8# 2: branch
9# 3: version
10# 4: revision
11  local suffix expl archive=`$ARCHCMD my-default-archive 2> /dev/null`
12  local trailing_dashes=0
13  [[ -n $argv[(r)--trailing-dashes] ]] && trailing_dashes=1
14  local library
15  [[ -n $argv[(r)--library] ]] && library='library-';
16  local exclude_library_revisions=0
17  [[ -n $argv[(r)--exclude-library-revisions] ]] && exclude_library_revisions=1
18
19  if [ $1 -gt 1 ] || (( trailing_dashes )); then
20    suffix=(-q -S --)
21  fi
22  if [[ $PREFIX = */* ]]; then
23    compset -P '*/'
24    archive=${IPREFIX%/*}
25    _description -V categories expl "${library:-}categories in $archive"
26    compadd $suffix "$expl[@]" `$ARCHCMD ${library:-}categories $archive`
27  elif [ -z $IPREFIX ]; then
28    local index=$(( words[(i)-A] + 1 ))
29    (( index < CURRENT )) || index=$(( words[(i)--archive] + 1 ))
30    (( index < CURRENT )) && archive=$words[$index]
31
32    if [ $archive ]; then
33      _description -V categories expl "${library:-}categories in $archive"
34      compadd "$expl[@]" $suffix `$ARCHCMD ${library:-}categories $archive`
35    fi
36
37    _arch_archives "$ARCHCMD" -S / ${library:+--library}
38  fi
39  if [ $archive ] && [ $1 -gt 1 ] && [[ $PREFIX != *@* ]] \
40     && [[ $PREFIX = *--* ]]; then
41  #this match could be better
42    _arch_namespace_branches "$ARCHCMD" $(($1 - 1))
43  fi
44}
45
46(( $+functions[_arch_namespace_branches] )) ||
47_arch_namespace_branches () {
48  local ARCHCMD="$1"
49  shift
50  local suffix expl
51  if [ $1 -gt 1 ] || (( $trailing_dashes )); then
52    suffix=(-q -S --)
53  fi
54  if [[ $IPREFIX != *-- ]]; then
55    compset -P 1 '*--'
56    local category=${IPREFIX%--}
57    _description -V branches expl "${library:-}branches"
58    compadd $suffix "$expl[@]" \
59      ${${(@)$($ARCHCMD ${library:-}branches $category)}##*--}
60  fi
61  if [ $1 -gt 1 ] && [[ $IPREFIX = *-- ]] && [[ $PREFIX = *--* ]]; then
62    _arch_namespace_versions "${ARCHCMD}" $(($1 - 1))
63  fi
64}
65
66(( $+functions[_arch_namespace_versions] )) ||
67_arch_namespace_versions () {
68  local ARCHCMD="$1"
69  shift
70  local suffix expl
71  if [ $1 -gt 1 ]; then
72    suffix=(-q -S --)
73  fi
74  if [[ $IPREFIX != *--*-- ]] || [[ $IPREFIX != */*--*-- ]]; then
75    compset -P 1 '*--'
76    local branch=${IPREFIX%--}
77    _description -V versions expl "${library:-}versions"
78    compadd $suffix "$expl[@]" \
79      ${${(@)$($ARCHCMD ${library:-}versions $branch)}##*--}
80  fi
81  if [ $1 -gt 1 ] && [[ $IPREFIX = *--*-- ]] && ([[ $IPREFIX = */*--*-- ]] \
82    || [[ $PREFIX != */* ]]) && [[ $PREFIX = *--* ]]; then
83    _arch_namespace_revisions "${ARCHCMD}"
84  fi
85}
86
87(( $+functions[_arch_namespace_revisions] )) ||
88_arch_namespace_revisions () {
89  local ARCHCMD="$1"
90  local expl
91  if [[ $IPREFIX != *--*--*-- ]] || [[ $IPREFIX != */*--*--*-- ]]; then
92    compset -P 1 '*--'
93    local version=${IPREFIX%--}
94    _description -V revisions expl "${library:-}revisions"
95    local completions c
96    completions=(
97      ${${(@)$($ARCHCMD ${library:-}revisions $version)}##*--}
98    )
99    (( exclude_library_revisions )) && \
100        foreach c ($($ARCHCMD library-revisions $version)); do completions[(r)$c]=(); done
101    compadd "$expl[@]" -a completions
102  fi
103}
104
105_arch_namespace "$@"
106