Skip to content

Commit fb52adb

Browse files
committed
[API] Forgejo API /api/forgejo/v1
(cherry picked from commit 20b56692693e054bb3c04b4ef12b29b0715b4530) (cherry picked from commit 1574643a6a9634e5b92c033a4bfb69062a86bd05) Update semantic version according to specification (cherry picked from commit 22510f41306f9c133a7e99b61f9c38dabfd4b810) Mise à jour de 'Makefile' (cherry picked from commit c3d85d8409f1bb18a45659a167cf1ffee057f3b6) (cherry picked from commit 5ea23098513c068444226af41faf9be9c4c998e6) (cherry picked from commit ec5217b9d1b94bb04e34ce8c27eecbdc6f3a247a) (cherry picked from commit 14f08e364b2ad7e3176b45d3ec8da5f5605b4315) (cherry picked from commit b4465c67b8737aed9fd79a43046aa3795a298e68) [API] [SEMVER] replace number with version (cherry picked from commit fba48e64977a75e77c9c6cf8e3f8a679a5e7b733) (cherry picked from commit 532ec5d8782703b62d7d02312764e50637cd016e) [API] [SEMVER] [v1.20] less is replaced by css (cherry picked from commit 01ca3a4f4291cf4c62df42cbd12a00638f3cdc70) (cherry picked from commit 1d928c3ab2e1fda6082e1400d89ea96d6605ebaa) (cherry picked from commit a39dc804cd1da86444ed709455857f069475e7db) Conflicts: webpack.config.js (cherry picked from commit adc68578b3eb41215338125edfca91804706f8a1) (cherry picked from commit 9b8d98475fd7efcc15bf0d91b0af6ef3aff64508) (cherry picked from commit 25161039745a63282257eded9616390241af8013) (cherry picked from commit 18e6287963a0e1863cd08fd514a4e732a1904a68) (cherry picked from commit e9694e67ab93ad74f7eae3152d88d95e8493e739) (cherry picked from commit a9763edaf002c8009a2cca4115cb8b926f8cdc85) (cherry picked from commit e2b550f4fba144f9637a212b56bfe30cac1adb3b) (cherry picked from commit 2edac36701e8fa1ff67f87dccfa34cfc00ab66de) [API] Forgejo API /api/forgejo/v1 (squash) Update semver as v1.20 is entering release candidate mode (cherry picked from commit 4995098ec3c6eee19a7ad7bc956b71c6e937c04c) (cherry picked from commit 3dd6f2862e10250e5caefbf46a6c8092ab68eabc) (cherry picked from commit e8192737ef5773b520f85c6ea405219ad6fce1a5) (cherry picked from commit 7b1245cc706c95e70c01601c54e0dfabb162ba31) (cherry picked from commit 4d7cd59703dffbd2ab5bb417afe8ace3d0af7141) (cherry picked from commit 7a7a293dbd8f5e2acd313d3d96c54a337f717f1f)
1 parent f389a6f commit fb52adb

File tree

14 files changed

+400
-2
lines changed

14 files changed

+400
-2
lines changed

Makefile

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,10 @@ else
8888
endif
8989
VERSION = ${GITEA_VERSION}
9090

91-
LDFLAGS := $(LDFLAGS) -X "main.MakeVersion=$(MAKE_VERSION)" -X "main.Version=$(GITEA_VERSION)" -X "main.Tags=$(TAGS)"
91+
# SemVer
92+
FORGEJO_VERSION := 5.0.0+0-gitea-1.20.0
93+
94+
LDFLAGS := $(LDFLAGS) -X "main.MakeVersion=$(MAKE_VERSION)" -X "main.Version=$(GITEA_VERSION)" -X "main.Tags=$(TAGS)" -X "code.gitea.io/gitea/routers/api/forgejo/v1.ForgejoVersion=$(FORGEJO_VERSION)"
9295

9396
LINUX_ARCHS ?= linux/amd64,linux/386,linux/arm-5,linux/arm-6,linux/arm64
9497

@@ -140,6 +143,8 @@ ifdef DEPS_PLAYWRIGHT
140143
PLAYWRIGHT_FLAGS += --with-deps
141144
endif
142145

146+
FORGEJO_API_SPEC := public/forgejo/api.v1.yml
147+
143148
SWAGGER_SPEC := templates/swagger/v1_json.tmpl
144149
SWAGGER_SPEC_S_TMPL := s|"basePath": *"/api/v1"|"basePath": "{{AppSubUrl \| JSEscape \| Safe}}/api/v1"|g
145150
SWAGGER_SPEC_S_JSON := s|"basePath": *"{{AppSubUrl \| JSEscape \| Safe}}/api/v1"|"basePath": "/api/v1"|g
@@ -215,6 +220,8 @@ help:
215220
@echo " - generate-license update license files"
216221
@echo " - generate-gitignore update gitignore files"
217222
@echo " - generate-manpage generate manpage"
223+
@echo " - generate-forgejo-api generate the forgejo API from spec"
224+
@echo " - forgejo-api-validate check if the forgejo API matches the specs"
218225
@echo " - generate-swagger generate the swagger spec from code comments"
219226
@echo " - swagger-validate check if the swagger spec is valid"
220227
@echo " - go-licenses regenerate go licenses"
@@ -300,6 +307,27 @@ ifneq "$(TAGS)" "$(shell cat $(TAGS_EVIDENCE) 2>/dev/null)"
300307
TAGS_PREREQ := $(TAGS_EVIDENCE)
301308
endif
302309

310+
OAPI_CODEGEN_PACKAGE ?= github.com/deepmap/oapi-codegen/cmd/[email protected]
311+
KIN_OPENAPI_CODEGEN_PACKAGE ?= github.com/getkin/kin-openapi/cmd/[email protected]
312+
FORGEJO_API_SERVER = routers/api/forgejo/v1/generated.go
313+
314+
.PHONY: generate-forgejo-api
315+
generate-forgejo-api: $(FORGEJO_API_SPEC)
316+
$(GO) run $(OAPI_CODEGEN_PACKAGE) -package v1 -generate chi-server,types $< > $(FORGEJO_API_SERVER)
317+
318+
.PHONY: forgejo-api-check
319+
forgejo-api-check: generate-forgejo-api
320+
@diff=$$(git diff $(FORGEJO_API_SERVER) ; \
321+
if [ -n "$$diff" ]; then \
322+
echo "Please run 'make generate-forgejo-api' and commit the result:"; \
323+
echo "$${diff}"; \
324+
exit 1; \
325+
fi
326+
327+
.PHONY: forgejo-api-validate
328+
forgejo-api-validate:
329+
$(GO) run $(KIN_OPENAPI_CODEGEN_PACKAGE) $(FORGEJO_API_SPEC)
330+
303331
.PHONY: generate-swagger
304332
generate-swagger: $(SWAGGER_SPEC)
305333

@@ -330,7 +358,7 @@ checks: checks-frontend checks-backend
330358
checks-frontend: lockfile-check svg-check
331359

332360
.PHONY: checks-backend
333-
checks-backend: tidy-check swagger-check fmt-check misspell-check swagger-validate security-check
361+
checks-backend: tidy-check swagger-check fmt-check misspell-check forgejo-api-validate swagger-validate security-check
334362

335363
.PHONY: lint
336364
lint: lint-frontend lint-backend

public/forgejo/api.v1.yml

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
openapi: 3.0.0
2+
info:
3+
title: Forgejo API
4+
description: |-
5+
Forgejo REST API
6+
7+
contact:
8+
9+
license:
10+
name: MIT
11+
url: https://codeberg.org/forgejo/forgejo/src/branch/forgejo/LICENSE
12+
version: 1.0.0
13+
externalDocs:
14+
description: Find out more about Forgejo
15+
url: http://forgejo.org
16+
servers:
17+
- url: /api/forgejo/v1
18+
paths:
19+
/version:
20+
get:
21+
summary: API version
22+
description: Semantic version of the Forgejo API
23+
operationId: getVersion
24+
responses:
25+
'200':
26+
description: successful operation
27+
content:
28+
application/json:
29+
schema:
30+
type: array
31+
items:
32+
$ref: '#/components/schemas/Version'
33+
components:
34+
schemas:
35+
Version:
36+
type: object
37+
properties:
38+
version:
39+
type: string
40+

routers/api/forgejo/v1/api.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright 2023 The Forgejo Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package v1
5+
6+
import (
7+
gocontext "context"
8+
9+
"code.gitea.io/gitea/modules/web"
10+
)
11+
12+
func Routes(ctx gocontext.Context) *web.Route {
13+
m := web.NewRoute()
14+
forgejo := NewForgejo()
15+
m.Get("", Root)
16+
m.Get("/version", forgejo.GetVersion)
17+
return m
18+
}

routers/api/forgejo/v1/forgejo.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// SPDX-License-Identifier: MIT
2+
3+
package v1
4+
5+
import (
6+
"net/http"
7+
8+
"code.gitea.io/gitea/modules/json"
9+
)
10+
11+
type Forgejo struct{}
12+
13+
var _ ServerInterface = &Forgejo{}
14+
15+
func NewForgejo() *Forgejo {
16+
return &Forgejo{}
17+
}
18+
19+
var ForgejoVersion = "development"
20+
21+
func (f *Forgejo) GetVersion(w http.ResponseWriter, r *http.Request) {
22+
w.WriteHeader(http.StatusOK)
23+
_ = json.NewEncoder(w).Encode(Version{&ForgejoVersion})
24+
}

routers/api/forgejo/v1/generated.go

Lines changed: 167 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

routers/api/forgejo/v1/root.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Copyright The Forgejo Authors.
2+
// SPDX-License-Identifier: MIT
3+
4+
package v1
5+
6+
import (
7+
"net/http"
8+
)
9+
10+
func Root(w http.ResponseWriter, r *http.Request) {
11+
// https://www.rfc-editor.org/rfc/rfc8631
12+
w.Header().Set("Link", "</assets/forgejo/api.v1.yml>; rel=\"service-desc\"")
13+
w.WriteHeader(http.StatusNoContent)
14+
}

routers/init.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"code.gitea.io/gitea/modules/translation"
3131
"code.gitea.io/gitea/modules/web"
3232
actions_router "code.gitea.io/gitea/routers/api/actions"
33+
forgejo "code.gitea.io/gitea/routers/api/forgejo/v1"
3334
packages_router "code.gitea.io/gitea/routers/api/packages"
3435
apiv1 "code.gitea.io/gitea/routers/api/v1"
3536
"code.gitea.io/gitea/routers/common"
@@ -175,6 +176,7 @@ func NormalRoutes(ctx context.Context) *web.Route {
175176

176177
r.Mount("/", web_routers.Routes(ctx))
177178
r.Mount("/api/v1", apiv1.Routes(ctx))
179+
r.Mount("/api/forgejo/v1", forgejo.Routes(ctx))
178180
r.Mount("/api/internal", private.Routes())
179181

180182
if setting.Packages.Enabled {

routers/web/misc/swagger-forgejo.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// Copyright 2017 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package misc
5+
6+
import (
7+
"net/http"
8+
9+
"code.gitea.io/gitea/modules/base"
10+
"code.gitea.io/gitea/modules/context"
11+
)
12+
13+
// tplSwagger swagger page template
14+
const tplForgejoSwagger base.TplName = "swagger/forgejo-ui"
15+
16+
func SwaggerForgejo(ctx *context.Context) {
17+
ctx.Data["APIVersion"] = "v1"
18+
ctx.HTML(http.StatusOK, tplForgejoSwagger)
19+
}

routers/web/web.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ func Routes(ctx gocontext.Context) *web.Route {
160160
if setting.API.EnableSwagger {
161161
// Note: The route is here but no in API routes because it renders a web page
162162
routes.Get("/api/swagger", append(mid, misc.Swagger)...) // Render V1 by default
163+
routes.Get("/api/forgejo/swagger", append(mid, misc.SwaggerForgejo)...)
163164
}
164165

165166
// TODO: These really seem like things that could be folded into Contexter or as helper functions

templates/swagger/forgejo-ui.tmpl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<title>Forgejo API</title>
6+
<link href="{{AssetUrlPrefix}}/css/swagger.css?v={{AssetVersion}}" rel="stylesheet">
7+
</head>
8+
<body>
9+
<a class="swagger-back-link" href="{{AppUrl}}">{{svg "octicon-reply"}}{{.locale.Tr "return_to_gitea"}}</a>
10+
<div id="swagger-ui" data-source="{{AssetUrlPrefix}}/forgejo/api.{{.APIVersion}}.yml"></div>
11+
<script src="{{AssetUrlPrefix}}/js/forgejoswagger.js?v={{AssetVersion}}"></script>
12+
</body>
13+
</html>

0 commit comments

Comments
 (0)