Add ditto archive helper

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Leon Mika 2026-05-02 10:09:40 +10:00
parent 0c48594842
commit 1acf07af16
2 changed files with 46 additions and 0 deletions

View file

@ -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
}

View file

@ -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)
}
}