diff --git a/go.mod b/go.mod index 09aa540b..6628fe75 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/bitrise-io/go-utils v1.0.14 github.com/bitrise-io/go-utils/v2 v2.0.0-alpha.23 github.com/bitrise-io/go-xcode v1.3.0 - github.com/bitrise-io/go-xcode/v2 v2.0.0-alpha.66 + github.com/bitrise-io/go-xcode/v2 v2.0.0-alpha.67 github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 github.com/stretchr/testify v1.10.0 gopkg.in/yaml.v3 v3.0.1 diff --git a/go.sum b/go.sum index 165b0068..39714657 100644 --- a/go.sum +++ b/go.sum @@ -13,8 +13,8 @@ github.com/bitrise-io/go-utils/v2 v2.0.0-alpha.23 h1:Dfh4nyZPuEtilBisidejqxBrkx9 github.com/bitrise-io/go-utils/v2 v2.0.0-alpha.23/go.mod h1:3XUplo0dOWc3DqT2XA2SeHToDSg7+j1y1HTHibT2H68= github.com/bitrise-io/go-xcode v1.3.0 h1:QB8Vyr2oZQro/ocs9DJai80rlYL1hU1kwjHqdGslFLo= github.com/bitrise-io/go-xcode v1.3.0/go.mod h1:9OwsvrhZ4A2JxHVoEY7CPcABAKA+OE7FQqFfBfvbFuY= -github.com/bitrise-io/go-xcode/v2 v2.0.0-alpha.66 h1:b5l1PHUb618bRro8UZVwA5znA5p0PFCFFTl9NoqECPE= -github.com/bitrise-io/go-xcode/v2 v2.0.0-alpha.66/go.mod h1:rSmzmqVD3Mn9dWwe19qiiGjlvk/At3D8bQh7n9E8S58= +github.com/bitrise-io/go-xcode/v2 v2.0.0-alpha.67 h1:Fz3LSRoH9p5u7yTqdsmE32RHGWEw8q3BVWoOSiHs7AY= +github.com/bitrise-io/go-xcode/v2 v2.0.0-alpha.67/go.mod h1:rSmzmqVD3Mn9dWwe19qiiGjlvk/At3D8bQh7n9E8S58= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 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= diff --git a/vendor/github.com/bitrise-io/go-xcode/v2/autocodesign/devportalclient/appstoreconnect/appstoreconnect.go b/vendor/github.com/bitrise-io/go-xcode/v2/autocodesign/devportalclient/appstoreconnect/appstoreconnect.go index de64f725..36aca686 100644 --- a/vendor/github.com/bitrise-io/go-xcode/v2/autocodesign/devportalclient/appstoreconnect/appstoreconnect.go +++ b/vendor/github.com/bitrise-io/go-xcode/v2/autocodesign/devportalclient/appstoreconnect/appstoreconnect.go @@ -283,7 +283,6 @@ func (c *Client) Do(req *http.Request, v interface{}) (*http.Response, error) { c.tracker.TrackAPIRequest(req.Method, req.URL.Host, req.URL.Path, resp.StatusCode, duration) - if v != nil { decErr := json.NewDecoder(resp.Body).Decode(v) if decErr == io.EOF { diff --git a/vendor/github.com/bitrise-io/go-xcode/v2/loginterceptor/loginterceptor.go b/vendor/github.com/bitrise-io/go-xcode/v2/loginterceptor/loginterceptor.go index d4eb3bf6..570bad59 100644 --- a/vendor/github.com/bitrise-io/go-xcode/v2/loginterceptor/loginterceptor.go +++ b/vendor/github.com/bitrise-io/go-xcode/v2/loginterceptor/loginterceptor.go @@ -13,8 +13,8 @@ import ( // both writers. Partial writes without newline are buffered until a newline. type PrefixInterceptor struct { prefixRegexp *regexp.Regexp - intercepted io.Writer - target io.Writer + intercepted *NonBlockingWriter + target *NonBlockingWriter logger log.Logger // internal pipe and goroutine to scan and route @@ -31,8 +31,8 @@ func NewPrefixInterceptor(prefixRegexp *regexp.Regexp, intercepted, target io.Wr pipeReader, pipeWriter := io.Pipe() interceptor := &PrefixInterceptor{ prefixRegexp: prefixRegexp, - intercepted: intercepted, - target: target, + intercepted: NewNonBlockingWriter(intercepted, logger), + target: NewNonBlockingWriter(target, logger), logger: logger, internalReader: pipeReader, internalWriter: pipeWriter, @@ -55,18 +55,12 @@ func (i *PrefixInterceptor) Close() error { } func (i *PrefixInterceptor) closeAfterRun() { - // Close writers if able - if interceptedCloser, ok := i.intercepted.(io.Closer); ok { - if err := interceptedCloser.Close(); err != nil { - i.logger.Errorf("closing intercepted writer: %v", err) - } + if err := i.intercepted.Close(); err != nil { + i.logger.Errorf("intercepted writer: %v", err) } - if originalCloser, ok := i.target.(io.Closer); ok { - if err := originalCloser.Close(); err != nil { - i.logger.Errorf("closing original writer: %v", err) - } + if err := i.target.Close(); err != nil { + i.logger.Errorf("target writer: %v", err) } - if err := i.internalReader.Close(); err != nil { i.logger.Errorf("internal reader: %v", err) } @@ -104,3 +98,53 @@ func (i *PrefixInterceptor) run() { i.logger.Errorf("router scanner error: %v\n", err) } } + +// NonBlockingWriter is an io.Writer that writes to a wrapped io.Writer in a non-blocking way. +type NonBlockingWriter struct { + channel chan []byte + wrapped io.Writer + logger log.Logger +} + +// NewNonBlockingWriter creates a new NonBlockingWriter. +func NewNonBlockingWriter(w io.Writer, logger log.Logger) *NonBlockingWriter { + writer := &NonBlockingWriter{ + channel: make(chan []byte, 10000), // buffered channel to avoid blocking + wrapped: w, + logger: logger, + } + go writer.Run() + return writer +} + +// Write implements io.Writer. It writes into an internal pipe which the interceptor goroutine consumes. +func (i *NonBlockingWriter) Write(p []byte) (int, error) { + select { + case i.channel <- p: + return len(p), nil + default: + i.logger.Debugf("buffer full, dropping log") + return 0, nil + } +} + +// Close stops the interceptor and closes the pipe. +func (i *NonBlockingWriter) Close() error { + close(i.channel) + return nil +} + +// Run consumes the channel and writes to the wrapped writer. +func (i *NonBlockingWriter) Run() { + for msg := range i.channel { + if _, err := i.wrapped.Write(msg); err != nil { + i.logger.Errorf("NonBlockingWriter: wrapped writer error: %v", err) + } + } + + if closer, ok := i.wrapped.(io.Closer); ok { + if err := closer.Close(); err != nil { + i.logger.Errorf("NonBlockingWriter: closing wrapped writer: %v", err) + } + } +} diff --git a/vendor/github.com/bitrise-io/go-xcode/v2/xcodecache/swiftpm_cache.go b/vendor/github.com/bitrise-io/go-xcode/v2/xcodecache/swiftpm_cache.go index 402e9261..e137981e 100644 --- a/vendor/github.com/bitrise-io/go-xcode/v2/xcodecache/swiftpm_cache.go +++ b/vendor/github.com/bitrise-io/go-xcode/v2/xcodecache/swiftpm_cache.go @@ -12,7 +12,8 @@ import ( // SwiftPackagesStateInvalid is the partial error message printed out if swift packages cache is invalid. // Can be used to detect invalid state and clear the path returned by SwiftPackagesPath. // xcodebuild: error: Could not resolve package dependencies: -// The repository at [path] is invalid; try resetting package caches +// +// The repository at [path] is invalid; try resetting package caches const SwiftPackagesStateInvalid = "Could not resolve package dependencies:" // SwiftPackageCache ... diff --git a/vendor/modules.txt b/vendor/modules.txt index 65ef53d7..9c0a6b78 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -55,7 +55,7 @@ github.com/bitrise-io/go-xcode/xcodeproject/serialized github.com/bitrise-io/go-xcode/xcodeproject/xcodeproj github.com/bitrise-io/go-xcode/xcodeproject/xcscheme github.com/bitrise-io/go-xcode/xcodeproject/xcworkspace -# github.com/bitrise-io/go-xcode/v2 v2.0.0-alpha.66 +# github.com/bitrise-io/go-xcode/v2 v2.0.0-alpha.67 ## explicit; go 1.22 github.com/bitrise-io/go-xcode/v2/autocodesign github.com/bitrise-io/go-xcode/v2/autocodesign/certdownloader