Skip to content

Commit 4f60dd7

Browse files
soraxasadmorgan
authored andcommitted
implements fish completion
Signed-off-by: Tin Lai <[email protected]>
1 parent 3ec45fd commit 4f60dd7

File tree

3 files changed

+107
-2
lines changed

3 files changed

+107
-2
lines changed

Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ compgen: force
101101
$(SHARE)/completion.bash
102102
perl pkg/bin/generate-completion.pl zsh $(DOC) $(LIB) > \
103103
$(SHARE)/zsh-completion/_git-subrepo
104+
perl pkg/bin/generate-completion.pl fish $(DOC) $(LIB) > \
105+
$(SHARE)/git-subrepo.fish
104106

105107
clean:
106108
rm -fr tmp test/tmp

pkg/bin/generate-completion.pl

Lines changed: 69 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,15 @@ sub main {
4646
if ($cmd eq "bash") {
4747
generate_bash(\@list, \@subdir_cmds, \@options);
4848
}
49-
else {
49+
elsif ($cmd eq "zsh") {
5050
generate_zsh(\@list, \@subdir_cmds, \@options);
5151
}
52-
52+
elsif ($cmd eq "fish") {
53+
generate_fish(\@list, \@subdir_cmds, \@options);
54+
}
55+
else {
56+
die "Unknown shell: $cmd";
57+
}
5358
}
5459

5560
sub generate_zsh {
@@ -139,6 +144,68 @@ sub generate_zsh {
139144
...
140145
}
141146

147+
sub generate_fish {
148+
my ($list, $subdir_cmds, $options) = @_;
149+
150+
print <<'...';
151+
# DO NOT EDIT. This file generated by pkg/bin/generate-completion.pl.
152+
153+
function __fish_git_subrepo_subdirs
154+
git subrepo status -q
155+
end
156+
157+
complete -c git-subrepo -f
158+
...
159+
160+
# Add subcommands
161+
print "complete -c git-subrepo -n '__fish_use_subcommand' -a '", join(" ", @$list), "'\n";
162+
163+
# Add options
164+
for my $opt (@$options) {
165+
my $keys = $opt->{keys};
166+
my $desc = $opt->{desc};
167+
$desc =~ s/'/'"'"'/g;
168+
169+
my @short_keys = grep { length $_ == 1 } @$keys;
170+
my @long_keys = grep { length $_ > 1 } @$keys;
171+
my $arg = $opt->{arg} ? " -r" : "";
172+
173+
if (@short_keys && @long_keys) {
174+
# Has both short and long options
175+
for my $i (0..$#long_keys) {
176+
my $short = $short_keys[$i] // '';
177+
my $long = $long_keys[$i];
178+
if ($short) {
179+
print "complete -c git-subrepo -l $long -s $short -d '$desc'$arg\n";
180+
} else {
181+
print "complete -c git-subrepo -l $long -d '$desc'$arg\n";
182+
}
183+
}
184+
} else {
185+
# Only short or only long options
186+
for my $key (@$keys) {
187+
if (length $key == 1) {
188+
print "complete -c git-subrepo -s $key -d '$desc'$arg\n";
189+
} else {
190+
print "complete -c git-subrepo -l $key -d '$desc'$arg\n";
191+
}
192+
}
193+
}
194+
}
195+
196+
# Add subdir commands completion
197+
for my $cmd (@$subdir_cmds) {
198+
print <<"...";
199+
complete -c git-subrepo -n '__fish_git_using_command $cmd' -a '(__fish_git_subrepo_subdirs)'
200+
...
201+
}
202+
203+
# Special handling for clone command which add folders and git remotes
204+
print <<'...';
205+
complete -c git-subrepo -F -n '__fish_git_using_command clone' -a '(__fish_git_remotes)' -d 'Repository to clone from'
206+
...
207+
}
208+
142209
sub generate_bash {
143210

144211
my ($list, $subdir_cmds, $options, $complete_fetch_limit) = @_;

share/git-subrepo.fish

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# DO NOT EDIT. This file generated by pkg/bin/generate-completion.pl.
2+
3+
function __fish_git_subrepo_subdirs
4+
git subrepo status -q
5+
end
6+
7+
complete -c git-subrepo -f
8+
complete -c git-subrepo -n '__fish_use_subcommand' -a 'branch clean clone commit config fetch help init pull push status upgrade version'
9+
complete -c git-subrepo -s h -d 'Show the command summary'
10+
complete -c git-subrepo -l help -d 'Help overview'
11+
complete -c git-subrepo -l version -d 'Print the git-subrepo version number'
12+
complete -c git-subrepo -l all -s a -d 'Perform command on all current subrepos'
13+
complete -c git-subrepo -l ALL -s A -d 'Perform command on all subrepos and subsubrepos'
14+
complete -c git-subrepo -l branch -s b -d 'Specify the upstream branch to push/pull/fetch' -r
15+
complete -c git-subrepo -l edit -s e -d 'Edit commit message'
16+
complete -c git-subrepo -l force -s f -d 'Force certain operations'
17+
complete -c git-subrepo -l fetch -s F -d 'Fetch the upstream content first'
18+
complete -c git-subrepo -l method -s M -d 'Join method: '"'"'merge'"'"' (default) or '"'"'rebase'"'"'' -r
19+
complete -c git-subrepo -l message -s m -d 'Specify a commit message' -r
20+
complete -c git-subrepo -l file -d 'Specify a commit message file' -r
21+
complete -c git-subrepo -l remote -s r -d 'Specify the upstream remote to push/pull/fetch' -r
22+
complete -c git-subrepo -l squash -s s -d 'Squash commits on push'
23+
complete -c git-subrepo -l update -s u -d 'Add the --branch and/or --remote overrides to .gitrepo'
24+
complete -c git-subrepo -l quiet -s q -d 'Show minimal output'
25+
complete -c git-subrepo -l verbose -s v -d 'Show verbose output'
26+
complete -c git-subrepo -l debug -s d -d 'Show the actual commands used'
27+
complete -c git-subrepo -l DEBUG -s x -d 'Turn on -x Bash debugging'
28+
complete -c git-subrepo -n '__fish_git_using_command branch' -a '(__fish_git_subrepo_subdirs)'
29+
complete -c git-subrepo -n '__fish_git_using_command clean' -a '(__fish_git_subrepo_subdirs)'
30+
complete -c git-subrepo -n '__fish_git_using_command commit' -a '(__fish_git_subrepo_subdirs)'
31+
complete -c git-subrepo -n '__fish_git_using_command config' -a '(__fish_git_subrepo_subdirs)'
32+
complete -c git-subrepo -n '__fish_git_using_command fetch' -a '(__fish_git_subrepo_subdirs)'
33+
complete -c git-subrepo -n '__fish_git_using_command pull' -a '(__fish_git_subrepo_subdirs)'
34+
complete -c git-subrepo -n '__fish_git_using_command push' -a '(__fish_git_subrepo_subdirs)'
35+
complete -c git-subrepo -n '__fish_git_using_command status' -a '(__fish_git_subrepo_subdirs)'
36+
complete -c git-subrepo -F -n '__fish_git_using_command clone' -a '(__fish_git_remotes)' -d 'Repository to clone from'

0 commit comments

Comments
 (0)