From 695b10beddc640d333fd5864cb6edb03e540b344 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marc=20Br=C3=BCckner?= <marc@ma-br.de>
Date: Tue, 16 Jan 2018 09:54:13 +0100
Subject: [PATCH] Fix API-Endpoint release (#3012)

* Fixes API-Endpoint release (#3005)

* Using context.ReferencesGitRepo(); doing the same in the PATCH route.

* Add release create, get and update test
---
 integrations/api_releases_test.go | 85 +++++++++++++++++++++++++++++++
 routers/api/v1/api.go             |  4 +-
 routers/api/v1/repo/release.go    |  5 +-
 3 files changed, 91 insertions(+), 3 deletions(-)
 create mode 100644 integrations/api_releases_test.go

diff --git a/integrations/api_releases_test.go b/integrations/api_releases_test.go
new file mode 100644
index 0000000000..678075935c
--- /dev/null
+++ b/integrations/api_releases_test.go
@@ -0,0 +1,85 @@
+// Copyright 2018 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 integrations
+
+import (
+	"fmt"
+	"net/http"
+	"testing"
+
+	"code.gitea.io/git"
+	"code.gitea.io/gitea/models"
+	api "code.gitea.io/sdk/gitea"
+
+	"github.com/stretchr/testify/assert"
+)
+
+func TestAPICreateRelease(t *testing.T) {
+	prepareTestEnv(t)
+
+	repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository)
+	owner := models.AssertExistsAndLoadBean(t, &models.User{ID: repo.OwnerID}).(*models.User)
+	session := loginUser(t, owner.LowerName)
+
+	gitRepo, err := git.OpenRepository(repo.RepoPath())
+	assert.NoError(t, err)
+
+	err = gitRepo.CreateTag("v0.0.1", "master")
+	assert.NoError(t, err)
+
+	commitID, err := gitRepo.GetTagCommitID("v0.0.1")
+	assert.NoError(t, err)
+
+	urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/releases",
+		owner.Name, repo.Name)
+	req := NewRequestWithJSON(t, "POST", urlStr, &api.CreateReleaseOption{
+		TagName:      "v0.0.1",
+		Title:        "v0.0.1",
+		Note:         "test",
+		IsDraft:      false,
+		IsPrerelease: false,
+		Target:       commitID,
+	})
+	resp := session.MakeRequest(t, req, http.StatusCreated)
+
+	var newRelease api.Release
+	DecodeJSON(t, resp, &newRelease)
+	models.AssertExistsAndLoadBean(t, &models.Release{
+		ID:      newRelease.ID,
+		TagName: newRelease.TagName,
+		Title:   newRelease.Title,
+		Note:    newRelease.Note,
+	})
+
+	urlStr = fmt.Sprintf("/api/v1/repos/%s/%s/releases/%d",
+		owner.Name, repo.Name, newRelease.ID)
+	req = NewRequest(t, "GET", urlStr)
+	resp = session.MakeRequest(t, req, http.StatusOK)
+
+	var release api.Release
+	DecodeJSON(t, resp, &release)
+
+	assert.Equal(t, newRelease.TagName, release.TagName)
+	assert.Equal(t, newRelease.Title, release.Title)
+	assert.Equal(t, newRelease.Note, release.Note)
+
+	req = NewRequestWithJSON(t, "PATCH", urlStr, &api.EditReleaseOption{
+		TagName:      release.TagName,
+		Title:        release.Title,
+		Note:         "updated",
+		IsDraft:      &release.IsDraft,
+		IsPrerelease: &release.IsPrerelease,
+		Target:       release.Target,
+	})
+	resp = session.MakeRequest(t, req, http.StatusOK)
+
+	DecodeJSON(t, resp, &newRelease)
+	models.AssertExistsAndLoadBean(t, &models.Release{
+		ID:      newRelease.ID,
+		TagName: newRelease.TagName,
+		Title:   newRelease.Title,
+		Note:    newRelease.Note,
+	})
+}
diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go
index 8a300f9958..6bbc014266 100644
--- a/routers/api/v1/api.go
+++ b/routers/api/v1/api.go
@@ -463,9 +463,9 @@ func RegisterRoutes(m *macaron.Macaron) {
 				})
 				m.Group("/releases", func() {
 					m.Combo("").Get(repo.ListReleases).
-						Post(reqToken(), reqRepoWriter(), bind(api.CreateReleaseOption{}), repo.CreateRelease)
+						Post(reqToken(), reqRepoWriter(), context.ReferencesGitRepo(), bind(api.CreateReleaseOption{}), repo.CreateRelease)
 					m.Combo("/:id").Get(repo.GetRelease).
-						Patch(reqToken(), reqRepoWriter(), bind(api.EditReleaseOption{}), repo.EditRelease).
+						Patch(reqToken(), reqRepoWriter(), context.ReferencesGitRepo(), bind(api.EditReleaseOption{}), repo.EditRelease).
 						Delete(reqToken(), reqRepoWriter(), repo.DeleteRelease)
 				})
 				m.Post("/mirror-sync", reqToken(), reqRepoWriter(), repo.MirrorSync)
diff --git a/routers/api/v1/repo/release.go b/routers/api/v1/repo/release.go
index f5b529ac6a..41efa482dd 100644
--- a/routers/api/v1/repo/release.go
+++ b/routers/api/v1/repo/release.go
@@ -96,7 +96,7 @@ func ListReleases(ctx *context.APIContext) {
 
 // CreateRelease create a release
 func CreateRelease(ctx *context.APIContext, form api.CreateReleaseOption) {
-	// swagger:operation GET /repos/{owner}/{repo}/releases repository repoCreateRelease
+	// swagger:operation POST /repos/{owner}/{repo}/releases repository repoCreateRelease
 	// ---
 	// summary: Create a release
 	// consumes:
@@ -146,6 +146,7 @@ func CreateRelease(ctx *context.APIContext, form api.CreateReleaseOption) {
 			IsDraft:      form.IsDraft,
 			IsPrerelease: form.IsPrerelease,
 			IsTag:        false,
+			Repo:         ctx.Repo.Repository,
 		}
 		if err := models.CreateRelease(ctx.Repo.GitRepo, rel, nil); err != nil {
 			if models.IsErrReleaseAlreadyExist(err) {
@@ -167,6 +168,8 @@ func CreateRelease(ctx *context.APIContext, form api.CreateReleaseOption) {
 		rel.IsPrerelease = form.IsPrerelease
 		rel.PublisherID = ctx.User.ID
 		rel.IsTag = false
+		rel.Repo = ctx.Repo.Repository
+		rel.Publisher = ctx.User
 
 		if err = models.UpdateRelease(ctx.Repo.GitRepo, rel, nil); err != nil {
 			ctx.ServerError("UpdateRelease", err)