package docs import ( "bytes" "embed" "io/fs" "os" "path/filepath" "sort" ) // embeddedDocs holds zot's user-facing documentation so installed // binaries do not depend on a source checkout existing on disk. // //go:embed README.md docs/*.md var embeddedDocs embed.FS var docFiles = map[string]string{ "README.md": "README.md", "extensions.md": "docs/extensions.md", "rpc.md": "docs/rpc.md", "skills.md": "docs/skills.md", "themes.md": "docs/themes.md", } // EnsureInstalled writes the embedded docs into $ZOT_HOME/docs and // returns that directory. Existing files are left untouched when their // content already matches the embedded copy. func EnsureInstalled(zotHome string) (string, error) { dir := filepath.Join(zotHome, "docs") if err := os.MkdirAll(dir, 0o755); err != nil { return dir, err } names := make([]string, 0, len(docFiles)) for name := range docFiles { names = append(names, name) } sort.Strings(names) for _, name := range names { src := docFiles[name] data, err := fs.ReadFile(embeddedDocs, src) if err != nil { return dir, err } dst := filepath.Join(dir, name) if existing, err := os.ReadFile(dst); err == nil && bytes.Equal(existing, data) { continue } if err := os.WriteFile(dst, data, 0o644); err != nil { return dir, err } } return dir, nil }