1package main
2
3import (
4 "fmt"
5 "os"
6 "path/filepath"
7 "strings"
8 "sync"
9 "time"
10
11 "github.com/spf13/cobra"
12 "github.com/spf13/cobra/doc"
13
14 "github.com/git-bug/git-bug/commands"
15)
16
17// TaskError holds a given task name and the error it returned (if any)
18type TaskError struct {
19 name string
20 err error
21}
22
23func main() {
24 fmt.Println("Generating documentation...")
25
26 tasks := map[string]func(*cobra.Command) error{
27 "ManPage": genManPage,
28 "Markdown": genMarkdown,
29 }
30
31 var wg sync.WaitGroup
32 errs := make(chan TaskError, len(tasks))
33 for name, f := range tasks {
34 wg.Add(1)
35 go func(name string, f func(*cobra.Command) error) {
36 defer wg.Done()
37 root := commands.NewRootCommand()
38 err := f(root)
39 if err != nil {
40 fmt.Printf(" - %s: FATAL\n", name)
41 errs <- TaskError{name: name, err: err}
42 return
43 }
44 fmt.Printf(" - %s: ok\n", name)
45 }(name, f)
46 }
47
48 wg.Wait()
49 close(errs)
50
51 if len(errs) > 0 {
52 fmt.Println()
53 for e := range errs {
54 fmt.Printf(" Error generating %s:\n", strings.ToLower(e.name))
55 for _, line := range strings.Split(e.err.Error(), "\n") {
56 fmt.Printf(" %s\n", line)
57 }
58 fmt.Println()
59 }
60 os.Exit(1)
61 }
62}
63
64func genManPage(root *cobra.Command) error {
65 cwd, _ := os.Getwd()
66 dir := filepath.Join(cwd, "doc", "man")
67
68 // fixed date to avoid having to commit each month
69 date := time.Date(2019, 4, 1, 12, 0, 0, 0, time.UTC)
70
71 header := &doc.GenManHeader{
72 Title: "GIT-BUG",
73 Section: "1",
74 Date: &date,
75 Source: "Generated from git-bug's source code",
76 }
77
78 files, err := filepath.Glob(dir + "/*.1")
79 if err != nil {
80 return err
81 }
82 for _, f := range files {
83 if err := os.Remove(f); err != nil {
84 return err
85 }
86 }
87
88 return doc.GenManTree(root, header, dir)
89}
90
91func genMarkdown(root *cobra.Command) error {
92 cwd, _ := os.Getwd()
93 dir := filepath.Join(cwd, "doc", "md")
94
95 files, err := filepath.Glob(dir + "/*.md")
96 if err != nil {
97 return err
98 }
99 for _, f := range files {
100 if err := os.Remove(f); err != nil {
101 return err
102 }
103 }
104
105 if err := doc.GenMarkdownTree(root, dir); err != nil {
106 return err
107 }
108
109 return nil
110}