feat: ship -kind static packs the site dir deterministically
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 file changed,
+23
−7
cli.go+23 −7
diff --git a/cli.go b/cli.go| index e4b862f07..441b40f2a 100644 |
| --- a/cli.go |
| +++ b/cli.go |
| @@ -18,6 +18,7 @@ import ( |
| "text/tabwriter" |
| "time" |
| + "github.com/carlosframework/platform/internal/edge" |
| "github.com/carlosframework/platform/internal/registry" |
| "github.com/carlosframework/platform/internal/release" |
| "github.com/carlosframework/platform/internal/version" |
| @@ -164,20 +165,35 @@ func runShip(args []string) { |
| ver := fs.String("version", "", "version (git short sha)") |
| fs.Parse(args) |
| if *app == "" || *ver == "" || fs.NArg() == 0 { |
| - log.Fatal("usage: carlos ship -app <a> -version <sha> [-kind binary|static] <files...>") |
| + log.Fatal("usage: carlos ship -app <a> -version <sha> [-kind binary|static] <files-or-site-dir>") |
| } |
| files := map[string][]byte{} |
| arts := map[string]release.Artifact{} |
| - for _, path := range fs.Args() { |
| - data, err := os.ReadFile(path) |
| - if err != nil { |
| - log.Fatal(err) |
| - } |
| - name := filepath.Base(path) |
| + addFile := func(name string, data []byte) { |
| files[name] = data |
| sum := sha256.Sum256(data) |
| arts[name] = release.Artifact{File: name, SHA256: hex.EncodeToString(sum[:]), Size: int64(len(data))} |
| } |
| + if *kind == "static" { |
| + // A static release is one deterministic artifact: site.tar.gz of the |
| + // given directory, so re-shipping an unchanged tree is byte-identical. |
| + if fs.NArg() != 1 { |
| + log.Fatal("static ship takes exactly one site directory") |
| + } |
| + data, err := edge.PackDir(fs.Arg(0)) |
| + if err != nil { |
| + log.Fatal(err) |
| + } |
| + addFile("site.tar.gz", data) |
| + } else { |
| + for _, path := range fs.Args() { |
| + data, err := os.ReadFile(path) |
| + if err != nil { |
| + log.Fatal(err) |
| + } |
| + addFile(filepath.Base(path), data) |
| + } |
| + } |
| m := release.Manifest{ |
| Schema: 1, App: *app, Version: *ver, Kind: *kind, |
| BuiltBy: "carlos " + version.Build, BuiltAt: time.Now().UTC().Format(time.RFC3339), |