diff --git a/modules/markup/html.go b/modules/markup/html.go index 772c521ea3..e29cbe4457 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -15,8 +15,8 @@ import ( "strings" "code.gitea.io/gitea/modules/base" - "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" "github.com/Unknwon/com" "golang.org/x/net/html" @@ -112,20 +112,6 @@ func cutoutVerbosePrefix(prefix string) string { return prefix } -// URLJoin joins url components, like path.Join, but preserving contents -func URLJoin(base string, elems ...string) string { - u, err := url.Parse(base) - if err != nil { - log.Error(4, "URLJoin: Invalid base URL %s", base) - return "" - } - joinArgs := make([]string, 0, len(elems)+1) - joinArgs = append(joinArgs, u.Path) - joinArgs = append(joinArgs, elems...) - u.Path = path.Join(joinArgs...) - return u.String() -} - // RenderIssueIndexPatternOptions options for RenderIssueIndexPattern function type RenderIssueIndexPatternOptions struct { // url to which non-special formatting should be linked. If empty, @@ -177,7 +163,7 @@ func RenderIssueIndexPattern(rawBytes []byte, opts RenderIssueIndexPatternOption } if opts.Metas == nil { buf.WriteString(``) buf.Write(remainder[startIndex:endIndex]) @@ -228,7 +214,7 @@ func renderFullSha1Pattern(rawBytes []byte, urlPrefix string) []byte { path := protocol + "://" + paths author := string(m[3]) repoName := string(m[4]) - path = URLJoin(path, author, repoName) + path = util.URLJoin(path, author, repoName) ltype := "src" itemType := m[5] if IsSameDomain(paths) { @@ -260,7 +246,7 @@ func renderFullSha1Pattern(rawBytes []byte, urlPrefix string) []byte { text += ")" } rawBytes = bytes.Replace(rawBytes, all, []byte(fmt.Sprintf( - `%s`, URLJoin(path, ltype, string(sha))+urlSuffix, text)), -1) + `%s`, util.URLJoin(path, ltype, string(sha))+urlSuffix, text)), -1) } return rawBytes } @@ -399,9 +385,9 @@ func RenderShortLinks(rawBytes []byte, urlPrefix string, noLink bool, isWikiMark urlPrefix = strings.Replace(urlPrefix, "/src/", "/raw/", 1) } if isWikiMarkdown { - link = URLJoin("wiki", "raw", link) + link = util.URLJoin("wiki", "raw", link) } - link = URLJoin(urlPrefix, link) + link = util.URLJoin(urlPrefix, link) } title := props["title"] if title == "" { @@ -420,9 +406,9 @@ func RenderShortLinks(rawBytes []byte, urlPrefix string, noLink bool, isWikiMark name = fmt.Sprintf(``, link, alt, title) } else if !absoluteLink { if isWikiMarkdown { - link = URLJoin("wiki", link) + link = util.URLJoin("wiki", link) } - link = URLJoin(urlPrefix, link) + link = util.URLJoin(urlPrefix, link) } if noLink { rawBytes = bytes.Replace(rawBytes, orig, []byte(name), -1) @@ -445,7 +431,7 @@ func RenderCrossReferenceIssueIndexPattern(rawBytes []byte, urlPrefix string, me repo := string(bytes.Split(m, []byte("#"))[0]) issue := string(bytes.Split(m, []byte("#"))[1]) - link := fmt.Sprintf(`%s`, URLJoin(setting.AppURL, repo, "issues", issue), m) + link := fmt.Sprintf(`%s`, util.URLJoin(setting.AppURL, repo, "issues", issue), m) rawBytes = bytes.Replace(rawBytes, m, []byte(link), 1) } return rawBytes @@ -463,7 +449,7 @@ func renderSha1CurrentPattern(rawBytes []byte, urlPrefix string) []byte { // Although unlikely, deadbeef and 1234567 are valid short forms of SHA1 hash // as used by git and github for linking and thus we have to do similar. rawBytes = bytes.Replace(rawBytes, hash, []byte(fmt.Sprintf( - `%s`, URLJoin(urlPrefix, "commit", string(hash)), base.ShortSha(string(hash)))), -1) + `%s`, util.URLJoin(urlPrefix, "commit", string(hash)), base.ShortSha(string(hash)))), -1) } return rawBytes } @@ -474,7 +460,7 @@ func RenderSpecialLink(rawBytes []byte, urlPrefix string, metas map[string]strin for _, m := range ms { m = m[bytes.Index(m, []byte("@")):] rawBytes = bytes.Replace(rawBytes, m, - []byte(fmt.Sprintf(`%s`, URLJoin(setting.AppURL, string(m[1:])), m)), -1) + []byte(fmt.Sprintf(`%s`, util.URLJoin(setting.AppURL, string(m[1:])), m)), -1) } rawBytes = RenderFullIssuePattern(rawBytes) diff --git a/modules/markup/html_test.go b/modules/markup/html_test.go index 4e47b47b00..92f815ad94 100644 --- a/modules/markup/html_test.go +++ b/modules/markup/html_test.go @@ -13,6 +13,7 @@ import ( . "code.gitea.io/gitea/modules/markup" _ "code.gitea.io/gitea/modules/markup/markdown" "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" "github.com/stretchr/testify/assert" ) @@ -37,12 +38,12 @@ var alphanumericMetas = map[string]string{ // numericLink an HTML to a numeric-style issue func numericIssueLink(baseURL string, index int) string { - return link(URLJoin(baseURL, strconv.Itoa(index)), fmt.Sprintf("#%d", index)) + return link(util.URLJoin(baseURL, strconv.Itoa(index)), fmt.Sprintf("#%d", index)) } // alphanumLink an HTML link to an alphanumeric-style issue func alphanumIssueLink(baseURL string, name string) string { - return link(URLJoin(baseURL, name), name) + return link(util.URLJoin(baseURL, name), name) } // urlContentsLink an HTML link whose contents is the target URL @@ -63,31 +64,6 @@ func testRenderIssueIndexPattern(t *testing.T, input, expected string, opts Rend assert.Equal(t, expected, actual) } -func TestURLJoin(t *testing.T) { - type test struct { - Expected string - Base string - Elements []string - } - newTest := func(expected, base string, elements ...string) test { - return test{Expected: expected, Base: base, Elements: elements} - } - for _, test := range []test{ - newTest("https://try.gitea.io/a/b/c", - "https://try.gitea.io", "a/b", "c"), - newTest("https://try.gitea.io/a/b/c", - "https://try.gitea.io/", "/a/b/", "/c/"), - newTest("https://try.gitea.io/a/c", - "https://try.gitea.io/", "/a/./b/", "../c/"), - newTest("a/b/c", - "a", "b/c/"), - newTest("a/b/d", - "a/", "b/c/", "/../d/"), - } { - assert.Equal(t, test.Expected, URLJoin(test.Base, test.Elements...)) - } -} - func TestRender_IssueIndexPattern(t *testing.T) { // numeric: render inputs without valid mentions test := func(s string) { @@ -123,7 +99,7 @@ func TestRender_IssueIndexPattern2(t *testing.T) { test := func(s, expectedFmt string, indices ...int) { links := make([]interface{}, len(indices)) for i, index := range indices { - links[i] = numericIssueLink(URLJoin(setting.AppSubURL, "issues"), index) + links[i] = numericIssueLink(util.URLJoin(setting.AppSubURL, "issues"), index) } expectedNil := fmt.Sprintf(expectedFmt, links...) testRenderIssueIndexPattern(t, s, expectedNil, RenderIssueIndexPatternOptions{}) @@ -228,8 +204,8 @@ func TestRender_AutoLink(t *testing.T) { } // render valid issue URLs - test(URLJoin(setting.AppSubURL, "issues", "3333"), - numericIssueLink(URLJoin(setting.AppSubURL, "issues"), 3333)) + test(util.URLJoin(setting.AppSubURL, "issues", "3333"), + numericIssueLink(util.URLJoin(setting.AppSubURL, "issues"), 3333)) // render external issue URLs for _, externalURL := range []string{ @@ -240,7 +216,7 @@ func TestRender_AutoLink(t *testing.T) { } // render valid commit URLs - tmp := URLJoin(AppSubURL, "commit", "d8a994ef243349f321568f9e36d5c3f444b99cae") + tmp := util.URLJoin(AppSubURL, "commit", "d8a994ef243349f321568f9e36d5c3f444b99cae") test(tmp, "d8a994ef24") tmp += "#diff-2" test(tmp, "d8a994ef24 (diff-2)") @@ -260,8 +236,8 @@ func TestRender_Commits(t *testing.T) { } var sha = "b6dd6210eaebc915fd5be5579c58cce4da2e2579" - var commit = URLJoin(AppSubURL, "commit", sha) - var subtree = URLJoin(commit, "src") + var commit = util.URLJoin(AppSubURL, "commit", sha) + var subtree = util.URLJoin(commit, "src") var tree = strings.Replace(subtree, "/commit/", "/tree/", -1) var src = strings.Replace(subtree, "/commit/", "/src/", -1) @@ -284,10 +260,10 @@ func TestRender_CrossReferences(t *testing.T) { test( "gogits/gogs#12345", - `

gogits/gogs#12345

`) + `

gogits/gogs#12345

`) test( "go-gitea/gitea#12345", - `

go-gitea/gitea#12345

`) + `

go-gitea/gitea#12345

`) } func TestRender_FullIssueURLs(t *testing.T) { @@ -482,7 +458,7 @@ func TestMisc_IsSameDomain(t *testing.T) { setting.AppSubURL = AppSubURL var sha = "b6dd6210eaebc915fd5be5579c58cce4da2e2579" - var commit = URLJoin(AppSubURL, "commit", sha) + var commit = util.URLJoin(AppSubURL, "commit", sha) assert.True(t, IsSameDomain(commit)) assert.False(t, IsSameDomain("http://google.com/ncr")) diff --git a/modules/markup/markdown/markdown.go b/modules/markup/markdown/markdown.go index f0ed0e03ab..2e3d180c4e 100644 --- a/modules/markup/markdown/markdown.go +++ b/modules/markup/markdown/markdown.go @@ -10,6 +10,7 @@ import ( "code.gitea.io/gitea/modules/markup" "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" "github.com/russross/blackfriday" ) @@ -27,9 +28,9 @@ func (r *Renderer) Link(out *bytes.Buffer, link []byte, title []byte, content [] if link[0] != '#' { lnk := string(link) if r.IsWiki { - lnk = markup.URLJoin("wiki", lnk) + lnk = util.URLJoin("wiki", lnk) } - mLink := markup.URLJoin(r.URLPrefix, lnk) + mLink := util.URLJoin(r.URLPrefix, lnk) link = []byte(mLink) } } @@ -97,7 +98,7 @@ var ( func (r *Renderer) Image(out *bytes.Buffer, link []byte, title []byte, alt []byte) { prefix := r.URLPrefix if r.IsWiki { - prefix = markup.URLJoin(prefix, "wiki", "src") + prefix = util.URLJoin(prefix, "wiki", "src") } prefix = strings.Replace(prefix, "/src/", "/raw/", 1) if len(link) > 0 { @@ -110,7 +111,7 @@ func (r *Renderer) Image(out *bytes.Buffer, link []byte, title []byte, alt []byt } } else { lnk := string(link) - lnk = markup.URLJoin(prefix, lnk) + lnk = util.URLJoin(prefix, lnk) lnk = strings.Replace(lnk, " ", "+", -1) link = []byte(lnk) } diff --git a/modules/markup/markdown/markdown_test.go b/modules/markup/markdown/markdown_test.go index 9ca3de01ca..c19037f629 100644 --- a/modules/markup/markdown/markdown_test.go +++ b/modules/markup/markdown/markdown_test.go @@ -11,6 +11,7 @@ import ( "code.gitea.io/gitea/modules/markup" . "code.gitea.io/gitea/modules/markup/markdown" "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" "github.com/stretchr/testify/assert" ) @@ -33,8 +34,8 @@ func TestRender_StandardLinks(t *testing.T) { googleRendered := `

https://google.com/

` test("", googleRendered, googleRendered) - lnk := markup.URLJoin(AppSubURL, "WikiPage") - lnkWiki := markup.URLJoin(AppSubURL, "wiki", "WikiPage") + lnk := util.URLJoin(AppSubURL, "WikiPage") + lnkWiki := util.URLJoin(AppSubURL, "wiki", "WikiPage") test("[WikiPage](WikiPage)", `

WikiPage

`, `

WikiPage

`) @@ -43,7 +44,7 @@ func TestRender_StandardLinks(t *testing.T) { func TestRender_ShortLinks(t *testing.T) { setting.AppURL = AppURL setting.AppSubURL = AppSubURL - tree := markup.URLJoin(AppSubURL, "src", "master") + tree := util.URLJoin(AppSubURL, "src", "master") test := func(input, expected, expectedWiki string) { buffer := RenderString(input, tree, nil) @@ -52,13 +53,13 @@ func TestRender_ShortLinks(t *testing.T) { assert.Equal(t, strings.TrimSpace(expectedWiki), strings.TrimSpace(string(buffer))) } - rawtree := markup.URLJoin(AppSubURL, "raw", "master") - url := markup.URLJoin(tree, "Link") - otherUrl := markup.URLJoin(tree, "OtherLink") - imgurl := markup.URLJoin(rawtree, "Link.jpg") - urlWiki := markup.URLJoin(AppSubURL, "wiki", "Link") - otherUrlWiki := markup.URLJoin(AppSubURL, "wiki", "OtherLink") - imgurlWiki := markup.URLJoin(AppSubURL, "wiki", "raw", "Link.jpg") + rawtree := util.URLJoin(AppSubURL, "raw", "master") + url := util.URLJoin(tree, "Link") + otherUrl := util.URLJoin(tree, "OtherLink") + imgurl := util.URLJoin(rawtree, "Link.jpg") + urlWiki := util.URLJoin(AppSubURL, "wiki", "Link") + otherUrlWiki := util.URLJoin(AppSubURL, "wiki", "OtherLink") + imgurlWiki := util.URLJoin(AppSubURL, "wiki", "raw", "Link.jpg") favicon := "http://google.com/favicon.ico" test( @@ -136,7 +137,7 @@ func TestRender_Images(t *testing.T) { url := "../../.images/src/02/train.jpg" title := "Train" - result := markup.URLJoin(AppSubURL, url) + result := util.URLJoin(AppSubURL, url) test( "!["+title+"]("+url+")", @@ -259,7 +260,7 @@ Here are some links to the most important topics. You can find the full list of } func TestTotal_RenderWiki(t *testing.T) { - answers := testAnswers(markup.URLJoin(AppSubURL, "wiki/"), markup.URLJoin(AppSubURL, "wiki", "raw/")) + answers := testAnswers(util.URLJoin(AppSubURL, "wiki/"), util.URLJoin(AppSubURL, "wiki", "raw/")) for i := 0; i < len(sameCases); i++ { line := RenderWiki([]byte(sameCases[i]), AppSubURL, nil) @@ -286,10 +287,10 @@ func TestTotal_RenderWiki(t *testing.T) { } func TestTotal_RenderString(t *testing.T) { - answers := testAnswers(markup.URLJoin(AppSubURL, "src", "master/"), markup.URLJoin(AppSubURL, "raw", "master/")) + answers := testAnswers(util.URLJoin(AppSubURL, "src", "master/"), util.URLJoin(AppSubURL, "raw", "master/")) for i := 0; i < len(sameCases); i++ { - line := RenderString(sameCases[i], markup.URLJoin(AppSubURL, "src", "master/"), nil) + line := RenderString(sameCases[i], util.URLJoin(AppSubURL, "src", "master/"), nil) assert.Equal(t, answers[i], line) } diff --git a/modules/markup/orgmode/orgmode_test.go b/modules/markup/orgmode/orgmode_test.go index a68ab5d3af..3846922c25 100644 --- a/modules/markup/orgmode/orgmode_test.go +++ b/modules/markup/orgmode/orgmode_test.go @@ -8,8 +8,8 @@ import ( "strings" "testing" - "code.gitea.io/gitea/modules/markup" "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" "github.com/stretchr/testify/assert" ) @@ -30,7 +30,7 @@ func TestRender_StandardLinks(t *testing.T) { googleRendered := `

https://google.com/

` test("[[https://google.com/]]", googleRendered) - lnk := markup.URLJoin(AppSubURL, "WikiPage") + lnk := util.URLJoin(AppSubURL, "WikiPage") test("[[WikiPage][WikiPage]]", `

WikiPage

`) } @@ -46,7 +46,7 @@ func TestRender_Images(t *testing.T) { url := "../../.images/src/02/train.jpg" title := "Train" - result := markup.URLJoin(AppSubURL, url) + result := util.URLJoin(AppSubURL, url) test( "[[file:"+url+"]["+title+"]]", diff --git a/modules/util/util.go b/modules/util/util.go index e99f951f21..3a0411f64b 100644 --- a/modules/util/util.go +++ b/modules/util/util.go @@ -4,6 +4,13 @@ package util +import ( + "net/url" + "path" + + "code.gitea.io/gitea/modules/log" +) + // OptionalBool a boolean that can be "null" type OptionalBool byte @@ -47,6 +54,20 @@ func Max(a, b int) int { return a } +// URLJoin joins url components, like path.Join, but preserving contents +func URLJoin(base string, elems ...string) string { + u, err := url.Parse(base) + if err != nil { + log.Error(4, "URLJoin: Invalid base URL %s", base) + return "" + } + joinArgs := make([]string, 0, len(elems)+1) + joinArgs = append(joinArgs, u.Path) + joinArgs = append(joinArgs, elems...) + u.Path = path.Join(joinArgs...) + return u.String() +} + // Min min of two ints func Min(a, b int) int { if a > b { diff --git a/modules/util/util_test.go b/modules/util/util_test.go new file mode 100644 index 0000000000..cc5875263a --- /dev/null +++ b/modules/util/util_test.go @@ -0,0 +1,36 @@ +// 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 util + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestURLJoin(t *testing.T) { + type test struct { + Expected string + Base string + Elements []string + } + newTest := func(expected, base string, elements ...string) test { + return test{Expected: expected, Base: base, Elements: elements} + } + for _, test := range []test{ + newTest("https://try.gitea.io/a/b/c", + "https://try.gitea.io", "a/b", "c"), + newTest("https://try.gitea.io/a/b/c", + "https://try.gitea.io/", "/a/b/", "/c/"), + newTest("https://try.gitea.io/a/c", + "https://try.gitea.io/", "/a/./b/", "../c/"), + newTest("a/b/c", + "a", "b/c/"), + newTest("a/b/d", + "a/", "b/c/", "/../d/"), + } { + assert.Equal(t, test.Expected, URLJoin(test.Base, test.Elements...)) + } +} diff --git a/routers/api/v1/convert/convert.go b/routers/api/v1/convert/convert.go index e24ac0518c..19b966971a 100644 --- a/routers/api/v1/convert/convert.go +++ b/routers/api/v1/convert/convert.go @@ -13,6 +13,8 @@ import ( "code.gitea.io/git" "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/util" ) // ToEmail convert models.EmailAddress to api.Email @@ -25,35 +27,40 @@ func ToEmail(email *models.EmailAddress) *api.Email { } // ToBranch convert a commit and branch to an api.Branch -func ToBranch(b *models.Branch, c *git.Commit) *api.Branch { +func ToBranch(repo *models.Repository, b *models.Branch, c *git.Commit) *api.Branch { return &api.Branch{ Name: b.Name, - Commit: ToCommit(c), + Commit: ToCommit(repo, c), } } // ToCommit convert a commit to api.PayloadCommit -func ToCommit(c *git.Commit) *api.PayloadCommit { +func ToCommit(repo *models.Repository, c *git.Commit) *api.PayloadCommit { authorUsername := "" - author, err := models.GetUserByEmail(c.Author.Email) - if err == nil { + if author, err := models.GetUserByEmail(c.Author.Email); err == nil { authorUsername = author.Name + } else if !models.IsErrUserNotExist(err) { + log.Error(4, "GetUserByEmail: %v", err) } + committerUsername := "" - committer, err := models.GetUserByEmail(c.Committer.Email) - if err == nil { + if committer, err := models.GetUserByEmail(c.Committer.Email); err == nil { committerUsername = committer.Name + } else if !models.IsErrUserNotExist(err) { + log.Error(4, "GetUserByEmail: %v", err) } + verif := models.ParseCommitWithSignature(c) var signature, payload string if c.Signature != nil { signature = c.Signature.Signature payload = c.Signature.Payload } + return &api.PayloadCommit{ ID: c.ID.String(), Message: c.Message(), - URL: "Not implemented", + URL: util.URLJoin(repo.Link(), "commit", c.ID.String()), Author: &api.PayloadUser{ Name: c.Author.Name, Email: c.Author.Email, diff --git a/routers/api/v1/misc/markdown.go b/routers/api/v1/misc/markdown.go index ed50c1c05b..fd7d1489b3 100644 --- a/routers/api/v1/misc/markdown.go +++ b/routers/api/v1/misc/markdown.go @@ -8,9 +8,9 @@ import ( api "code.gitea.io/sdk/gitea" "code.gitea.io/gitea/modules/context" - "code.gitea.io/gitea/modules/markup" "code.gitea.io/gitea/modules/markup/markdown" "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" ) // Markdown render markdown document to HTML @@ -45,7 +45,7 @@ func Markdown(ctx *context.APIContext, form api.MarkdownOption) { switch form.Mode { case "gfm": md := []byte(form.Text) - context := markup.URLJoin(setting.AppURL, form.Context) + context := util.URLJoin(setting.AppURL, form.Context) if form.Wiki { ctx.Write([]byte(markdown.RenderWiki(md, context, nil))) } else { diff --git a/routers/api/v1/misc/markdown_test.go b/routers/api/v1/misc/markdown_test.go index 8c3051ea8e..c1449589a3 100644 --- a/routers/api/v1/misc/markdown_test.go +++ b/routers/api/v1/misc/markdown_test.go @@ -9,8 +9,8 @@ import ( "testing" "code.gitea.io/gitea/modules/context" - "code.gitea.io/gitea/modules/markup" "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" api "code.gitea.io/sdk/gitea" "github.com/go-macaron/inject" @@ -53,7 +53,7 @@ func TestAPI_RenderGFM(t *testing.T) { Context: Repo, Wiki: true, } - requrl, _ := url.Parse(markup.URLJoin(AppURL, "api", "v1", "markdown")) + requrl, _ := url.Parse(util.URLJoin(AppURL, "api", "v1", "markdown")) req := &http.Request{ Method: "POST", URL: requrl, @@ -147,7 +147,7 @@ func TestAPI_RenderSimple(t *testing.T) { Text: "", Context: Repo, } - requrl, _ := url.Parse(markup.URLJoin(AppURL, "api", "v1", "markdown")) + requrl, _ := url.Parse(util.URLJoin(AppURL, "api", "v1", "markdown")) req := &http.Request{ Method: "POST", URL: requrl, @@ -166,7 +166,7 @@ func TestAPI_RenderSimple(t *testing.T) { func TestAPI_RenderRaw(t *testing.T) { setting.AppURL = AppURL - requrl, _ := url.Parse(markup.URLJoin(AppURL, "api", "v1", "markdown")) + requrl, _ := url.Parse(util.URLJoin(AppURL, "api", "v1", "markdown")) req := &http.Request{ Method: "POST", URL: requrl, diff --git a/routers/api/v1/repo/branch.go b/routers/api/v1/repo/branch.go index a82527e6a7..8e44f42368 100644 --- a/routers/api/v1/repo/branch.go +++ b/routers/api/v1/repo/branch.go @@ -61,7 +61,7 @@ func GetBranch(ctx *context.APIContext) { return } - ctx.JSON(200, convert.ToBranch(branch, c)) + ctx.JSON(200, convert.ToBranch(ctx.Repo.Repository, branch, c)) } // ListBranches list all the branches of a repository @@ -98,7 +98,7 @@ func ListBranches(ctx *context.APIContext) { ctx.Error(500, "GetCommit", err) return } - apiBranches[i] = convert.ToBranch(branches[i], c) + apiBranches[i] = convert.ToBranch(ctx.Repo.Repository, branches[i], c) } ctx.JSON(200, &apiBranches)