916
|
1 _hg_commands()
|
|
2 {
|
|
3 local commands="$(hg -v help | sed -e '1,/^list of commands:/d' \
|
|
4 -e '/^global options:/Q' \
|
|
5 -e '/^ [^ ]/!d; s/[,:]//g;')"
|
|
6
|
|
7 # hide debug commands from users, but complete them if
|
|
8 # specifically asked for
|
|
9 if [[ "$cur" == de* ]]; then
|
|
10 commands="$commands debugcheckstate debugstate debugindex"
|
|
11 commands="$commands debugindexdot debugwalk"
|
|
12 fi
|
|
13 COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -W "$commands" -- "$cur") )
|
|
14 }
|
|
15
|
|
16 _hg_paths()
|
|
17 {
|
|
18 local paths="$(hg paths | sed -e 's/ = .*$//')"
|
|
19 COMPREPLY=(${COMPREPLY[@]:-} $( compgen -W "$paths" -- "$cur" ))
|
|
20 }
|
|
21
|
|
22 _hg_tags()
|
|
23 {
|
|
24 local tags="$(hg tags | sed -e 's/[0-9]*:[a-f0-9]\{40\}$//; s/ *$//')"
|
|
25 COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -W "$tags" -- "$cur") )
|
|
26 }
|
|
27
|
|
28 # this is "kind of" ugly...
|
|
29 _hg_count_non_option()
|
|
30 {
|
|
31 local i count=0
|
|
32 local filters="$1"
|
|
33
|
|
34 for (( i=1; $i<=$COMP_CWORD; i++ )); do
|
|
35 if [[ "${COMP_WORDS[i]}" != -* ]]; then
|
|
36 for f in $filters; do
|
|
37 if [[ ${COMP_WORDS[i-1]} == $f ]]; then
|
|
38 continue 2
|
|
39 fi
|
|
40 done
|
|
41 count=$(($count + 1))
|
|
42 fi
|
|
43 done
|
|
44
|
|
45 echo $(($count - 1))
|
|
46 }
|
|
47
|
|
48 _hg()
|
|
49 {
|
|
50 local cur prev cmd opts i
|
|
51
|
|
52 COMPREPLY=()
|
|
53 cur="$2"
|
|
54 prev="$3"
|
|
55
|
|
56 # searching for the command
|
|
57 # (first non-option argument that doesn't follow -R/--repository)
|
|
58 for (( i=1; $i<=$COMP_CWORD; i++ )); do
|
|
59 if [[ ${COMP_WORDS[i]} != -* ]] \
|
|
60 && [ "${COMP_WORDS[i-1]}" != -R ] \
|
|
61 && [ "${COMP_WORDS[i-1]}" != --repository ]; then
|
|
62 cmd="${COMP_WORDS[i]}"
|
|
63 break
|
|
64 fi
|
|
65 done
|
|
66
|
|
67 if [[ "$cur" == -* ]]; then
|
|
68 opts="$(hg -v help | sed -e '1,/^global options/d; /^ -/!d')"
|
|
69
|
|
70 if [ -n "$cmd" ]; then
|
|
71 opts="$opts $(hg help "$cmd" | sed -e '/^ -/!d; s/ [^-][^ ]*//')"
|
|
72 fi
|
|
73
|
|
74 COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -W "$opts" -- "$cur") )
|
|
75 return
|
|
76 fi
|
|
77
|
|
78 if [ "$prev" = -R ] || [ "$prev" = --repository ]; then
|
|
79 COMPREPLY=(${COMPREPLY[@]:-} $( compgen -d -- "$cur" ))
|
|
80 return
|
|
81 fi
|
|
82
|
|
83 if [ -z "$cmd" ] || [ $COMP_CWORD -eq $i ]; then
|
|
84 _hg_commands
|
|
85 return
|
|
86 fi
|
|
87
|
|
88 if [ "$cmd" != status ] && [ "$prev" = -r ] || [ "$prev" = --rev ]; then
|
|
89 _hg_tags
|
|
90 return
|
|
91 fi
|
|
92
|
|
93 case "$cmd" in
|
|
94 help)
|
|
95 _hg_commands
|
|
96 ;;
|
|
97 export|manifest|update|checkout|up|co)
|
|
98 _hg_tags
|
|
99 ;;
|
929
|
100 pull|push|outgoing|incoming)
|
916
|
101 _hg_paths
|
|
102 COMPREPLY=(${COMPREPLY[@]:-} $( compgen -d -- "$cur" ))
|
|
103 ;;
|
|
104 paths)
|
|
105 _hg_paths
|
|
106 ;;
|
|
107 clone)
|
|
108 local count=$(_hg_count_non_option)
|
|
109 if [ $count = 1 ]; then
|
|
110 _hg_paths
|
|
111 fi
|
|
112 COMPREPLY=(${COMPREPLY[@]:-} $( compgen -d -- "$cur" ))
|
|
113 ;;
|
|
114 cat)
|
|
115 local count=$(_hg_count_non_option -o --output)
|
|
116 if [ $count = 2 ]; then
|
|
117 _hg_tags
|
|
118 else
|
|
119 COMPREPLY=(${COMPREPLY[@]:-} $( compgen -f -- "$cur" ))
|
|
120 fi
|
|
121 ;;
|
|
122 *)
|
|
123 COMPREPLY=(${COMPREPLY[@]:-} $( compgen -f -- "$cur" ))
|
|
124 ;;
|
|
125 esac
|
|
126
|
|
127 }
|
|
128
|
|
129 complete -o filenames -F _hg hg
|