Merge remote-tracking branch 'forgejo/v1.18/forgejo-branding' into v1.18/forgejo
|
@ -75,6 +75,14 @@ pipeline:
|
||||||
commands:
|
commands:
|
||||||
- ./build/test-env-prepare.sh
|
- ./build/test-env-prepare.sh
|
||||||
|
|
||||||
|
environment-to-ini:
|
||||||
|
image: *golang_image
|
||||||
|
environment:
|
||||||
|
GOPROXY_OVERRIDE: *goproxy_override
|
||||||
|
commands:
|
||||||
|
- *goproxy_setup
|
||||||
|
- go test contrib/environment-to-ini/environment-to-ini.go contrib/environment-to-ini/environment-to-ini_test.go
|
||||||
|
|
||||||
build:
|
build:
|
||||||
image: *test_image
|
image: *test_image
|
||||||
environment:
|
environment:
|
||||||
|
|
2
Makefile
|
@ -157,6 +157,7 @@ SWAGGER_SPEC_S_TMPL := s|"basePath": *"/api/v1"|"basePath": "{{AppSubUrl \| JSEs
|
||||||
SWAGGER_SPEC_S_JSON := s|"basePath": *"{{AppSubUrl \| JSEscape \| Safe}}/api/v1"|"basePath": "/api/v1"|g
|
SWAGGER_SPEC_S_JSON := s|"basePath": *"{{AppSubUrl \| JSEscape \| Safe}}/api/v1"|"basePath": "/api/v1"|g
|
||||||
SWAGGER_EXCLUDE := code.gitea.io/sdk
|
SWAGGER_EXCLUDE := code.gitea.io/sdk
|
||||||
SWAGGER_NEWLINE_COMMAND := -e '$$a\'
|
SWAGGER_NEWLINE_COMMAND := -e '$$a\'
|
||||||
|
SWAGGER_SPEC_BRANDING := s|Gitea API|Forgejo API|g
|
||||||
|
|
||||||
TEST_MYSQL_HOST ?= mysql:3306
|
TEST_MYSQL_HOST ?= mysql:3306
|
||||||
TEST_MYSQL_DBNAME ?= testgitea
|
TEST_MYSQL_DBNAME ?= testgitea
|
||||||
|
@ -331,6 +332,7 @@ $(SWAGGER_SPEC): $(GO_SOURCES_NO_BINDATA)
|
||||||
$(GO) run $(SWAGGER_PACKAGE) generate spec -x "$(SWAGGER_EXCLUDE)" -o './$(SWAGGER_SPEC)'
|
$(GO) run $(SWAGGER_PACKAGE) generate spec -x "$(SWAGGER_EXCLUDE)" -o './$(SWAGGER_SPEC)'
|
||||||
$(SED_INPLACE) '$(SWAGGER_SPEC_S_TMPL)' './$(SWAGGER_SPEC)'
|
$(SED_INPLACE) '$(SWAGGER_SPEC_S_TMPL)' './$(SWAGGER_SPEC)'
|
||||||
$(SED_INPLACE) $(SWAGGER_NEWLINE_COMMAND) './$(SWAGGER_SPEC)'
|
$(SED_INPLACE) $(SWAGGER_NEWLINE_COMMAND) './$(SWAGGER_SPEC)'
|
||||||
|
$(SED_INPLACE) '$(SWAGGER_SPEC_BRANDING)' './$(SWAGGER_SPEC)'
|
||||||
|
|
||||||
.PHONY: swagger-check
|
.PHONY: swagger-check
|
||||||
swagger-check: generate-swagger
|
swagger-check: generate-swagger
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="https://codeberg.org/forgejo/meta/raw/branch/readme/logo/forgejo.svg" alt="" width="192" align="center" />
|
<img src="./assets/logo.svg" alt="" width="192" align="center" />
|
||||||
<h1 align="center">Welcome to Forgejo</h1>
|
<h1 align="center">Welcome to Forgejo</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -1,31 +1,27 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<svg viewBox="0 0 212 212" xmlns="http://www.w3.org/2000/svg">
|
||||||
<svg version="1.1" id="main_outline" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
|
<style type="text/css">
|
||||||
y="0px" viewBox="0 0 640 640" style="enable-background:new 0 0 640 640;" xml:space="preserve">
|
circle {
|
||||||
<g>
|
fill: none;
|
||||||
<path id="teabag" style="fill:#FFFFFF" d="M395.9,484.2l-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5,21.2-17.9,33.8-11.8
|
stroke: #000;
|
||||||
c17.2,8.3,27.1,13,27.1,13l-0.1-109.2l16.7-0.1l0.1,117.1c0,0,57.4,24.2,83.1,40.1c3.7,2.3,10.2,6.8,12.9,14.4
|
stroke-width: 15;
|
||||||
c2.1,6.1,2,13.1-1,19.3l-61,126.9C423.6,484.9,408.4,490.3,395.9,484.2z"/>
|
}
|
||||||
<g>
|
path {
|
||||||
<g>
|
fill: none;
|
||||||
<path style="fill:#609926" d="M622.7,149.8c-4.1-4.1-9.6-4-9.6-4s-117.2,6.6-177.9,8c-13.3,0.3-26.5,0.6-39.6,0.7c0,39.1,0,78.2,0,117.2
|
stroke: #000;
|
||||||
c-5.5-2.6-11.1-5.3-16.6-7.9c0-36.4-0.1-109.2-0.1-109.2c-29,0.4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5
|
stroke-width: 25;
|
||||||
c-9.8-0.6-22.5-2.1-39,1.5c-8.7,1.8-33.5,7.4-53.8,26.9C-4.9,212.4,6.6,276.2,8,285.8c1.7,11.7,6.9,44.2,31.7,72.5
|
}
|
||||||
c45.8,56.1,144.4,54.8,144.4,54.8s12.1,28.9,30.6,55.5c25,33.1,50.7,58.9,75.7,62c63,0,188.9-0.1,188.9-0.1s12,0.1,28.3-10.3
|
.orange {
|
||||||
c14-8.5,26.5-23.4,26.5-23.4s12.9-13.8,30.9-45.3c5.5-9.7,10.1-19.1,14.1-28c0,0,55.2-117.1,55.2-231.1
|
stroke:#ff6600;
|
||||||
C633.2,157.9,624.7,151.8,622.7,149.8z M125.6,353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6,321.8,60,295.4
|
}
|
||||||
c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5,38.5-30c13.8-3.7,31-3.1,31-3.1s7.1,59.4,15.7,94.2c7.2,29.2,24.8,77.7,24.8,77.7
|
.red {
|
||||||
S142.5,359.9,125.6,353.9z M425.9,461.5c0,0-6.1,14.5-19.6,15.4c-5.8,0.4-10.3-1.2-10.3-1.2s-0.3-0.1-5.3-2.1l-112.9-55
|
stroke:#d40000;
|
||||||
c0,0-10.9-5.7-12.8-15.6c-2.2-8.1,2.7-18.1,2.7-18.1L322,273c0,0,4.8-9.7,12.2-13c0.6-0.3,2.3-1,4.5-1.5c8.1-2.1,18,2.8,18,2.8
|
}
|
||||||
l110.7,53.7c0,0,12.6,5.7,15.3,16.2c1.9,7.4-0.5,14-1.8,17.2C474.6,363.8,425.9,461.5,425.9,461.5z"/>
|
</style>
|
||||||
<path style="fill:#609926" d="M326.8,380.1c-8.2,0.1-15.4,5.8-17.3,13.8c-1.9,8,2,16.3,9.1,20c7.7,4,17.5,1.8,22.7-5.4
|
<g transform="translate(6,6)">
|
||||||
c5.1-7.1,4.3-16.9-1.8-23.1l24-49.1c1.5,0.1,3.7,0.2,6.2-0.5c4.1-0.9,7.1-3.6,7.1-3.6c4.2,1.8,8.6,3.8,13.2,6.1
|
<path d="M58 168 v-98 a50 50 0 0 1 50-50 h20" class="orange" />
|
||||||
c4.8,2.4,9.3,4.9,13.4,7.3c0.9,0.5,1.8,1.1,2.8,1.9c1.6,1.3,3.4,3.1,4.7,5.5c1.9,5.5-1.9,14.9-1.9,14.9
|
<path d="M58 168 v-30 a50 50 0 0 1 50-50 h20" class="red" />
|
||||||
c-2.3,7.6-18.4,40.6-18.4,40.6c-8.1-0.2-15.3,5-17.7,12.5c-2.6,8.1,1.1,17.3,8.9,21.3c7.8,4,17.4,1.7,22.5-5.3
|
<circle cx="142" cy="20" r="18" class="orange" />
|
||||||
c5-6.8,4.6-16.3-1.1-22.6c1.9-3.7,3.7-7.4,5.6-11.3c5-10.4,13.5-30.4,13.5-30.4c0.9-1.7,5.7-10.3,2.7-21.3
|
<circle cx="142" cy="88" r="18" class="red" />
|
||||||
c-2.5-11.4-12.6-16.7-12.6-16.7c-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3c4.7-9.7,9.4-19.3,14.1-29
|
<circle cx="58" cy="180" r="18" class="red" />
|
||||||
c-4.1-2-8.1-4-12.2-6.1c-4.8,9.8-9.7,19.7-14.5,29.5c-6.7-0.1-12.9,3.5-16.1,9.4c-3.4,6.3-2.7,14.1,1.9,19.8
|
</g>
|
||||||
C343.2,346.5,335,363.3,326.8,380.1z"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 677 B |
|
@ -1,31 +1,27 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<svg viewBox="0 0 212 212" xmlns="http://www.w3.org/2000/svg">
|
||||||
<svg version="1.1" id="main_outline" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
|
<style type="text/css">
|
||||||
y="0px" viewBox="0 0 640 640" style="enable-background:new 0 0 640 640;" xml:space="preserve">
|
circle {
|
||||||
<g>
|
fill: none;
|
||||||
<path id="teabag" style="fill:#FFFFFF" d="M395.9,484.2l-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5,21.2-17.9,33.8-11.8
|
stroke: #000;
|
||||||
c17.2,8.3,27.1,13,27.1,13l-0.1-109.2l16.7-0.1l0.1,117.1c0,0,57.4,24.2,83.1,40.1c3.7,2.3,10.2,6.8,12.9,14.4
|
stroke-width: 15;
|
||||||
c2.1,6.1,2,13.1-1,19.3l-61,126.9C423.6,484.9,408.4,490.3,395.9,484.2z"/>
|
}
|
||||||
<g>
|
path {
|
||||||
<g>
|
fill: none;
|
||||||
<path style="fill:#609926" d="M622.7,149.8c-4.1-4.1-9.6-4-9.6-4s-117.2,6.6-177.9,8c-13.3,0.3-26.5,0.6-39.6,0.7c0,39.1,0,78.2,0,117.2
|
stroke: #000;
|
||||||
c-5.5-2.6-11.1-5.3-16.6-7.9c0-36.4-0.1-109.2-0.1-109.2c-29,0.4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5
|
stroke-width: 25;
|
||||||
c-9.8-0.6-22.5-2.1-39,1.5c-8.7,1.8-33.5,7.4-53.8,26.9C-4.9,212.4,6.6,276.2,8,285.8c1.7,11.7,6.9,44.2,31.7,72.5
|
}
|
||||||
c45.8,56.1,144.4,54.8,144.4,54.8s12.1,28.9,30.6,55.5c25,33.1,50.7,58.9,75.7,62c63,0,188.9-0.1,188.9-0.1s12,0.1,28.3-10.3
|
.orange {
|
||||||
c14-8.5,26.5-23.4,26.5-23.4s12.9-13.8,30.9-45.3c5.5-9.7,10.1-19.1,14.1-28c0,0,55.2-117.1,55.2-231.1
|
stroke:#ff6600;
|
||||||
C633.2,157.9,624.7,151.8,622.7,149.8z M125.6,353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6,321.8,60,295.4
|
}
|
||||||
c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5,38.5-30c13.8-3.7,31-3.1,31-3.1s7.1,59.4,15.7,94.2c7.2,29.2,24.8,77.7,24.8,77.7
|
.red {
|
||||||
S142.5,359.9,125.6,353.9z M425.9,461.5c0,0-6.1,14.5-19.6,15.4c-5.8,0.4-10.3-1.2-10.3-1.2s-0.3-0.1-5.3-2.1l-112.9-55
|
stroke:#d40000;
|
||||||
c0,0-10.9-5.7-12.8-15.6c-2.2-8.1,2.7-18.1,2.7-18.1L322,273c0,0,4.8-9.7,12.2-13c0.6-0.3,2.3-1,4.5-1.5c8.1-2.1,18,2.8,18,2.8
|
}
|
||||||
l110.7,53.7c0,0,12.6,5.7,15.3,16.2c1.9,7.4-0.5,14-1.8,17.2C474.6,363.8,425.9,461.5,425.9,461.5z"/>
|
</style>
|
||||||
<path style="fill:#609926" d="M326.8,380.1c-8.2,0.1-15.4,5.8-17.3,13.8c-1.9,8,2,16.3,9.1,20c7.7,4,17.5,1.8,22.7-5.4
|
<g transform="translate(6,6)">
|
||||||
c5.1-7.1,4.3-16.9-1.8-23.1l24-49.1c1.5,0.1,3.7,0.2,6.2-0.5c4.1-0.9,7.1-3.6,7.1-3.6c4.2,1.8,8.6,3.8,13.2,6.1
|
<path d="M58 168 v-98 a50 50 0 0 1 50-50 h20" class="orange" />
|
||||||
c4.8,2.4,9.3,4.9,13.4,7.3c0.9,0.5,1.8,1.1,2.8,1.9c1.6,1.3,3.4,3.1,4.7,5.5c1.9,5.5-1.9,14.9-1.9,14.9
|
<path d="M58 168 v-30 a50 50 0 0 1 50-50 h20" class="red" />
|
||||||
c-2.3,7.6-18.4,40.6-18.4,40.6c-8.1-0.2-15.3,5-17.7,12.5c-2.6,8.1,1.1,17.3,8.9,21.3c7.8,4,17.4,1.7,22.5-5.3
|
<circle cx="142" cy="20" r="18" class="orange" />
|
||||||
c5-6.8,4.6-16.3-1.1-22.6c1.9-3.7,3.7-7.4,5.6-11.3c5-10.4,13.5-30.4,13.5-30.4c0.9-1.7,5.7-10.3,2.7-21.3
|
<circle cx="142" cy="88" r="18" class="red" />
|
||||||
c-2.5-11.4-12.6-16.7-12.6-16.7c-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3c4.7-9.7,9.4-19.3,14.1-29
|
<circle cx="58" cy="180" r="18" class="red" />
|
||||||
c-4.1-2-8.1-4-12.2-6.1c-4.8,9.8-9.7,19.7-14.5,29.5c-6.7-0.1-12.9,3.5-16.1,9.4c-3.4,6.3-2.7,14.1,1.9,19.8
|
</g>
|
||||||
C343.2,346.5,335,363.3,326.8,380.1z"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 677 B |
|
@ -149,13 +149,13 @@ func runServ(c *cli.Context) error {
|
||||||
}
|
}
|
||||||
switch key.Type {
|
switch key.Type {
|
||||||
case asymkey_model.KeyTypeDeploy:
|
case asymkey_model.KeyTypeDeploy:
|
||||||
println("Hi there! You've successfully authenticated with the deploy key named " + key.Name + ", but Gitea does not provide shell access.")
|
println("Hi there! You've successfully authenticated with the deploy key named " + key.Name + ", but Forgejo does not provide shell access.")
|
||||||
case asymkey_model.KeyTypePrincipal:
|
case asymkey_model.KeyTypePrincipal:
|
||||||
println("Hi there! You've successfully authenticated with the principal " + key.Content + ", but Gitea does not provide shell access.")
|
println("Hi there! You've successfully authenticated with the principal " + key.Content + ", but Forgejo does not provide shell access.")
|
||||||
default:
|
default:
|
||||||
println("Hi there, " + user.Name + "! You've successfully authenticated with the key named " + key.Name + ", but Gitea does not provide shell access.")
|
println("Hi there, " + user.Name + "! You've successfully authenticated with the key named " + key.Name + ", but Forgejo does not provide shell access.")
|
||||||
}
|
}
|
||||||
println("If this is unexpected, please log in with password and setup Gitea under another user.")
|
println("If this is unexpected, please log in with password and setup Forgejo under another user.")
|
||||||
return nil
|
return nil
|
||||||
} else if c.Bool("debug") {
|
} else if c.Bool("debug") {
|
||||||
log.Debug("SSH_ORIGINAL_COMMAND: %s", os.Getenv("SSH_ORIGINAL_COMMAND"))
|
log.Debug("SSH_ORIGINAL_COMMAND: %s", os.Getenv("SSH_ORIGINAL_COMMAND"))
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Copyright 2023 The Forgejo Authors. All rights reserved.
|
||||||
// Copyright 2019 The Gitea Authors. All rights reserved.
|
// Copyright 2019 The Gitea Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a MIT-style
|
// Use of this source code is governed by a MIT-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
@ -19,17 +20,17 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// EnvironmentPrefix environment variables prefixed with this represent ini values to write
|
// EnvironmentPrefix environment variables prefixed with this represent ini values to write
|
||||||
const EnvironmentPrefix = "GITEA"
|
const prefixRegexpString = "^(FORGEJO|GITEA)"
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
app := cli.NewApp()
|
app := cli.NewApp()
|
||||||
app.Name = "environment-to-ini"
|
app.Name = "environment-to-ini"
|
||||||
app.Usage = "Use provided environment to update configuration ini"
|
app.Usage = "Use provided environment to update configuration ini"
|
||||||
app.Description = `As a helper to allow docker users to update the gitea configuration
|
app.Description = `As a helper to allow docker users to update the forgejo configuration
|
||||||
through the environment, this command allows environment variables to
|
through the environment, this command allows environment variables to
|
||||||
be mapped to values in the ini.
|
be mapped to values in the ini.
|
||||||
|
|
||||||
Environment variables of the form "GITEA__SECTION_NAME__KEY_NAME"
|
Environment variables of the form "FORGEJO__SECTION_NAME__KEY_NAME"
|
||||||
will be mapped to the ini section "[section_name]" and the key
|
will be mapped to the ini section "[section_name]" and the key
|
||||||
"KEY_NAME" with the value as provided.
|
"KEY_NAME" with the value as provided.
|
||||||
|
|
||||||
|
@ -47,9 +48,8 @@ func main() {
|
||||||
...
|
...
|
||||||
"""
|
"""
|
||||||
|
|
||||||
You would set the environment variables: "GITEA__LOG_0x2E_CONSOLE__COLORIZE=false"
|
You would set the environment variables: "FORGEJO__LOG_0x2E_CONSOLE__COLORIZE=false"
|
||||||
and "GITEA__LOG_0x2E_CONSOLE__STDERR=false". Other examples can be found
|
and "FORGEJO__LOG_0x2E_CONSOLE__STDERR=false".`
|
||||||
on the configuration cheat sheet.`
|
|
||||||
app.Flags = []cli.Flag{
|
app.Flags = []cli.Flag{
|
||||||
cli.StringFlag{
|
cli.StringFlag{
|
||||||
Name: "custom-path, C",
|
Name: "custom-path, C",
|
||||||
|
@ -77,7 +77,7 @@ func main() {
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
cli.StringFlag{
|
||||||
Name: "prefix, p",
|
Name: "prefix, p",
|
||||||
Value: EnvironmentPrefix,
|
Value: prefixRegexpString,
|
||||||
Usage: "Environment prefix to look for - will be suffixed by __ (2 underscores)",
|
Usage: "Environment prefix to look for - will be suffixed by __ (2 underscores)",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -90,6 +90,19 @@ func main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func splitEnvironmentVariable(prefixRegexp *regexp.Regexp, kv string) (string, string) {
|
||||||
|
idx := strings.IndexByte(kv, '=')
|
||||||
|
if idx < 0 {
|
||||||
|
return "", ""
|
||||||
|
}
|
||||||
|
k := kv[:idx]
|
||||||
|
loc := prefixRegexp.FindStringIndex(k)
|
||||||
|
if loc == nil {
|
||||||
|
return "", ""
|
||||||
|
}
|
||||||
|
return k[loc[1]:], kv[idx+1:]
|
||||||
|
}
|
||||||
|
|
||||||
func runEnvironmentToIni(c *cli.Context) error {
|
func runEnvironmentToIni(c *cli.Context) error {
|
||||||
providedCustom := c.String("custom-path")
|
providedCustom := c.String("custom-path")
|
||||||
providedConf := c.String("config")
|
providedConf := c.String("config")
|
||||||
|
@ -112,19 +125,13 @@ func runEnvironmentToIni(c *cli.Context) error {
|
||||||
|
|
||||||
changed := false
|
changed := false
|
||||||
|
|
||||||
prefix := c.String("prefix") + "__"
|
prefixRegexp := regexp.MustCompile(c.String("prefix") + "__")
|
||||||
|
|
||||||
for _, kv := range os.Environ() {
|
for _, kv := range os.Environ() {
|
||||||
idx := strings.IndexByte(kv, '=')
|
eKey, value := splitEnvironmentVariable(prefixRegexp, kv)
|
||||||
if idx < 0 {
|
if eKey == "" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
eKey := kv[:idx]
|
|
||||||
value := kv[idx+1:]
|
|
||||||
if !strings.HasPrefix(eKey, prefix) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
eKey = eKey[len(prefix):]
|
|
||||||
sectionName, keyName := DecodeSectionKey(eKey)
|
sectionName, keyName := DecodeSectionKey(eKey)
|
||||||
if len(keyName) == 0 {
|
if len(keyName) == 0 {
|
||||||
continue
|
continue
|
||||||
|
@ -164,14 +171,11 @@ func runEnvironmentToIni(c *cli.Context) error {
|
||||||
}
|
}
|
||||||
if c.Bool("clear") {
|
if c.Bool("clear") {
|
||||||
for _, kv := range os.Environ() {
|
for _, kv := range os.Environ() {
|
||||||
idx := strings.IndexByte(kv, '=')
|
eKey, _ := splitEnvironmentVariable(prefixRegexp, kv)
|
||||||
if idx < 0 {
|
if eKey == "" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
eKey := kv[:idx]
|
_ = os.Unsetenv(eKey)
|
||||||
if strings.HasPrefix(eKey, prefix) {
|
|
||||||
_ = os.Unsetenv(eKey)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
21
contrib/environment-to-ini/environment-to-ini_test.go
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
// Copyright 2023 The Forgejo Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"regexp"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Test_splitEnvironmentVariable(t *testing.T) {
|
||||||
|
prefixRegexp := regexp.MustCompile(prefixRegexpString + "__")
|
||||||
|
k, v := splitEnvironmentVariable(prefixRegexp, "FORGEJO__KEY=VALUE")
|
||||||
|
assert.Equal(t, k, "KEY")
|
||||||
|
assert.Equal(t, v, "VALUE")
|
||||||
|
k, v = splitEnvironmentVariable(prefixRegexp, "nothing=interesting")
|
||||||
|
assert.Equal(t, k, "")
|
||||||
|
assert.Equal(t, v, "")
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Gitea (Git with a cup of tea)
|
Description=Forgejo (Beyond coding. We forge.)
|
||||||
After=syslog.target
|
After=syslog.target
|
||||||
After=network.target
|
After=network.target
|
||||||
###
|
###
|
||||||
|
@ -25,21 +25,21 @@ After=network.target
|
||||||
# If using socket activation for main http/s
|
# If using socket activation for main http/s
|
||||||
###
|
###
|
||||||
#
|
#
|
||||||
#After=gitea.main.socket
|
#After=forgejo.main.socket
|
||||||
#Requires=gitea.main.socket
|
#Requires=forgejo.main.socket
|
||||||
#
|
#
|
||||||
###
|
###
|
||||||
# (You can also provide gitea an http fallback and/or ssh socket too)
|
# (You can also provide forgejo an http fallback and/or ssh socket too)
|
||||||
#
|
#
|
||||||
# An example of /etc/systemd/system/gitea.main.socket
|
# An example of /etc/systemd/system/forgejo.main.socket
|
||||||
###
|
###
|
||||||
##
|
##
|
||||||
## [Unit]
|
## [Unit]
|
||||||
## Description=Gitea Web Socket
|
## Description=Forgejo Web Socket
|
||||||
## PartOf=gitea.service
|
## PartOf=forgejo.service
|
||||||
##
|
##
|
||||||
## [Socket]
|
## [Socket]
|
||||||
## Service=gitea.service
|
## Service=forgejo.service
|
||||||
## ListenStream=<some_port>
|
## ListenStream=<some_port>
|
||||||
## NoDelay=true
|
## NoDelay=true
|
||||||
##
|
##
|
||||||
|
@ -55,28 +55,28 @@ RestartSec=2s
|
||||||
Type=simple
|
Type=simple
|
||||||
User=git
|
User=git
|
||||||
Group=git
|
Group=git
|
||||||
WorkingDirectory=/var/lib/gitea/
|
WorkingDirectory=/var/lib/forgejo/
|
||||||
# If using Unix socket: tells systemd to create the /run/gitea folder, which will contain the gitea.sock file
|
# If using Unix socket: tells systemd to create the /run/forgejo folder, which will contain the forgejo.sock file
|
||||||
# (manually creating /run/gitea doesn't work, because it would not persist across reboots)
|
# (manually creating /run/forgejo doesn't work, because it would not persist across reboots)
|
||||||
#RuntimeDirectory=gitea
|
#RuntimeDirectory=forgejo
|
||||||
ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
|
ExecStart=/usr/local/bin/forgejo web --config /etc/forgejo/app.ini
|
||||||
Restart=always
|
Restart=always
|
||||||
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea
|
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/forgejo
|
||||||
# If you install Git to directory prefix other than default PATH (which happens
|
# If you install Git to directory prefix other than default PATH (which happens
|
||||||
# for example if you install other versions of Git side-to-side with
|
# for example if you install other versions of Git side-to-side with
|
||||||
# distribution version), uncomment below line and add that prefix to PATH
|
# distribution version), uncomment below line and add that prefix to PATH
|
||||||
# Don't forget to place git-lfs binary on the PATH below if you want to enable
|
# Don't forget to place git-lfs binary on the PATH below if you want to enable
|
||||||
# Git LFS support
|
# Git LFS support
|
||||||
#Environment=PATH=/path/to/git/bin:/bin:/sbin:/usr/bin:/usr/sbin
|
#Environment=PATH=/path/to/git/bin:/bin:/sbin:/usr/bin:/usr/sbin
|
||||||
# If you want to bind Gitea to a port below 1024, uncomment
|
# If you want to bind Forgejo to a port below 1024, uncomment
|
||||||
# the two values below, or use socket activation to pass Gitea its ports as above
|
# the two values below, or use socket activation to pass Forgejo its ports as above
|
||||||
###
|
###
|
||||||
#CapabilityBoundingSet=CAP_NET_BIND_SERVICE
|
#CapabilityBoundingSet=CAP_NET_BIND_SERVICE
|
||||||
#AmbientCapabilities=CAP_NET_BIND_SERVICE
|
#AmbientCapabilities=CAP_NET_BIND_SERVICE
|
||||||
###
|
###
|
||||||
# In some cases, when using CapabilityBoundingSet and AmbientCapabilities option, you may want to
|
# In some cases, when using CapabilityBoundingSet and AmbientCapabilities option, you may want to
|
||||||
# set the following value to false to allow capabilities to be applied on gitea process. The following
|
# set the following value to false to allow capabilities to be applied on Forgejo process. The following
|
||||||
# value if set to true sandboxes gitea service and prevent any processes from running with privileges
|
# value if set to true sandboxes Forgejo service and prevent any processes from running with privileges
|
||||||
# in the host user namespace.
|
# in the host user namespace.
|
||||||
###
|
###
|
||||||
#PrivateUsers=false
|
#PrivateUsers=false
|
|
@ -331,7 +331,7 @@ USER = root
|
||||||
;; SQLite Configuration
|
;; SQLite Configuration
|
||||||
;;
|
;;
|
||||||
;DB_TYPE = sqlite3
|
;DB_TYPE = sqlite3
|
||||||
;PATH= ; defaults to data/gitea.db
|
;PATH= ; defaults to data/forgejo.db
|
||||||
;SQLITE_TIMEOUT = ; Query timeout defaults to: 500
|
;SQLITE_TIMEOUT = ; Query timeout defaults to: 500
|
||||||
;SQLITE_JOURNAL_MODE = ; defaults to sqlite database default (often DELETE), can be used to enable WAL mode. https://www.sqlite.org/pragma.html#pragma_journal_mode
|
;SQLITE_JOURNAL_MODE = ; defaults to sqlite database default (often DELETE), can be used to enable WAL mode. https://www.sqlite.org/pragma.html#pragma_journal_mode
|
||||||
;;
|
;;
|
||||||
|
|
|
@ -24,7 +24,7 @@ if [ ! -f ${GITEA_CUSTOM}/conf/app.ini ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Substitute the environment variables in the template
|
# Substitute the environment variables in the template
|
||||||
APP_NAME=${APP_NAME:-"Gitea: Git with a cup of tea"} \
|
APP_NAME=${APP_NAME:-"Forgejo: Beyond coding. We forge."} \
|
||||||
RUN_MODE=${RUN_MODE:-"prod"} \
|
RUN_MODE=${RUN_MODE:-"prod"} \
|
||||||
DOMAIN=${DOMAIN:-"localhost"} \
|
DOMAIN=${DOMAIN:-"localhost"} \
|
||||||
SSH_DOMAIN=${SSH_DOMAIN:-"localhost"} \
|
SSH_DOMAIN=${SSH_DOMAIN:-"localhost"} \
|
||||||
|
|
|
@ -26,7 +26,7 @@ if [ ! -f ${GITEA_APP_INI} ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Substitute the environment variables in the template
|
# Substitute the environment variables in the template
|
||||||
APP_NAME=${APP_NAME:-"Gitea: Git with a cup of tea"} \
|
APP_NAME=${APP_NAME:-"Forgejo: Beyond coding. We forge."} \
|
||||||
RUN_MODE=${RUN_MODE:-"prod"} \
|
RUN_MODE=${RUN_MODE:-"prod"} \
|
||||||
RUN_USER=${USER:-"git"} \
|
RUN_USER=${USER:-"git"} \
|
||||||
SSH_DOMAIN=${SSH_DOMAIN:-"localhost"} \
|
SSH_DOMAIN=${SSH_DOMAIN:-"localhost"} \
|
||||||
|
|
|
@ -155,6 +155,7 @@ type HookType = string
|
||||||
|
|
||||||
// Types of webhooks
|
// Types of webhooks
|
||||||
const (
|
const (
|
||||||
|
FORGEJO HookType = "forgejo"
|
||||||
GITEA HookType = "gitea"
|
GITEA HookType = "gitea"
|
||||||
GOGS HookType = "gogs"
|
GOGS HookType = "gogs"
|
||||||
SLACK HookType = "slack"
|
SLACK HookType = "slack"
|
||||||
|
|
|
@ -31,6 +31,7 @@ func AddCacheControlToHeader(h http.Header, maxAge time.Duration, additionalDire
|
||||||
|
|
||||||
// to remind users they are using non-prod setting.
|
// to remind users they are using non-prod setting.
|
||||||
h.Add("X-Gitea-Debug", "RUN_MODE="+setting.RunMode)
|
h.Add("X-Gitea-Debug", "RUN_MODE="+setting.RunMode)
|
||||||
|
h.Add("X-Forgejo-Debug", "RUN_MODE="+setting.RunMode)
|
||||||
}
|
}
|
||||||
|
|
||||||
h.Set("Cache-Control", strings.Join(append(directives, additionalDirectives...), ", "))
|
h.Set("Cache-Control", strings.Join(append(directives, additionalDirectives...), ", "))
|
||||||
|
|
|
@ -30,6 +30,9 @@ func countFormalHeaders(h http.Header) (c int) {
|
||||||
if strings.HasPrefix(k, "X-Gitea-") {
|
if strings.HasPrefix(k, "X-Gitea-") {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if strings.HasPrefix(k, "X-Forgejo-") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
c++
|
c++
|
||||||
}
|
}
|
||||||
return c
|
return c
|
||||||
|
|
|
@ -90,7 +90,7 @@ func InitDBConfig() {
|
||||||
log.Error("Deprecated database mysql charset utf8 support, please use utf8mb4 or convert utf8 to utf8mb4.")
|
log.Error("Deprecated database mysql charset utf8 support, please use utf8mb4 or convert utf8 to utf8mb4.")
|
||||||
}
|
}
|
||||||
|
|
||||||
Database.Path = sec.Key("PATH").MustString(filepath.Join(AppDataPath, "gitea.db"))
|
Database.Path = sec.Key("PATH").MustString(filepath.Join(AppDataPath, "forgejo.db"))
|
||||||
Database.Timeout = sec.Key("SQLITE_TIMEOUT").MustInt(500)
|
Database.Timeout = sec.Key("SQLITE_TIMEOUT").MustInt(500)
|
||||||
Database.SQLiteJournalMode = sec.Key("SQLITE_JOURNAL_MODE").MustString("")
|
Database.SQLiteJournalMode = sec.Key("SQLITE_JOURNAL_MODE").MustString("")
|
||||||
|
|
||||||
|
|
|
@ -276,7 +276,7 @@ func newRepository() {
|
||||||
Repository.UseCompatSSHURI = sec.Key("USE_COMPAT_SSH_URI").MustBool()
|
Repository.UseCompatSSHURI = sec.Key("USE_COMPAT_SSH_URI").MustBool()
|
||||||
Repository.MaxCreationLimit = sec.Key("MAX_CREATION_LIMIT").MustInt(-1)
|
Repository.MaxCreationLimit = sec.Key("MAX_CREATION_LIMIT").MustInt(-1)
|
||||||
Repository.DefaultBranch = sec.Key("DEFAULT_BRANCH").MustString(Repository.DefaultBranch)
|
Repository.DefaultBranch = sec.Key("DEFAULT_BRANCH").MustString(Repository.DefaultBranch)
|
||||||
RepoRootPath = sec.Key("ROOT").MustString(path.Join(AppDataPath, "gitea-repositories"))
|
RepoRootPath = sec.Key("ROOT").MustString(path.Join(AppDataPath, "forgejo-repositories"))
|
||||||
forcePathSeparator(RepoRootPath)
|
forcePathSeparator(RepoRootPath)
|
||||||
if !filepath.IsAbs(RepoRootPath) {
|
if !filepath.IsAbs(RepoRootPath) {
|
||||||
RepoRootPath = filepath.Join(AppWorkPath, RepoRootPath)
|
RepoRootPath = filepath.Join(AppWorkPath, RepoRootPath)
|
||||||
|
|
|
@ -287,11 +287,11 @@ var (
|
||||||
ReactionMaxUserNum: 10,
|
ReactionMaxUserNum: 10,
|
||||||
ThemeColorMetaTag: `#6cc644`,
|
ThemeColorMetaTag: `#6cc644`,
|
||||||
MaxDisplayFileSize: 8388608,
|
MaxDisplayFileSize: 8388608,
|
||||||
DefaultTheme: `auto`,
|
DefaultTheme: `forgejo-auto`,
|
||||||
Themes: []string{`auto`, `gitea`, `arc-green`},
|
Themes: []string{`forgejo-auto`, `forgejo-light`, `forgejo-dark`, `auto`, `gitea`, `arc-green`},
|
||||||
Reactions: []string{`+1`, `-1`, `laugh`, `hooray`, `confused`, `heart`, `rocket`, `eyes`},
|
Reactions: []string{`+1`, `-1`, `laugh`, `hooray`, `confused`, `heart`, `rocket`, `eyes`},
|
||||||
CustomEmojis: []string{`git`, `gitea`, `codeberg`, `gitlab`, `github`, `gogs`},
|
CustomEmojis: []string{`git`, `gitea`, `codeberg`, `gitlab`, `github`, `gogs`, `forgejo`},
|
||||||
CustomEmojisMap: map[string]string{"git": ":git:", "gitea": ":gitea:", "codeberg": ":codeberg:", "gitlab": ":gitlab:", "github": ":github:", "gogs": ":gogs:"},
|
CustomEmojisMap: map[string]string{"git": ":git:", "gitea": ":gitea:", "codeberg": ":codeberg:", "gitlab": ":gitlab:", "github": ":github:", "gogs": ":gogs:", "forgejo": ":forgejo:"},
|
||||||
Notification: struct {
|
Notification: struct {
|
||||||
MinTimeout time.Duration
|
MinTimeout time.Duration
|
||||||
TimeoutStep time.Duration
|
TimeoutStep time.Duration
|
||||||
|
@ -334,9 +334,9 @@ var (
|
||||||
Description string
|
Description string
|
||||||
Keywords string
|
Keywords string
|
||||||
}{
|
}{
|
||||||
Author: "Gitea - Git with a cup of tea",
|
Author: "Forgejo – Beyond coding. We forge.",
|
||||||
Description: "Gitea (Git with a cup of tea) is a painless self-hosted Git service written in Go",
|
Description: "Forgejo is a self-hosted lightweight software forge. Easy to install and low maintenance, it just does the job.",
|
||||||
Keywords: "go,git,self-hosted,gitea",
|
Keywords: "git,forge,forgejo",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -663,7 +663,7 @@ func loadFromConf(allowEmpty bool, extraConfig string) {
|
||||||
forcePathSeparator(LogRootPath)
|
forcePathSeparator(LogRootPath)
|
||||||
|
|
||||||
sec := Cfg.Section("server")
|
sec := Cfg.Section("server")
|
||||||
AppName = Cfg.Section("").Key("APP_NAME").MustString("Gitea: Git with a cup of tea")
|
AppName = Cfg.Section("").Key("APP_NAME").MustString("Forgejo: Beyond coding. We Forge.")
|
||||||
|
|
||||||
Domain = sec.Key("DOMAIN").MustString("localhost")
|
Domain = sec.Key("DOMAIN").MustString("localhost")
|
||||||
HTTPAddr = sec.Key("HTTP_ADDR").MustString("0.0.0.0")
|
HTTPAddr = sec.Key("HTTP_ADDR").MustString("0.0.0.0")
|
||||||
|
|
|
@ -36,7 +36,7 @@ func newWebhookService() {
|
||||||
Webhook.DeliverTimeout = sec.Key("DELIVER_TIMEOUT").MustInt(5)
|
Webhook.DeliverTimeout = sec.Key("DELIVER_TIMEOUT").MustInt(5)
|
||||||
Webhook.SkipTLSVerify = sec.Key("SKIP_TLS_VERIFY").MustBool()
|
Webhook.SkipTLSVerify = sec.Key("SKIP_TLS_VERIFY").MustBool()
|
||||||
Webhook.AllowedHostList = sec.Key("ALLOWED_HOST_LIST").MustString("")
|
Webhook.AllowedHostList = sec.Key("ALLOWED_HOST_LIST").MustString("")
|
||||||
Webhook.Types = []string{"gitea", "gogs", "slack", "discord", "dingtalk", "telegram", "msteams", "feishu", "matrix", "wechatwork", "packagist"}
|
Webhook.Types = []string{"forgejo", "gitea", "gogs", "slack", "discord", "dingtalk", "telegram", "msteams", "feishu", "matrix", "wechatwork", "packagist"}
|
||||||
Webhook.PagingNum = sec.Key("PAGING_NUM").MustInt(10)
|
Webhook.PagingNum = sec.Key("PAGING_NUM").MustInt(10)
|
||||||
Webhook.ProxyURL = sec.Key("PROXY_URL").MustString("")
|
Webhook.ProxyURL = sec.Key("PROXY_URL").MustString("")
|
||||||
if Webhook.ProxyURL != "" {
|
if Webhook.ProxyURL != "" {
|
||||||
|
|
|
@ -40,7 +40,7 @@ type CreateHookOptionConfig map[string]string
|
||||||
// CreateHookOption options when create a hook
|
// CreateHookOption options when create a hook
|
||||||
type CreateHookOption struct {
|
type CreateHookOption struct {
|
||||||
// required: true
|
// required: true
|
||||||
// enum: dingtalk,discord,gitea,gogs,msteams,slack,telegram,feishu,wechatwork,packagist
|
// enum: forgejo,dingtalk,discord,gitea,gogs,msteams,slack,telegram,feishu,wechatwork,packagist
|
||||||
Type string `json:"type" binding:"Required"`
|
Type string `json:"type" binding:"Required"`
|
||||||
// required: true
|
// required: true
|
||||||
Config CreateHookOptionConfig `json:"config" binding:"Required"`
|
Config CreateHookOptionConfig `json:"config" binding:"Required"`
|
||||||
|
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 3.1 KiB |
BIN
public/img/emoji/forgejo.png
Normal file
After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 2.9 KiB |
|
@ -1 +1 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640" style="enable-background:new 0 0 640 640" xml:space="preserve" width="32" height="32"><path style="fill:#fff" d="m395.9 484.2-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5 21.2-17.9 33.8-11.8 17.2 8.3 27.1 13 27.1 13l-.1-109.2 16.7-.1.1 117.1s57.4 24.2 83.1 40.1c3.7 2.3 10.2 6.8 12.9 14.4 2.1 6.1 2 13.1-1 19.3l-61 126.9c-6.2 12.7-21.4 18.1-33.9 12z"/><path style="fill:#609926" d="M622.7 149.8c-4.1-4.1-9.6-4-9.6-4s-117.2 6.6-177.9 8c-13.3.3-26.5.6-39.6.7v117.2c-5.5-2.6-11.1-5.3-16.6-7.9 0-36.4-.1-109.2-.1-109.2-29 .4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5c-9.8-.6-22.5-2.1-39 1.5-8.7 1.8-33.5 7.4-53.8 26.9C-4.9 212.4 6.6 276.2 8 285.8c1.7 11.7 6.9 44.2 31.7 72.5 45.8 56.1 144.4 54.8 144.4 54.8s12.1 28.9 30.6 55.5c25 33.1 50.7 58.9 75.7 62 63 0 188.9-.1 188.9-.1s12 .1 28.3-10.3c14-8.5 26.5-23.4 26.5-23.4S547 483 565 451.5c5.5-9.7 10.1-19.1 14.1-28 0 0 55.2-117.1 55.2-231.1-1.1-34.5-9.6-40.6-11.6-42.6zM125.6 353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6 321.8 60 295.4c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5 38.5-30c13.8-3.7 31-3.1 31-3.1s7.1 59.4 15.7 94.2c7.2 29.2 24.8 77.7 24.8 77.7s-26.1-3.1-43-9.1zm300.3 107.6s-6.1 14.5-19.6 15.4c-5.8.4-10.3-1.2-10.3-1.2s-.3-.1-5.3-2.1l-112.9-55s-10.9-5.7-12.8-15.6c-2.2-8.1 2.7-18.1 2.7-18.1L322 273s4.8-9.7 12.2-13c.6-.3 2.3-1 4.5-1.5 8.1-2.1 18 2.8 18 2.8L467.4 315s12.6 5.7 15.3 16.2c1.9 7.4-.5 14-1.8 17.2-6.3 15.4-55 113.1-55 113.1z"/><path style="fill:#609926" d="M326.8 380.1c-8.2.1-15.4 5.8-17.3 13.8-1.9 8 2 16.3 9.1 20 7.7 4 17.5 1.8 22.7-5.4 5.1-7.1 4.3-16.9-1.8-23.1l24-49.1c1.5.1 3.7.2 6.2-.5 4.1-.9 7.1-3.6 7.1-3.6 4.2 1.8 8.6 3.8 13.2 6.1 4.8 2.4 9.3 4.9 13.4 7.3.9.5 1.8 1.1 2.8 1.9 1.6 1.3 3.4 3.1 4.7 5.5 1.9 5.5-1.9 14.9-1.9 14.9-2.3 7.6-18.4 40.6-18.4 40.6-8.1-.2-15.3 5-17.7 12.5-2.6 8.1 1.1 17.3 8.9 21.3 7.8 4 17.4 1.7 22.5-5.3 5-6.8 4.6-16.3-1.1-22.6 1.9-3.7 3.7-7.4 5.6-11.3 5-10.4 13.5-30.4 13.5-30.4.9-1.7 5.7-10.3 2.7-21.3-2.5-11.4-12.6-16.7-12.6-16.7-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3 4.7-9.7 9.4-19.3 14.1-29-4.1-2-8.1-4-12.2-6.1-4.8 9.8-9.7 19.7-14.5 29.5-6.7-.1-12.9 3.5-16.1 9.4-3.4 6.3-2.7 14.1 1.9 19.8l-24.6 50.4z"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" width="32" height="32"><style>circle,path{fill:none;stroke:#000;stroke-width:15}path{stroke-width:25}.orange{stroke:#f60}.red{stroke:#d40000}</style><g transform="translate(6 6)"><path d="M58 168V70a50 50 0 0 1 50-50h20" class="orange"/><path d="M58 168v-30a50 50 0 0 1 50-50h20" class="red"/><circle cx="142" cy="20" r="18" class="orange"/><circle cx="142" cy="88" r="18" class="red"/><circle cx="58" cy="180" r="18" class="red"/></g></svg>
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 503 B |
14
public/img/forgejo-loading.svg
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212">
|
||||||
|
<style>
|
||||||
|
@keyframes draw-orange{0%{stroke-dashoffset:200}25%{stroke-dashoffset:200;stroke-width:0}50%{stroke-dashoffset:0;stroke-width:25}to{stroke-dashoffset:0}}@keyframes draw-red{0%{stroke-dashoffset:130;stroke-width:0}25%{stroke-dashoffset:0;stroke-width:25}50%,to{stroke-dashoffset:0}}@keyframes red-circle{0%{opacity:0}20%{opacity:0;stroke-width:0}25%{opacity:1;stroke-width:15}to{opacity:1}}@keyframes orange-circle{0%{opacity:0}45%{opacity:0;stroke-width:0}50%{opacity:1;stroke-width:15}to{opacity:1}}@keyframes fade{0%,90%{opacity:1}to{opacity:0}}circle,path{fill:none;stroke:#000;stroke-width:15}path{stroke-width:25}.orange{stroke:#f60}.red{stroke:#d40000}
|
||||||
|
</style>
|
||||||
|
<g transform="translate(6 6)">
|
||||||
|
<g style="animation:fade 2000ms ease-in-out 5ms infinite">
|
||||||
|
<path d="M58 168V70a50 50 0 0 1 50-50h20" class="orange" style="stroke-dasharray:200;stroke-dashoffset:200;animation:draw-orange 2000ms ease-out 5ms infinite"/>
|
||||||
|
<path d="M58 168v-30a50 50 0 0 1 50-50h20" class="red" style="stroke-dasharray:130;stroke-dashoffset:130;animation:draw-red 2000ms ease-out 5ms infinite"/>
|
||||||
|
<circle cx="142" cy="20" r="18" class="orange" style="opacity:0;animation:orange-circle 2000ms ease-out 5ms infinite"/>
|
||||||
|
<circle cx="142" cy="88" r="18" class="red" style="opacity:0;animation:red-circle 2000ms ease-out 5ms infinite"/>
|
||||||
|
</g>
|
||||||
|
<circle cx="58" cy="180" r="18" class="red"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.5 KiB |
1
public/img/forgejo.svg
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" width="32" height="32"><style>circle,path{fill:none;stroke:#000;stroke-width:15}path{stroke-width:25}.orange{stroke:#f60}.red{stroke:#d40000}</style><g transform="translate(6 6)"><path d="M58 168V70a50 50 0 0 1 50-50h20" class="orange"/><path d="M58 168v-30a50 50 0 0 1 50-50h20" class="red"/><circle cx="142" cy="20" r="18" class="orange"/><circle cx="142" cy="88" r="18" class="red"/><circle cx="58" cy="180" r="18" class="red"/></g></svg>
|
After Width: | Height: | Size: 503 B |
1
public/img/gitea-original.svg
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640" width="32" height="32"><path d="M395.9 484.2l-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5 21.2-17.9 33.8-11.8 17.2 8.3 27.1 13 27.1 13l-.1-109.2 16.7-.1.1 117.1s57.4 24.2 83.1 40.1c3.7 2.3 10.2 6.8 12.9 14.4 2.1 6.1 2 13.1-1 19.3l-61 126.9c-6.2 12.7-21.4 18.1-33.9 12z" fill="#fff"/><g fill="#609926"><path d="M622.7 149.8c-4.1-4.1-9.6-4-9.6-4s-117.2 6.6-177.9 8c-13.3.3-26.5.6-39.6.7v117.2c-5.5-2.6-11.1-5.3-16.6-7.9 0-36.4-.1-109.2-.1-109.2-29 .4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5c-9.8-.6-22.5-2.1-39 1.5-8.7 1.8-33.5 7.4-53.8 26.9C-4.9 212.4 6.6 276.2 8 285.8c1.7 11.7 6.9 44.2 31.7 72.5 45.8 56.1 144.4 54.8 144.4 54.8s12.1 28.9 30.6 55.5c25 33.1 50.7 58.9 75.7 62 63 0 188.9-.1 188.9-.1s12 .1 28.3-10.3c14-8.5 26.5-23.4 26.5-23.4S547 483 565 451.5c5.5-9.7 10.1-19.1 14.1-28 0 0 55.2-117.1 55.2-231.1-1.1-34.5-9.6-40.6-11.6-42.6zM125.6 353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6 321.8 60 295.4c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5 38.5-30c13.8-3.7 31-3.1 31-3.1s7.1 59.4 15.7 94.2c7.2 29.2 24.8 77.7 24.8 77.7s-26.1-3.1-43-9.1zm300.3 107.6s-6.1 14.5-19.6 15.4c-5.8.4-10.3-1.2-10.3-1.2s-.3-.1-5.3-2.1l-112.9-55s-10.9-5.7-12.8-15.6c-2.2-8.1 2.7-18.1 2.7-18.1L322 273s4.8-9.7 12.2-13c.6-.3 2.3-1 4.5-1.5 8.1-2.1 18 2.8 18 2.8L467.4 315s12.6 5.7 15.3 16.2c1.9 7.4-.5 14-1.8 17.2-6.3 15.4-55 113.1-55 113.1z"/><path d="M326.8 380.1c-8.2.1-15.4 5.8-17.3 13.8-1.9 8 2 16.3 9.1 20 7.7 4 17.5 1.8 22.7-5.4 5.1-7.1 4.3-16.9-1.8-23.1l24-49.1c1.5.1 3.7.2 6.2-.5 4.1-.9 7.1-3.6 7.1-3.6 4.2 1.8 8.6 3.8 13.2 6.1 4.8 2.4 9.3 4.9 13.4 7.3.9.5 1.8 1.1 2.8 1.9 1.6 1.3 3.4 3.1 4.7 5.5 1.9 5.5-1.9 14.9-1.9 14.9-2.3 7.6-18.4 40.6-18.4 40.6-8.1-.2-15.3 5-17.7 12.5-2.6 8.1 1.1 17.3 8.9 21.3 7.8 4 17.4 1.7 22.5-5.3 5-6.8 4.6-16.3-1.1-22.6 1.9-3.7 3.7-7.4 5.6-11.3 5-10.4 13.5-30.4 13.5-30.4.9-1.7 5.7-10.3 2.7-21.3-2.5-11.4-12.6-16.7-12.6-16.7-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3 4.7-9.7 9.4-19.3 14.1-29-4.1-2-8.1-4-12.2-6.1-4.8 9.8-9.7 19.7-14.5 29.5-6.7-.1-12.9 3.5-16.1 9.4-3.4 6.3-2.7 14.1 1.9 19.8l-24.6 50.4z"/></g></svg>
|
After Width: | Height: | Size: 2.1 KiB |
|
@ -1 +1 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640" width="32" height="32"><path d="M395.9 484.2l-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5 21.2-17.9 33.8-11.8 17.2 8.3 27.1 13 27.1 13l-.1-109.2 16.7-.1.1 117.1s57.4 24.2 83.1 40.1c3.7 2.3 10.2 6.8 12.9 14.4 2.1 6.1 2 13.1-1 19.3l-61 126.9c-6.2 12.7-21.4 18.1-33.9 12z" fill="#fff"/><g fill="#609926"><path d="M622.7 149.8c-4.1-4.1-9.6-4-9.6-4s-117.2 6.6-177.9 8c-13.3.3-26.5.6-39.6.7v117.2c-5.5-2.6-11.1-5.3-16.6-7.9 0-36.4-.1-109.2-.1-109.2-29 .4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5c-9.8-.6-22.5-2.1-39 1.5-8.7 1.8-33.5 7.4-53.8 26.9C-4.9 212.4 6.6 276.2 8 285.8c1.7 11.7 6.9 44.2 31.7 72.5 45.8 56.1 144.4 54.8 144.4 54.8s12.1 28.9 30.6 55.5c25 33.1 50.7 58.9 75.7 62 63 0 188.9-.1 188.9-.1s12 .1 28.3-10.3c14-8.5 26.5-23.4 26.5-23.4S547 483 565 451.5c5.5-9.7 10.1-19.1 14.1-28 0 0 55.2-117.1 55.2-231.1-1.1-34.5-9.6-40.6-11.6-42.6zM125.6 353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6 321.8 60 295.4c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5 38.5-30c13.8-3.7 31-3.1 31-3.1s7.1 59.4 15.7 94.2c7.2 29.2 24.8 77.7 24.8 77.7s-26.1-3.1-43-9.1zm300.3 107.6s-6.1 14.5-19.6 15.4c-5.8.4-10.3-1.2-10.3-1.2s-.3-.1-5.3-2.1l-112.9-55s-10.9-5.7-12.8-15.6c-2.2-8.1 2.7-18.1 2.7-18.1L322 273s4.8-9.7 12.2-13c.6-.3 2.3-1 4.5-1.5 8.1-2.1 18 2.8 18 2.8L467.4 315s12.6 5.7 15.3 16.2c1.9 7.4-.5 14-1.8 17.2-6.3 15.4-55 113.1-55 113.1z"/><path d="M326.8 380.1c-8.2.1-15.4 5.8-17.3 13.8-1.9 8 2 16.3 9.1 20 7.7 4 17.5 1.8 22.7-5.4 5.1-7.1 4.3-16.9-1.8-23.1l24-49.1c1.5.1 3.7.2 6.2-.5 4.1-.9 7.1-3.6 7.1-3.6 4.2 1.8 8.6 3.8 13.2 6.1 4.8 2.4 9.3 4.9 13.4 7.3.9.5 1.8 1.1 2.8 1.9 1.6 1.3 3.4 3.1 4.7 5.5 1.9 5.5-1.9 14.9-1.9 14.9-2.3 7.6-18.4 40.6-18.4 40.6-8.1-.2-15.3 5-17.7 12.5-2.6 8.1 1.1 17.3 8.9 21.3 7.8 4 17.4 1.7 22.5-5.3 5-6.8 4.6-16.3-1.1-22.6 1.9-3.7 3.7-7.4 5.6-11.3 5-10.4 13.5-30.4 13.5-30.4.9-1.7 5.7-10.3 2.7-21.3-2.5-11.4-12.6-16.7-12.6-16.7-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3 4.7-9.7 9.4-19.3 14.1-29-4.1-2-8.1-4-12.2-6.1-4.8 9.8-9.7 19.7-14.5 29.5-6.7-.1-12.9 3.5-16.1 9.4-3.4 6.3-2.7 14.1 1.9 19.8l-24.6 50.4z"/></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" width="32" height="32"><style>circle,path{fill:none;stroke:#000;stroke-width:15}path{stroke-width:25}.orange{stroke:#f60}.red{stroke:#d40000}</style><g transform="translate(6 6)"><path d="M58 168V70a50 50 0 0 1 50-50h20" class="orange"/><path d="M58 168v-30a50 50 0 0 1 50-50h20" class="red"/><circle cx="142" cy="20" r="18" class="orange"/><circle cx="142" cy="88" r="18" class="red"/><circle cx="58" cy="180" r="18" class="red"/></g></svg>
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 503 B |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 6.6 KiB |
|
@ -1 +1 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640" style="enable-background:new 0 0 640 640" xml:space="preserve" width="32" height="32"><path style="fill:#fff" d="m395.9 484.2-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5 21.2-17.9 33.8-11.8 17.2 8.3 27.1 13 27.1 13l-.1-109.2 16.7-.1.1 117.1s57.4 24.2 83.1 40.1c3.7 2.3 10.2 6.8 12.9 14.4 2.1 6.1 2 13.1-1 19.3l-61 126.9c-6.2 12.7-21.4 18.1-33.9 12z"/><path style="fill:#609926" d="M622.7 149.8c-4.1-4.1-9.6-4-9.6-4s-117.2 6.6-177.9 8c-13.3.3-26.5.6-39.6.7v117.2c-5.5-2.6-11.1-5.3-16.6-7.9 0-36.4-.1-109.2-.1-109.2-29 .4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5c-9.8-.6-22.5-2.1-39 1.5-8.7 1.8-33.5 7.4-53.8 26.9C-4.9 212.4 6.6 276.2 8 285.8c1.7 11.7 6.9 44.2 31.7 72.5 45.8 56.1 144.4 54.8 144.4 54.8s12.1 28.9 30.6 55.5c25 33.1 50.7 58.9 75.7 62 63 0 188.9-.1 188.9-.1s12 .1 28.3-10.3c14-8.5 26.5-23.4 26.5-23.4S547 483 565 451.5c5.5-9.7 10.1-19.1 14.1-28 0 0 55.2-117.1 55.2-231.1-1.1-34.5-9.6-40.6-11.6-42.6zM125.6 353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6 321.8 60 295.4c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5 38.5-30c13.8-3.7 31-3.1 31-3.1s7.1 59.4 15.7 94.2c7.2 29.2 24.8 77.7 24.8 77.7s-26.1-3.1-43-9.1zm300.3 107.6s-6.1 14.5-19.6 15.4c-5.8.4-10.3-1.2-10.3-1.2s-.3-.1-5.3-2.1l-112.9-55s-10.9-5.7-12.8-15.6c-2.2-8.1 2.7-18.1 2.7-18.1L322 273s4.8-9.7 12.2-13c.6-.3 2.3-1 4.5-1.5 8.1-2.1 18 2.8 18 2.8L467.4 315s12.6 5.7 15.3 16.2c1.9 7.4-.5 14-1.8 17.2-6.3 15.4-55 113.1-55 113.1z"/><path style="fill:#609926" d="M326.8 380.1c-8.2.1-15.4 5.8-17.3 13.8-1.9 8 2 16.3 9.1 20 7.7 4 17.5 1.8 22.7-5.4 5.1-7.1 4.3-16.9-1.8-23.1l24-49.1c1.5.1 3.7.2 6.2-.5 4.1-.9 7.1-3.6 7.1-3.6 4.2 1.8 8.6 3.8 13.2 6.1 4.8 2.4 9.3 4.9 13.4 7.3.9.5 1.8 1.1 2.8 1.9 1.6 1.3 3.4 3.1 4.7 5.5 1.9 5.5-1.9 14.9-1.9 14.9-2.3 7.6-18.4 40.6-18.4 40.6-8.1-.2-15.3 5-17.7 12.5-2.6 8.1 1.1 17.3 8.9 21.3 7.8 4 17.4 1.7 22.5-5.3 5-6.8 4.6-16.3-1.1-22.6 1.9-3.7 3.7-7.4 5.6-11.3 5-10.4 13.5-30.4 13.5-30.4.9-1.7 5.7-10.3 2.7-21.3-2.5-11.4-12.6-16.7-12.6-16.7-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3 4.7-9.7 9.4-19.3 14.1-29-4.1-2-8.1-4-12.2-6.1-4.8 9.8-9.7 19.7-14.5 29.5-6.7-.1-12.9 3.5-16.1 9.4-3.4 6.3-2.7 14.1 1.9 19.8l-24.6 50.4z"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" width="32" height="32"><style>circle,path{fill:none;stroke:#000;stroke-width:15}path{stroke-width:25}.orange{stroke:#f60}.red{stroke:#d40000}</style><g transform="translate(6 6)"><path d="M58 168V70a50 50 0 0 1 50-50h20" class="orange"/><path d="M58 168v-30a50 50 0 0 1 50-50h20" class="red"/><circle cx="142" cy="20" r="18" class="orange"/><circle cx="142" cy="88" r="18" class="red"/><circle cx="58" cy="180" r="18" class="red"/></g></svg>
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 503 B |
|
@ -611,7 +611,7 @@ func Routes(ctx gocontext.Context) *web.Route {
|
||||||
// setting.CORSConfig.AllowSubdomain // FIXME: the cors middleware needs allowSubdomain option
|
// setting.CORSConfig.AllowSubdomain // FIXME: the cors middleware needs allowSubdomain option
|
||||||
AllowedMethods: setting.CORSConfig.Methods,
|
AllowedMethods: setting.CORSConfig.Methods,
|
||||||
AllowCredentials: setting.CORSConfig.AllowCredentials,
|
AllowCredentials: setting.CORSConfig.AllowCredentials,
|
||||||
AllowedHeaders: []string{"Authorization", "X-Gitea-OTP"},
|
AllowedHeaders: []string{"Authorization", "X-Gitea-OTP", "X-Forgejo-OTP"},
|
||||||
MaxAge: int(setting.CORSConfig.MaxAge.Seconds()),
|
MaxAge: int(setting.CORSConfig.MaxAge.Seconds()),
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,10 +66,10 @@ func NodeInfo(ctx *context.APIContext) {
|
||||||
nodeInfo := &structs.NodeInfo{
|
nodeInfo := &structs.NodeInfo{
|
||||||
Version: "2.1",
|
Version: "2.1",
|
||||||
Software: structs.NodeInfoSoftware{
|
Software: structs.NodeInfoSoftware{
|
||||||
Name: "gitea",
|
Name: "forgejo",
|
||||||
Version: setting.AppVer,
|
Version: setting.AppVer,
|
||||||
Repository: "https://github.com/go-gitea/gitea.git",
|
Repository: "https://codeberg.org/forgejo/forgejo.git",
|
||||||
Homepage: "https://gitea.io/",
|
Homepage: "https://forgejo.org/",
|
||||||
},
|
},
|
||||||
Protocols: []string{"activitypub"},
|
Protocols: []string{"activitypub"},
|
||||||
Services: structs.NodeInfoServices{
|
Services: structs.NodeInfoServices{
|
||||||
|
|
|
@ -33,7 +33,10 @@ import (
|
||||||
files_service "code.gitea.io/gitea/services/repository/files"
|
files_service "code.gitea.io/gitea/services/repository/files"
|
||||||
)
|
)
|
||||||
|
|
||||||
const giteaObjectTypeHeader = "X-Gitea-Object-Type"
|
const (
|
||||||
|
giteaObjectTypeHeader = "X-Gitea-Object-Type"
|
||||||
|
forgejoObjectTypeHeader = "X-Forgejo-Object-Type"
|
||||||
|
)
|
||||||
|
|
||||||
// GetRawFile get a file by path on a repository
|
// GetRawFile get a file by path on a repository
|
||||||
func GetRawFile(ctx *context.APIContext) {
|
func GetRawFile(ctx *context.APIContext) {
|
||||||
|
@ -80,6 +83,7 @@ func GetRawFile(ctx *context.APIContext) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.RespHeader().Set(giteaObjectTypeHeader, string(files_service.GetObjectTypeFromTreeEntry(entry)))
|
ctx.RespHeader().Set(giteaObjectTypeHeader, string(files_service.GetObjectTypeFromTreeEntry(entry)))
|
||||||
|
ctx.RespHeader().Set(forgejoObjectTypeHeader, string(files_service.GetObjectTypeFromTreeEntry(entry)))
|
||||||
|
|
||||||
if err := common.ServeBlob(ctx.Context, blob, lastModified); err != nil {
|
if err := common.ServeBlob(ctx.Context, blob, lastModified); err != nil {
|
||||||
ctx.Error(http.StatusInternalServerError, "ServeBlob", err)
|
ctx.Error(http.StatusInternalServerError, "ServeBlob", err)
|
||||||
|
@ -129,6 +133,7 @@ func GetRawFileOrLFS(ctx *context.APIContext) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.RespHeader().Set(giteaObjectTypeHeader, string(files_service.GetObjectTypeFromTreeEntry(entry)))
|
ctx.RespHeader().Set(giteaObjectTypeHeader, string(files_service.GetObjectTypeFromTreeEntry(entry)))
|
||||||
|
ctx.RespHeader().Set(forgejoObjectTypeHeader, string(files_service.GetObjectTypeFromTreeEntry(entry)))
|
||||||
|
|
||||||
// LFS Pointer files are at most 1024 bytes - so any blob greater than 1024 bytes cannot be an LFS file
|
// LFS Pointer files are at most 1024 bytes - so any blob greater than 1024 bytes cannot be an LFS file
|
||||||
if blob.Size() > 1024 {
|
if blob.Size() > 1024 {
|
||||||
|
|
|
@ -186,7 +186,7 @@ func checkDatabase(ctx *context.Context, form *forms.InstallForm) bool {
|
||||||
if err = db.InitEngine(ctx); err != nil {
|
if err = db.InitEngine(ctx); err != nil {
|
||||||
if strings.Contains(err.Error(), `Unknown database type: sqlite3`) {
|
if strings.Contains(err.Error(), `Unknown database type: sqlite3`) {
|
||||||
ctx.Data["Err_DbType"] = true
|
ctx.Data["Err_DbType"] = true
|
||||||
ctx.RenderWithErr(ctx.Tr("install.sqlite3_not_available", "https://docs.gitea.io/en-us/install-from-binary/"), tplInstall, form)
|
ctx.RenderWithErr(ctx.Tr("install.sqlite3_not_available", "https://forgejo.org/download#installation-from-binary"), tplInstall, form)
|
||||||
} else {
|
} else {
|
||||||
ctx.Data["Err_DbSetting"] = true
|
ctx.Data["Err_DbSetting"] = true
|
||||||
ctx.RenderWithErr(ctx.Tr("install.invalid_db_setting", err), tplInstall, form)
|
ctx.RenderWithErr(ctx.Tr("install.invalid_db_setting", err), tplInstall, form)
|
||||||
|
|
|
@ -297,6 +297,34 @@ func editWebhook(ctx *context.Context, params webhookParams) {
|
||||||
ctx.Redirect(fmt.Sprintf("%s/%d", orCtx.Link, w.ID))
|
ctx.Redirect(fmt.Sprintf("%s/%d", orCtx.Link, w.ID))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ForgejoHooksNewPost response for creating Forgejo webhook
|
||||||
|
func ForgejoHooksNewPost(ctx *context.Context) {
|
||||||
|
createWebhook(ctx, forgejoHookParams(ctx))
|
||||||
|
}
|
||||||
|
|
||||||
|
// ForgejoHooksEditPost response for editing Forgejo webhook
|
||||||
|
func ForgejoHooksEditPost(ctx *context.Context) {
|
||||||
|
editWebhook(ctx, forgejoHookParams(ctx))
|
||||||
|
}
|
||||||
|
|
||||||
|
func forgejoHookParams(ctx *context.Context) webhookParams {
|
||||||
|
form := web.GetForm(ctx).(*forms.NewWebhookForm)
|
||||||
|
|
||||||
|
contentType := webhook.ContentTypeJSON
|
||||||
|
if webhook.HookContentType(form.ContentType) == webhook.ContentTypeForm {
|
||||||
|
contentType = webhook.ContentTypeForm
|
||||||
|
}
|
||||||
|
|
||||||
|
return webhookParams{
|
||||||
|
Type: webhook.FORGEJO,
|
||||||
|
URL: form.PayloadURL,
|
||||||
|
ContentType: contentType,
|
||||||
|
Secret: form.Secret,
|
||||||
|
HTTPMethod: form.HTTPMethod,
|
||||||
|
WebhookForm: form.WebhookForm,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// GiteaHooksNewPost response for creating Gitea webhook
|
// GiteaHooksNewPost response for creating Gitea webhook
|
||||||
func GiteaHooksNewPost(ctx *context.Context) {
|
func GiteaHooksNewPost(ctx *context.Context) {
|
||||||
createWebhook(ctx, giteaHookParams(ctx))
|
createWebhook(ctx, giteaHookParams(ctx))
|
||||||
|
|
|
@ -534,6 +534,7 @@ func RegisterRoutes(m *web.Route) {
|
||||||
m.Get("", repo.WebHooksEdit)
|
m.Get("", repo.WebHooksEdit)
|
||||||
m.Post("/replay/{uuid}", repo.ReplayWebhook)
|
m.Post("/replay/{uuid}", repo.ReplayWebhook)
|
||||||
})
|
})
|
||||||
|
m.Post("/forgejo/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.ForgejoHooksEditPost)
|
||||||
m.Post("/gitea/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksEditPost)
|
m.Post("/gitea/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksEditPost)
|
||||||
m.Post("/gogs/{id}", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksEditPost)
|
m.Post("/gogs/{id}", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksEditPost)
|
||||||
m.Post("/slack/{id}", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksEditPost)
|
m.Post("/slack/{id}", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksEditPost)
|
||||||
|
@ -549,6 +550,7 @@ func RegisterRoutes(m *web.Route) {
|
||||||
|
|
||||||
m.Group("/{configType:default-hooks|system-hooks}", func() {
|
m.Group("/{configType:default-hooks|system-hooks}", func() {
|
||||||
m.Get("/{type}/new", repo.WebhooksNew)
|
m.Get("/{type}/new", repo.WebhooksNew)
|
||||||
|
m.Post("/forgejo/new", bindIgnErr(forms.NewWebhookForm{}), repo.ForgejoHooksNewPost)
|
||||||
m.Post("/gitea/new", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksNewPost)
|
m.Post("/gitea/new", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksNewPost)
|
||||||
m.Post("/gogs/new", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksNewPost)
|
m.Post("/gogs/new", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksNewPost)
|
||||||
m.Post("/slack/new", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksNewPost)
|
m.Post("/slack/new", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksNewPost)
|
||||||
|
@ -712,6 +714,7 @@ func RegisterRoutes(m *web.Route) {
|
||||||
m.Get("", org.Webhooks)
|
m.Get("", org.Webhooks)
|
||||||
m.Post("/delete", org.DeleteWebhook)
|
m.Post("/delete", org.DeleteWebhook)
|
||||||
m.Get("/{type}/new", repo.WebhooksNew)
|
m.Get("/{type}/new", repo.WebhooksNew)
|
||||||
|
m.Post("/forgejo/new", bindIgnErr(forms.NewWebhookForm{}), repo.ForgejoHooksNewPost)
|
||||||
m.Post("/gitea/new", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksNewPost)
|
m.Post("/gitea/new", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksNewPost)
|
||||||
m.Post("/gogs/new", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksNewPost)
|
m.Post("/gogs/new", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksNewPost)
|
||||||
m.Post("/slack/new", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksNewPost)
|
m.Post("/slack/new", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksNewPost)
|
||||||
|
@ -726,6 +729,7 @@ func RegisterRoutes(m *web.Route) {
|
||||||
m.Get("", repo.WebHooksEdit)
|
m.Get("", repo.WebHooksEdit)
|
||||||
m.Post("/replay/{uuid}", repo.ReplayWebhook)
|
m.Post("/replay/{uuid}", repo.ReplayWebhook)
|
||||||
})
|
})
|
||||||
|
m.Post("/forgejo/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.ForgejoHooksEditPost)
|
||||||
m.Post("/gitea/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksEditPost)
|
m.Post("/gitea/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksEditPost)
|
||||||
m.Post("/gogs/{id}", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksEditPost)
|
m.Post("/gogs/{id}", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksEditPost)
|
||||||
m.Post("/slack/{id}", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksEditPost)
|
m.Post("/slack/{id}", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksEditPost)
|
||||||
|
@ -835,6 +839,7 @@ func RegisterRoutes(m *web.Route) {
|
||||||
m.Get("", repo.Webhooks)
|
m.Get("", repo.Webhooks)
|
||||||
m.Post("/delete", repo.DeleteWebhook)
|
m.Post("/delete", repo.DeleteWebhook)
|
||||||
m.Get("/{type}/new", repo.WebhooksNew)
|
m.Get("/{type}/new", repo.WebhooksNew)
|
||||||
|
m.Post("/forgejo/new", bindIgnErr(forms.NewWebhookForm{}), repo.ForgejoHooksNewPost)
|
||||||
m.Post("/gitea/new", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksNewPost)
|
m.Post("/gitea/new", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksNewPost)
|
||||||
m.Post("/gogs/new", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksNewPost)
|
m.Post("/gogs/new", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksNewPost)
|
||||||
m.Post("/slack/new", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksNewPost)
|
m.Post("/slack/new", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksNewPost)
|
||||||
|
@ -851,6 +856,7 @@ func RegisterRoutes(m *web.Route) {
|
||||||
m.Post("/test", repo.TestWebhook)
|
m.Post("/test", repo.TestWebhook)
|
||||||
m.Post("/replay/{uuid}", repo.ReplayWebhook)
|
m.Post("/replay/{uuid}", repo.ReplayWebhook)
|
||||||
})
|
})
|
||||||
|
m.Post("/forgejo/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.ForgejoHooksEditPost)
|
||||||
m.Post("/gitea/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksEditPost)
|
m.Post("/gitea/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksEditPost)
|
||||||
m.Post("/gogs/{id}", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksEditPost)
|
m.Post("/gogs/{id}", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksEditPost)
|
||||||
m.Post("/slack/{id}", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksEditPost)
|
m.Post("/slack/{id}", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksEditPost)
|
||||||
|
|
|
@ -373,6 +373,16 @@ func generateAdditionalHeaders(ctx *mailCommentContext, reason string, recipient
|
||||||
"X-Gitea-Issue-ID": strconv.FormatInt(ctx.Issue.Index, 10),
|
"X-Gitea-Issue-ID": strconv.FormatInt(ctx.Issue.Index, 10),
|
||||||
"X-Gitea-Issue-Link": ctx.Issue.HTMLURL(),
|
"X-Gitea-Issue-Link": ctx.Issue.HTMLURL(),
|
||||||
|
|
||||||
|
"X-Forgejo-Reason": reason,
|
||||||
|
"X-Forgejo-Sender": ctx.Doer.DisplayName(),
|
||||||
|
"X-Forgejo-Recipient": recipient.DisplayName(),
|
||||||
|
"X-Forgejo-Recipient-Address": recipient.Email,
|
||||||
|
"X-Forgejo-Repository": repo.Name,
|
||||||
|
"X-Forgejo-Repository-Path": repo.FullName(),
|
||||||
|
"X-Forgejo-Repository-Link": repo.HTMLURL(),
|
||||||
|
"X-Forgejo-Issue-ID": strconv.FormatInt(ctx.Issue.Index, 10),
|
||||||
|
"X-Forgejo-Issue-Link": ctx.Issue.HTMLURL(),
|
||||||
|
|
||||||
"X-GitHub-Reason": reason,
|
"X-GitHub-Reason": reason,
|
||||||
"X-GitHub-Sender": ctx.Doer.DisplayName(),
|
"X-GitHub-Sender": ctx.Doer.DisplayName(),
|
||||||
"X-GitHub-Recipient": recipient.DisplayName(),
|
"X-GitHub-Recipient": recipient.DisplayName(),
|
||||||
|
|
|
@ -116,6 +116,10 @@ func Deliver(ctx context.Context, t *webhook_model.HookTask) error {
|
||||||
|
|
||||||
event := t.EventType.Event()
|
event := t.EventType.Event()
|
||||||
eventType := string(t.EventType)
|
eventType := string(t.EventType)
|
||||||
|
req.Header.Add("X-Forgejo-Delivery", t.UUID)
|
||||||
|
req.Header.Add("X-Forgejo-Event", event)
|
||||||
|
req.Header.Add("X-Forgejo-Event-Type", eventType)
|
||||||
|
req.Header.Add("X-Forgejo-Signature", signatureSHA256)
|
||||||
req.Header.Add("X-Gitea-Delivery", t.UUID)
|
req.Header.Add("X-Gitea-Delivery", t.UUID)
|
||||||
req.Header.Add("X-Gitea-Event", event)
|
req.Header.Add("X-Gitea-Event", event)
|
||||||
req.Header.Add("X-Gitea-Event-Type", eventType)
|
req.Header.Add("X-Gitea-Event-Type", eventType)
|
||||||
|
|
|
@ -74,7 +74,7 @@ func RegisterWebhook(name string, webhook *webhook) {
|
||||||
|
|
||||||
// IsValidHookTaskType returns true if a webhook registered
|
// IsValidHookTaskType returns true if a webhook registered
|
||||||
func IsValidHookTaskType(name string) bool {
|
func IsValidHookTaskType(name string) bool {
|
||||||
if name == webhook_model.GITEA || name == webhook_model.GOGS {
|
if name == webhook_model.FORGEJO || name == webhook_model.GITEA || name == webhook_model.GOGS {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
_, ok := webhooks[name]
|
_, ok := webhooks[name]
|
||||||
|
@ -170,7 +170,7 @@ func PrepareWebhook(ctx context.Context, w *webhook_model.Webhook, event webhook
|
||||||
// Avoid sending "0 new commits" to non-integration relevant webhooks (e.g. slack, discord, etc.).
|
// Avoid sending "0 new commits" to non-integration relevant webhooks (e.g. slack, discord, etc.).
|
||||||
// Integration webhooks (e.g. drone) still receive the required data.
|
// Integration webhooks (e.g. drone) still receive the required data.
|
||||||
if pushEvent, ok := p.(*api.PushPayload); ok &&
|
if pushEvent, ok := p.(*api.PushPayload); ok &&
|
||||||
w.Type != webhook_model.GITEA && w.Type != webhook_model.GOGS &&
|
w.Type != webhook_model.FORGEJO && w.Type != webhook_model.GITEA && w.Type != webhook_model.GOGS &&
|
||||||
len(pushEvent.Commits) == 0 {
|
len(pushEvent.Commits) == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,8 +14,10 @@
|
||||||
{{.locale.Tr "admin.defaulthooks.update_webhook"}}
|
{{.locale.Tr "admin.defaulthooks.update_webhook"}}
|
||||||
{{end}}
|
{{end}}
|
||||||
<div class="ui right">
|
<div class="ui right">
|
||||||
{{if eq .HookType "gitea"}}
|
{{if eq .HookType "forgejo"}}
|
||||||
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gitea.svg">
|
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/forgejo.svg">
|
||||||
|
{{else if eq .HookType "gitea"}}
|
||||||
|
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gitea-original.svg">
|
||||||
{{else if eq .HookType "gogs"}}
|
{{else if eq .HookType "gogs"}}
|
||||||
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gogs.ico">
|
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gogs.ico">
|
||||||
{{else if eq .HookType "slack"}}
|
{{else if eq .HookType "slack"}}
|
||||||
|
@ -40,6 +42,7 @@
|
||||||
</div>
|
</div>
|
||||||
</h4>
|
</h4>
|
||||||
<div class="ui attached segment">
|
<div class="ui attached segment">
|
||||||
|
{{template "repo/settings/webhook/forgejo" .}}
|
||||||
{{template "repo/settings/webhook/gitea" .}}
|
{{template "repo/settings/webhook/gitea" .}}
|
||||||
{{template "repo/settings/webhook/gogs" .}}
|
{{template "repo/settings/webhook/gogs" .}}
|
||||||
{{template "repo/settings/webhook/slack" .}}
|
{{template "repo/settings/webhook/slack" .}}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<footer>
|
<footer>
|
||||||
<div class="ui container">
|
<div class="ui container">
|
||||||
<div class="ui left">
|
<div class="ui left">
|
||||||
<a target="_blank" rel="noopener noreferrer" href="https://gitea.io">{{.locale.Tr "powered_by" "Gitea"}}</a>
|
<a target="_blank" rel="noopener noreferrer" href="https://forgejo.org">{{.locale.Tr "powered_by" "Forgejo"}}</a>
|
||||||
{{if (or .ShowFooterVersion .PageIsAdmin)}}
|
{{if (or .ShowFooterVersion .PageIsAdmin)}}
|
||||||
{{.locale.Tr "version"}}:
|
{{.locale.Tr "version"}}:
|
||||||
{{if .IsAdmin}}
|
{{if .IsAdmin}}
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="ui right links">
|
<div class="ui right links">
|
||||||
{{if .ShowFooterBranding}}
|
{{if .ShowFooterBranding}}
|
||||||
<a target="_blank" rel="noopener noreferrer" href="https://github.com/go-gitea/gitea">{{svg "octicon-mark-github"}}<span class="sr-only">GitHub</span></a>
|
<a target="_blank" rel="noopener noreferrer" href="https://codeberg.org/forgejo/forgejo">{{svg "octicon-git-branch"}}<span class="sr-only">Codeberg</span></a>
|
||||||
{{end}}
|
{{end}}
|
||||||
<div class="ui language bottom floating slide up dropdown link item">
|
<div class="ui language bottom floating slide up dropdown link item">
|
||||||
{{svg "octicon-globe"}}
|
{{svg "octicon-globe"}}
|
||||||
|
|
|
@ -339,5 +339,5 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<img style="display: none" src="{{AssetUrlPrefix}}/img/loading.png"/>
|
<img style="display: none" src="{{AssetUrlPrefix}}/img/forgejo-loading.svg" width="256" height="256" />
|
||||||
{{template "base/footer" .}}
|
{{template "base/footer" .}}
|
||||||
|
|
|
@ -9,8 +9,10 @@
|
||||||
<h4 class="ui top attached header">
|
<h4 class="ui top attached header">
|
||||||
{{if .PageIsSettingsHooksNew}}{{.locale.Tr "repo.settings.add_webhook"}}{{else}}{{.locale.Tr "repo.settings.update_webhook"}}{{end}}
|
{{if .PageIsSettingsHooksNew}}{{.locale.Tr "repo.settings.add_webhook"}}{{else}}{{.locale.Tr "repo.settings.update_webhook"}}{{end}}
|
||||||
<div class="ui right">
|
<div class="ui right">
|
||||||
{{if eq .HookType "gitea"}}
|
{{if eq .HookType "forgejo"}}
|
||||||
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gitea.svg">
|
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/forgejo.svg">
|
||||||
|
{{else if eq .HookType "gitea"}}
|
||||||
|
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gitea-original.svg">
|
||||||
{{else if eq .HookType "gogs"}}
|
{{else if eq .HookType "gogs"}}
|
||||||
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gogs.ico">
|
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gogs.ico">
|
||||||
{{else if eq .HookType "slack"}}
|
{{else if eq .HookType "slack"}}
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
<div class="ui stackable middle very relaxed page grid">
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
<div id="repo_migrating" class="sixteen wide center aligned centered column">
|
<div id="repo_migrating" class="sixteen wide center aligned centered column">
|
||||||
<div>
|
<div>
|
||||||
<img src="{{AssetUrlPrefix}}/img/loading.png"/>
|
<img src="{{AssetUrlPrefix}}/img/forgejo-loading.svg" width="256" height="256" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -9,12 +9,12 @@
|
||||||
<div class="ui stackable middle very relaxed page grid">
|
<div class="ui stackable middle very relaxed page grid">
|
||||||
<div id="repo_migrating" class="sixteen wide center aligned centered column" task="{{.MigrateTask.ID}}">
|
<div id="repo_migrating" class="sixteen wide center aligned centered column" task="{{.MigrateTask.ID}}">
|
||||||
<div>
|
<div>
|
||||||
<img src="{{AssetUrlPrefix}}/img/loading.png"/>
|
<img src="{{AssetUrlPrefix}}/img/forgejo-loading.svg" width="256" height="256" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="repo_migrating_failed_image" class="sixteen wide center aligned centered column" style="display: none;">
|
<div id="repo_migrating_failed_image" class="sixteen wide center aligned centered column" style="display: none;">
|
||||||
<div>
|
<div>
|
||||||
<img src="{{AssetUrlPrefix}}/img/failed.png"/>
|
<span class="red">{{svg "octicon-git-pull-request-closed" 256 "ui red icon"}}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -4,8 +4,11 @@
|
||||||
<div class="ui floating1 jump dropdown">
|
<div class="ui floating1 jump dropdown">
|
||||||
<div class="ui primary tiny button">{{.locale.Tr "repo.settings.add_webhook"}}</div>
|
<div class="ui primary tiny button">{{.locale.Tr "repo.settings.add_webhook"}}</div>
|
||||||
<div class="menu">
|
<div class="menu">
|
||||||
|
<a class="item" href="{{.BaseLinkNew}}/forgejo/new">
|
||||||
|
<img width="20" height="20" src="{{AssetUrlPrefix}}/img/forgejo.svg">{{.locale.Tr "repo.settings.web_hook_name_forgejo"}}
|
||||||
|
</a>
|
||||||
<a class="item" href="{{.BaseLinkNew}}/gitea/new">
|
<a class="item" href="{{.BaseLinkNew}}/gitea/new">
|
||||||
<img width="20" height="20" src="{{AssetUrlPrefix}}/img/gitea.svg">{{.locale.Tr "repo.settings.web_hook_name_gitea"}}
|
<img width="20" height="20" src="{{AssetUrlPrefix}}/img/gitea-original.svg">{{.locale.Tr "repo.settings.web_hook_name_gitea"}}
|
||||||
</a>
|
</a>
|
||||||
<a class="item" href="{{.BaseLinkNew}}/gogs/new">
|
<a class="item" href="{{.BaseLinkNew}}/gogs/new">
|
||||||
<img width="20" height="20" src="{{AssetUrlPrefix}}/img/gogs.ico">{{.locale.Tr "repo.settings.web_hook_name_gogs"}}
|
<img width="20" height="20" src="{{AssetUrlPrefix}}/img/gogs.ico">{{.locale.Tr "repo.settings.web_hook_name_gogs"}}
|
||||||
|
|
40
templates/repo/settings/webhook/forgejo.tmpl
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
{{if eq .HookType "forgejo"}}
|
||||||
|
<p>{{.locale.Tr "repo.settings.add_web_hook_desc" "https://docs.gitea.io/en-us/webhooks/" (.locale.Tr "repo.settings.web_hook_name_forgejo") | Str2html}}</p>
|
||||||
|
<form class="ui form" action="{{.BaseLink}}/forgejo/{{or .Webhook.ID "new"}}" method="post">
|
||||||
|
{{template "base/disable_form_autofill"}}
|
||||||
|
{{.CsrfTokenHtml}}
|
||||||
|
<div class="required field {{if .Err_PayloadURL}}error{{end}}">
|
||||||
|
<label for="payload_url">{{.locale.Tr "repo.settings.payload_url"}}</label>
|
||||||
|
<input id="payload_url" name="payload_url" type="url" value="{{.Webhook.URL}}" autofocus required>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label>{{.locale.Tr "repo.settings.http_method"}}</label>
|
||||||
|
<div class="ui selection dropdown">
|
||||||
|
<input type="hidden" id="http_method" name="http_method" value="{{if .Webhook.HTTPMethod}}{{.Webhook.HTTPMethod}}{{else}}POST{{end}}">
|
||||||
|
<div class="default text"></div>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
<div class="menu">
|
||||||
|
<div class="item" data-value="POST">POST</div>
|
||||||
|
<div class="item" data-value="GET">GET</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label>{{.locale.Tr "repo.settings.content_type"}}</label>
|
||||||
|
<div class="ui selection dropdown">
|
||||||
|
<input type="hidden" id="content_type" name="content_type" value="{{if .Webhook.ContentType}}{{.Webhook.ContentType}}{{else}}1{{end}}">
|
||||||
|
<div class="default text"></div>
|
||||||
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
||||||
|
<div class="menu">
|
||||||
|
<div class="item" data-value="1">application/json</div>
|
||||||
|
<div class="item" data-value="2">application/x-www-form-urlencoded</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="field {{if .Err_Secret}}error{{end}}">
|
||||||
|
<label for="secret">{{.locale.Tr "repo.settings.secret"}}</label>
|
||||||
|
<input id="secret" name="secret" type="password" value="{{.Webhook.Secret}}" autocomplete="off">
|
||||||
|
</div>
|
||||||
|
{{template "repo/settings/webhook/settings" .}}
|
||||||
|
</form>
|
||||||
|
{{end}}
|
|
@ -7,8 +7,10 @@
|
||||||
<h4 class="ui top attached header">
|
<h4 class="ui top attached header">
|
||||||
{{if .PageIsSettingsHooksNew}}{{.locale.Tr "repo.settings.add_webhook"}}{{else}}{{.locale.Tr "repo.settings.update_webhook"}}{{end}}
|
{{if .PageIsSettingsHooksNew}}{{.locale.Tr "repo.settings.add_webhook"}}{{else}}{{.locale.Tr "repo.settings.update_webhook"}}{{end}}
|
||||||
<div class="ui right">
|
<div class="ui right">
|
||||||
{{if eq .HookType "gitea"}}
|
{{if eq .HookType "forgejo"}}
|
||||||
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gitea.svg">
|
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/forgejo.svg">
|
||||||
|
{{else if eq .HookType "gitea"}}
|
||||||
|
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gitea-original.svg">
|
||||||
{{else if eq .HookType "gogs"}}
|
{{else if eq .HookType "gogs"}}
|
||||||
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gogs.ico">
|
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gogs.ico">
|
||||||
{{else if eq .HookType "slack"}}
|
{{else if eq .HookType "slack"}}
|
||||||
|
@ -33,6 +35,7 @@
|
||||||
</div>
|
</div>
|
||||||
</h4>
|
</h4>
|
||||||
<div class="ui attached segment">
|
<div class="ui attached segment">
|
||||||
|
{{template "repo/settings/webhook/forgejo" .}}
|
||||||
{{template "repo/settings/webhook/gitea" .}}
|
{{template "repo/settings/webhook/gitea" .}}
|
||||||
{{template "repo/settings/webhook/gogs" .}}
|
{{template "repo/settings/webhook/gogs" .}}
|
||||||
{{template "repo/settings/webhook/slack" .}}
|
{{template "repo/settings/webhook/slack" .}}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>Gitea API</title>
|
<title>Forgejo API</title>
|
||||||
<link href="{{AssetUrlPrefix}}/css/swagger.css?v={{AssetVersion}}" rel="stylesheet">
|
<link href="{{AssetUrlPrefix}}/css/swagger.css?v={{AssetVersion}}" rel="stylesheet">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
|
@ -13,8 +13,8 @@
|
||||||
],
|
],
|
||||||
"swagger": "2.0",
|
"swagger": "2.0",
|
||||||
"info": {
|
"info": {
|
||||||
"description": "This documentation describes the Gitea API.",
|
"description": "This documentation describes the Forgejo API.",
|
||||||
"title": "Gitea API.",
|
"title": "Forgejo API.",
|
||||||
"license": {
|
"license": {
|
||||||
"name": "MIT",
|
"name": "MIT",
|
||||||
"url": "http://opensource.org/licenses/MIT"
|
"url": "http://opensource.org/licenses/MIT"
|
||||||
|
@ -14465,6 +14465,7 @@
|
||||||
"type": {
|
"type": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": [
|
"enum": [
|
||||||
|
"forgejo",
|
||||||
"dingtalk",
|
"dingtalk",
|
||||||
"discord",
|
"discord",
|
||||||
"gitea",
|
"gitea",
|
||||||
|
|
|
@ -31,7 +31,7 @@ func TestNodeinfo(t *testing.T) {
|
||||||
var nodeinfo api.NodeInfo
|
var nodeinfo api.NodeInfo
|
||||||
DecodeJSON(t, resp, &nodeinfo)
|
DecodeJSON(t, resp, &nodeinfo)
|
||||||
assert.True(t, nodeinfo.OpenRegistrations)
|
assert.True(t, nodeinfo.OpenRegistrations)
|
||||||
assert.Equal(t, "gitea", nodeinfo.Software.Name)
|
assert.Equal(t, "forgejo", nodeinfo.Software.Name)
|
||||||
assert.Equal(t, 24, nodeinfo.Usage.Users.Total)
|
assert.Equal(t, 24, nodeinfo.Usage.Users.Total)
|
||||||
assert.Equal(t, 17, nodeinfo.Usage.LocalPosts)
|
assert.Equal(t, 17, nodeinfo.Usage.LocalPosts)
|
||||||
assert.Equal(t, 2, nodeinfo.Usage.LocalComments)
|
assert.Equal(t, 2, nodeinfo.Usage.LocalComments)
|
||||||
|
|
|
@ -174,3 +174,41 @@ func TestLinksLogin(t *testing.T) {
|
||||||
|
|
||||||
testLinksAsUser("user2", t)
|
testLinksAsUser("user2", t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRedirectsWebhooks(t *testing.T) {
|
||||||
|
defer tests.PrepareTestEnv(t)()
|
||||||
|
|
||||||
|
//
|
||||||
|
// A redirect means the route exists but not if it performs as intended.
|
||||||
|
//
|
||||||
|
for _, kind := range []string{"forgejo", "gitea"} {
|
||||||
|
{
|
||||||
|
redirects := map[string]string{
|
||||||
|
"/user2/repo1/settings/hooks/" + kind + "/new": "/user/login",
|
||||||
|
"/admin/system-hooks/" + kind + "/new": "/user/login",
|
||||||
|
"/admin/default-hooks/" + kind + "/new": "/user/login",
|
||||||
|
}
|
||||||
|
for link, redirectLink := range redirects {
|
||||||
|
req := NewRequest(t, "GET", link)
|
||||||
|
resp := MakeRequest(t, req, http.StatusSeeOther)
|
||||||
|
assert.EqualValues(t, path.Join(setting.AppSubURL, redirectLink), test.RedirectURL(resp))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
redirects := map[string]string{
|
||||||
|
"/user2/repo1/settings/hooks/" + kind + "/new": "/",
|
||||||
|
"/admin/system-hooks/" + kind + "/new": "/",
|
||||||
|
"/admin/default-hooks/" + kind + "/new": "/",
|
||||||
|
|
||||||
|
"/user2/repo1/settings/hooks/" + kind + "/1": "/",
|
||||||
|
"/admin/hooks/" + kind + "/1": "/",
|
||||||
|
}
|
||||||
|
for link, redirectLink := range redirects {
|
||||||
|
req := NewRequest(t, "POST", link)
|
||||||
|
resp := MakeRequest(t, req, http.StatusSeeOther)
|
||||||
|
assert.EqualValues(t, path.Join(setting.AppSubURL, redirectLink), test.RedirectURL(resp))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -5,8 +5,8 @@ export function initInstall() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const defaultDbUser = 'gitea';
|
const defaultDbUser = 'forgejo';
|
||||||
const defaultDbName = 'gitea';
|
const defaultDbName = 'forgejo';
|
||||||
|
|
||||||
const defaultDbHosts = {
|
const defaultDbHosts = {
|
||||||
mysql: '127.0.0.1:3306',
|
mysql: '127.0.0.1:3306',
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.svg {
|
.svg {
|
||||||
color: var(--color-green);
|
color: var(--color-primary);
|
||||||
height: 40px;
|
height: 40px;
|
||||||
width: 50px;
|
width: 50px;
|
||||||
vertical-align: bottom;
|
vertical-align: bottom;
|
||||||
|
@ -45,7 +45,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
color: var(--color-green);
|
color: var(--color-primary);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
5
web_src/less/themes/theme-forgejo-auto.less
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
@import "theme-forgejo-light.less";
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
@import "theme-forgejo-dark.less";
|
||||||
|
}
|
294
web_src/less/themes/theme-forgejo-dark.less
Normal file
|
@ -0,0 +1,294 @@
|
||||||
|
@import "../chroma/dark.less";
|
||||||
|
@import "../codemirror/dark.less";
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--steel-900: #10161D;
|
||||||
|
--steel-850: #131A21;
|
||||||
|
--steel-800: #171E26;
|
||||||
|
--steel-750: #1D262F;
|
||||||
|
--steel-700: #242D38;
|
||||||
|
--steel-650: #2B3642;
|
||||||
|
--steel-600: #374351;
|
||||||
|
--steel-550: #445161;
|
||||||
|
--steel-500: #515F70;
|
||||||
|
--steel-450: #5F6E80;
|
||||||
|
--steel-400: #6D7D8F;
|
||||||
|
--steel-350: #7C8C9F;
|
||||||
|
--steel-300: #8C9CAF;
|
||||||
|
--steel-250: #9DADC0;
|
||||||
|
--steel-200: #AEBED0;
|
||||||
|
--steel-150: #C0CFE0;
|
||||||
|
--steel-100: #D2E0F0;
|
||||||
|
|
||||||
|
--is-dark-theme: true;
|
||||||
|
--color-primary: #fb923c;
|
||||||
|
--color-primary-contrast: #000;
|
||||||
|
--color-primary-dark-1: #fdba74;
|
||||||
|
--color-primary-dark-2: #fdba74;
|
||||||
|
--color-primary-dark-3: #fed7aa;
|
||||||
|
--color-primary-dark-4: #fed7aa;
|
||||||
|
--color-primary-dark-5: #ffedd5;
|
||||||
|
--color-primary-dark-6: #ffedd5;
|
||||||
|
--color-primary-dark-7: #fff7ed;
|
||||||
|
--color-primary-light-1: #f97316;
|
||||||
|
--color-primary-light-2: #ea580c;
|
||||||
|
--color-primary-light-3: #c2410c;
|
||||||
|
--color-primary-light-4: #9a3412;
|
||||||
|
--color-primary-light-5: #9a3412;
|
||||||
|
--color-primary-light-6: #7c2d12;
|
||||||
|
--color-primary-light-7: #7c2d12;
|
||||||
|
--color-primary-alpha-10: #ea580c19;
|
||||||
|
--color-primary-alpha-20: #ea580c33;
|
||||||
|
--color-primary-alpha-30: #ea580c4b;
|
||||||
|
--color-primary-alpha-40: #ea580c66;
|
||||||
|
--color-primary-alpha-50: #ea580c80;
|
||||||
|
--color-primary-alpha-60: #ea580c99;
|
||||||
|
--color-primary-alpha-70: #ea580cb3;
|
||||||
|
--color-primary-alpha-80: #ea580ccc;
|
||||||
|
--color-primary-alpha-90: #ea580ce1;
|
||||||
|
--color-secondary: var(--steel-700);
|
||||||
|
--color-secondary-dark-1: var(--steel-550);
|
||||||
|
--color-secondary-dark-2: var(--steel-500);
|
||||||
|
--color-secondary-dark-3: var(--steel-450);
|
||||||
|
--color-secondary-dark-4: var(--steel-400);
|
||||||
|
--color-secondary-dark-5: var(--steel-350);
|
||||||
|
--color-secondary-dark-6: var(--steel-300);
|
||||||
|
--color-secondary-dark-7: var(--steel-250);
|
||||||
|
--color-secondary-dark-8: var(--steel-200);
|
||||||
|
--color-secondary-dark-9: var(--steel-150);
|
||||||
|
--color-secondary-dark-10: var(--steel-100);
|
||||||
|
--color-secondary-dark-11: var(--steel-100);
|
||||||
|
--color-secondary-dark-12: var(--steel-100);
|
||||||
|
--color-secondary-dark-13: var(--steel-100);
|
||||||
|
--color-secondary-light-1: var(--steel-650);
|
||||||
|
--color-secondary-light-2: var(--steel-700);
|
||||||
|
--color-secondary-light-3: var(--steel-750);
|
||||||
|
--color-secondary-light-4: var(--steel-800);
|
||||||
|
--color-secondary-alpha-10: #2B364219;
|
||||||
|
--color-secondary-alpha-20: #2B364233;
|
||||||
|
--color-secondary-alpha-30: #2B36424b;
|
||||||
|
--color-secondary-alpha-40: #2B364266;
|
||||||
|
--color-secondary-alpha-50: #2B364280;
|
||||||
|
--color-secondary-alpha-60: #2B364299;
|
||||||
|
--color-secondary-alpha-70: #2B3642b3;
|
||||||
|
--color-secondary-alpha-80: #2B3642cc;
|
||||||
|
--color-secondary-alpha-90: #2B3642e1;
|
||||||
|
|
||||||
|
/* colors */
|
||||||
|
--color-red: #b91c1c;
|
||||||
|
--color-orange: #ea580c;
|
||||||
|
--color-yellow: #ca8a04;
|
||||||
|
--color-olive: #91a313;
|
||||||
|
--color-green: #15803d;
|
||||||
|
--color-teal: #0d9488;
|
||||||
|
--color-blue: #2563eb;
|
||||||
|
--color-violet: #7c3aed;
|
||||||
|
--color-purple: #9333ea;
|
||||||
|
--color-pink: #db2777;
|
||||||
|
--color-brown: #a47252;
|
||||||
|
--color-grey: var(--steel-500);
|
||||||
|
--color-black: #111827;
|
||||||
|
|
||||||
|
/* light variants */
|
||||||
|
--color-red-light: #dc2626;
|
||||||
|
--color-orange-light: #f97316;
|
||||||
|
--color-yellow-light: #eab308;
|
||||||
|
--color-olive-light: #839311;
|
||||||
|
--color-green-light: #16a34a;
|
||||||
|
--color-teal-light: #14b8a6;
|
||||||
|
--color-blue-light: #3b82f6;
|
||||||
|
--color-violet-light: #8b5cf6;
|
||||||
|
--color-purple-light: #a855f7;
|
||||||
|
--color-pink-light: #ec4899;
|
||||||
|
--color-brown-light: #94674a;
|
||||||
|
--color-grey-light: var(--steel-300);
|
||||||
|
--color-black-light: #1f2937;
|
||||||
|
|
||||||
|
/* other colors */
|
||||||
|
--color-gold: #b1983b;
|
||||||
|
--color-white: #ffffff;
|
||||||
|
--color-diff-removed-word-bg: #783030;
|
||||||
|
--color-diff-added-word-bg: #255C39;
|
||||||
|
--color-diff-removed-row-bg: #432121;
|
||||||
|
--color-diff-moved-row-bg: #825718;
|
||||||
|
--color-diff-added-row-bg: #1B3625;
|
||||||
|
--color-diff-removed-row-border: #783030;
|
||||||
|
--color-diff-moved-row-border: #A67A1D;
|
||||||
|
--color-diff-added-row-border: #255C39;
|
||||||
|
--color-diff-inactive: var(--steel-650);
|
||||||
|
--color-error-border: #783030;
|
||||||
|
--color-error-bg: #5F2525;
|
||||||
|
--color-error-bg-active: #783030;
|
||||||
|
--color-error-bg-hover: #783030;
|
||||||
|
--color-error-text: #fef2f2;
|
||||||
|
--color-success-border: #1F6E3C;
|
||||||
|
--color-success-bg: #1D462C;
|
||||||
|
--color-success-text: #f0fdf4;
|
||||||
|
--color-warning-border: #A67A1D;
|
||||||
|
--color-warning-bg: #644821;
|
||||||
|
--color-warning-text: #fefce8;
|
||||||
|
--color-info-border: #2E50B0;
|
||||||
|
--color-info-bg: #2A396B;
|
||||||
|
--color-info-text: var(--steel-100);
|
||||||
|
--color-red-badge: #B91C1C;
|
||||||
|
--color-red-badge-bg: #B91C1C22;
|
||||||
|
--color-red-badge-hover-bg: #B91C1C44;
|
||||||
|
--color-green-badge: #16a34a;
|
||||||
|
--color-green-badge-bg: #16a34a22;
|
||||||
|
--color-green-badge-hover-bg: #16a34a44;
|
||||||
|
--color-yellow-badge: #ca8a04;
|
||||||
|
--color-yellow-badge-bg: #ca8a0422;
|
||||||
|
--color-yellow-badge-hover-bg: #ca8a0444;
|
||||||
|
--color-orange-badge: #ea580c;
|
||||||
|
--color-orange-badge-bg: #ea580c22;
|
||||||
|
--color-orange-badge-hover-bg: #ea580c44;
|
||||||
|
--color-git: #f05133;
|
||||||
|
|
||||||
|
/* target-based colors */
|
||||||
|
--color-body: var(--steel-800);
|
||||||
|
--color-box-header: var(--steel-700);
|
||||||
|
--color-box-body: var(--steel-750);
|
||||||
|
--color-box-body-highlight: var(--steel-650);
|
||||||
|
--color-text-dark: #fff;
|
||||||
|
--color-text: var(--steel-100);
|
||||||
|
--color-text-light: var(--steel-150);
|
||||||
|
--color-text-light-1: var(--steel-150);
|
||||||
|
--color-text-light-2: var(--steel-200);
|
||||||
|
--color-text-light-3: var(--steel-200);
|
||||||
|
--color-footer: var(--steel-900);
|
||||||
|
--color-timeline: var(--steel-650);
|
||||||
|
--color-input-text: var(--steel-100);
|
||||||
|
--color-input-background: var(--steel-650);
|
||||||
|
--color-input-toggle-background: var(--steel-650);
|
||||||
|
--color-input-border: var(--steel-550);
|
||||||
|
--color-input-border-hover: var(--steel-450);
|
||||||
|
--color-navbar: var(--steel-850);
|
||||||
|
--color-navbar-transparent: #242D3800;
|
||||||
|
--color-light: #00000028;
|
||||||
|
--color-light-mimic-enabled: rgba(0, 0, 0, calc(40 / 255 * 222 / 255 / var(--opacity-disabled)));
|
||||||
|
--color-light-border: #ffffff28;
|
||||||
|
--color-hover: var(--steel-600);
|
||||||
|
--color-active: var(--steel-650);
|
||||||
|
--color-menu: var(--steel-700);
|
||||||
|
--color-card: var(--steel-700);
|
||||||
|
--color-markup-table-row: #ffffff06;
|
||||||
|
--color-markup-code-block: var(--steel-800);
|
||||||
|
--color-button: var(--steel-600);
|
||||||
|
--color-code-bg: var(--steel-750);
|
||||||
|
--color-code-sidebar-bg: var(--steel-600);
|
||||||
|
--color-shadow: #00000060;
|
||||||
|
--color-secondary-bg: var(--steel-700);
|
||||||
|
--color-text-focus: #fff;
|
||||||
|
--color-expand-button: #3c404d;
|
||||||
|
--color-placeholder-text: var(--steel-450);
|
||||||
|
--color-editor-line-highlight: var(--steel-700);
|
||||||
|
--color-project-board-bg: var(--color-secondary-light-3);
|
||||||
|
--color-project-board-dark-label: var(--color-text-light-3);
|
||||||
|
--color-caret: var(--color-text); /* should ideally be --color-text-dark, see #15651 */
|
||||||
|
--color-reaction-bg: #ffffff12;
|
||||||
|
--color-reaction-active-bg: var(--color-primary-alpha-30);
|
||||||
|
--color-header-bar: var(--steel-900);
|
||||||
|
--color-label-active-bg: #4c525e;
|
||||||
|
--color-accent: var(--color-primary-light-1);
|
||||||
|
--color-small-accent: var(--color-primary-light-5);
|
||||||
|
--color-active-line: #534d1b;
|
||||||
|
|
||||||
|
accent-color: var(--color-accent);
|
||||||
|
color-scheme: dark;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* invert emojis that are hard to read otherwise */
|
||||||
|
.emoji[aria-label="check mark"],
|
||||||
|
.emoji[aria-label="currency exchange"],
|
||||||
|
.emoji[aria-label="TOP arrow"],
|
||||||
|
.emoji[aria-label="END arrow"],
|
||||||
|
.emoji[aria-label="ON! arrow"],
|
||||||
|
.emoji[aria-label="SOON arrow"],
|
||||||
|
.emoji[aria-label="heavy dollar sign"],
|
||||||
|
.emoji[aria-label="copyright"],
|
||||||
|
.emoji[aria-label="registered"],
|
||||||
|
.emoji[aria-label="trade mark"],
|
||||||
|
.emoji[aria-label="multiply"],
|
||||||
|
.emoji[aria-label="plus"],
|
||||||
|
.emoji[aria-label="minus"],
|
||||||
|
.emoji[aria-label="divide"],
|
||||||
|
.emoji[aria-label="curly loop"],
|
||||||
|
.emoji[aria-label="double curly loop"],
|
||||||
|
.emoji[aria-label="wavy dash"],
|
||||||
|
.emoji[aria-label="paw prints"],
|
||||||
|
.emoji[aria-label="musical note"],
|
||||||
|
.emoji[aria-label="musical notes"] {
|
||||||
|
filter: invert(100%) hue-rotate(180deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.following.bar.light{
|
||||||
|
border-bottom-color: #ffffff11 !important;
|
||||||
|
}
|
||||||
|
.text.green.svg {
|
||||||
|
color: #16a34a !important;
|
||||||
|
}
|
||||||
|
i.grey.icon.icon.icon.icon {
|
||||||
|
color: var(--steel-350) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.red.button,
|
||||||
|
.ui.negative.button {
|
||||||
|
background-color: #7f1d1d !important;
|
||||||
|
color: #fff !important;
|
||||||
|
border-color: var(--color-light-border) !important;
|
||||||
|
&:hover {
|
||||||
|
background-color: #991b1b !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.secondary.vertical.menu {
|
||||||
|
border-radius: 0.28571429rem !important;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.ui.secondary.vertical.menu > .item {
|
||||||
|
border-radius: 0 !important;
|
||||||
|
}
|
||||||
|
.ui.basic.primary.button.item {
|
||||||
|
background-color: var(--color-active) !important;
|
||||||
|
color: var(--color-text) !important;
|
||||||
|
box-shadow: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.red.label.notification_count,
|
||||||
|
.ui.primary.label, .ui.primary.labels .label {
|
||||||
|
background-color: var(--color-primary-light-3) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.repository.view.issue .comment-list .code-comment + .code-comment {
|
||||||
|
margin: 1.25rem 0 !important;
|
||||||
|
padding-top: 1.25rem !important;
|
||||||
|
border-top-color: var(--steel-650) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.labeled.icon.buttons > .button > .icon, .ui.labeled.icon.button > .icon {
|
||||||
|
background-color: rgba(0, 0, 0, 0.05) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#review-box .review-comments-counter {
|
||||||
|
background-color: #00000088 !important;
|
||||||
|
color: #fff !important;
|
||||||
|
margin-left: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.tabs .ui.primary.label,
|
||||||
|
.ui.menu .ui.primary.label {
|
||||||
|
background-color: rgba(192,192,255, 0.2) !important;
|
||||||
|
// background-color: var(--zinc-300) !important;
|
||||||
|
color: var(--color-text-dark) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.basic.yellow.label.pending-label {
|
||||||
|
background: var(--color-light) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.tertiary.button {
|
||||||
|
color: #fff9;
|
||||||
|
&:hover {
|
||||||
|
color: #ccc;
|
||||||
|
}
|
||||||
|
}
|
277
web_src/less/themes/theme-forgejo-light.less
Normal file
|
@ -0,0 +1,277 @@
|
||||||
|
// @import "../chroma/light.less";
|
||||||
|
// @import "../codemirror/light.less";
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--steel-900: #10161D;
|
||||||
|
--steel-850: #131A21;
|
||||||
|
--steel-800: #171E26;
|
||||||
|
--steel-750: #1D262F;
|
||||||
|
--steel-700: #242D38;
|
||||||
|
--steel-650: #2B3642;
|
||||||
|
--steel-600: #374351;
|
||||||
|
--steel-550: #445161;
|
||||||
|
--steel-500: #515F70;
|
||||||
|
--steel-450: #5F6E80;
|
||||||
|
--steel-400: #6D7D8F;
|
||||||
|
--steel-350: #7C8C9F;
|
||||||
|
--steel-300: #8C9CAF;
|
||||||
|
--steel-250: #9DADC0;
|
||||||
|
--steel-200: #AEBED0;
|
||||||
|
--steel-150: #C0CFE0;
|
||||||
|
--steel-100: #D2E0F0;
|
||||||
|
|
||||||
|
--zinc-50: #FAFAFA;
|
||||||
|
--zinc-100: #F4F4F5;
|
||||||
|
--zinc-150: #ECECEE;
|
||||||
|
--zinc-200: #E4E4E7;
|
||||||
|
--zinc-250: #DCDCE0;
|
||||||
|
--zinc-300: #D4D4D8;
|
||||||
|
--zinc-350: #BABAC1;
|
||||||
|
--zinc-400: #A1A1AA;
|
||||||
|
--zinc-450: #898992;
|
||||||
|
--zinc-500: #71717A;
|
||||||
|
--zinc-550: #61616A;
|
||||||
|
--zinc-600: #52525B;
|
||||||
|
--zinc-650: #484850;
|
||||||
|
--zinc-700: #3F3F46;
|
||||||
|
--zinc-750: #333338;
|
||||||
|
--zinc-800: #27272A;
|
||||||
|
--zinc-850: #1F1F23;
|
||||||
|
--zinc-900: #18181B;
|
||||||
|
|
||||||
|
// --is-dark-theme: true;
|
||||||
|
--color-primary: #c2410c;
|
||||||
|
--color-primary-contrast: #ffffff;
|
||||||
|
--color-primary-dark-1: #c2410c;
|
||||||
|
--color-primary-dark-2: #9a3412;
|
||||||
|
--color-primary-dark-3: #9a3412;
|
||||||
|
--color-primary-dark-4: #7c2d12;
|
||||||
|
--color-primary-dark-5: #7c2d12;
|
||||||
|
--color-primary-dark-6: #7c2d12;
|
||||||
|
--color-primary-dark-7: #7c2d12;
|
||||||
|
--color-primary-light-1: #ea580c;
|
||||||
|
--color-primary-light-2: #f97316;
|
||||||
|
--color-primary-light-3: #fb923c;
|
||||||
|
--color-primary-light-4: #fdba74;
|
||||||
|
--color-primary-light-5: #fed7aa;
|
||||||
|
--color-primary-light-6: #ffedd5;
|
||||||
|
--color-primary-light-7: #fff7ed;
|
||||||
|
--color-primary-alpha-10: #c2410c19;
|
||||||
|
--color-primary-alpha-20: #c2410c33;
|
||||||
|
--color-primary-alpha-30: #c2410c4b;
|
||||||
|
--color-primary-alpha-40: #c2410c66;
|
||||||
|
--color-primary-alpha-50: #c2410c80;
|
||||||
|
--color-primary-alpha-60: #c2410c99;
|
||||||
|
--color-primary-alpha-70: #c2410cb3;
|
||||||
|
--color-primary-alpha-80: #c2410ccc;
|
||||||
|
--color-primary-alpha-90: #c2410ce1;
|
||||||
|
--color-secondary: var(--zinc-200);
|
||||||
|
--color-secondary-dark-1: var(--zinc-200);
|
||||||
|
--color-secondary-dark-2: var(--zinc-300);
|
||||||
|
--color-secondary-dark-3: var(--zinc-300);
|
||||||
|
--color-secondary-dark-4: var(--zinc-400);
|
||||||
|
--color-secondary-dark-5: var(--zinc-400);
|
||||||
|
--color-secondary-dark-6: var(--zinc-500);
|
||||||
|
--color-secondary-dark-7: var(--zinc-500);
|
||||||
|
--color-secondary-dark-8: var(--zinc-600);
|
||||||
|
--color-secondary-dark-9: var(--zinc-600);
|
||||||
|
--color-secondary-dark-10: var(--zinc-700);
|
||||||
|
--color-secondary-dark-11: var(--zinc-700);
|
||||||
|
--color-secondary-dark-12: var(--zinc-800);
|
||||||
|
--color-secondary-dark-13: var(--zinc-800);
|
||||||
|
--color-secondary-light-1: var(--zinc-200);
|
||||||
|
--color-secondary-light-2: var(--zinc-100);
|
||||||
|
--color-secondary-light-3: var(--zinc-100);
|
||||||
|
--color-secondary-light-4: var(--zinc-50);
|
||||||
|
--color-secondary-alpha-10: #d4d4d819;
|
||||||
|
--color-secondary-alpha-20: #d4d4d833;
|
||||||
|
--color-secondary-alpha-30: #d4d4d84b;
|
||||||
|
--color-secondary-alpha-40: #d4d4d866;
|
||||||
|
--color-secondary-alpha-50: #d4d4d880;
|
||||||
|
--color-secondary-alpha-60: #d4d4d899;
|
||||||
|
--color-secondary-alpha-70: #d4d4d8b3;
|
||||||
|
--color-secondary-alpha-80: #d4d4d8cc;
|
||||||
|
--color-secondary-alpha-90: #d4d4d8e1;
|
||||||
|
|
||||||
|
/* colors */
|
||||||
|
--color-red: #dc2626;
|
||||||
|
--color-orange: #ea580c;
|
||||||
|
--color-yellow: #ca8a04;
|
||||||
|
--color-olive: #91a313;
|
||||||
|
--color-green: #15803d;
|
||||||
|
--color-teal: #0d9488;
|
||||||
|
--color-blue: #2563eb;
|
||||||
|
--color-violet: #7c3aed;
|
||||||
|
--color-purple: #9333ea;
|
||||||
|
--color-pink: #db2777;
|
||||||
|
--color-brown: #a47252;
|
||||||
|
--color-grey: #4b5563;
|
||||||
|
--color-black: #000000;
|
||||||
|
|
||||||
|
/* light variants */
|
||||||
|
--color-red-light: #ef4444;
|
||||||
|
--color-orange-light: #f97316;
|
||||||
|
--color-yellow-light: #eab308;
|
||||||
|
--color-olive-light: #839311;
|
||||||
|
--color-green-light: #16a34a;
|
||||||
|
--color-teal-light: #14b8a6;
|
||||||
|
--color-blue-light: #3b82f6;
|
||||||
|
--color-violet-light: #8b5cf6;
|
||||||
|
--color-purple-light: #a855f7;
|
||||||
|
--color-pink-light: #ec4899;
|
||||||
|
--color-brown-light: #94674a;
|
||||||
|
--color-grey-light: #6b7280;
|
||||||
|
--color-black-light: #181818;
|
||||||
|
|
||||||
|
/* other colors */
|
||||||
|
--color-gold: #b1983b;
|
||||||
|
--color-white: #ffffff;
|
||||||
|
--color-diff-removed-word-bg: #fca5a5;
|
||||||
|
--color-diff-added-word-bg: #86efac;
|
||||||
|
--color-diff-removed-row-bg: #fee2e2;
|
||||||
|
--color-diff-moved-row-bg: #fef9c3;
|
||||||
|
--color-diff-added-row-bg: #dcfce7;
|
||||||
|
--color-diff-removed-row-border: #fca5a5;
|
||||||
|
--color-diff-moved-row-border: #fde047;
|
||||||
|
--color-diff-added-row-border: #86efac;
|
||||||
|
--color-diff-inactive: var(--zinc-100);
|
||||||
|
--color-error-border: #fecaca;
|
||||||
|
--color-error-bg: #fee2e2;
|
||||||
|
--color-error-bg-active: #fca5a5;
|
||||||
|
--color-error-bg-hover: #fecaca;
|
||||||
|
--color-error-text: #7f1d1d;
|
||||||
|
--color-success-border: #bbf7d0;
|
||||||
|
--color-success-bg: #dcfce7;
|
||||||
|
--color-success-text: #14532d;
|
||||||
|
--color-warning-border: #fde047;
|
||||||
|
--color-warning-bg: #fef3c7;
|
||||||
|
--color-warning-text: #78350f;
|
||||||
|
--color-info-border: #bae6fd;
|
||||||
|
--color-info-bg: #e0f2fe;
|
||||||
|
--color-info-text: #0c4a6e;
|
||||||
|
--color-red-badge: #B91C1C;
|
||||||
|
--color-red-badge-bg: #B91C1C22;
|
||||||
|
--color-red-badge-hover-bg: #B91C1C44;
|
||||||
|
--color-green-badge: #16a34a;
|
||||||
|
--color-green-badge-bg: #16a34a22;
|
||||||
|
--color-green-badge-hover-bg: #16a34a44;
|
||||||
|
--color-yellow-badge: #ca8a04;
|
||||||
|
--color-yellow-badge-bg: #ca8a0422;
|
||||||
|
--color-yellow-badge-hover-bg: #ca8a0444;
|
||||||
|
--color-orange-badge: #ea580c;
|
||||||
|
--color-orange-badge-bg: #ea580c22;
|
||||||
|
--color-orange-badge-hover-bg: #ea580c44;
|
||||||
|
--color-git: #f05133;
|
||||||
|
|
||||||
|
/* target-based colors */
|
||||||
|
--color-body: #fff;
|
||||||
|
--color-box-header: var(--zinc-100);
|
||||||
|
--color-box-body: var(--zinc-50);
|
||||||
|
--color-box-body-highlight: var(--zinc-200);
|
||||||
|
--color-text-dark: #000;
|
||||||
|
--color-text: var(--zinc-900);
|
||||||
|
--color-text-light: var(--zinc-700);
|
||||||
|
--color-text-light-1: var(--zinc-650);
|
||||||
|
--color-text-light-2: var(--zinc-600);
|
||||||
|
--color-text-light-3: var(--zinc-550);
|
||||||
|
--color-footer: var(--zinc-100);
|
||||||
|
--color-timeline: var(--zinc-200);
|
||||||
|
--color-input-text: var(--zinc-800);
|
||||||
|
--color-input-background: #fff;
|
||||||
|
--color-input-toggle-background: #fff;
|
||||||
|
--color-input-border: var(--zinc-300);
|
||||||
|
--color-input-border-hover: var(--zinc-400);
|
||||||
|
--color-navbar: var(--zinc-50);
|
||||||
|
--color-navbar-transparent: #D2E0F000;
|
||||||
|
--color-light: #ffffffcc;
|
||||||
|
--color-light-mimic-enabled: rgba(0, 0, 0, calc(6 / 255 * 222 / 255 / var(--opacity-disabled)));
|
||||||
|
--color-light-border: #0000001d;
|
||||||
|
--color-hover: #e4e4e4aa;
|
||||||
|
--color-active: #d4d4d8aa;
|
||||||
|
--color-menu: var(--zinc-100);
|
||||||
|
--color-card: var(--zinc-50);
|
||||||
|
--color-markup-table-row: #ffffff06;
|
||||||
|
--color-markup-code-block: var(--zinc-150);
|
||||||
|
--color-button: var(--zinc-150);
|
||||||
|
--color-code-bg: var(--zinc-50);
|
||||||
|
--color-code-sidebar-bg: var(--zinc-100);
|
||||||
|
--color-shadow: #00000060;
|
||||||
|
--color-secondary-bg: var(--zinc-100);
|
||||||
|
--color-text-focus: #fff;
|
||||||
|
--color-expand-button: var(--zinc-200);
|
||||||
|
--color-placeholder-text: var(--zinc-400);
|
||||||
|
--color-editor-line-highlight: var(--zinc-100);
|
||||||
|
--color-project-board-bg: var(--color-secondary-light-2);
|
||||||
|
--color-project-board-dark-label: var(--color-text-light-3);
|
||||||
|
--color-caret: var(--color-text); /* should ideally be --color-text-dark, see #15651 */
|
||||||
|
--color-reaction-bg: #0000000a;
|
||||||
|
--color-reaction-active-bg: var(--color-primary-alpha-20);
|
||||||
|
--color-header-bar: var(--zinc-100);
|
||||||
|
--color-label-active-bg: #4c525e;
|
||||||
|
--color-accent: var(--color-primary-light-1);
|
||||||
|
--color-small-accent: var(--color-primary-light-5);
|
||||||
|
--color-active-line: #534d1b;
|
||||||
|
|
||||||
|
accent-color: var(--color-accent);
|
||||||
|
color-scheme: light;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text.green.svg {
|
||||||
|
color: #16a34a !important;
|
||||||
|
}
|
||||||
|
// .ui.red.button,
|
||||||
|
// .ui.negative.button {
|
||||||
|
// background-color: var(--color-red) !important;
|
||||||
|
// color: #fff !important;
|
||||||
|
// border-color: var(--color-light-border) !important;
|
||||||
|
// &:hover {
|
||||||
|
// background-color: var(--color-red-light) !important;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
.ui.secondary.vertical.menu {
|
||||||
|
border-radius: 0.28571429rem !important;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.ui.secondary.vertical.menu > .item {
|
||||||
|
border-radius: 0 !important;
|
||||||
|
}
|
||||||
|
.ui.basic.primary.button.item {
|
||||||
|
background-color: var(--color-active) !important;
|
||||||
|
color: var(--color-text) !important;
|
||||||
|
box-shadow: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.red.label.notification_count,
|
||||||
|
.ui.primary.label, .ui.primary.labels .label {
|
||||||
|
background-color: var(--color-primary-dark-1) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.repository.view.issue .comment-list .code-comment + .code-comment {
|
||||||
|
margin: 1.25rem 0 !important;
|
||||||
|
padding-top: 1.25rem !important;
|
||||||
|
border-top-color: var(--zinc-250) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.labeled.icon.buttons > .button > .icon, .ui.labeled.icon.button > .icon {
|
||||||
|
background-color: rgba(0, 0, 0, 0.05) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#review-box .review-comments-counter {
|
||||||
|
background-color: #ffffffaa !important;
|
||||||
|
color: #000 !important;
|
||||||
|
margin-left: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.tabs .ui.primary.label,
|
||||||
|
.ui.menu .ui.primary.label {
|
||||||
|
background-color: rgba(0, 0, 0, 0.15) !important;
|
||||||
|
// background-color: var(--zinc-300) !important;
|
||||||
|
color: var(--color-text-dark) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.basic.yellow.label.pending-label {
|
||||||
|
background: var(--color-warning-bg) !important;
|
||||||
|
color: var(--color-warning-text) !important;
|
||||||
|
border-color: #eab308 !important;
|
||||||
|
}
|