From 79d24ab9aa66d6bc0114fbc4dd8aa1af8335b672 Mon Sep 17 00:00:00 2001 From: Mengqi Yu Date: Wed, 3 Jan 2018 15:05:31 -0800 Subject: [PATCH] update-imported-docs in golang (#6642) --- update-imported-docs/README | 5 + update-imported-docs/config.yaml | 14 +++ update-imported-docs/update-imported-docs.go | 124 +++++++++++++++++++ 3 files changed, 143 insertions(+) create mode 100644 update-imported-docs/README create mode 100644 update-imported-docs/config.yaml create mode 100644 update-imported-docs/update-imported-docs.go diff --git a/update-imported-docs/README b/update-imported-docs/README new file mode 100644 index 0000000000..0314070896 --- /dev/null +++ b/update-imported-docs/README @@ -0,0 +1,5 @@ +update-imported-docs/update-imported-docs.go will update the target files generated from other repos. +You should modify update-imported-docs/config.yaml to reflect the desired src and dst path. +``` +go run update-imported-docs/update-imported-docs.go +``` diff --git a/update-imported-docs/config.yaml b/update-imported-docs/config.yaml new file mode 100644 index 0000000000..b889e7b80b --- /dev/null +++ b/update-imported-docs/config.yaml @@ -0,0 +1,14 @@ +repos: +- name: kubernetes + remote: https://github.com/kubernetes/kubernetes.git + branch: release-1.9 + files: + - src: docs/admin/cloud-controller-manager.md + dst: docs/reference/generated/cloud-controller-manager.md +#- name: federation +# remote: https://github.com/kubernetes/federation.git +# # Change this to a release branch when federation has release branches. +# branch: master +# files: +# - src: a/foo.md +# dst: b/foo.md diff --git a/update-imported-docs/update-imported-docs.go b/update-imported-docs/update-imported-docs.go new file mode 100644 index 0000000000..cb8de3aabb --- /dev/null +++ b/update-imported-docs/update-imported-docs.go @@ -0,0 +1,124 @@ +package main + +import ( + "fmt" + "io" + "io/ioutil" + "os" + "os/exec" + "path" + "path/filepath" + "regexp" + + "github.com/ghodss/yaml" +) + +func main() { + websiteRepo, err := os.Getwd() + checkError(err) + + content, err := ioutil.ReadFile("update-imported-docs/config.yaml") + if err != nil { + fmt.Fprintf(os.Stderr, "error when reading file: %v\n", err) + os.Exit(1) + } + + var config map[string]interface{} + err = yaml.Unmarshal(content, &config) + if err != nil { + fmt.Fprintf(os.Stderr, "error when unmarshal the config file: %v\n", err) + os.Exit(1) + } + + tmpDir := "/tmp/update_docs" + os.RemoveAll(tmpDir) + os.Mkdir(tmpDir, 0750) + + // Match the content between 2 `---` + // It mostly have something like: + // --- + // title: *** + // notile: *** + // --- + titleRegex := regexp.MustCompile("^---\n(.*\n)*---\n") + + repos := config["repos"].([]interface{}) + for _, repo := range repos { + err = os.Chdir(tmpDir) + checkError(err) + + r := repo.(map[string]interface{}) + repoName := r["name"].(string) + cmd := "git" + args := []string{"clone", "--depth=1", "-b", r["branch"].(string), r["remote"].(string), repoName} + fmt.Fprintf(os.Stdout, "Cloning repo %q\n", repoName) + if err := exec.Command(cmd, args...).Run(); err != nil { + fmt.Fprintf(os.Stderr, "error when cloning repo %q: %v\n", repoName, err) + os.Exit(1) + } + + err = os.Chdir(repoName) + checkError(err) + + fmt.Fprintf(os.Stdout, "Generating docs for repo %q\n", repoName) + if err := exec.Command("hack/generate-docs.sh").Run(); err != nil { + fmt.Fprintf(os.Stderr, "error when generating docs for repo %q: %v\n", repoName, err) + os.Exit(1) + } + + err = os.Chdir(websiteRepo) + checkError(err) + files := r["files"].([]interface{}) + for _, file := range files { + f := file.(map[string]interface{}) + src := f["src"].(string) + dst := f["dst"].(string) + absSrc, err := filepath.Abs(path.Join(tmpDir, repoName, src)) + checkError(err) + absDst, err := filepath.Abs(dst) + checkError(err) + // Ignore the error if the old file is not found/ + content, _ := ioutil.ReadFile(absDst) + titleBlock := titleRegex.Find(content) + content, err = ioutil.ReadFile(absSrc) + checkError(err) + dstFile, err := os.OpenFile(absDst, os.O_RDWR|os.O_CREATE, 0755) + checkError(err) + defer dstFile.Close() + _, err = dstFile.Write(titleBlock) + checkError(err) + _, err = dstFile.Write(content) + checkError(err) + dstFile.Sync() + } + } + fmt.Fprintf(os.Stdout, "Docs imported! Run 'git add .' 'git commit -m ' and 'git push' to upload them\n") +} + +func copyFile(src, dst string) error { + sf, err := os.Open(src) + if err != nil { + return err + } + defer sf.Close() + + df, err := os.Create(dst) + if err != nil { + return err + } + defer df.Close() + + _, err = io.Copy(df, sf) + if err != nil { + return err + } + + return df.Sync() +} + +func checkError(err error) { + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +}