1package main
2
3import (
4	"flag"
5	"fmt"
6	"html/template"
7	"log"
8	"os"
9	"path/filepath"
10	"strings"
11
12	"golang.org/x/tools/go/packages"
13)
14
15var tmpl = `<!DOCTYPE html>
16<html lang="en">
17    <head>
18        <meta http-equiv="refresh" content="5; url=https://godoc.org/go.mongodb.org/mongo-driver/{{.}}">
19        <meta name=go-import content="go.mongodb.org/mongo-driver git https://github.com/mongodb/mongo-go-driver.git">
20        <meta name="go-source" content="go.mongodb.org/mongo-driver https://github.com/mongodb/mongo-go-driver https://github.com/mongodb/mongo-go-driver/tree/master{/dir} https://github.com/mongodb/mongo-go-driver/blob/master{/dir}/{file}#L{line}">
21    </head>
22    <body>
23        Redirecting to docs...
24    </body>
25</html>
26`
27
28func main() {
29	var directory = "."
30	var destination = "s3-website"
31	fs := flag.NewFlagSet("", flag.ExitOnError)
32	fs.Usage = func() {
33		fmt.Fprintln(fs.Output(), "docbuilder is used to create the static site for the import paths for go.mongodb.org.")
34		fmt.Fprintln(fs.Output(), "usage: docbuilder [flags] [destination]")
35		fs.PrintDefaults()
36	}
37	fs.StringVar(&directory, "directory", ".", "directory to run docbuilder on")
38	err := fs.Parse(os.Args[1:])
39	if err == flag.ErrHelp {
40		fs.Usage()
41		os.Exit(0)
42	}
43	if err != nil {
44		log.Fatalf("Could not parse flags: %v", err)
45	}
46
47	args := fs.Args()
48	if len(args) > 0 {
49		destination = args[0]
50	}
51
52	pkgs, err := packages.Load(&packages.Config{Dir: directory}, "./...")
53	if err != nil {
54		log.Fatalf("Could not load packages: %v", err)
55	}
56
57	dirs := make([]string, 1, len(pkgs)+1)
58	for _, pkg := range pkgs {
59		if !strings.HasPrefix(pkg.PkgPath, "go.mongodb.org") {
60			continue
61		}
62		dirs = append(dirs, strings.TrimPrefix(pkg.PkgPath, "go.mongodb.org/mongo-driver"))
63	}
64
65	err = os.MkdirAll(filepath.Join(destination, "mongo-driver"), os.ModeDir|os.FileMode(0755))
66	if err != nil {
67		log.Fatalf("Could not make path: %v", err)
68	}
69
70	t, err := template.New("index").Parse(tmpl)
71	if err != nil {
72		log.Fatalf("Could not parse template: %v", err)
73	}
74
75	for _, dir := range dirs {
76		directory := filepath.Join(destination, "mongo-driver", dir)
77		err = os.MkdirAll(directory, os.ModeDir|os.FileMode(0755))
78		if err != nil {
79			log.Fatalf("Could not create directory (%s): %v", directory, err)
80		}
81
82		file, err := os.Create(filepath.Join(directory, "index.html"))
83		if err != nil {
84			log.Fatalf("Could not create index.html: %v", err)
85		}
86
87		err = t.Execute(file, dir)
88		if err != nil {
89			log.Fatalf("Could not execute template: %v", err)
90		}
91	}
92}
93