Skip to content
This repository was archived by the owner on Dec 10, 2024. It is now read-only.

Commit 9dc1b19

Browse files
svanharmelenneomantra
authored andcommitted
Update the PR
1 parent 69a6faf commit 9dc1b19

4 files changed

+67
-90
lines changed

generic_packages.go

+32-45
Original file line numberDiff line numberDiff line change
@@ -23,31 +23,32 @@ import (
2323
"net/http"
2424
)
2525

26-
// GenericPackageStatusValue represents a GitLab Package Status.
27-
type GenericPackageStatusValue string
28-
29-
// These constants represent all valid package statuses.
30-
const (
31-
Default GenericPackageStatusValue = "default"
32-
Hidden GenericPackageStatusValue = "hidden"
33-
)
34-
35-
// GenericPackagesService handles communication with the packages related methods
36-
// of the GitLab API.
26+
// GenericPackagesService handles communication with the packages related
27+
// methods of the GitLab API.
3728
//
38-
// GitLab docs: https://docs.gitlab.com/ee/user/packages/generic_packages/index.html
29+
// GitLab docs:
30+
// https://docs.gitlab.com/ee/user/packages/generic_packages/index.html
3931
type GenericPackagesService struct {
4032
client *Client
4133
}
4234

43-
// DownloadPackageFile allows you to download the package file.
35+
// PublishPackageFileOptions represents the available PublishPackageFile()
36+
// options.
4437
//
4538
// GitLab docs:
4639
// https://docs.gitlab.com/ee/user/packages/generic_packages/index.html#download-package-file
47-
func (s *GenericPackagesService) DownloadPackageFile(pid interface{}, packageName, packageVersion, fileName string, options ...RequestOptionFunc) ([]byte, *Response, error) {
40+
type PublishPackageFileOptions struct {
41+
Status *GenericPackageStatusValue `url:"status,omitempty" json:"status,omitempty"`
42+
}
43+
44+
// PublishPackageFile uploads a file to a project's package registry.
45+
//
46+
// GitLab docs:
47+
// https://docs.gitlab.com/ee/user/packages/generic_packages/index.html#download-package-file
48+
func (s *GenericPackagesService) PublishPackageFile(pid interface{}, packageName, packageVersion, fileName string, content io.Reader, opt *PublishPackageFileOptions, options ...RequestOptionFunc) (*Response, error) {
4849
project, err := parseID(pid)
4950
if err != nil {
50-
return nil, nil, err
51+
return nil, err
5152
}
5253
u := fmt.Sprintf(
5354
"projects/%s/packages/generic/%s/%s/%s",
@@ -57,37 +58,29 @@ func (s *GenericPackagesService) DownloadPackageFile(pid interface{}, packageNam
5758
pathEscape(fileName),
5859
)
5960

60-
req, err := s.client.NewRequest(http.MethodGet, u, nil, options)
61-
if err != nil {
62-
return nil, nil, err
63-
}
64-
65-
var f bytes.Buffer
66-
resp, err := s.client.Do(req, &f)
61+
// We need to create the request as a GET request to make sure the options
62+
// are set correctly. After the request is created we will overwrite both
63+
// the method and the body.
64+
req, err := s.client.NewRequest(http.MethodGet, u, opt, options)
6765
if err != nil {
68-
return nil, resp, err
66+
return nil, err
6967
}
7068

71-
return f.Bytes(), resp, err
72-
}
69+
// Overwrite the method and body.
70+
req.Method = http.MethodPut
71+
req.SetBody(content)
7372

74-
// PublishPackageFileOptions represents the available PublishPackageFile() options.
75-
//
76-
// GitLab docs:
77-
// https://docs.gitlab.com/ee/user/packages/generic_packages/index.html#download-package-file
78-
type PublishPackageFileOptions struct {
79-
Status *GenericPackageStatusValue `url:"status,omitempty" json:"status,omitempty"`
73+
return s.client.Do(req, nil)
8074
}
8175

82-
// PublishPackageFile uploads a file to a project's Package Registry.
83-
// Returns the package URL, the response body, the Response, and any error.
76+
// DownloadPackageFile allows you to download the package file.
8477
//
8578
// GitLab docs:
8679
// https://docs.gitlab.com/ee/user/packages/generic_packages/index.html#download-package-file
87-
func (s *GenericPackagesService) PublishPackageFile(pid interface{}, packageName, packageVersion, fileName string, content io.ReadCloser, opt *PublishPackageFileOptions, options ...RequestOptionFunc) (string, []byte, *Response, error) {
80+
func (s *GenericPackagesService) DownloadPackageFile(pid interface{}, packageName, packageVersion, fileName string, options ...RequestOptionFunc) ([]byte, *Response, error) {
8881
project, err := parseID(pid)
8982
if err != nil {
90-
return "", nil, nil, err
83+
return nil, nil, err
9184
}
9285
u := fmt.Sprintf(
9386
"projects/%s/packages/generic/%s/%s/%s",
@@ -97,22 +90,16 @@ func (s *GenericPackagesService) PublishPackageFile(pid interface{}, packageName
9790
pathEscape(fileName),
9891
)
9992

100-
// This is currently the only way to use a PUT request to upload a non-JSON file.
101-
// We invoke NewRequest with MethodGet so the body is not marshalled to JSON;
102-
// WithUploadFile modifies the request to MethodPut
103-
options = append(options, WithUploadFile(content))
104-
req, err := s.client.NewRequest(http.MethodGet, u, opt, options)
93+
req, err := s.client.NewRequest(http.MethodGet, u, nil, options)
10594
if err != nil {
106-
return "", nil, nil, err
95+
return nil, nil, err
10796
}
10897

10998
var f bytes.Buffer
11099
resp, err := s.client.Do(req, &f)
111100
if err != nil {
112-
return "", nil, resp, err
101+
return nil, resp, err
113102
}
114103

115-
// ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/my_package/0.0.1/file.txt'
116-
downloadURL := fmt.Sprintf("%s%s", s.client.BaseURL(), u)
117-
return downloadURL, f.Bytes(), resp, err
104+
return f.Bytes(), resp, err
118105
}

generic_packages_test.go

+18-35
Original file line numberDiff line numberDiff line change
@@ -17,37 +17,13 @@
1717
package gitlab
1818

1919
import (
20-
"encoding/json"
2120
"fmt"
22-
"io"
2321
"net/http"
2422
"reflect"
2523
"strings"
2624
"testing"
2725
)
2826

29-
func TestDownloadPackageFile(t *testing.T) {
30-
mux, server, client := setup(t)
31-
defer teardown(server)
32-
33-
mux.HandleFunc("/api/v4/projects/1234/packages/generic/foo/0.1.2/bar-baz.txt", func(w http.ResponseWriter, r *http.Request) {
34-
testMethod(t, r, http.MethodGet)
35-
fmt.Fprint(w, strings.TrimSpace(`
36-
bar = baz
37-
`))
38-
})
39-
40-
packageBytes, _, err := client.GenericPackages.DownloadPackageFile(1234, "foo", "0.1.2", "bar-baz.txt")
41-
if err != nil {
42-
t.Errorf("GenericPackages.DownloadPackageFile returned error: %v", err)
43-
}
44-
45-
want := []byte("bar = baz")
46-
if !reflect.DeepEqual(want, packageBytes) {
47-
t.Errorf("GenericPackages.DownloadPackageFile returned %+v, want %+v", packageBytes, want)
48-
}
49-
}
50-
5127
func TestPublishPackageFile(t *testing.T) {
5228
mux, server, client := setup(t)
5329
defer teardown(server)
@@ -61,23 +37,30 @@ func TestPublishPackageFile(t *testing.T) {
6137
`)
6238
})
6339

64-
url, result, _, err := client.GenericPackages.PublishPackageFile(1234, "foo", "0.1.2", "bar-baz.txt", io.NopCloser(strings.NewReader("bar = baz")), &PublishPackageFileOptions{})
40+
_, err := client.GenericPackages.PublishPackageFile(1234, "foo", "0.1.2", "bar-baz.txt", strings.NewReader("bar = baz"), &PublishPackageFileOptions{})
6541
if err != nil {
6642
t.Errorf("GenericPackages.PublishPackageFile returned error: %v", err)
6743
}
44+
}
6845

69-
goldenURL := client.BaseURL().String() + "projects/1234/packages/generic/foo/0%2E1%2E2/bar-baz%2Etxt"
70-
if url != goldenURL {
71-
t.Errorf("GenericPackages.PublishPackageFile URL was %+v, want %+v", url, goldenURL)
72-
}
46+
func TestDownloadPackageFile(t *testing.T) {
47+
mux, server, client := setup(t)
48+
defer teardown(server)
49+
50+
mux.HandleFunc("/api/v4/projects/1234/packages/generic/foo/0.1.2/bar-baz.txt", func(w http.ResponseWriter, r *http.Request) {
51+
testMethod(t, r, http.MethodGet)
52+
fmt.Fprint(w, strings.TrimSpace(`
53+
bar = baz
54+
`))
55+
})
7356

74-
body := map[string]interface{}{}
75-
if err := json.Unmarshal(result, &body); err != nil {
76-
t.Errorf("Error decoding body: %v", err)
57+
packageBytes, _, err := client.GenericPackages.DownloadPackageFile(1234, "foo", "0.1.2", "bar-baz.txt")
58+
if err != nil {
59+
t.Errorf("GenericPackages.DownloadPackageFile returned error: %v", err)
7760
}
7861

79-
want := map[string]interface{}{"message": "201 Created"}
80-
if !reflect.DeepEqual(body, want) {
81-
t.Errorf("GenericPackages.PublishPackageFile response code was %+v, want %+v", body, want)
62+
want := []byte("bar = baz")
63+
if !reflect.DeepEqual(want, packageBytes) {
64+
t.Errorf("GenericPackages.DownloadPackageFile returned %+v, want %+v", packageBytes, want)
8265
}
8366
}

request_options.go

-10
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ package gitlab
1818

1919
import (
2020
"context"
21-
"io"
22-
"net/http"
2321

2422
retryablehttp "github.com/hashicorp/go-retryablehttp"
2523
)
@@ -61,11 +59,3 @@ func WithToken(authType AuthType, token string) RequestOptionFunc {
6159
return nil
6260
}
6361
}
64-
65-
func WithUploadFile(content io.ReadCloser) RequestOptionFunc {
66-
return func(req *retryablehttp.Request) error {
67-
req.Body = content
68-
req.Method = http.MethodPut
69-
return nil
70-
}
71-
}

types.go

+17
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,23 @@ func FileAction(v FileActionValue) *FileActionValue {
199199
return p
200200
}
201201

202+
// GenericPackageStatusValue represents a GitLab Package Status.
203+
type GenericPackageStatusValue string
204+
205+
// The available generic package statuses.
206+
const (
207+
PackageDefault GenericPackageStatusValue = "default"
208+
PackageHidden GenericPackageStatusValue = "hidden"
209+
)
210+
211+
// GenericPackageStatus is a helper routine that allocates a new GenericPackageStatusValue
212+
// value to store v and returns a pointer to it.
213+
func GenericPackageStatus(v GenericPackageStatusValue) *GenericPackageStatusValue {
214+
p := new(GenericPackageStatusValue)
215+
*p = v
216+
return p
217+
}
218+
202219
// ISOTime represents an ISO 8601 formatted date
203220
type ISOTime time.Time
204221

0 commit comments

Comments
 (0)