// Package export writes the published tree to a directory, for static // hosts and CI. package export import ( "fmt" "os" "path/filepath" "git.pablomurad.com/pablo/patchwork/internal/render" ) // Write puts every file of the tree under dir. It builds the new tree in a // sibling directory and swaps it in, so a web server reading dir never sees // a half-written export. Files in dir that Patchwork didn't write are lost: // give Patchwork a directory of its own. func Write(t *render.Tree, dir string) error { dir = filepath.Clean(dir) tmp := dir + ".tmp" old := dir + ".old" if err := os.RemoveAll(tmp); err != nil { return err } for _, p := range t.Paths() { dst := filepath.Join(tmp, filepath.FromSlash(p)) if err := os.MkdirAll(filepath.Dir(dst), 0o755); err != nil { return err } if err := os.WriteFile(dst, t.Files[p].Body, 0o644); err != nil { return err } } if err := os.RemoveAll(old); err != nil { return err } if _, err := os.Stat(dir); err == nil { if err := os.Rename(dir, old); err != nil { return fmt.Errorf("move old export aside: %w", err) } } if err := os.Rename(tmp, dir); err != nil { os.Rename(old, dir) // put the previous export back return fmt.Errorf("swap in new export: %w", err) } return os.RemoveAll(old) }