From 11e0aa8cd45f2042e3180e941acdf9c7fb33c43b Mon Sep 17 00:00:00 2001 From: Stefan Lacatus Date: Thu, 24 Aug 2017 00:38:18 +0300 Subject: [PATCH] Added read-only attachments to the Releases API (#63) * Added assets (attachments) to the releases. - Added three new endpoints to the release api for attachments. - List assets: GET /repos/:owner/:repo/releases/:id/assets - Get single asset: GET /repos/:owner/:repo/releases/assets/:id - Get /repos/:owner/:repo/releases/latest` that gets the latest published full release for the repository. Draft releases and prereleases are not returned by this endpoint. Signed-off-by: Petrisor Lacatus --- gitea/attachment.go | 17 ++++++++++++++ gitea/release.go | 54 ++++++++++++++++++++++++++++++++++----------- 2 files changed, 58 insertions(+), 13 deletions(-) create mode 100644 gitea/attachment.go diff --git a/gitea/attachment.go b/gitea/attachment.go new file mode 100644 index 0000000..10e7a1d --- /dev/null +++ b/gitea/attachment.go @@ -0,0 +1,17 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package gitea // import "code.gitea.io/sdk/gitea" +import "time" + +// Attachment a generic attachment +type Attachment struct { + ID int64 `json:"id"` + Name string `json:"name"` + Size int64 `json:"size"` + DownloadCount int64 `json:"download_count"` + Created time.Time `json:"created_at"` + UUID string `json:"uuid"` + DownloadURL string `json:"browser_download_url"` +} diff --git a/gitea/release.go b/gitea/release.go index cc84146..179e739 100644 --- a/gitea/release.go +++ b/gitea/release.go @@ -13,19 +13,20 @@ import ( // Release represents a repository release type Release struct { - ID int64 `json:"id"` - TagName string `json:"tag_name"` - Target string `json:"target_commitish"` - Title string `json:"name"` - Note string `json:"body"` - URL string `json:"url"` - TarURL string `json:"tarball_url"` - ZipURL string `json:"zipball_url"` - IsDraft bool `json:"draft"` - IsPrerelease bool `json:"prerelease"` - CreatedAt time.Time `json:"created_at"` - PublishedAt time.Time `json:"published_at"` - Publisher *User `json:"author"` + ID int64 `json:"id"` + TagName string `json:"tag_name"` + Target string `json:"target_commitish"` + Title string `json:"name"` + Note string `json:"body"` + URL string `json:"url"` + TarURL string `json:"tarball_url"` + ZipURL string `json:"zipball_url"` + IsDraft bool `json:"draft"` + IsPrerelease bool `json:"prerelease"` + CreatedAt time.Time `json:"created_at"` + PublishedAt time.Time `json:"published_at"` + Publisher *User `json:"author"` + Attachments []*Attachment `json:"assets"` } // ListReleases list releases of a repository @@ -46,6 +47,33 @@ func (c *Client) GetRelease(user, repo string, id int64) (*Release, error) { return r, err } +// ListReleaseAttachments gets all the assets of a release in a repository +func (c *Client) ListReleaseAttachments(user, repo string, id int64) ([]*Attachment, error) { + attachments := make([]*Attachment, 0, 10) + err := c.getParsedResponse("GET", + fmt.Sprintf("/repos/%s/%s/releases/%d/assets", user, repo, id), + nil, nil, &attachments) + return attachments, err +} + +// GetReleaseAttachment gets a single attachment of a release in a repository +func (c *Client) GetReleaseAttachment(user, repo string, releaseID int64, attachmentID int64) (*Attachment, error) { + attachment := new(Attachment) + err := c.getParsedResponse("GET", + fmt.Sprintf("/repos/%s/%s/releases/%d/assets/%d", user, repo, releaseID, attachmentID), + nil, nil, &attachment) + return attachment, err +} + +// GetLatestRelease gets the latest release in a repository. This cannot be a draft or prerelease +func (c *Client) GetLatestRelease(user, repo string) (*Release, error) { + r := new(Release) + err := c.getParsedResponse("GET", + fmt.Sprintf("/repos/%s/%s/releases/latest", user, repo), + nil, nil, &r) + return r, err +} + // CreateReleaseOption options when creating a release type CreateReleaseOption struct { TagName string `json:"tag_name" binding:"Required"`