Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions cli/command/publish/publish.go
Original file line number Diff line number Diff line change
Expand Up @@ -196,11 +196,12 @@ func runPublish(wpmCli command.Cli, opts publishOptions) error {
"uploading tarball to registry",
func() error {
upload, err := registryClient.UploadTarball(context.TODO(), tempTarball, client.UploadTarballOptions{
Acl: opts.access,
Name: wpmJson.Name,
Version: wpmJson.Version,
Digest: digest,
Type: wpmJson.Type,
Acl: opts.access,
Name: wpmJson.Name,
Version: wpmJson.Version,
Digest: digest,
Type: wpmJson.Type,
ContentLength: counter.total,
})
if err != nil {
return err
Expand Down
12 changes: 9 additions & 3 deletions cli/command/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,25 @@ package command
import (
"bufio"
"context"
"errors"
"fmt"
"io"
"os"
"runtime"
"strings"
"wpm/pkg/streams"

"github.com/docker/docker/errdefs"
"github.com/moby/term"
)

var ErrPromptTerminated = errdefs.Cancelled(errors.New("prompt terminated"))
type cancelledErr string

func (e cancelledErr) Error() string {
return string(e)
}

func (cancelledErr) Cancelled() {}

var ErrPromptTerminated = cancelledErr("prompt terminated")

// DisableInputEcho disables input echo on the provided streams.In.
// This is useful when the user provides sensitive information like passwords.
Expand Down
12 changes: 7 additions & 5 deletions cli/registry/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,12 @@ func NewRegistryClient(host string, authToken string, userAgent string, out *str

// UploadTarballOptions defines the options for uploading a tarball to the registry.
type UploadTarballOptions struct {
Name string // package name
Acl string // must be one of "public" or "private"
Digest string // base64 encoded digest of the package
Version string // package version
Type string // package type, e.g., "theme", "plugin" or "mu-plugin"
Name string // package name
Acl string // must be one of "public" or "private"
Digest string // base64 encoded digest of the package
Version string // package version
Type string // package type, e.g., "theme", "plugin" or "mu-plugin"
ContentLength int64 // length of the content being uploaded
}

// UploadTarballResponse defines the response structure for uploading a package.
Expand All @@ -73,6 +74,7 @@ func (c *client) UploadTarball(ctx context.Context, body io.Reader, opts UploadT
api.WithHeader("x-wpm-package-type", opts.Type),
api.WithHeader("x-wpm-checksum-sha256", opts.Digest),
api.WithHeader("Content-Type", "application/octet-stream"),
api.WithHeader("x-wpm-content-length", fmt.Sprintf("%d", opts.ContentLength)),
Comment thread
thelovekesh marked this conversation as resolved.
)
if err != nil {
return UploadTarballResponse{}, err
Expand Down
59 changes: 55 additions & 4 deletions cmd/wpm/wpm.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"io"
"os"
"os/signal"
"syscall"

"wpm/cli"
"wpm/cli/command"
Expand All @@ -14,22 +15,62 @@ import (
"wpm/cli/version"
platformsignals "wpm/cmd/wpm/internal/signals"

"github.com/docker/docker/errdefs"
"github.com/containerd/errdefs"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)

type errCtxSignalTerminated struct {
signal os.Signal
}

func (errCtxSignalTerminated) Error() string {
return ""
Comment thread
thelovekesh marked this conversation as resolved.
}

func main() {
err := wpmMain(context.Background())
if err != nil && !errdefs.IsCancelled(err) {
_, _ = fmt.Fprintln(os.Stderr, err)
if errors.As(err, &errCtxSignalTerminated{}) {
os.Exit(getExitCode(err))
}

if err != nil && !errdefs.IsCanceled(err) {
Comment thread
thelovekesh marked this conversation as resolved.
if err.Error() != "" {
_, _ = fmt.Fprintln(os.Stderr, err)
}
os.Exit(getExitCode(err))
}
}

func notifyContext(ctx context.Context, signals ...os.Signal) (context.Context, context.CancelFunc) {
ch := make(chan os.Signal, 1)
signal.Notify(ch, signals...)

ctxCause, cancel := context.WithCancelCause(ctx)

go func() {
select {
case <-ctx.Done():
signal.Stop(ch)
return
case sig := <-ch:
cancel(errCtxSignalTerminated{
signal: sig,
})
signal.Stop(ch)
return
}
}()

return ctxCause, func() {
signal.Stop(ch)
cancel(nil)
}
}

func wpmMain(ctx context.Context) error {
ctx, cancelNotify := signal.NotifyContext(ctx, platformsignals.TerminationSignals...)
ctx, cancelNotify := notifyContext(ctx, platformsignals.TerminationSignals...)
defer cancelNotify()

wpmCli, err := command.NewWpmCli()
Expand All @@ -48,6 +89,16 @@ func getExitCode(err error) int {
if err == nil {
return 0
}

var userTerminatedErr errCtxSignalTerminated
if errors.As(err, &userTerminatedErr) {
s, ok := userTerminatedErr.signal.(syscall.Signal)
if !ok {
return 1
}
return 128 + int(s)
}

var stErr cli.StatusError
if errors.As(err, &stErr) && stErr.StatusCode != 0 {
return stErr.StatusCode
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ toolchain go1.24.1
require (
github.com/Masterminds/semver/v3 v3.4.0
github.com/briandowns/spinner v1.23.2
github.com/docker/docker v28.1.1+incompatible
github.com/containerd/errdefs v1.0.0
github.com/docker/go-units v0.5.0
github.com/fvbommel/sortorder v1.1.0
github.com/go-playground/validator/v10 v10.27.0
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1
github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
github.com/briandowns/spinner v1.23.2 h1:Zc6ecUnI+YzLmJniCfDNaMbW0Wid1d5+qcTq4L2FW8w=
github.com/briandowns/spinner v1.23.2/go.mod h1:LaZeM4wm2Ywy6vO571mvhQNRcWfRUnXOs0RcKV0wYKM=
github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI=
github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M=
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
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/docker/docker v28.1.1+incompatible h1:49M11BFLsVO1gxY9UX9p/zwkE/rswggs8AdFmXQw51I=
github.com/docker/docker v28.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
Expand Down