build/update-readmes.go

85 строки
2.0 KiB
Go

// 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)
}
}