Add the 'sync' command
[stgit] / contrib / stgit-completion.bash
CommitLineData
8ebae56b
KH
1# bash completion support for StGIT -*- shell-script -*-
2#
3# Copyright (C) 2006, Karl Hasselström <kha@treskal.com>
4# Based on git-completion.sh
5#
6# To use these routines:
7#
8# 1. Copy this file to somewhere (e.g. ~/.stgit-completion.bash).
9#
10# 2. Add the following line to your .bashrc:
11# . ~/.stgit-completion.bash
12
1aaf55c9
CM
13_stg_commands="
14 add
15 applied
16 assimilate
17 branch
18 delete
19 diff
20 clean
21 clone
22 commit
23 export
24 files
25 float
26 fold
27 goto
28 id
29 import
30 init
31 log
32 mail
33 new
34 patches
35 pick
36 pop
37 pull
38 push
39 refresh
40 rename
41 resolved
42 rm
43 series
44 show
45 status
06848fab 46 sync
1aaf55c9
CM
47 top
48 unapplied
49 uncommit
50"
51
8ebae56b
KH
52# The path to .git, or empty if we're not in a repository.
53_gitdir ()
54{
55 echo "$(git rev-parse --git-dir 2>/dev/null)"
56}
57
58# Name of the current branch, or empty if there isn't one.
59_current_branch ()
60{
61 local b=$(git symbolic-ref HEAD 2>/dev/null)
62 echo ${b#refs/heads/}
63}
64
65# List of all applied patches.
66_applied_patches ()
67{
68 local g=$(_gitdir)
69 [ "$g" ] && cat "$g/patches/$(_current_branch)/applied"
70}
71
72# List of all unapplied patches.
73_unapplied_patches ()
74{
75 local g=$(_gitdir)
76 [ "$g" ] && cat "$g/patches/$(_current_branch)/unapplied"
77}
78
79# List of all patches.
80_all_patches ()
81{
82 local b=$(_current_branch)
83 local g=$(_gitdir)
84 [ "$g" ] && cat "$g/patches/$b/applied" "$g/patches/$b/unapplied"
85}
86
87# List of all patches except the current patch.
88_all_other_patches ()
89{
90 local b=$(_current_branch)
91 local g=$(_gitdir)
92 [ "$g" ] && cat "$g/patches/$b/applied" "$g/patches/$b/unapplied" \
93 | grep -v "^$(< $g/patches/$b/current)$"
94}
95
1aaf55c9
CM
96# List the command options
97_cmd_options ()
98{
99 stg $1 --help | grep -e " --[A-Za-z]" | sed -e "s/.*\(--[^ =]\+\).*/\1/"
100}
101
8ebae56b
KH
102# Generate completions for patches and patch ranges from the given
103# patch list function, and options from the given list.
104_complete_patch_range ()
105{
106 local patchlist="$1" options="$2"
107 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
108 case "$cur" in
109 *..*)
110 pfx="${cur%..*}.."
111 cur="${cur#*..}"
112 COMPREPLY=($(compgen -P "$pfx" -W "$($patchlist)" -- "$cur"))
113 ;;
114 *)
115 COMPREPLY=($(compgen -W "$options $($patchlist)" -- "$cur"))
116 ;;
117 esac
118}
119
ebbd6f00
CM
120_complete_patch_range_options ()
121{
122 local patchlist="$1" options="$2" patch_options="$3"
123 local prev="${COMP_WORDS[COMP_CWORD-1]}"
124 local cur="${COMP_WORDS[COMP_CWORD]}"
125 local popt
126 for popt in $patch_options; do
127 if [ $prev == $popt ]; then
128 _complete_patch_range $patchlist
129 return
130 fi
131 done
132 COMPREPLY=($(compgen -W "$options" -- "$cur"))
133}
134
8ebae56b
KH
135# Generate completions for options from the given list.
136_complete_options ()
137{
138 local options="$1"
139 COMPREPLY=($(compgen -W "$options" -- "${COMP_WORDS[COMP_CWORD]}"))
140}
141
1aaf55c9 142_stg_common ()
8ebae56b 143{
1aaf55c9 144 _complete_options "$(_cmd_options $1)"
8ebae56b
KH
145}
146
ebbd6f00 147_stg_patches ()
8ebae56b 148{
ebbd6f00 149 _complete_patch_range "$2" "$(_cmd_options $1)"
8ebae56b
KH
150}
151
ebbd6f00 152_stg_patches_options ()
8ebae56b 153{
ebbd6f00 154 _complete_patch_range_options "$2" "$(_cmd_options $1)" "$3"
8ebae56b
KH
155}
156
1aaf55c9 157_stg_help ()
8ebae56b 158{
1aaf55c9 159 _complete_options "$_stg_commands"
8ebae56b
KH
160}
161
162_stg ()
163{
164 local i c=1 command
165
166 while [ $c -lt $COMP_CWORD ]; do
167 if [ $c == 1 ]; then
168 command="${COMP_WORDS[c]}"
169 fi
170 c=$((++c))
171 done
172
173 # Complete name of subcommand.
174 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
175 COMPREPLY=($(compgen \
1aaf55c9 176 -W "--help --version copyright help $_stg_commands" \
8ebae56b
KH
177 -- "${COMP_WORDS[COMP_CWORD]}"))
178 return;
179 fi
180
181 # Complete arguments to subcommands.
182 case "$command" in
1aaf55c9
CM
183 # generic commands
184 help) _stg_help ;;
185 # repository commands
ebbd6f00 186 id) _stg_patches $command _all_patches ;;
1aaf55c9 187 # stack commands
ebbd6f00
CM
188 float) _stg_patches $command _all_patches ;;
189 goto) _stg_patches $command _all_other_patches ;;
190 pop) _stg_patches $command _applied_patches ;;
191 push) _stg_patches $command _unapplied_patches ;;
1aaf55c9 192 # patch commands
ebbd6f00 193 delete) _stg_patches $command _all_patches ;;
8560c67b 194 export) _stg_patches $command _applied_patches ;;
ebbd6f00
CM
195 files) _stg_patches $command _all_patches ;;
196 log) _stg_patches $command _all_patches ;;
197 mail) _stg_patches $command _applied_patches ;;
198 pick) _stg_patches $command _unapplied_patches ;;
199 refresh)_stg_patches_options $command _applied_patches "-p --patch" ;;
200 rename) _stg_patches $command _all_patches ;;
201 show) _stg_patches $command _all_patches ;;
06848fab 202 sync) _stg_patches $command _applied_patches ;;
ebbd6f00
CM
203 # working-copy commands
204 diff) _stg_patches_options $command _applied_patches "-r --range" ;;
1aaf55c9
CM
205 # all the other commands
206 *) _stg_common $command ;;
8ebae56b
KH
207 esac
208}
209
210complete -o default -F _stg stg