From e86b08a724e09d287ff5762d613121c8c073decb Mon Sep 17 00:00:00 2001 From: Robert Kaussow Date: Sun, 15 Dec 2024 21:23:20 +0100 Subject: [PATCH] Add client error to sdk and fix purge cli --- cli/pipeline/purge.go | 9 +++++++- woodpecker-go/woodpecker/client.go | 34 +++++++++++++++++++++++++----- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/cli/pipeline/purge.go b/cli/pipeline/purge.go index c71b6ee79..3781f8458 100644 --- a/cli/pipeline/purge.go +++ b/cli/pipeline/purge.go @@ -1,4 +1,4 @@ -// Copyright 2022 Woodpecker Authors +// Copyright 2024 Woodpecker Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -16,7 +16,9 @@ package pipeline import ( "context" + "errors" "fmt" + "net/http" "time" "github.com/rs/zerolog/log" @@ -121,6 +123,11 @@ func pipelinePurge(c *cli.Command, client woodpecker.Client) (err error) { err := client.PipelineDelete(repoID, p.Number) if err != nil { + var clientErr *woodpecker.ClientError + if errors.As(err, &clientErr) && clientErr.StatusCode == http.StatusUnprocessableEntity { + log.Error().Err(err).Msgf("failed to delete pipeline %d", p.Number) + continue + } return err } } diff --git a/woodpecker-go/woodpecker/client.go b/woodpecker-go/woodpecker/client.go index 3a26f5dc2..8eb613fbd 100644 --- a/woodpecker-go/woodpecker/client.go +++ b/woodpecker-go/woodpecker/client.go @@ -34,6 +34,15 @@ const ( // pathVersion = "%s/version" ) +type ClientError struct { + StatusCode int + Message string +} + +func (e *ClientError) Error() string { + return fmt.Sprintf("client error %d: %s", e.StatusCode, e.Message) +} + type client struct { client *http.Client addr string @@ -116,16 +125,25 @@ func (c *client) do(rawURL, method string, in, out any) error { func (c *client) open(rawURL, method string, in any) (io.ReadCloser, error) { uri, err := url.Parse(rawURL) if err != nil { - return nil, err + return nil, &ClientError{ + StatusCode: http.StatusInternalServerError, + Message: err.Error(), + } } req, err := http.NewRequest(method, uri.String(), nil) if err != nil { - return nil, err + return nil, &ClientError{ + StatusCode: http.StatusInternalServerError, + Message: err.Error(), + } } if in != nil { decoded, decodeErr := json.Marshal(in) if decodeErr != nil { - return nil, decodeErr + return nil, &ClientError{ + StatusCode: http.StatusInternalServerError, + Message: decodeErr.Error(), + } } buf := bytes.NewBuffer(decoded) req.Body = io.NopCloser(buf) @@ -135,12 +153,18 @@ func (c *client) open(rawURL, method string, in any) (io.ReadCloser, error) { } resp, err := c.client.Do(req) if err != nil { - return nil, err + return nil, &ClientError{ + StatusCode: http.StatusInternalServerError, + Message: err.Error(), + } } if resp.StatusCode > http.StatusPartialContent { defer resp.Body.Close() out, _ := io.ReadAll(resp.Body) - return nil, fmt.Errorf("client error %d: %s", resp.StatusCode, string(out)) + return nil, &ClientError{ + StatusCode: resp.StatusCode, + Message: string(out), + } } return resp.Body, nil }