1package main
2
3import (
4 "fmt"
5 "os"
6 "path"
7 "path/filepath"
8 "strings"
9 "time"
10
11 "github.com/go-errors/errors"
12 "github.com/spf13/cobra/doc"
13
14 "github.com/MichaelMure/git-bug/bridge"
15 "github.com/MichaelMure/git-bug/commands"
16)
17
18const bridgeExampleFilePath = "commands/bridge_configure_doc.go"
19
20func main() {
21 fmt.Println("Generating documentation ...")
22
23 tasks := map[string]func() error{
24 "BridgeConfig": genBridgeConfig,
25 "ManPage": genManPage,
26 "Markdown": genMarkdown,
27 }
28
29 // Due to concurrency issues in cobra, the following can't be concurrent :(
30
31 // var wg sync.WaitGroup
32 for name, f := range tasks {
33 // wg.Add(1)
34 // go func(name string, f func() error) {
35 // defer wg.Done()
36 err := f()
37 if err != nil {
38 fmt.Printf(" - %s: %v\n", name, err)
39 return
40 }
41 fmt.Printf(" - %s: ok\n", name)
42 // }(name, f)
43 }
44
45 // wg.Wait()
46}
47
48func genBridgeConfig() error {
49 var exampleText strings.Builder
50 exampleText.WriteString("`")
51 exampleText.WriteString(`# Interactive example
52[1]: github
53[2]: gitlab
54[3]: jira
55[4]: launchpad-preview
56
57target: 1
58name [default]: default
59
60Detected projects:
61[1]: github.com/a-hilaly/git-bug
62[2]: github.com/MichaelMure/git-bug
63
64[0]: Another project
65
66Select option: 1
67
68[1]: user provided token
69[2]: interactive token creation
70Select option: 1
71
72You can generate a new token by visiting https://github.com/settings/tokens.
73Choose 'Generate new token' and set the necessary access scope for your repository.
74
75The access scope depend on the type of repository.
76Public:
77 - 'public_repo': to be able to read public repositories
78Private:
79 - 'repo' : to be able to read private repositories
80
81Enter token: 87cf5c03b64029f18ea5f9ca5679daa08ccbd700
82Successfully configured bridge: default
83
84`)
85 targets := bridge.Targets()
86 for i, b := range targets {
87 if i != 0 {
88 _, err := exampleText.WriteString("\n\n")
89 if err != nil {
90 return err
91 }
92 }
93 _, err := fmt.Fprintf(&exampleText, "# For %s\ngit bug bridge configure \\\n", strings.Title(strings.Split(b, ".")[0]))
94 if err != nil {
95 return err
96 }
97 params, err := bridge.ValidParams(b)
98 if err != nil {
99 return errors.WrapPrefix(err, "bridge parameters", 0)
100 }
101 for _, param := range params {
102 _, err = fmt.Fprintf(&exampleText, " --%s=PLACEHOLDERTEXT \\\n", param)
103 if err != nil {
104 return err
105 }
106 }
107 }
108 exampleText.WriteString("`")
109
110 _ = os.Remove(bridgeExampleFilePath)
111
112 f, err := os.Create(bridgeExampleFilePath)
113 if err != nil {
114 return err
115 }
116 defer f.Close()
117
118 _, err = f.WriteString(`// Code generated by doc/gen_docs.go; DO NOT EDIT.
119
120package commands
121
122var bridgeConfigureExample =`)
123 if err != nil {
124 return err
125 }
126 _, err = f.WriteString(exampleText.String())
127 if err != nil {
128 return err
129 }
130
131 return nil
132}
133
134func genManPage() error {
135 cwd, _ := os.Getwd()
136 dir := path.Join(cwd, "doc", "man")
137
138 date := time.Date(2019, 4, 1, 12, 0, 0, 0, time.UTC)
139
140 header := &doc.GenManHeader{
141 Title: "GIT-BUG",
142 Section: "1",
143 Date: &date,
144 Source: "Generated from git-bug's source code",
145 }
146
147 files, err := filepath.Glob(dir + "/*.1")
148 if err != nil {
149 return err
150 }
151 for _, f := range files {
152 if err := os.Remove(f); err != nil {
153 return err
154 }
155 }
156
157 return doc.GenManTree(commands.NewRootCommand(), header, dir)
158}
159
160func genMarkdown() error {
161 cwd, _ := os.Getwd()
162 dir := path.Join(cwd, "doc", "md")
163
164 files, err := filepath.Glob(dir + "/*.md")
165 if err != nil {
166 return err
167 }
168 for _, f := range files {
169 if err := os.Remove(f); err != nil {
170 return err
171 }
172 }
173
174 return doc.GenMarkdownTree(commands.NewRootCommand(), dir)
175}