diff --git a/archive/cmd/archive/main.go b/archive/cmd/archive/main.go deleted file mode 100644 index 9cbcd08..0000000 --- a/archive/cmd/archive/main.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) 2025 Z5Labs and Contributors -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - -package main - -import "dagger/archive/internal/archive" - -func main() { - archive.Main() -} diff --git a/archive/go.mod b/archive/go.mod index a55022b..dfd3bdd 100644 --- a/archive/go.mod +++ b/archive/go.mod @@ -5,8 +5,6 @@ go 1.24.4 require ( github.com/99designs/gqlgen v0.17.75 github.com/Khan/genqlient v0.8.1 - github.com/containerd/platforms v0.2.1 - github.com/spf13/cobra v1.9.1 github.com/vektah/gqlparser/v2 v2.5.28 github.com/z5labs/sdk-go v0.2.0 go.opentelemetry.io/otel v1.36.0 @@ -30,17 +28,11 @@ require ( require ( github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cenkalti/backoff/v5 v5.0.2 // indirect - github.com/containerd/log v0.1.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.0-rc5 // indirect - github.com/sirupsen/logrus v1.9.3 // indirect github.com/sosodev/duration v1.3.1 // indirect - github.com/spf13/pflag v1.0.6 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 // indirect golang.org/x/net v0.41.0 // indirect diff --git a/archive/go.sum b/archive/go.sum index c5feee0..24f8611 100644 --- a/archive/go.sum +++ b/archive/go.sum @@ -8,12 +8,6 @@ github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK3 github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8= github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= -github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= -github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= -github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= -github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -29,27 +23,12 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= -github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sosodev/duration v1.3.1 h1:qtHBDMQ6lvMQsL15g4aopM4HEfOaYuhWBw3NPTtlqq4= github.com/sosodev/duration v1.3.1/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= -github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= -github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= -github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= -github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/vektah/gqlparser/v2 v2.5.28 h1:bIulcl3LF69ba6EiZVGD88y4MkM+Jxrf3P2MX8xLRkY= @@ -96,7 +75,6 @@ golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= @@ -109,7 +87,5 @@ google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok= google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/archive/internal/archive/archive.go b/archive/internal/archive/archive.go deleted file mode 100644 index d2f4edc..0000000 --- a/archive/internal/archive/archive.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2025 Z5Labs and Contributors -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - -package archive - -import ( - "context" - "log/slog" - "os" - "os/signal" - - "github.com/spf13/cobra" -) - -func Main() { - ctx, cancel := signal.NotifyContext(context.Background(), os.Kill, os.Interrupt) - defer cancel() - - log := slog.New(slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{})) - - cmd := archiveCommand() - - err := cmd.ExecuteContext(ctx) - if err != nil { - log.ErrorContext(ctx, "unexpected error", slog.Any("error", err)) - os.Exit(1) - } -} - -func archiveCommand() *cobra.Command { - cmd := &cobra.Command{ - Use: "archive", - } - - cmd.AddCommand( - zipCommand(), - tarCommand(), - ) - - return cmd -} diff --git a/archive/internal/archive/tar.go b/archive/internal/archive/tar.go index 1c9984a..5fc2831 100644 --- a/archive/internal/archive/tar.go +++ b/archive/internal/archive/tar.go @@ -8,63 +8,41 @@ package archive import ( "archive/tar" "compress/gzip" + "context" "io" "log/slog" "os" "path" - "github.com/spf13/cobra" + "dagger/archive/internal/dagger" + "github.com/z5labs/sdk-go/try" ) -func tarCommand() *cobra.Command { - cmd := &cobra.Command{ - Use: "tar", - Short: "Utilities for working with TAR archives.", - } - - cmd.AddCommand( - tarExtractCommand(), - ) - - return cmd -} - -func tarExtractCommand() *cobra.Command { - cmd := &cobra.Command{ - Use: "extract FILE DIR", - Short: "Extract a TAR archive to a specified directory.", - Args: cobra.ExactArgs(2), - RunE: extractTar, - } - - cmd.Flags().Bool("gzip", false, "Enable gzip decompression.") - - return cmd -} +func ExtractTar(ctx context.Context, filename, out string, isGziped bool) error { + _, span := dagger.Tracer().Start(ctx, "archive.ExtractTar") + defer span.End() -func extractTar(cmd *cobra.Command, args []string) error { - log := slog.New(slog.NewJSONHandler(cmd.ErrOrStderr(), &slog.HandlerOptions{})) + log := slog.New(slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{})) - err := os.MkdirAll(args[1], os.ModeDir) + err := os.MkdirAll(out, os.ModeDir) if err != nil { - log.ErrorContext(cmd.Context(), "failed to create output directory", slog.Any("error", err)) + log.ErrorContext(ctx, "failed to create output directory", slog.Any("error", err)) return err } - f, err := os.Open(args[0]) + f, err := os.Open(filename) if err != nil { - log.ErrorContext(cmd.Context(), "failed to open file", slog.Any("error", err)) + log.ErrorContext(ctx, "failed to open file", slog.Any("error", err)) return err } defer f.Close() var stream io.Reader = f - isGziped, _ := cmd.Flags().GetBool("gzip") if isGziped { stream, err = gzip.NewReader(stream) if err != nil { - log.ErrorContext(cmd.Context(), "failed to create gzip reader", slog.Any("error", err)) + log.ErrorContext(ctx, "failed to create gzip reader", slog.Any("error", err)) return err } } @@ -76,7 +54,7 @@ func extractTar(cmd *cobra.Command, args []string) error { return nil } if err != nil { - log.ErrorContext(cmd.Context(), "failed to get header", slog.Any("error", err)) + log.ErrorContext(ctx, "failed to get header", slog.Any("error", err)) return err } @@ -86,21 +64,21 @@ func extractTar(cmd *cobra.Command, args []string) error { dir, _ := path.Split(h.Name) if dir != "" { - err = os.MkdirAll(path.Join(args[1], dir), os.ModeDir) + err = os.MkdirAll(path.Join(out, dir), os.ModeDir) if err != nil { - log.ErrorContext(cmd.Context(), "failed to create output sub dir", slog.Any("error", err)) + log.ErrorContext(ctx, "failed to create output sub dir", slog.Any("error", err)) return err } } - f, err := os.Create(path.Join(args[1], h.Name)) + f, err := os.Create(path.Join(out, h.Name)) if err != nil { return err } err = copyTarFile(f, tr) if err != nil { - log.ErrorContext(cmd.Context(), "failed to write tar content to output directory", slog.Any("error", err)) + log.ErrorContext(ctx, "failed to write tar content to output directory", slog.Any("error", err)) return err } } diff --git a/archive/internal/archive/zip.go b/archive/internal/archive/zip.go index 9c67070..2174488 100644 --- a/archive/internal/archive/zip.go +++ b/archive/internal/archive/zip.go @@ -7,51 +7,32 @@ package archive import ( "archive/zip" + "context" "io" "log/slog" "os" "path" - "github.com/spf13/cobra" + "dagger/archive/internal/dagger" + "github.com/z5labs/sdk-go/try" ) -func zipCommand() *cobra.Command { - cmd := &cobra.Command{ - Use: "zip", - Short: "Utilities for working with ZIP archives.", - } - - cmd.AddCommand( - zipExtractCommand(), - ) - - return cmd -} - -func zipExtractCommand() *cobra.Command { - cmd := &cobra.Command{ - Use: "extract FILE DIR", - Short: "Extract a ZIP archive to a specified directory.", - Args: cobra.ExactArgs(2), - RunE: extractZip, - } - - return cmd -} +func ExtractZip(ctx context.Context, filename, out string) error { + _, span := dagger.Tracer().Start(ctx, "archive.ExtractZip") + defer span.End() -func extractZip(cmd *cobra.Command, args []string) error { - log := slog.New(slog.NewJSONHandler(cmd.ErrOrStderr(), &slog.HandlerOptions{})) + log := slog.New(slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{})) - err := os.MkdirAll(args[1], os.ModeDir) + err := os.MkdirAll(out, os.ModeDir) if err != nil { - log.ErrorContext(cmd.Context(), "failed to create output directory", slog.Any("error", err)) + log.ErrorContext(ctx, "failed to create output directory", slog.Any("error", err)) return err } - zr, err := zip.OpenReader(args[0]) + zr, err := zip.OpenReader(filename) if err != nil { - log.ErrorContext(cmd.Context(), "failed to open file", slog.Any("error", err)) + log.ErrorContext(ctx, "failed to open file", slog.Any("error", err)) return err } defer zr.Close() @@ -61,9 +42,9 @@ func extractZip(cmd *cobra.Command, args []string) error { continue } - err = os.MkdirAll(path.Join(args[1], zipFile.Name), os.ModeDir) + err = os.MkdirAll(path.Join(out, zipFile.Name), os.ModeDir) if err != nil { - log.ErrorContext(cmd.Context(), "failed to create output dir", slog.Any("error", err)) + log.ErrorContext(ctx, "failed to create output dir", slog.Any("error", err)) return err } } @@ -73,21 +54,21 @@ func extractZip(cmd *cobra.Command, args []string) error { continue } - out, err := os.Create(path.Join(args[1], zipFile.Name)) + out, err := os.Create(path.Join(out, zipFile.Name)) if err != nil { - log.ErrorContext(cmd.Context(), "failed to create output file", slog.Any("error", err)) + log.ErrorContext(ctx, "failed to create output file", slog.Any("error", err)) return err } rc, err := zipFile.Open() if err != nil { - log.ErrorContext(cmd.Context(), "failed to open zip content", slog.Any("error", err)) + log.ErrorContext(ctx, "failed to open zip content", slog.Any("error", err)) return err } err = copyZipFile(out, rc) if err != nil { - log.ErrorContext(cmd.Context(), "failed to write zip content to output directory", slog.Any("error", err)) + log.ErrorContext(ctx, "failed to write zip content to output directory", slog.Any("error", err)) return err } } diff --git a/archive/main.go b/archive/main.go index 694703d..8ce37eb 100644 --- a/archive/main.go +++ b/archive/main.go @@ -2,30 +2,10 @@ package main import ( "context" - - "dagger/archive/internal/dagger" - - "github.com/containerd/platforms" ) -type Archive struct { - // +private - Container *dagger.Container -} - -func New(ctx context.Context) (*Archive, error) { - ctrs, err := dag.Go(). - Module(dag.CurrentModule().Source()). - Library(). - Application("./cmd/archive"). - Build(ctx, dagger.GoApplicationBuildOpts{ - Platforms: []dagger.Platform{dagger.Platform(platforms.DefaultString())}, - }) - if err != nil { - return nil, err - } +type Archive struct{} - return &Archive{ - Container: &ctrs[0], - }, nil +func New(ctx context.Context) *Archive { + return &Archive{} } diff --git a/archive/tar.go b/archive/tar.go index 676d8ec..92b4b56 100644 --- a/archive/tar.go +++ b/archive/tar.go @@ -7,18 +7,15 @@ package main import ( "context" + + "dagger/archive/internal/archive" "dagger/archive/internal/dagger" ) -type Tar struct { - // +private - Container *dagger.Container -} +type Tar struct{} func (m *Archive) Tar() *Tar { - return &Tar{ - Container: m.Container, - } + return &Tar{} } // Extract tar contents to a directory @@ -36,20 +33,15 @@ func (t *Tar) Extract( return nil, err } - args := []string{"tar", "extract"} - - if gzip { - args = append(args, "--gzip") + _, err = file.Export(ctx, name) + if err != nil { + return nil, err } - args = append(args, name, "out") - - dir := t.Container. - WithFile(name, file). - WithExec(args, dagger.ContainerWithExecOpts{ - UseEntrypoint: true, - }). - Directory("out") + err = archive.ExtractTar(ctx, name, "out", gzip) + if err != nil { + return nil, err + } - return dir, nil + return dag.CurrentModule().Workdir("out"), nil } diff --git a/archive/zip.go b/archive/zip.go index b8a8604..9257d2e 100644 --- a/archive/zip.go +++ b/archive/zip.go @@ -8,18 +8,14 @@ package main import ( "context" + "dagger/archive/internal/archive" "dagger/archive/internal/dagger" ) -type Zip struct { - // +private - Container *dagger.Container -} +type Zip struct{} func (m *Archive) Zip() *Zip { - return &Zip{ - Container: m.Container, - } + return &Zip{} } // Extract zip contents to a directory @@ -32,14 +28,15 @@ func (z *Zip) Extract( return nil, err } - args := []string{"zip", "extract", name, "out"} + _, err = file.Export(ctx, name) + if err != nil { + return nil, err + } - dir := z.Container. - WithFile(name, file). - WithExec(args, dagger.ContainerWithExecOpts{ - UseEntrypoint: true, - }). - Directory("out") + err = archive.ExtractZip(ctx, name, "out") + if err != nil { + return nil, err + } - return dir, nil + return dag.CurrentModule().Workdir("out"), nil }