aboutsummaryrefslogtreecommitdiffstats
path: root/misc/completion/gen_completion.go
diff options
context:
space:
mode:
Diffstat (limited to 'misc/completion/gen_completion.go')
-rw-r--r--misc/completion/gen_completion.go127
1 files changed, 127 insertions, 0 deletions
diff --git a/misc/completion/gen_completion.go b/misc/completion/gen_completion.go
new file mode 100644
index 00000000..5f643832
--- /dev/null
+++ b/misc/completion/gen_completion.go
@@ -0,0 +1,127 @@
+package main
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+ "sync"
+
+ "github.com/spf13/cobra"
+
+ "github.com/MichaelMure/git-bug/commands"
+)
+
+func main() {
+ fmt.Println("Generating completion files ...")
+
+ tasks := map[string]func(*cobra.Command) error{
+ "Bash": genBash,
+ "Fish": genFish,
+ "PowerShell": genPowerShell,
+ "ZSH": genZsh,
+ }
+
+ var wg sync.WaitGroup
+ for name, f := range tasks {
+ wg.Add(1)
+ go func(name string, f func(*cobra.Command) error) {
+ defer wg.Done()
+ root := commands.NewRootCommand()
+ err := f(root)
+ if err != nil {
+ fmt.Printf(" - %s: %v\n", name, err)
+ return
+ }
+ fmt.Printf(" - %s: ok\n", name)
+ }(name, f)
+ }
+
+ wg.Wait()
+}
+
+func genBash(root *cobra.Command) error {
+ cwd, err := os.Getwd()
+ if err != nil {
+ return err
+ }
+ f, err := os.Create(filepath.Join(cwd, "misc", "completion", "bash", "git-bug"))
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+
+ const patch = `
+# Custom bash code to connect the git completion for "git bug" to the
+# git-bug completion for "git-bug"
+_git_bug() {
+ local cur prev words cword split
+
+ COMPREPLY=()
+
+ # Call _init_completion from the bash-completion package
+ # to prepare the arguments properly
+ if declare -F _init_completion >/dev/null 2>&1; then
+ _init_completion -n "=:" || return
+ else
+ __git-bug_init_completion -n "=:" || return
+ fi
+
+ # START PATCH
+ # replace in the array ("git","bug", ...) to ("git-bug", ...) and adjust the index in cword
+ words=("git-bug" "${words[@]:2}")
+ cword=$(($cword-1))
+ # END PATCH
+
+ __git-bug_debug
+ __git-bug_debug "========= starting completion logic =========="
+ __git-bug_debug "cur is ${cur}, words[*] is ${words[*]}, #words[@] is ${#words[@]}, cword is $cword"
+
+ # The user could have moved the cursor backwards on the command-line.
+ # We need to trigger completion from the $cword location, so we need
+ # to truncate the command-line ($words) up to the $cword location.
+ words=("${words[@]:0:$cword+1}")
+ __git-bug_debug "Truncated words[*]: ${words[*]},"
+
+ local out directive
+ __git-bug_get_completion_results
+ __git-bug_process_completion_results
+}
+`
+ err = root.GenBashCompletionV2(f, true)
+ if err != nil {
+ return err
+ }
+
+ // Custom bash code to connect the git completion for "git bug" to the
+ // git-bug completion for "git-bug"
+ _, err = f.WriteString(patch)
+
+ return err
+}
+
+func genFish(root *cobra.Command) error {
+ cwd, err := os.Getwd()
+ if err != nil {
+ return err
+ }
+ dir := filepath.Join(cwd, "misc", "completion", "fish", "git-bug")
+ return root.GenFishCompletionFile(dir, true)
+}
+
+func genPowerShell(root *cobra.Command) error {
+ cwd, err := os.Getwd()
+ if err != nil {
+ return err
+ }
+ path := filepath.Join(cwd, "misc", "completion", "powershell", "git-bug")
+ return root.GenPowerShellCompletionFile(path)
+}
+
+func genZsh(root *cobra.Command) error {
+ cwd, err := os.Getwd()
+ if err != nil {
+ return err
+ }
+ path := filepath.Join(cwd, "misc", "completion", "zsh", "git-bug")
+ return root.GenZshCompletionFile(path)
+}