Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add API for gitignore templates #22783

Merged
merged 13 commits into from
Apr 27, 2023
6 changes: 6 additions & 0 deletions modules/structs/miscellaneous.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,12 @@ type ServerVersion struct {
Version string `json:"version"`
}

// GitignoreTemplateInfo name and text of a gitignore template
type GitignoreTemplateInfo struct {
Name string `json:"name"`
Source string `json:"source"`
}

// APIError is an api error with a message
type APIError struct {
Message string `json:"message"`
Expand Down
2 changes: 2 additions & 0 deletions routers/api/v1/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -719,6 +719,8 @@ func Routes(ctx gocontext.Context) *web.Route {
m.Post("/markup", bind(api.MarkupOption{}), misc.Markup)
m.Post("/markdown", bind(api.MarkdownOption{}), misc.Markdown)
m.Post("/markdown/raw", misc.MarkdownRaw)
m.Get("/gitignore/templates", misc.ListGitignoresTemplates)
m.Get("/gitignore/templates/{name}", misc.GetGitignoreTemplateInfo)
m.Group("/settings", func() {
m.Get("/ui", settings.GetGeneralUISettings)
m.Get("/api", settings.GetGeneralAPISettings)
Expand Down
55 changes: 55 additions & 0 deletions routers/api/v1/misc/gitignore.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
// Copyright 2023 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT

package misc

import (
"net/http"

"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/options"
repo_module "code.gitea.io/gitea/modules/repository"
"code.gitea.io/gitea/modules/structs"
)

// Shows a list of all Gitignore templates
func ListGitignoresTemplates(ctx *context.APIContext) {
// swagger:operation GET /gitignore/templates miscellaneous listGitignoresTemplates
// ---
// summary: Returns a list of all gitignore templates
// produces:
// - application/json
// responses:
// "200":
// "$ref": "#/responses/GitignoreTemplateList"
ctx.JSON(http.StatusOK, repo_module.Gitignores)
}

// SHows information about a gitignore template
func GetGitignoreTemplateInfo(ctx *context.APIContext) {
// swagger:operation GET /gitignore/templates/{name} miscellaneous getGitignoreTemplateInfo
// ---
// summary: Returns information about a gitignore template
// produces:
// - application/json
// parameters:
// - name: name
// in: path
// description: name of the template
// type: string
// required: true
// responses:
// "200":
// "$ref": "#/responses/GitignoreTemplateInfo"
// "404":
// "$ref": "#/responses/notFound"
name := ctx.Params("name")
JakobDev marked this conversation as resolved.
Show resolved Hide resolved

text, err := options.Gitignore(name)
if err != nil {
ctx.NotFound()
return
}

ctx.JSON(http.StatusOK, &structs.GitignoreTemplateInfo{Name: name, Source: string(text)})
}
14 changes: 14 additions & 0 deletions routers/api/v1/swagger/misc.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,20 @@ type swaggerResponseServerVersion struct {
Body api.ServerVersion `json:"body"`
}

// GitignoreTemplateList
// swagger:response GitignoreTemplateList
type swaggerResponseGitignoreTemplateList struct {
// in:body
Body []string `json:"body"`
}

// GitignoreTemplateInfo
// swagger:response GitignoreTemplateInfo
type swaggerResponseGitignoreTemplateInfo struct {
// in:body
Body api.GitignoreTemplateInfo `json:"body"`
}

// StringSlice
// swagger:response StringSlice
type swaggerResponseStringSlice struct {
Expand Down
76 changes: 76 additions & 0 deletions templates/swagger/v1_json.tmpl

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

53 changes: 53 additions & 0 deletions tests/integration/api_gitignore_templates_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// Copyright 2023 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT

package integration

import (
"fmt"
"net/http"
"testing"

"code.gitea.io/gitea/modules/options"
repo_module "code.gitea.io/gitea/modules/repository"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/tests"

"github.com/stretchr/testify/assert"
)

func TestAPIListGitignoresTemplates(t *testing.T) {
defer tests.PrepareTestEnv(t)()

req := NewRequest(t, "GET", "/api/v1/gitignore/templates")
resp := MakeRequest(t, req, http.StatusOK)

// This tests if the API returns a list of strings
var gitignoreList []string
DecodeJSON(t, resp, &gitignoreList)
}

func TestAPIGetGitignoreTemplateInfo(t *testing.T) {
defer tests.PrepareTestEnv(t)()

// If Gitea has for some reason no Gitignore templates, we need to skip this test
if len(repo_module.Gitignores) == 0 {
return
}

// Use the first template for the test
templateName := repo_module.Gitignores[0]

urlStr := fmt.Sprintf("/api/v1/gitignore/templates/%s", templateName)
req := NewRequest(t, "GET", urlStr)
resp := MakeRequest(t, req, http.StatusOK)

var templateInfo api.GitignoreTemplateInfo
DecodeJSON(t, resp, &templateInfo)

// We get the text of the template here
text, _ := options.Gitignore(templateName)

assert.Equal(t, templateInfo.Name, templateName)
assert.Equal(t, templateInfo.Source, string(text))
}