generate.go

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