aboutsummaryrefslogtreecommitdiffstats
path: root/misc/completion/gen_completion.go
blob: 5f64383246b0e63a070f17432132e2ad09cea208 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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)
}