gen_docs.go

  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}