diff --git a/go/cmd/internal/docgen/docgen.go b/go/cmd/internal/docgen/docgen.go index 65353319dca..7491f0b06ca 100644 --- a/go/cmd/internal/docgen/docgen.go +++ b/go/cmd/internal/docgen/docgen.go @@ -49,6 +49,7 @@ import ( "os/exec" "path/filepath" "strings" + "sync" "github.com/spf13/cobra" "github.com/spf13/cobra/doc" @@ -84,6 +85,10 @@ func GenerateMarkdownTree(cmd *cobra.Command, dir string) error { return fmt.Errorf("failed to index doc (generated at %s) into proper position (%s): %w", rootDocPath, indexDocPath, err) } + if err := anonymizeHomedir(indexDocPath); err != nil { + return fmt.Errorf("failed to anonymize homedir in help text for command %s: %w", indexDocPath, err) + } + if err := restructure(dir, dir, cmd.Name(), cmd.Commands()); err != nil { return err } @@ -123,10 +128,15 @@ func restructure(rootDir string, dir string, name string, commands []*cobra.Comm return fmt.Errorf("failed to create subdir for %s: %w", fullCmdFilename, err) } - if err := os.Rename(filepath.Join(rootDir, fullCmdFilename+".md"), filepath.Join(cmdDir, "_index.md")); err != nil { + indexFile := filepath.Join(cmdDir, "_index.md") + if err := os.Rename(filepath.Join(rootDir, fullCmdFilename+".md"), indexFile); err != nil { return fmt.Errorf("failed to move index doc for command %s with children: %w", fullCmdFilename, err) } + if err := anonymizeHomedir(indexFile); err != nil { + return fmt.Errorf("failed to anonymize homedir in help text for command %s: %w", indexFile, err) + } + if err := restructure(rootDir, cmdDir, fullCmdFilename, children); err != nil { return fmt.Errorf("failed to restructure child commands for %s: %w", fullCmdFilename, err) } @@ -150,6 +160,10 @@ func restructure(rootDir string, dir string, name string, commands []*cobra.Comm if out, err := sed.CombinedOutput(); err != nil { return fmt.Errorf("failed to rewrite links to parent command in child %s: %w (extra: %s)", newName, err, out) } + + if err := anonymizeHomedir(newName); err != nil { + return fmt.Errorf("failed to anonymize homedir in help text for command %s: %w", newName, err) + } default: // Top-level command without children. Nothing to restructure. continue @@ -163,6 +177,31 @@ func newParentLinkSedCommand(parent string, file string) *exec.Cmd { return exec.Command("sed", "-i", "", "-e", fmt.Sprintf("s:(./%s/):(../):i", parent), file) } +var ( + wd string + once sync.Once +) + +func anonymizeHomedir(file string) (err error) { + once.Do(func() { + // Only do this once per run. + wd, err = os.Getwd() + }) + if err != nil { + return err + } + + // We're replacing the stuff inside the square brackets in the example sed + // below: + // 's:Paths to search for config files in. (default \[.*\])$:Paths to search for config files in. (default \[$WORKDIR\]):' + sed := exec.Command("sed", "-i", "", "-e", fmt.Sprintf("s:%s:$WORKDIR:i", wd), file) + if out, err := sed.CombinedOutput(); err != nil { + return fmt.Errorf("%w: %s", err, out) + } + + return nil +} + func recursivelyDisableAutoGenTags(root *cobra.Command) { commands := []*cobra.Command{root} for cmd := commands[0]; len(commands) > 0; cmd, commands = commands[0], commands[1:] {