// Copyright 2017 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// +build ignore

// The update-readmes.go tool creates or updates README.md files in
// the golang.org/x/build tree. It only updates files if they are
// missing or were previously generated by this tool.
//
// The auto-generated Markdown contains the package doc synopsis
// and a link to godoc.org for the API reference.
package main

import (
	"bytes"
	"fmt"
	"go/build"
	"io/ioutil"
	"log"
	"os"
	"path/filepath"
	"strings"
)

func main() {
	root, err := build.Import("golang.org/x/build", "", build.FindOnly)
	if err != nil {
		log.Fatalf("failed to find golang.org/x/build root: %v", err)
	}
	err = filepath.Walk(root.Dir, func(path string, fi os.FileInfo, err error) error {
		if err != nil {
			return err
		}
		if !fi.IsDir() {
			return nil
		}
		rest := strings.TrimPrefix(strings.TrimPrefix(path, root.Dir), "/")
		switch rest {
		case "env", "version", "vendor":
			return filepath.SkipDir
		}
		pkgName := "golang.org/x/build/" + filepath.ToSlash(rest)

		pkg, err := build.Import(pkgName, "", 0)
		if err != nil {
			// Skip.
			return nil
		}
		if _, err := os.Stat(filepath.Join(pkg.Dir, "README")); err == nil {
			// Directory has exiting README; don't touch.
			return nil
		}
		readmePath := filepath.Join(pkg.Dir, "README.md")
		exist, err := ioutil.ReadFile(readmePath)
		if err != nil && !os.IsNotExist(err) {
			// A real error.
			return err
		}
		const header = "Auto-generated by x/build/update-readmes.go"
		if len(exist) > 0 && !bytes.Contains(exist, []byte(header)) {
			return nil
		}
		newContents := []byte(fmt.Sprintf(`<!-- %s -->

[![GoDoc](https://godoc.org/%s?status.svg)](https://godoc.org/%s)

# %s

%s
`, header, pkgName, pkgName, pkgName, pkg.Doc))
		if bytes.Equal(exist, newContents) {
			return nil
		}
		if err := ioutil.WriteFile(readmePath, newContents, 0644); err != nil {
			return err
		}
		log.Printf("Wrote %s", readmePath)
		return nil
	})
	if err != nil {
		log.Fatal(err)
	}
}
