diff --git a/internal/gitea/files.go b/internal/gitea/files.go index e579dd4..3fcd229 100644 --- a/internal/gitea/files.go +++ b/internal/gitea/files.go @@ -92,13 +92,24 @@ type FileWriteResult struct { } `json:"commit"` } +// UpsertFile creates a file when args.Sha is empty (POST) or updates an existing +// file when args.Sha is set (PUT). Gitea routes both operations by HTTP method on +// the same /contents/{path} URL, and rejects PUT without a sha. func (c *Client) UpsertFile(ctx context.Context, owner, repo, path string, args UpsertFileArgs) (*FileWriteResult, error) { p := fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", owner, repo, path) payload, err := json.Marshal(args) if err != nil { return nil, err } - body, status, err := c.PutJSON(ctx, p, payload) + var ( + body []byte + status int + ) + if args.Sha == "" { + body, status, err = c.PostJSON(ctx, p, payload) + } else { + body, status, err = c.PutJSON(ctx, p, payload) + } if err != nil { return nil, err }