carlos / platform Public

feat: ship -kind static packs the site dir deterministically

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Paul Campbell 2024e502a193169173ab32d71e0fac974057a762 parent ede3ba4
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),