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}