From f99489d5c522663cfc14b9b65539966844f3ee6b Mon Sep 17 00:00:00 2001 From: Ethan Koenig Date: Sat, 1 Jul 2017 22:03:57 -0400 Subject: [PATCH] Fix API for branches with slashes (#2096) --- integrations/api_branch_test.go | 44 +++++++++++++++++++ .../user2/repo1.git/refs/heads/feature/1 | 1 + routers/api/v1/api.go | 2 +- routers/api/v1/repo/branch.go | 9 +++- 4 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 integrations/api_branch_test.go create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/refs/heads/feature/1 diff --git a/integrations/api_branch_test.go b/integrations/api_branch_test.go new file mode 100644 index 000000000..79adfaa4f --- /dev/null +++ b/integrations/api_branch_test.go @@ -0,0 +1,44 @@ +// 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 integrations + +import ( + "net/http" + "testing" + + api "code.gitea.io/sdk/gitea" + + "github.com/stretchr/testify/assert" +) + +func testAPIGetBranch(t *testing.T, branchName string, exists bool) { + prepareTestEnv(t) + + session := loginUser(t, "user2") + req := NewRequestf(t, "GET", "/api/v1/repos/user2/repo1/branches/%s", branchName) + resp := session.MakeRequest(t, req) + if !exists { + assert.EqualValues(t, http.StatusNotFound, resp.HeaderCode) + return + } + assert.EqualValues(t, http.StatusOK, resp.HeaderCode) + var branch api.Branch + DecodeJSON(t, resp, &branch) + assert.EqualValues(t, branchName, branch.Name) +} + +func TestAPIGetBranch(t *testing.T) { + for _, test := range []struct { + BranchName string + Exists bool + }{ + {"master", true}, + {"master/doesnotexist", false}, + {"feature/1", true}, + {"feature/1/doesnotexist", false}, + } { + testAPIGetBranch(t, test.BranchName, test.Exists) + } +} diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/refs/heads/feature/1 b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/refs/heads/feature/1 new file mode 100644 index 000000000..f98a263be --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/refs/heads/feature/1 @@ -0,0 +1 @@ +65f1bf27bc3bf70f64657658635e66094edbcb4d diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 0e356b1f9..56bb3b0f3 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -364,7 +364,7 @@ func RegisterRoutes(m *macaron.Macaron) { Post(bind(api.CreateForkOption{}), repo.CreateFork) m.Group("/branches", func() { m.Get("", repo.ListBranches) - m.Get("/:branchname", repo.GetBranch) + m.Get("/*", context.RepoRef(), repo.GetBranch) }) m.Group("/keys", func() { m.Combo("").Get(repo.ListDeployKeys). diff --git a/routers/api/v1/repo/branch.go b/routers/api/v1/repo/branch.go index 489fbe6b4..aed630f55 100644 --- a/routers/api/v1/repo/branch.go +++ b/routers/api/v1/repo/branch.go @@ -15,7 +15,14 @@ import ( // GetBranch get a branch of a repository // see https://github.com/gogits/go-gogs-client/wiki/Repositories#get-branch func GetBranch(ctx *context.APIContext) { - branch, err := ctx.Repo.Repository.GetBranch(ctx.Params(":branchname")) + if ctx.Repo.TreePath != "" { + // if TreePath != "", then URL contained extra slashes + // (i.e. "master/subbranch" instead of "master"), so branch does + // not exist + ctx.Status(404) + return + } + branch, err := ctx.Repo.Repository.GetBranch(ctx.Repo.BranchName) if err != nil { if models.IsErrBranchNotExist(err) { ctx.Error(404, "GetBranch", err)