From 1acf07af16c34b0a95e100acf6b06ebe2b30e5d9 Mon Sep 17 00:00:00 2001 From: Leon Mika Date: Sat, 2 May 2026 10:09:40 +1000 Subject: [PATCH] Add ditto archive helper Co-Authored-By: Claude Opus 4.7 (1M context) --- internal/archive/archive.go | 22 ++++++++++++++++++++++ internal/archive/archive_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 internal/archive/archive.go create mode 100644 internal/archive/archive_test.go diff --git a/internal/archive/archive.go b/internal/archive/archive.go new file mode 100644 index 0000000..c018105 --- /dev/null +++ b/internal/archive/archive.go @@ -0,0 +1,22 @@ +package archive + +import ( + "context" + "fmt" + + "github.com/leonmika/wails-release/internal/runner" +) + +// ZipApp wraps a .app bundle into a .app.zip via ditto, preserving +// extended attributes and producing an archive Apple's notary service +// will accept. +func ZipApp(ctx context.Context, r runner.Runner, app, zipPath string) error { + _, err := r.Run(ctx, runner.Spec{ + Name: "ditto", + Args: []string{"-c", "-k", "--keepParent", app, zipPath}, + }) + if err != nil { + return fmt.Errorf("ditto archive %s -> %s: %w", app, zipPath, err) + } + return nil +} diff --git a/internal/archive/archive_test.go b/internal/archive/archive_test.go new file mode 100644 index 0000000..4782191 --- /dev/null +++ b/internal/archive/archive_test.go @@ -0,0 +1,24 @@ +package archive_test + +import ( + "context" + "reflect" + "testing" + + "github.com/leonmika/wails-release/internal/archive" + "github.com/leonmika/wails-release/internal/runner" +) + +func TestZipApp_BuildsCorrectDittoArgs(t *testing.T) { + f := &runner.Fake{} + f.On("ditto", nil).Return(nil, nil) + + err := archive.ZipApp(context.Background(), f, "/build/MyApp.app", "/dist/MyApp-1.2.3.app.zip") + if err != nil { + t.Fatalf("unexpected: %v", err) + } + want := []string{"-c", "-k", "--keepParent", "/build/MyApp.app", "/dist/MyApp-1.2.3.app.zip"} + if !reflect.DeepEqual(f.Calls[0].Args, want) { + t.Fatalf("args got %v want %v", f.Calls[0].Args, want) + } +}