Compare commits
73 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
78a4744798 | ||
|
|
6acad3de28 | ||
|
|
2c9f94dad5 | ||
|
|
f6e9e3b17d | ||
|
|
e414c24004 | ||
|
|
ab0539cd31 | ||
|
|
bfdd2713d3 | ||
|
|
ddb06706f3 | ||
|
|
856c9d7f2b | ||
|
|
735d131321 | ||
|
|
b2b6686f46 | ||
|
|
710ec5d69a | ||
|
|
b92948cb0a | ||
|
|
8bc2b852eb | ||
|
|
4ad19d8b5c | ||
|
|
b7a8538f6e | ||
|
|
9bd0a95e9f | ||
|
|
5818970a2a | ||
|
|
00d593260e | ||
|
|
6f7e600645 | ||
|
|
f382591ef1 | ||
|
|
706b39861d | ||
|
|
c71f3eeff4 | ||
|
|
13fc6ec45d | ||
|
|
d15996c3ee | ||
|
|
b27f338d4d | ||
|
|
68c64d1716 | ||
|
|
5e359c6231 | ||
|
|
b4513b55ba | ||
|
|
1b1a4c0903 | ||
|
|
6ed635306c | ||
|
|
d0b565c94e | ||
|
|
dc0d1e0645 | ||
|
|
5e412826b6 | ||
|
|
6c3bd42839 | ||
|
|
45f4f5a6c3 | ||
|
|
3bbd048204 | ||
|
|
15bd1d61c4 | ||
|
|
b569c3f8a8 | ||
|
|
ded40c34c5 | ||
|
|
e53c8fd040 | ||
|
|
a3c1aa3011 | ||
|
|
469551095b | ||
|
|
5ca3661c33 | ||
|
|
a68d691750 | ||
| 3a1075d6a0 | |||
| 6795122e00 | |||
| 2fc3e5a1c7 | |||
| 1af82412c0 | |||
| 5832d93f0a | |||
| 44f04a7866 | |||
| 2ba34c0abb | |||
| 1717a0c45c | |||
| e871e65342 | |||
| 8b8812f81c | |||
| 67ff066157 | |||
| 3fb751bc24 | |||
| 6cfd51e4c7 | |||
| 659e08da6c | |||
| d664ce29d8 | |||
| 4580e5c87f | |||
| 11b2ee48e9 | |||
| 85d73a2d85 | |||
| 54510ce582 | |||
| 1986d90df0 | |||
| 5b0442d357 | |||
| d44fea18d5 | |||
| e57b4f1654 | |||
| 69d7c72ba8 | |||
|
|
919746c756 | ||
|
|
853ff29ae2 | ||
|
|
7292421334 | ||
|
|
84adad19bf |
@@ -22,7 +22,7 @@ jobs:
|
||||
# Lint job - must pass
|
||||
lint:
|
||||
name: Lint
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: linux-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
@@ -54,7 +54,7 @@ jobs:
|
||||
# Unit tests with SQLite (no external database needed)
|
||||
test-unit:
|
||||
name: Unit Tests
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: linux-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
@@ -81,7 +81,7 @@ jobs:
|
||||
# Integration tests with PostgreSQL
|
||||
test-pgsql:
|
||||
name: Integration Tests (PostgreSQL)
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: linux-latest
|
||||
services:
|
||||
pgsql:
|
||||
image: postgres:15
|
||||
@@ -127,7 +127,7 @@ jobs:
|
||||
|
||||
- name: Build test binary
|
||||
run: |
|
||||
go build -tags="bindata sqlite sqlite_unlock_notify" -o gitea .
|
||||
go build -tags="bindata sqlite sqlite_unlock_notify" -o gitcaddy-server .
|
||||
|
||||
- name: Generate test config
|
||||
run: |
|
||||
@@ -154,7 +154,7 @@ jobs:
|
||||
# Create release job - runs first to create the release before build jobs upload
|
||||
create-release:
|
||||
name: Create Release
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: linux-latest
|
||||
if: startsWith(github.ref, 'refs/tags/v')
|
||||
outputs:
|
||||
release_id: ${{ steps.create.outputs.release_id }}
|
||||
@@ -182,7 +182,7 @@ jobs:
|
||||
RESPONSE=$(curl -sf -X POST \
|
||||
-H "Authorization: token ${{ secrets.RELEASE_TOKEN }}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"tag_name":"'"$TAG"'","name":"Gitea '"$TAG"'","body":"Official release of Gitea '"$TAG"'.","draft":false,"prerelease":false}' \
|
||||
-d '{"tag_name":"'"$TAG"'","name":"GitCaddy Server '"$TAG"'","body":"Official release of GitCaddy Server '"$TAG"'.","draft":false,"prerelease":false}' \
|
||||
"https://direct.git.marketally.com/api/v1/repos/${{ github.repository }}/releases" 2>&1)
|
||||
|
||||
if echo "$RESPONSE" | grep -q '"id":[0-9]'; then
|
||||
@@ -197,9 +197,9 @@ jobs:
|
||||
# Build job for binaries
|
||||
build:
|
||||
name: Build Binaries
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: linux-latest
|
||||
needs: [lint, create-release]
|
||||
if: always() && needs.lint.result == 'success' && (needs.create-release.result == 'success' || needs.create-release.result == 'skipped')
|
||||
if: startsWith(github.ref, 'refs/tags/v') && needs.lint.result == 'success' && needs.create-release.result == 'success'
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
@@ -250,7 +250,7 @@ jobs:
|
||||
GOARCH: ${{ matrix.goarch }}
|
||||
TAGS: bindata sqlite sqlite_unlock_notify
|
||||
run: |
|
||||
VERSION=$(git describe --tags --always --dirty 2>/dev/null || echo "dev")
|
||||
VERSION=$(git describe --tags --always --dirty 2>/dev/null | sed "s/-gitcaddy//" || echo "dev")
|
||||
LDFLAGS="-X code.gitea.io/gitea/modules/setting.AppVer=${VERSION}"
|
||||
|
||||
EXT=""
|
||||
@@ -258,7 +258,7 @@ jobs:
|
||||
EXT=".exe"
|
||||
fi
|
||||
|
||||
OUTPUT="gitea-${VERSION}-${GOOS}-${GOARCH}${EXT}"
|
||||
OUTPUT="gitcaddy-server-${VERSION}-${GOOS}-${GOARCH}${EXT}"
|
||||
|
||||
go build -v -trimpath -tags "${TAGS}" -ldflags "${LDFLAGS}" -o "dist/${OUTPUT}" .
|
||||
|
||||
|
||||
1
.gitignore
vendored
@@ -85,7 +85,6 @@ cpu.out
|
||||
/public/assets/js
|
||||
/public/assets/css
|
||||
/public/assets/fonts
|
||||
/public/assets/licenses.txt
|
||||
/vendor
|
||||
/VERSION
|
||||
/.air
|
||||
|
||||
6
Makefile
@@ -41,7 +41,7 @@ GO_LICENSES_PACKAGE ?= github.com/google/go-licenses@v1
|
||||
GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@v1
|
||||
ACTIONLINT_PACKAGE ?= github.com/rhysd/actionlint/cmd/actionlint@v1.7.9
|
||||
|
||||
DOCKER_IMAGE ?= gitea/gitea
|
||||
DOCKER_IMAGE ?= gitcaddy/gitcaddy-server
|
||||
DOCKER_TAG ?= latest
|
||||
DOCKER_REF := $(DOCKER_IMAGE):$(DOCKER_TAG)
|
||||
|
||||
@@ -70,10 +70,10 @@ else ifeq ($(patsubst Windows%,Windows,$(OS)),Windows)
|
||||
endif
|
||||
ifeq ($(IS_WINDOWS),yes)
|
||||
GOFLAGS := -v -buildmode=exe
|
||||
EXECUTABLE ?= gitea.exe
|
||||
EXECUTABLE ?= gitcaddy-server.exe
|
||||
else
|
||||
GOFLAGS := -v
|
||||
EXECUTABLE ?= gitea
|
||||
EXECUTABLE ?= gitcaddy-server
|
||||
endif
|
||||
|
||||
ifeq ($(shell sed --version 2>/dev/null | grep -q GNU && echo gnu),gnu)
|
||||
|
||||
11
README.md
@@ -260,11 +260,11 @@ autoUpdater.checkForUpdates()
|
||||
|
||||
### From Binary
|
||||
|
||||
Download from [Releases](https://git.marketally.com/gitcaddy/gitea/releases):
|
||||
Download from [Releases](https://git.marketally.com/gitcaddy/gitcaddy-server/releases):
|
||||
|
||||
```bash
|
||||
# Linux (amd64)
|
||||
curl -L -o gitcaddy https://git.marketally.com/gitcaddy/gitea/releases/latest/download/gitea-linux-amd64
|
||||
curl -L -o gitcaddy-server https://git.marketally.com/gitcaddy/gitcaddy-server/releases/latest/download/gitcaddy-server-linux-amd64
|
||||
chmod +x gitcaddy
|
||||
./gitcaddy web
|
||||
```
|
||||
@@ -272,10 +272,10 @@ chmod +x gitcaddy
|
||||
### From Source
|
||||
|
||||
```bash
|
||||
git clone https://git.marketally.com/gitcaddy/gitea.git
|
||||
cd gitea
|
||||
git clone https://git.marketally.com/gitcaddy/gitcaddy-server.git
|
||||
cd gitcaddy-server
|
||||
TAGS="bindata sqlite sqlite_unlock_notify" make build
|
||||
./gitea web
|
||||
./gitcaddy-server web
|
||||
```
|
||||
|
||||
### Docker
|
||||
@@ -413,4 +413,5 @@ MIT License - see [LICENSE](LICENSE) for details.
|
||||
GitCaddy is a fork of [Gitea](https://gitea.io), the open-source self-hosted Git service. We thank the Gitea team and all contributors for building the foundation that makes GitCaddy possible.
|
||||
|
||||
- [Gitea Project](https://gitea.io)
|
||||
- [Claude Code](https://claude.ai/code) - AI-assisted development by Anthropic
|
||||
- [Gitea Contributors](https://github.com/go-gitea/gitea/graphs/contributors)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package cmd
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package cmd
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package cmd
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
// gitea-cli is a command-line tool for interacting with Gitea instances.
|
||||
|
||||
@@ -86,9 +86,9 @@ type AppVersion struct {
|
||||
|
||||
func NewMainApp(appVer AppVersion) *cli.Command {
|
||||
app := &cli.Command{}
|
||||
app.Name = "gitea" // must be lower-cased because it appears in the "USAGE" section like "gitea doctor [command [command options]]"
|
||||
app.Usage = "A painless self-hosted Git service"
|
||||
app.Description = `Gitea program contains "web" and other subcommands. If no subcommand is given, it starts the web server by default. Use "web" subcommand for more web server arguments, use other subcommands for other purposes.`
|
||||
app.Name = "gitcaddy-server" // must be lower-cased because it appears in the "USAGE" section like "gitea doctor [command [command options]]"
|
||||
app.Usage = "GitCaddy Server - A painless self-hosted Git service"
|
||||
app.Description = `GitCaddy Server contains "web" and other subcommands. If no subcommand is given, it starts the web server by default. Use "web" subcommand for more web server arguments, use other subcommands for other purposes. Based on Gitea - https://gitea.io`
|
||||
app.Version = appVer.Version + appVer.Extra
|
||||
app.EnableShellCompletion = true
|
||||
app.Flags = []cli.Flag{
|
||||
|
||||
154
cmd/mcp-server/main.go
Normal file
@@ -0,0 +1,154 @@
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
// Gitea MCP Server - Model Context Protocol server for Gitea Actions
|
||||
//
|
||||
// This standalone server implements the MCP protocol over stdio,
|
||||
// proxying requests to a Gitea instance's /api/v2/mcp endpoint.
|
||||
//
|
||||
// Usage:
|
||||
//
|
||||
// gitea-mcp-server --url https://git.example.com --token YOUR_API_TOKEN
|
||||
//
|
||||
// Configure in Claude Code's settings.json:
|
||||
//
|
||||
// {
|
||||
// "mcpServers": {
|
||||
// "gitea": {
|
||||
// "command": "gitea-mcp-server",
|
||||
// "args": ["--url", "https://git.example.com", "--token", "YOUR_TOKEN"]
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"code.gitea.io/gitea/modules/json"
|
||||
)
|
||||
|
||||
var (
|
||||
giteaURL string
|
||||
giteaToken string
|
||||
debug bool
|
||||
)
|
||||
|
||||
func main() {
|
||||
flag.StringVar(&giteaURL, "url", "", "Gitea server URL (e.g., https://git.example.com)")
|
||||
flag.StringVar(&giteaToken, "token", "", "Gitea API token")
|
||||
flag.BoolVar(&debug, "debug", false, "Enable debug logging to stderr")
|
||||
flag.Parse()
|
||||
|
||||
// Also check environment variables
|
||||
if giteaURL == "" {
|
||||
giteaURL = os.Getenv("GITEA_URL")
|
||||
}
|
||||
if giteaToken == "" {
|
||||
giteaToken = os.Getenv("GITEA_TOKEN")
|
||||
}
|
||||
|
||||
if giteaURL == "" {
|
||||
fmt.Fprintln(os.Stderr, "Error: --url or GITEA_URL is required")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
debugLog("Gitea MCP Server starting")
|
||||
debugLog("Connecting to: %s", giteaURL)
|
||||
|
||||
// Read JSON-RPC messages from stdin, forward to Gitea, write responses to stdout
|
||||
reader := bufio.NewReader(os.Stdin)
|
||||
|
||||
for {
|
||||
line, err := reader.ReadBytes('\n')
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
debugLog("EOF received, exiting")
|
||||
break
|
||||
}
|
||||
debugLog("Read error: %v", err)
|
||||
continue
|
||||
}
|
||||
|
||||
line = bytes.TrimSpace(line)
|
||||
if len(line) == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
debugLog("Received: %s", string(line))
|
||||
|
||||
// Forward to Gitea's MCP endpoint
|
||||
response, err := forwardToGitea(line)
|
||||
if err != nil {
|
||||
debugLog("Forward error: %v", err)
|
||||
// Send error response
|
||||
errorResp := map[string]any{
|
||||
"jsonrpc": "2.0",
|
||||
"id": nil,
|
||||
"error": map[string]any{
|
||||
"code": -32603,
|
||||
"message": "Internal error",
|
||||
"data": err.Error(),
|
||||
},
|
||||
}
|
||||
writeResponse(errorResp)
|
||||
continue
|
||||
}
|
||||
|
||||
debugLog("Response: %s", string(response))
|
||||
|
||||
// Write response to stdout
|
||||
fmt.Println(string(response))
|
||||
}
|
||||
}
|
||||
|
||||
func forwardToGitea(request []byte) ([]byte, error) {
|
||||
mcpURL := giteaURL + "/api/v2/mcp"
|
||||
|
||||
req, err := http.NewRequest(http.MethodPost, mcpURL, bytes.NewReader(request))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("create request: %w", err)
|
||||
}
|
||||
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
req.Header.Set("Accept", "application/json")
|
||||
if giteaToken != "" {
|
||||
req.Header.Set("Authorization", "token "+giteaToken)
|
||||
}
|
||||
|
||||
client := &http.Client{Timeout: 30 * time.Second}
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("http request: %w", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("read response: %w", err)
|
||||
}
|
||||
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
return nil, fmt.Errorf("http status %d: %s", resp.StatusCode, string(body))
|
||||
}
|
||||
|
||||
return body, nil
|
||||
}
|
||||
|
||||
func writeResponse(resp any) {
|
||||
data, _ := json.Marshal(resp)
|
||||
fmt.Println(string(data))
|
||||
}
|
||||
|
||||
func debugLog(format string, args ...any) {
|
||||
if debug {
|
||||
fmt.Fprintf(os.Stderr, "[DEBUG] "+format+"\n", args...)
|
||||
}
|
||||
}
|
||||
4
go.mod
@@ -25,6 +25,7 @@ require (
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.19.0
|
||||
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.2
|
||||
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358
|
||||
github.com/Masterminds/semver/v3 v3.4.0
|
||||
github.com/ProtonMail/go-crypto v1.3.0
|
||||
github.com/PuerkitoBio/goquery v1.10.3
|
||||
github.com/SaveTheRbtz/zstd-seekable-format-go/pkg v0.8.0
|
||||
@@ -145,7 +146,6 @@ require (
|
||||
git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078 // indirect
|
||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 // indirect
|
||||
github.com/DataDog/zstd v1.5.7 // indirect
|
||||
github.com/Masterminds/semver/v3 v3.4.0 // indirect
|
||||
github.com/Microsoft/go-winio v0.6.2 // indirect
|
||||
github.com/RoaringBitmap/roaring/v2 v2.10.0 // indirect
|
||||
github.com/STARRY-S/zip v0.2.3 // indirect
|
||||
@@ -314,7 +314,7 @@ replace github.com/nektos/act => gitea.com/gitea/act v0.261.7-0.20251003180512-a
|
||||
replace git.sr.ht/~mariusor/go-xsd-duration => gitea.com/gitea/go-xsd-duration v0.0.0-20220703122237-02e73435a078
|
||||
|
||||
// Use GitCaddy fork with capability support
|
||||
replace code.gitea.io/actions-proto-go => git.marketally.com/gitcaddy/actions-proto-go v0.5.3
|
||||
replace code.gitea.io/actions-proto-go => git.marketally.com/gitcaddy/actions-proto-go v0.5.7
|
||||
|
||||
exclude github.com/gofrs/uuid v3.2.0+incompatible
|
||||
|
||||
|
||||
6
go.sum
@@ -29,8 +29,8 @@ dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA=
|
||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
|
||||
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
|
||||
git.marketally.com/gitcaddy/actions-proto-go v0.5.3 h1:tf625YKv1Bykxr9CIcoqilC2MWiO/yBN3srlJYnFQqM=
|
||||
git.marketally.com/gitcaddy/actions-proto-go v0.5.3/go.mod h1:mn7Wkqz6JbnTOHQpot3yDeHx+O5C9EGhMEE+htvHBas=
|
||||
git.marketally.com/gitcaddy/actions-proto-go v0.5.7 h1:RUbafr3Vkw2l4WfSwa+oF+Ihakbm05W0FlAmXuQrDJc=
|
||||
git.marketally.com/gitcaddy/actions-proto-go v0.5.7/go.mod h1:RPu21UoRD3zSAujoZR6LJwuVNa2uFRBveadslczCRfQ=
|
||||
gitea.com/gitea/act v0.261.7-0.20251003180512-ac6e4b751763 h1:ohdxegvslDEllZmRNDqpKun6L4Oq81jNdEDtGgHEV2c=
|
||||
gitea.com/gitea/act v0.261.7-0.20251003180512-ac6e4b751763/go.mod h1:Pg5C9kQY1CEA3QjthjhlrqOC/QOT5NyWNjOjRHw23Ok=
|
||||
gitea.com/gitea/go-xsd-duration v0.0.0-20220703122237-02e73435a078 h1:BAFmdZpRW7zMQZQDClaCWobRj9uL1MR3MzpCVJvc5s4=
|
||||
@@ -78,8 +78,6 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym
|
||||
github.com/DataDog/zstd v1.5.7 h1:ybO8RBeh29qrxIhCA9E8gKY6xfONU9T6G6aP9DTKfLE=
|
||||
github.com/DataDog/zstd v1.5.7/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
|
||||
github.com/Julusian/godocdown v0.0.0-20170816220326-6d19f8ff2df8/go.mod h1:INZr5t32rG59/5xeltqoCJoNY7e5x/3xoY9WSWVWg74=
|
||||
github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
|
||||
github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
|
||||
github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
|
||||
github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
|
||||
github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2021 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2021 The Gitea Authors and MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package actions
|
||||
@@ -64,6 +64,8 @@ type ActionRunner struct {
|
||||
Ephemeral bool `xorm:"ephemeral NOT NULL DEFAULT false"`
|
||||
// CapabilitiesJSON stores structured capability information for AI consumption
|
||||
CapabilitiesJSON string `xorm:"TEXT"`
|
||||
// BandwidthTestRequestedAt tracks when a bandwidth test was requested by admin
|
||||
BandwidthTestRequestedAt timeutil.TimeStamp `xorm:"index"`
|
||||
|
||||
Created timeutil.TimeStamp `xorm:"created"`
|
||||
Updated timeutil.TimeStamp `xorm:"updated"`
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright 2015 The Gogs Authors. All rights reserved.
|
||||
// Copyright 2017 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2017 The Gitea Authors and MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package migrations
|
||||
@@ -405,6 +405,8 @@ func prepareMigrationTasks() []*migration {
|
||||
newMigration(328, "Add wiki index table for search", v1_26.AddWikiIndexTable),
|
||||
newMigration(329, "Add release archive columns", v1_26.AddReleaseArchiveColumns),
|
||||
newMigration(330, "Add runner capabilities column", v1_26.AddRunnerCapabilitiesColumn),
|
||||
newMigration(331, "Add is_homepage_pinned to user table", v1_26.AddIsHomepagePinnedToUser),
|
||||
newMigration(332, "Add display_title and license_type to repository", v1_26.AddDisplayTitleAndLicenseTypeToRepository),
|
||||
}
|
||||
return preparedMigrations
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2024 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package v1_26
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package v1_26
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package v1_26
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package v1_26
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package v1_26
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package v1_26
|
||||
|
||||
16
models/migrations/v1_26/v331.go
Normal file
@@ -0,0 +1,16 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package v1_26
|
||||
|
||||
import (
|
||||
"xorm.io/xorm"
|
||||
)
|
||||
|
||||
// AddIsHomepagePinnedToUser adds is_homepage_pinned column to user table for organizations
|
||||
func AddIsHomepagePinnedToUser(x *xorm.Engine) error {
|
||||
type User struct {
|
||||
IsHomepagePinned bool `xorm:"NOT NULL DEFAULT false"`
|
||||
}
|
||||
return x.Sync(new(User))
|
||||
}
|
||||
18
models/migrations/v1_26/v332.go
Normal file
@@ -0,0 +1,18 @@
|
||||
// Copyright 2024 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package v1_26
|
||||
|
||||
import (
|
||||
"xorm.io/xorm"
|
||||
)
|
||||
|
||||
// AddDisplayTitleAndLicenseTypeToRepository adds display_title and license_type columns to the repository table
|
||||
func AddDisplayTitleAndLicenseTypeToRepository(x *xorm.Engine) error {
|
||||
type Repository struct {
|
||||
DisplayTitle string `xorm:"VARCHAR(255)"`
|
||||
LicenseType string `xorm:"VARCHAR(50)"`
|
||||
}
|
||||
|
||||
return x.Sync(new(Repository))
|
||||
}
|
||||
@@ -596,3 +596,21 @@ func getUserTeamIDsQueryBuilder(orgID, userID int64) *builder.Builder {
|
||||
"team_user.uid": userID,
|
||||
})
|
||||
}
|
||||
|
||||
// GetHomepagePinnedOrganizations returns all organizations that are pinned to the homepage
|
||||
func GetHomepagePinnedOrganizations(ctx context.Context) ([]*Organization, error) {
|
||||
orgs := make([]*Organization, 0, 10)
|
||||
return orgs, db.GetEngine(ctx).
|
||||
Where("type = ?", user_model.UserTypeOrganization).
|
||||
And("is_homepage_pinned = ?", true).
|
||||
And("visibility = ?", structs.VisibleTypePublic).
|
||||
OrderBy("name ASC").
|
||||
Find(&orgs)
|
||||
}
|
||||
|
||||
// SetHomepagePinned updates the homepage pinned status for an organization
|
||||
func (org *Organization) SetHomepagePinned(ctx context.Context, pinned bool) error {
|
||||
org.IsHomepagePinned = pinned
|
||||
_, err := db.GetEngine(ctx).ID(org.ID).Cols("is_homepage_pinned").Update(org)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package organization
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package organization
|
||||
@@ -144,10 +144,10 @@ func GetMemberPublicVisibility(ctx context.Context, orgID, userID int64) (bool,
|
||||
|
||||
// OrgOverviewStats represents statistics for the organization overview
|
||||
type OrgOverviewStats struct {
|
||||
MemberCount int64
|
||||
RepoCount int64
|
||||
PublicRepoCount int64
|
||||
TeamCount int64
|
||||
TotalRepos int64
|
||||
TotalMembers int64
|
||||
TotalTeams int64
|
||||
TotalStars int64
|
||||
}
|
||||
|
||||
// GetOrgMemberAndTeamCounts returns member and team counts for an organization
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package repo
|
||||
@@ -142,6 +142,12 @@ func UpdatePagesDomain(ctx context.Context, domain *PagesDomain) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// ActivatePagesDomainSSL sets SSL status to active for a domain
|
||||
func ActivatePagesDomainSSL(ctx context.Context, id int64) error {
|
||||
_, err := db.GetEngine(ctx).ID(id).Cols("ssl_status").Update(&PagesDomain{SSLStatus: SSLStatusActive})
|
||||
return err
|
||||
}
|
||||
|
||||
// DeletePagesDomain deletes a pages domain
|
||||
func DeletePagesDomain(ctx context.Context, id int64) error {
|
||||
_, err := db.GetEngine(ctx).ID(id).Delete(new(PagesDomain))
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright 2014 The Gogs Authors. All rights reserved.
|
||||
// Copyright 2019 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2019 The Gitea Authors and MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package repo
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2021 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2021 The Gitea Authors and MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package repo
|
||||
@@ -159,6 +159,8 @@ type Repository struct {
|
||||
LowerName string `xorm:"UNIQUE(s) INDEX NOT NULL"`
|
||||
Name string `xorm:"INDEX NOT NULL"`
|
||||
Description string `xorm:"TEXT"`
|
||||
DisplayTitle string `xorm:"VARCHAR(255)"`
|
||||
LicenseType string `xorm:"VARCHAR(50)"`
|
||||
Website string `xorm:"VARCHAR(2048)"`
|
||||
OriginalServiceType api.GitServiceType `xorm:"index"`
|
||||
OriginalURL string `xorm:"VARCHAR(2048)"`
|
||||
@@ -968,6 +970,17 @@ func CountNullArchivedRepository(ctx context.Context) (int64, error) {
|
||||
return db.GetEngine(ctx).Where(builder.IsNull{"is_archived"}).Count(new(Repository))
|
||||
}
|
||||
|
||||
// CountOrgRepoStars returns the total number of stars across all repos owned by an organization
|
||||
func CountOrgRepoStars(ctx context.Context, orgID int64) (int64, error) {
|
||||
var total int64
|
||||
_, err := db.GetEngine(ctx).
|
||||
Table("repository").
|
||||
Where("owner_id = ?", orgID).
|
||||
Select("COALESCE(SUM(num_stars), 0)").
|
||||
Get(&total)
|
||||
return total, err
|
||||
}
|
||||
|
||||
// FixNullArchivedRepository sets is_archived to false where it is null
|
||||
func FixNullArchivedRepository(ctx context.Context) (int64, error) {
|
||||
return db.GetEngine(ctx).Where(builder.IsNull{"is_archived"}).Cols("is_archived").NoAutoTime().Update(&Repository{
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2024 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package repo
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package repo
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright 2014 The Gogs Authors. All rights reserved.
|
||||
// Copyright 2019 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2019 The Gitea Authors and MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package user
|
||||
@@ -121,6 +121,8 @@ type User struct {
|
||||
// true: the user is only allowed to see organizations/repositories that they has explicit rights to.
|
||||
// (ex: in private Gitea instances user won't be allowed to see even organizations/repositories that are set as public)
|
||||
IsRestricted bool `xorm:"NOT NULL DEFAULT false"`
|
||||
// IsHomepagePinned indicates if this organization should appear on the homepage
|
||||
IsHomepagePinned bool `xorm:"NOT NULL DEFAULT false"`
|
||||
|
||||
AllowGitHook bool
|
||||
AllowImportLocal bool // Allow migrate repository by local path
|
||||
@@ -147,9 +149,10 @@ type User struct {
|
||||
RepoAdminChangeTeamAccess bool `xorm:"NOT NULL DEFAULT false"`
|
||||
|
||||
// Preferences
|
||||
DiffViewStyle string `xorm:"NOT NULL DEFAULT ''"`
|
||||
Theme string `xorm:"NOT NULL DEFAULT ''"`
|
||||
KeepActivityPrivate bool `xorm:"NOT NULL DEFAULT false"`
|
||||
DiffViewStyle string `xorm:"NOT NULL DEFAULT ''"`
|
||||
Theme string `xorm:"NOT NULL DEFAULT ''"`
|
||||
KeepActivityPrivate bool `xorm:"NOT NULL DEFAULT false"`
|
||||
ShowHeatmapOnProfile bool `xorm:"NOT NULL DEFAULT false"`
|
||||
}
|
||||
|
||||
// Meta defines the meta information of a user, to be stored in the K/V table
|
||||
|
||||
137
models/user/user_pinned.go
Normal file
@@ -0,0 +1,137 @@
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package user
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"code.gitea.io/gitea/models/db"
|
||||
"code.gitea.io/gitea/modules/timeutil"
|
||||
)
|
||||
|
||||
// PinnedRepo represents a pinned repository for a user's profile
|
||||
type PinnedRepo struct {
|
||||
ID int64 `xorm:"pk autoincr"`
|
||||
UserID int64 `xorm:"INDEX NOT NULL"`
|
||||
RepoID int64 `xorm:"INDEX NOT NULL"`
|
||||
DisplayOrder int `xorm:"DEFAULT 0"`
|
||||
CreatedUnix timeutil.TimeStamp `xorm:"created"`
|
||||
|
||||
Repo any `xorm:"-"` // Will be loaded by caller to avoid import cycle
|
||||
}
|
||||
|
||||
// TableName returns the table name for PinnedRepo
|
||||
func (p *PinnedRepo) TableName() string {
|
||||
return "user_pinned_repo"
|
||||
}
|
||||
|
||||
func init() {
|
||||
db.RegisterModel(new(PinnedRepo))
|
||||
}
|
||||
|
||||
// MaxPinnedRepos is the maximum number of repos a user can pin
|
||||
const MaxPinnedRepos = 6
|
||||
|
||||
// GetPinnedRepos returns all pinned repos for a user
|
||||
func GetPinnedRepos(ctx context.Context, userID int64) ([]*PinnedRepo, error) {
|
||||
pinnedRepos := make([]*PinnedRepo, 0, MaxPinnedRepos)
|
||||
err := db.GetEngine(ctx).
|
||||
Where("user_id = ?", userID).
|
||||
OrderBy("display_order ASC, id ASC").
|
||||
Find(&pinnedRepos)
|
||||
return pinnedRepos, err
|
||||
}
|
||||
|
||||
// CountPinnedRepos returns the count of pinned repos for a user
|
||||
func CountPinnedRepos(ctx context.Context, userID int64) (int64, error) {
|
||||
return db.GetEngine(ctx).Where("user_id = ?", userID).Count(new(PinnedRepo))
|
||||
}
|
||||
|
||||
// IsRepoPinnedByUser checks if a repo is pinned by a user
|
||||
func IsRepoPinnedByUser(ctx context.Context, userID, repoID int64) (bool, error) {
|
||||
return db.GetEngine(ctx).Where("user_id = ? AND repo_id = ?", userID, repoID).Exist(new(PinnedRepo))
|
||||
}
|
||||
|
||||
// PinRepoToUser pins a repo to a user's profile
|
||||
func PinRepoToUser(ctx context.Context, userID, repoID int64) error {
|
||||
// Check if already pinned
|
||||
exists, err := IsRepoPinnedByUser(ctx, userID, repoID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if exists {
|
||||
return nil // Already pinned
|
||||
}
|
||||
|
||||
// Check max limit
|
||||
count, err := CountPinnedRepos(ctx, userID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if count >= MaxPinnedRepos {
|
||||
return ErrPinnedRepoLimit{UserID: userID, Limit: MaxPinnedRepos}
|
||||
}
|
||||
|
||||
// Get next display order
|
||||
var maxOrder int
|
||||
_, err = db.GetEngine(ctx).
|
||||
Table("user_pinned_repo").
|
||||
Where("user_id = ?", userID).
|
||||
Select("COALESCE(MAX(display_order), 0)").
|
||||
Get(&maxOrder)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
pinnedRepo := &PinnedRepo{
|
||||
UserID: userID,
|
||||
RepoID: repoID,
|
||||
DisplayOrder: maxOrder + 1,
|
||||
}
|
||||
|
||||
_, err = db.GetEngine(ctx).Insert(pinnedRepo)
|
||||
return err
|
||||
}
|
||||
|
||||
// UnpinRepoFromUser unpins a repo from a user's profile
|
||||
func UnpinRepoFromUser(ctx context.Context, userID, repoID int64) error {
|
||||
_, err := db.GetEngine(ctx).Where("user_id = ? AND repo_id = ?", userID, repoID).Delete(new(PinnedRepo))
|
||||
return err
|
||||
}
|
||||
|
||||
// UpdatePinnedRepoOrder updates the display order of pinned repos
|
||||
func UpdatePinnedRepoOrder(ctx context.Context, userID int64, repoIDs []int64) error {
|
||||
for i, repoID := range repoIDs {
|
||||
_, err := db.GetEngine(ctx).
|
||||
Where("user_id = ? AND repo_id = ?", userID, repoID).
|
||||
Cols("display_order").
|
||||
Update(&PinnedRepo{DisplayOrder: i})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeletePinnedReposByRepoID deletes all pins for a repo (when repo is deleted)
|
||||
func DeletePinnedReposByRepoID(ctx context.Context, repoID int64) error {
|
||||
_, err := db.GetEngine(ctx).Where("repo_id = ?", repoID).Delete(new(PinnedRepo))
|
||||
return err
|
||||
}
|
||||
|
||||
// ErrPinnedRepoLimit represents an error when user has reached pin limit
|
||||
type ErrPinnedRepoLimit struct {
|
||||
UserID int64
|
||||
Limit int
|
||||
}
|
||||
|
||||
func (err ErrPinnedRepoLimit) Error() string {
|
||||
return "user has reached the maximum number of pinned repositories"
|
||||
}
|
||||
|
||||
// IsErrPinnedRepoLimit checks if error is ErrPinnedRepoLimit
|
||||
func IsErrPinnedRepoLimit(err error) bool {
|
||||
_, ok := err.(ErrPinnedRepoLimit)
|
||||
return ok
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package actions
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
// Package circuitbreaker implements the circuit breaker pattern for external service calls.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package errors
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package errors
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
// Package health provides comprehensive health checking for Gitea services.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
// Package idempotency provides middleware for idempotent POST request handling.
|
||||
|
||||
@@ -109,3 +109,7 @@ func UnmarshalHandleDoubleEncode(bs []byte, v any) error {
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
// RawMessage is a raw encoded JSON value.
|
||||
// It implements Marshaler and Unmarshaler and can be used to delay JSON decoding.
|
||||
type RawMessage = json.RawMessage
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
// Package operations provides tracking for long-running operations
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2022 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2022 The Gitea Authors and MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package nuget
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package pages
|
||||
@@ -14,33 +14,42 @@ import (
|
||||
// LandingConfig represents the parsed .gitea/landing.yaml configuration
|
||||
type LandingConfig struct {
|
||||
Enabled bool `yaml:"enabled"`
|
||||
PublicLanding bool `yaml:"public_landing"` // Allow public access even for private repos
|
||||
Template string `yaml:"template"` // simple, documentation, product, portfolio
|
||||
PublicLanding bool `yaml:"public_landing"`
|
||||
Template string `yaml:"template"` // open-source-hero, minimalist-docs, saas-conversion, bold-marketing
|
||||
|
||||
// Custom domain (optional)
|
||||
Domain string `yaml:"domain,omitempty"`
|
||||
|
||||
// Branding
|
||||
Branding BrandingConfig `yaml:"branding,omitempty"`
|
||||
// Brand configuration
|
||||
Brand BrandConfig `yaml:"brand,omitempty"`
|
||||
|
||||
// Hero section
|
||||
Hero HeroConfig `yaml:"hero,omitempty"`
|
||||
|
||||
// Features (for product template)
|
||||
// Stats/metrics
|
||||
Stats []StatConfig `yaml:"stats,omitempty"`
|
||||
|
||||
// Value propositions
|
||||
ValueProps []ValuePropConfig `yaml:"value_props,omitempty"`
|
||||
|
||||
// Features
|
||||
Features []FeatureConfig `yaml:"features,omitempty"`
|
||||
|
||||
// Sections
|
||||
Sections []SectionConfig `yaml:"sections,omitempty"`
|
||||
// Social proof
|
||||
SocialProof SocialProofConfig `yaml:"social_proof,omitempty"`
|
||||
|
||||
// Documentation settings (for documentation template)
|
||||
Documentation DocumentationConfig `yaml:"documentation,omitempty"`
|
||||
// Pricing (for saas-conversion template)
|
||||
Pricing PricingConfig `yaml:"pricing,omitempty"`
|
||||
|
||||
// Gallery settings (for portfolio template)
|
||||
Gallery GalleryConfig `yaml:"gallery,omitempty"`
|
||||
// CTA section
|
||||
CTASection CTASectionConfig `yaml:"cta_section,omitempty"`
|
||||
|
||||
// Footer
|
||||
Footer FooterConfig `yaml:"footer,omitempty"`
|
||||
|
||||
// Theme customization
|
||||
Theme ThemeConfig `yaml:"theme,omitempty"`
|
||||
|
||||
// SEO & Social
|
||||
SEO SEOConfig `yaml:"seo,omitempty"`
|
||||
|
||||
@@ -51,111 +60,116 @@ type LandingConfig struct {
|
||||
Advanced AdvancedConfig `yaml:"advanced,omitempty"`
|
||||
}
|
||||
|
||||
// BrandingConfig represents branding settings
|
||||
type BrandingConfig struct {
|
||||
Logo string `yaml:"logo,omitempty"`
|
||||
LogoDark string `yaml:"logo_dark,omitempty"`
|
||||
Favicon string `yaml:"favicon,omitempty"`
|
||||
PrimaryColor string `yaml:"primary_color,omitempty"`
|
||||
SecondaryColor string `yaml:"secondary_color,omitempty"`
|
||||
AccentColor string `yaml:"accent_color,omitempty"`
|
||||
DarkMode string `yaml:"dark_mode,omitempty"` // auto, light, dark, both
|
||||
HeadingFont string `yaml:"heading_font,omitempty"`
|
||||
BodyFont string `yaml:"body_font,omitempty"`
|
||||
// BrandConfig represents brand/identity settings
|
||||
type BrandConfig struct {
|
||||
Name string `yaml:"name,omitempty"`
|
||||
LogoURL string `yaml:"logo_url,omitempty"`
|
||||
Tagline string `yaml:"tagline,omitempty"`
|
||||
}
|
||||
|
||||
// HeroConfig represents hero section settings
|
||||
type HeroConfig struct {
|
||||
Title string `yaml:"title,omitempty"`
|
||||
Tagline string `yaml:"tagline,omitempty"`
|
||||
Background string `yaml:"background,omitempty"`
|
||||
Gradient string `yaml:"gradient,omitempty"`
|
||||
Color string `yaml:"color,omitempty"`
|
||||
CTAPrimary CTAConfig `yaml:"cta_primary,omitempty"`
|
||||
CTASecondary CTAConfig `yaml:"cta_secondary,omitempty"`
|
||||
Headline string `yaml:"headline,omitempty"`
|
||||
Subheadline string `yaml:"subheadline,omitempty"`
|
||||
PrimaryCTA CTAButton `yaml:"primary_cta,omitempty"`
|
||||
SecondaryCTA CTAButton `yaml:"secondary_cta,omitempty"`
|
||||
ImageURL string `yaml:"image_url,omitempty"`
|
||||
CodeExample string `yaml:"code_example,omitempty"`
|
||||
VideoURL string `yaml:"video_url,omitempty"`
|
||||
}
|
||||
|
||||
// CTAConfig represents a call-to-action button
|
||||
type CTAConfig struct {
|
||||
Text string `yaml:"text,omitempty"`
|
||||
Link string `yaml:"link,omitempty"`
|
||||
Style string `yaml:"style,omitempty"` // outline, ghost
|
||||
// CTAButton represents a call-to-action button
|
||||
type CTAButton struct {
|
||||
Label string `yaml:"label,omitempty"`
|
||||
URL string `yaml:"url,omitempty"`
|
||||
Variant string `yaml:"variant,omitempty"` // primary, secondary, outline, text
|
||||
}
|
||||
|
||||
// StatConfig represents a single stat/metric
|
||||
type StatConfig struct {
|
||||
Value string `yaml:"value,omitempty"`
|
||||
Label string `yaml:"label,omitempty"`
|
||||
}
|
||||
|
||||
// ValuePropConfig represents a value proposition
|
||||
type ValuePropConfig struct {
|
||||
Title string `yaml:"title,omitempty"`
|
||||
Description string `yaml:"description,omitempty"`
|
||||
Icon string `yaml:"icon,omitempty"`
|
||||
}
|
||||
|
||||
// FeatureConfig represents a single feature item
|
||||
type FeatureConfig struct {
|
||||
Icon string `yaml:"icon,omitempty"`
|
||||
Title string `yaml:"title,omitempty"`
|
||||
Description string `yaml:"description,omitempty"`
|
||||
Icon string `yaml:"icon,omitempty"`
|
||||
ImageURL string `yaml:"image_url,omitempty"`
|
||||
}
|
||||
|
||||
// SectionConfig represents a content section
|
||||
type SectionConfig struct {
|
||||
Type string `yaml:"type,omitempty"` // features, screenshot, readme, releases, contributors, custom
|
||||
Image string `yaml:"image,omitempty"`
|
||||
Caption string `yaml:"caption,omitempty"`
|
||||
File string `yaml:"file,omitempty"`
|
||||
Title string `yaml:"title,omitempty"`
|
||||
Limit int `yaml:"limit,omitempty"`
|
||||
ShowNotes bool `yaml:"show_notes,omitempty"`
|
||||
ShowCount bool `yaml:"show_count,omitempty"`
|
||||
// SocialProofConfig represents social proof section
|
||||
type SocialProofConfig struct {
|
||||
Logos []string `yaml:"logos,omitempty"`
|
||||
Testimonial TestimonialConfig `yaml:"testimonial,omitempty"`
|
||||
Testimonials []TestimonialConfig `yaml:"testimonials,omitempty"`
|
||||
}
|
||||
|
||||
// DocumentationConfig represents documentation template settings
|
||||
type DocumentationConfig struct {
|
||||
Source string `yaml:"source,omitempty"`
|
||||
Search bool `yaml:"search,omitempty"`
|
||||
TOC bool `yaml:"toc,omitempty"`
|
||||
Sidebar []SidebarGroup `yaml:"sidebar,omitempty"`
|
||||
EditLinks EditLinksConfig `yaml:"edit_links,omitempty"`
|
||||
// TestimonialConfig represents a testimonial
|
||||
type TestimonialConfig struct {
|
||||
Quote string `yaml:"quote,omitempty"`
|
||||
Author string `yaml:"author,omitempty"`
|
||||
Role string `yaml:"role,omitempty"`
|
||||
Avatar string `yaml:"avatar,omitempty"`
|
||||
}
|
||||
|
||||
// SidebarGroup represents a sidebar navigation group
|
||||
type SidebarGroup struct {
|
||||
Title string `yaml:"title,omitempty"`
|
||||
Items []string `yaml:"items,omitempty"`
|
||||
Collapsed bool `yaml:"collapsed,omitempty"`
|
||||
// PricingConfig represents pricing section
|
||||
type PricingConfig struct {
|
||||
Headline string `yaml:"headline,omitempty"`
|
||||
Subheadline string `yaml:"subheadline,omitempty"`
|
||||
Plans []PricingPlanConfig `yaml:"plans,omitempty"`
|
||||
}
|
||||
|
||||
// EditLinksConfig represents edit link settings
|
||||
type EditLinksConfig struct {
|
||||
Enabled bool `yaml:"enabled,omitempty"`
|
||||
Text string `yaml:"text,omitempty"`
|
||||
// PricingPlanConfig represents a pricing plan
|
||||
type PricingPlanConfig struct {
|
||||
Name string `yaml:"name,omitempty"`
|
||||
Price string `yaml:"price,omitempty"`
|
||||
Period string `yaml:"period,omitempty"`
|
||||
Features []string `yaml:"features,omitempty"`
|
||||
CTA string `yaml:"cta,omitempty"`
|
||||
Featured bool `yaml:"featured,omitempty"`
|
||||
}
|
||||
|
||||
// GalleryConfig represents gallery/portfolio template settings
|
||||
type GalleryConfig struct {
|
||||
Source string `yaml:"source,omitempty"`
|
||||
Columns int `yaml:"columns,omitempty"`
|
||||
Lightbox bool `yaml:"lightbox,omitempty"`
|
||||
Captions bool `yaml:"captions,omitempty"`
|
||||
Items []GalleryItem `yaml:"items,omitempty"`
|
||||
}
|
||||
|
||||
// GalleryItem represents a single gallery item
|
||||
type GalleryItem struct {
|
||||
Image string `yaml:"image,omitempty"`
|
||||
Title string `yaml:"title,omitempty"`
|
||||
Link string `yaml:"link,omitempty"`
|
||||
// CTASectionConfig represents the final CTA section
|
||||
type CTASectionConfig struct {
|
||||
Headline string `yaml:"headline,omitempty"`
|
||||
Subheadline string `yaml:"subheadline,omitempty"`
|
||||
Button CTAButton `yaml:"button,omitempty"`
|
||||
}
|
||||
|
||||
// FooterConfig represents footer settings
|
||||
type FooterConfig struct {
|
||||
Links []FooterLinkGroup `yaml:"links,omitempty"`
|
||||
Copyright string `yaml:"copyright,omitempty"`
|
||||
ShowPoweredBy bool `yaml:"show_powered_by,omitempty"`
|
||||
}
|
||||
|
||||
// FooterLinkGroup represents a group of footer links
|
||||
type FooterLinkGroup struct {
|
||||
Title string `yaml:"title,omitempty"`
|
||||
Items []FooterLink `yaml:"items,omitempty"`
|
||||
Links []FooterLink `yaml:"links,omitempty"`
|
||||
Social []SocialLink `yaml:"social,omitempty"`
|
||||
Copyright string `yaml:"copyright,omitempty"`
|
||||
ShowPoweredBy bool `yaml:"show_powered_by,omitempty"`
|
||||
}
|
||||
|
||||
// FooterLink represents a single footer link
|
||||
type FooterLink struct {
|
||||
Text string `yaml:"text,omitempty"`
|
||||
URL string `yaml:"url,omitempty"`
|
||||
Label string `yaml:"label,omitempty"`
|
||||
URL string `yaml:"url,omitempty"`
|
||||
}
|
||||
|
||||
// SocialLink represents a social media link
|
||||
type SocialLink struct {
|
||||
Platform string `yaml:"platform,omitempty"` // twitter, github, discord, linkedin, youtube
|
||||
URL string `yaml:"url,omitempty"`
|
||||
}
|
||||
|
||||
// ThemeConfig represents theme customization
|
||||
type ThemeConfig struct {
|
||||
PrimaryColor string `yaml:"primary_color,omitempty"`
|
||||
AccentColor string `yaml:"accent_color,omitempty"`
|
||||
Mode string `yaml:"mode,omitempty"` // light, dark, auto
|
||||
}
|
||||
|
||||
// SEOConfig represents SEO and social sharing settings
|
||||
@@ -186,15 +200,14 @@ type AdvancedConfig struct {
|
||||
CustomCSS string `yaml:"custom_css,omitempty"`
|
||||
CustomHead string `yaml:"custom_head,omitempty"`
|
||||
Redirects map[string]string `yaml:"redirects,omitempty"`
|
||||
PublicReleases bool `yaml:"public_releases,omitempty"` // Allow public access to releases even for private repos
|
||||
PublicReleases bool `yaml:"public_releases,omitempty"`
|
||||
}
|
||||
|
||||
// ParseLandingConfig parses a landing.yaml file content
|
||||
func ParseLandingConfig(content []byte) (*LandingConfig, error) {
|
||||
config := &LandingConfig{
|
||||
// Set defaults
|
||||
Enabled: true,
|
||||
Template: "simple",
|
||||
Template: "open-source-hero",
|
||||
}
|
||||
|
||||
if err := yaml.Unmarshal(content, config); err != nil {
|
||||
@@ -203,13 +216,10 @@ func ParseLandingConfig(content []byte) (*LandingConfig, error) {
|
||||
|
||||
// Apply defaults
|
||||
if config.Template == "" {
|
||||
config.Template = "simple"
|
||||
config.Template = "open-source-hero"
|
||||
}
|
||||
if config.Branding.DarkMode == "" {
|
||||
config.Branding.DarkMode = "auto"
|
||||
}
|
||||
if config.Gallery.Columns == 0 {
|
||||
config.Gallery.Columns = 4
|
||||
if config.Theme.Mode == "" {
|
||||
config.Theme.Mode = "auto"
|
||||
}
|
||||
|
||||
return config, nil
|
||||
@@ -225,36 +235,62 @@ func HashConfig(content []byte) string {
|
||||
func DefaultConfig() *LandingConfig {
|
||||
return &LandingConfig{
|
||||
Enabled: true,
|
||||
Template: "simple",
|
||||
Branding: BrandingConfig{
|
||||
DarkMode: "auto",
|
||||
},
|
||||
Template: "open-source-hero",
|
||||
Hero: HeroConfig{
|
||||
CTAPrimary: CTAConfig{
|
||||
Text: "Get Started",
|
||||
Link: "#installation",
|
||||
Headline: "Build something amazing",
|
||||
Subheadline: "A powerful toolkit for developers who want to ship fast.",
|
||||
PrimaryCTA: CTAButton{
|
||||
Label: "Get Started",
|
||||
URL: "#",
|
||||
},
|
||||
CTASecondary: CTAConfig{
|
||||
Text: "View Documentation",
|
||||
Link: "#readme",
|
||||
SecondaryCTA: CTAButton{
|
||||
Label: "View on GitHub",
|
||||
URL: "#",
|
||||
},
|
||||
},
|
||||
Sections: []SectionConfig{
|
||||
{Type: "readme"},
|
||||
{Type: "releases", Limit: 3},
|
||||
Stats: []StatConfig{
|
||||
{Value: "10k+", Label: "Downloads"},
|
||||
{Value: "100+", Label: "Contributors"},
|
||||
{Value: "MIT", Label: "License"},
|
||||
},
|
||||
ValueProps: []ValuePropConfig{
|
||||
{Title: "Fast", Description: "Optimized for performance out of the box.", Icon: "zap"},
|
||||
{Title: "Flexible", Description: "Adapts to your workflow, not the other way around.", Icon: "gear"},
|
||||
{Title: "Open Source", Description: "Free forever. Community driven.", Icon: "heart"},
|
||||
},
|
||||
CTASection: CTASectionConfig{
|
||||
Headline: "Ready to get started?",
|
||||
Subheadline: "Join thousands of developers already using this project.",
|
||||
Button: CTAButton{
|
||||
Label: "Get Started Free",
|
||||
URL: "#",
|
||||
},
|
||||
},
|
||||
Footer: FooterConfig{
|
||||
ShowPoweredBy: true,
|
||||
},
|
||||
Theme: ThemeConfig{
|
||||
Mode: "auto",
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// ValidTemplates returns the list of valid template names
|
||||
func ValidTemplates() []string {
|
||||
return []string{"simple", "documentation", "product", "portfolio"}
|
||||
return []string{"open-source-hero", "minimalist-docs", "saas-conversion", "bold-marketing"}
|
||||
}
|
||||
|
||||
// IsValidTemplate checks if a template name is valid
|
||||
func IsValidTemplate(name string) bool {
|
||||
return slices.Contains(ValidTemplates(), name)
|
||||
}
|
||||
|
||||
// TemplateDisplayNames returns a map of template names to display names
|
||||
func TemplateDisplayNames() map[string]string {
|
||||
return map[string]string{
|
||||
"open-source-hero": "Open Source Hero",
|
||||
"minimalist-docs": "Minimalist Docs",
|
||||
"saas-conversion": "SaaS Conversion",
|
||||
"bold-marketing": "Bold Marketing",
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2023 The Gitea Authors and MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package setting
|
||||
|
||||
@@ -53,9 +53,24 @@ type RepositoryStruct struct {
|
||||
GitGuideRemoteName *config.Value[string]
|
||||
}
|
||||
|
||||
type ThemeStruct struct {
|
||||
DisableRegistration *config.Value[bool]
|
||||
HideExploreUsers *config.Value[bool]
|
||||
HelpURL *config.Value[string]
|
||||
CustomSiteIconURL *config.Value[string]
|
||||
CustomHomeLogoURL *config.Value[string]
|
||||
CustomHomeHTML *config.Value[string]
|
||||
APIHeaderURL *config.Value[string]
|
||||
CustomHomeTitle *config.Value[string]
|
||||
CustomHomeTagline *config.Value[string]
|
||||
PinnedOrgDisplayFormat *config.Value[string]
|
||||
ExploreOrgDisplayFormat *config.Value[string]
|
||||
}
|
||||
|
||||
type ConfigStruct struct {
|
||||
Picture *PictureStruct
|
||||
Repository *RepositoryStruct
|
||||
Theme *ThemeStruct
|
||||
}
|
||||
|
||||
var (
|
||||
@@ -74,6 +89,19 @@ func initDefaultConfig() {
|
||||
OpenWithEditorApps: config.ValueJSON[OpenWithEditorAppsType]("repository.open-with.editor-apps"),
|
||||
GitGuideRemoteName: config.ValueJSON[string]("repository.git-guide-remote-name").WithDefault("origin"),
|
||||
},
|
||||
Theme: &ThemeStruct{
|
||||
DisableRegistration: config.ValueJSON[bool]("theme.disable_registration").WithFileConfig(config.CfgSecKey{Sec: "service", Key: "DISABLE_REGISTRATION"}),
|
||||
HideExploreUsers: config.ValueJSON[bool]("theme.hide_explore_users").WithDefault(false),
|
||||
HelpURL: config.ValueJSON[string]("theme.help_url").WithDefault(""),
|
||||
CustomSiteIconURL: config.ValueJSON[string]("theme.custom_site_icon_url").WithDefault(""),
|
||||
CustomHomeLogoURL: config.ValueJSON[string]("theme.custom_home_logo_url").WithDefault(""),
|
||||
CustomHomeHTML: config.ValueJSON[string]("theme.custom_home_html").WithDefault(""),
|
||||
APIHeaderURL: config.ValueJSON[string]("theme.api_header_url").WithDefault(""),
|
||||
CustomHomeTitle: config.ValueJSON[string]("theme.custom_home_title").WithDefault(""),
|
||||
CustomHomeTagline: config.ValueJSON[string]("theme.custom_home_tagline").WithDefault(""),
|
||||
PinnedOrgDisplayFormat: config.ValueJSON[string]("theme.pinned_org_display_format").WithDefault("condensed"),
|
||||
ExploreOrgDisplayFormat: config.ValueJSON[string]("theme.explore_org_display_format").WithDefault("list"),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,9 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
// EnvConfigKeyPrefixGitCaddy is the primary prefix for GitCaddy environment variables
|
||||
EnvConfigKeyPrefixGitCaddy = "GITCADDY__"
|
||||
// EnvConfigKeyPrefixGitea is the legacy prefix for backward compatibility
|
||||
EnvConfigKeyPrefixGitea = "GITEA__"
|
||||
EnvConfigKeySuffixFile = "__FILE"
|
||||
)
|
||||
@@ -24,7 +27,8 @@ var escapeRegex = regexp.MustCompile(escapeRegexpString)
|
||||
|
||||
func CollectEnvConfigKeys() (keys []string) {
|
||||
for _, env := range os.Environ() {
|
||||
if strings.HasPrefix(env, EnvConfigKeyPrefixGitea) {
|
||||
// Support both GITCADDY__ and GITEA__ prefixes
|
||||
if strings.HasPrefix(env, EnvConfigKeyPrefixGitCaddy) || strings.HasPrefix(env, EnvConfigKeyPrefixGitea) {
|
||||
k, _, _ := strings.Cut(env, "=")
|
||||
keys = append(keys, k)
|
||||
}
|
||||
@@ -41,7 +45,7 @@ func ClearEnvConfigKeys() {
|
||||
// decodeEnvSectionKey will decode a portable string encoded Section__Key pair
|
||||
// Portable strings are considered to be of the form [A-Z0-9_]*
|
||||
// We will encode a disallowed value as the UTF8 byte string preceded by _0X and
|
||||
// followed by _. E.g. _0X2C_ for a '-' and _0X2E_ for '.'
|
||||
// followed by _. E.g. _0X2C_ for a '-', and _0X2E_ for '.'.
|
||||
// Section and Key are separated by a plain '__'.
|
||||
// The entire section can be encoded as a UTF8 byte string
|
||||
func decodeEnvSectionKey(encoded string) (ok bool, section, key string) {
|
||||
@@ -96,16 +100,22 @@ func decodeEnvSectionKey(encoded string) (ok bool, section, key string) {
|
||||
}
|
||||
|
||||
// decodeEnvironmentKey decode the environment key to section and key
|
||||
// The environment key is in the form of GITEA__SECTION__KEY or GITEA__SECTION__KEY__FILE
|
||||
func decodeEnvironmentKey(prefixGitea, suffixFile, envKey string) (ok bool, section, key string, useFileValue bool) {
|
||||
if !strings.HasPrefix(envKey, prefixGitea) {
|
||||
// The environment key is in the form of GITCADDY__SECTION__KEY or GITEA__SECTION__KEY (legacy)
|
||||
// or GITCADDY__SECTION__KEY__FILE / GITEA__SECTION__KEY__FILE
|
||||
func decodeEnvironmentKey(prefixGitCaddy, prefixGitea, suffixFile, envKey string) (ok bool, section, key string, useFileValue bool) {
|
||||
var prefix string
|
||||
if strings.HasPrefix(envKey, prefixGitCaddy) {
|
||||
prefix = prefixGitCaddy
|
||||
} else if strings.HasPrefix(envKey, prefixGitea) {
|
||||
prefix = prefixGitea
|
||||
} else {
|
||||
return false, "", "", false
|
||||
}
|
||||
if strings.HasSuffix(envKey, suffixFile) {
|
||||
useFileValue = true
|
||||
envKey = envKey[:len(envKey)-len(suffixFile)]
|
||||
}
|
||||
ok, section, key = decodeEnvSectionKey(envKey[len(prefixGitea):])
|
||||
ok, section, key = decodeEnvSectionKey(envKey[len(prefix):])
|
||||
return ok, section, key, useFileValue
|
||||
}
|
||||
|
||||
@@ -119,7 +129,7 @@ func EnvironmentToConfig(cfg ConfigProvider, envs []string) (changed bool) {
|
||||
// parse the environment variable to config section name and key name
|
||||
envKey := before
|
||||
envValue := after
|
||||
ok, sectionName, keyName, useFileValue := decodeEnvironmentKey(EnvConfigKeyPrefixGitea, EnvConfigKeySuffixFile, envKey)
|
||||
ok, sectionName, keyName, useFileValue := decodeEnvironmentKey(EnvConfigKeyPrefixGitCaddy, EnvConfigKeyPrefixGitea, EnvConfigKeySuffixFile, envKey)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
@@ -167,20 +177,25 @@ func EnvironmentToConfig(cfg ConfigProvider, envs []string) (changed bool) {
|
||||
return changed
|
||||
}
|
||||
|
||||
// InitGiteaEnvVars initializes the environment variables for gitea
|
||||
func InitGiteaEnvVars() {
|
||||
// Ideally Gitea should only accept the environment variables which it clearly knows instead of unsetting the ones it doesn't want,
|
||||
// InitGitCaddyEnvVars initializes the environment variables for GitCaddy Server
|
||||
func InitGitCaddyEnvVars() {
|
||||
// Ideally GitCaddy should only accept the environment variables which it clearly knows instead of unsetting the ones it doesn't want,
|
||||
// but the ideal behavior would be a breaking change, and it seems not bringing enough benefits to end users,
|
||||
// so at the moment we could still keep "unsetting the unnecessary environments"
|
||||
|
||||
// HOME is managed by Gitea, Gitea's git should use "HOME/.gitconfig".
|
||||
// HOME is managed by GitCaddy, GitCaddy's git should use "HOME/.gitconfig".
|
||||
// But git would try "XDG_CONFIG_HOME/git/config" first if "HOME/.gitconfig" does not exist,
|
||||
// then our git.InitFull would still write to "XDG_CONFIG_HOME/git/config" if XDG_CONFIG_HOME is set.
|
||||
_ = os.Unsetenv("XDG_CONFIG_HOME")
|
||||
}
|
||||
|
||||
// InitGiteaEnvVars is an alias for InitGitCaddyEnvVars for backward compatibility
|
||||
func InitGiteaEnvVars() {
|
||||
InitGitCaddyEnvVars()
|
||||
}
|
||||
|
||||
func InitGiteaEnvVarsForTesting() {
|
||||
InitGiteaEnvVars()
|
||||
InitGitCaddyEnvVars()
|
||||
_ = os.Unsetenv("GIT_AUTHOR_NAME")
|
||||
_ = os.Unsetenv("GIT_AUTHOR_EMAIL")
|
||||
_ = os.Unsetenv("GIT_AUTHOR_DATE")
|
||||
|
||||
@@ -33,28 +33,29 @@ func TestDecodeEnvSectionKey(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestDecodeEnvironmentKey(t *testing.T) {
|
||||
prefix := "GITEA__"
|
||||
prefixGitCaddy := "GITCADDY__"
|
||||
prefixGitea := "GITEA__"
|
||||
suffix := "__FILE"
|
||||
|
||||
ok, section, key, file := decodeEnvironmentKey(prefix, suffix, "SEC__KEY")
|
||||
ok, section, key, file := decodeEnvironmentKey(prefixGitCaddy, prefixGitea, suffix, "SEC__KEY")
|
||||
assert.False(t, ok)
|
||||
assert.Empty(t, section)
|
||||
assert.Empty(t, key)
|
||||
assert.False(t, file)
|
||||
|
||||
ok, section, key, file = decodeEnvironmentKey(prefix, suffix, "GITEA__SEC")
|
||||
ok, section, key, file = decodeEnvironmentKey(prefixGitCaddy, prefixGitea, suffix, "GITEA__SEC")
|
||||
assert.False(t, ok)
|
||||
assert.Empty(t, section)
|
||||
assert.Empty(t, key)
|
||||
assert.False(t, file)
|
||||
|
||||
ok, section, key, file = decodeEnvironmentKey(prefix, suffix, "GITEA____KEY")
|
||||
ok, section, key, file = decodeEnvironmentKey(prefixGitCaddy, prefixGitea, suffix, "GITEA____KEY")
|
||||
assert.True(t, ok)
|
||||
assert.Empty(t, section)
|
||||
assert.Equal(t, "KEY", key)
|
||||
assert.False(t, file)
|
||||
|
||||
ok, section, key, file = decodeEnvironmentKey(prefix, suffix, "GITEA__SEC__KEY")
|
||||
ok, section, key, file = decodeEnvironmentKey(prefixGitCaddy, prefixGitea, suffix, "GITEA__SEC__KEY")
|
||||
assert.True(t, ok)
|
||||
assert.Equal(t, "sec", section)
|
||||
assert.Equal(t, "KEY", key)
|
||||
@@ -62,19 +63,19 @@ func TestDecodeEnvironmentKey(t *testing.T) {
|
||||
|
||||
// with "__FILE" suffix, it doesn't support to write "[sec].FILE" to config (no such key FILE is used in Gitea)
|
||||
// but it could be fixed in the future by adding a new suffix like "__VALUE" (no such key VALUE is used in Gitea either)
|
||||
ok, section, key, file = decodeEnvironmentKey(prefix, suffix, "GITEA__SEC__FILE")
|
||||
ok, section, key, file = decodeEnvironmentKey(prefixGitCaddy, prefixGitea, suffix, "GITEA__SEC__FILE")
|
||||
assert.False(t, ok)
|
||||
assert.Empty(t, section)
|
||||
assert.Empty(t, key)
|
||||
assert.True(t, file)
|
||||
|
||||
ok, section, key, file = decodeEnvironmentKey(prefix, suffix, "GITEA__SEC__KEY__FILE")
|
||||
ok, section, key, file = decodeEnvironmentKey(prefixGitCaddy, prefixGitea, suffix, "GITEA__SEC__KEY__FILE")
|
||||
assert.True(t, ok)
|
||||
assert.Equal(t, "sec", section)
|
||||
assert.Equal(t, "KEY", key)
|
||||
assert.True(t, file)
|
||||
|
||||
ok, _, _, _ = decodeEnvironmentKey("PREFIX__", "", "PREFIX__SEC__KEY")
|
||||
ok, _, _, _ = decodeEnvironmentKey("PREFIX__", "", "", "PREFIX__SEC__KEY")
|
||||
assert.True(t, ok)
|
||||
}
|
||||
|
||||
|
||||
@@ -18,11 +18,11 @@ var (
|
||||
// AppPath represents the path to the gitea binary
|
||||
AppPath string
|
||||
|
||||
// AppWorkPath is the "working directory" of Gitea. It maps to the: WORK_PATH in app.ini, "--work-path" flag, environment variable GITEA_WORK_DIR.
|
||||
// AppWorkPath is the "working directory" of GitCaddy. It maps to the: WORK_PATH in app.ini, "--work-path" flag, environment variable GITCADDY_WORK_DIR (or GITEA_WORK_DIR for backward compatibility).
|
||||
// If that is not set it is the default set here by the linker or failing that the directory of AppPath.
|
||||
// It is used as the base path for several other paths.
|
||||
AppWorkPath string
|
||||
CustomPath string // Custom directory path. Env: GITEA_CUSTOM
|
||||
CustomPath string // Custom directory path. Env: GITCADDY_CUSTOM (or GITEA_CUSTOM for backward compatibility)
|
||||
CustomConf string
|
||||
|
||||
appWorkPathBuiltin string
|
||||
|
||||
@@ -183,7 +183,7 @@ func MakeAbsoluteAssetURL(appURL, staticURLPrefix string) string {
|
||||
|
||||
func loadServerFrom(rootCfg ConfigProvider) {
|
||||
sec := rootCfg.Section("server")
|
||||
AppName = rootCfg.Section("").Key("APP_NAME").MustString("Gitea: Git with a cup of tea")
|
||||
AppName = rootCfg.Section("").Key("APP_NAME").MustString("GitCaddy")
|
||||
|
||||
Domain = sec.Key("DOMAIN").MustString("localhost")
|
||||
HTTPAddr = sec.Key("HTTP_ADDR").MustString("0.0.0.0")
|
||||
|
||||
@@ -96,7 +96,7 @@ func InitCfgProvider(file string) {
|
||||
|
||||
func MustInstalled() {
|
||||
if !InstallLock {
|
||||
log.Fatal(`Unable to load config file for a installed Gitea instance, you should either use "--config" to set your config file (app.ini), or run "gitea web" command to install Gitea.`)
|
||||
log.Fatal(`Unable to load config file for a installed GitCaddy instance, you should either use "--config" to set your config file (app.ini), or run "gitcaddy-server web" command to install GitCaddy.`)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -176,9 +176,9 @@ func loadRunModeFrom(rootCfg ConfigProvider) {
|
||||
if os.Getuid() == 0 {
|
||||
if !unsafeAllowRunAsRoot {
|
||||
// Special thanks to VLC which inspired the wording of this messaging.
|
||||
log.Fatal("Gitea is not supposed to be run as root. Sorry. If you need to use privileged TCP ports please instead use setcap and the `cap_net_bind_service` permission")
|
||||
log.Fatal("GitCaddy Server is not supposed to be run as root. Sorry. If you need to use privileged TCP ports please instead use setcap and the `cap_net_bind_service` permission")
|
||||
}
|
||||
log.Critical("You are running Gitea using the root user, and have purposely chosen to skip built-in protections around this. You have been warned against this.")
|
||||
log.Critical("You are running GitCaddy Server using the root user, and have purposely chosen to skip built-in protections around this. You have been warned against this.")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2023 The Gitea Authors and MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package storage
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2023 The Gitea Authors and MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package storage
|
||||
|
||||
@@ -1,19 +1,59 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package structs
|
||||
|
||||
import "time"
|
||||
|
||||
// BandwidthInfo holds network bandwidth test results
|
||||
type BandwidthInfo struct {
|
||||
DownloadMbps float64 `json:"download_mbps"`
|
||||
UploadMbps float64 `json:"upload_mbps,omitempty"`
|
||||
Latency float64 `json:"latency_ms,omitempty"`
|
||||
TestedAt time.Time `json:"tested_at"`
|
||||
}
|
||||
|
||||
// DiskInfo holds disk space information for a runner
|
||||
type DiskInfo struct {
|
||||
Total uint64 `json:"total_bytes"`
|
||||
Free uint64 `json:"free_bytes"`
|
||||
Used uint64 `json:"used_bytes"`
|
||||
UsedPercent float64 `json:"used_percent"`
|
||||
}
|
||||
|
||||
// DistroInfo holds Linux distribution information
|
||||
type DistroInfo struct {
|
||||
ID string `json:"id,omitempty"` // e.g., "ubuntu", "debian", "fedora"
|
||||
VersionID string `json:"version_id,omitempty"` // e.g., "24.04", "12"
|
||||
PrettyName string `json:"pretty_name,omitempty"` // e.g., "Ubuntu 24.04 LTS"
|
||||
}
|
||||
|
||||
// XcodeInfo holds Xcode-specific information for macOS runners
|
||||
type XcodeInfo struct {
|
||||
Version string `json:"version,omitempty"`
|
||||
Build string `json:"build,omitempty"`
|
||||
SDKs []string `json:"sdks,omitempty"`
|
||||
Simulators []string `json:"simulators,omitempty"`
|
||||
}
|
||||
|
||||
// RunnerCapability represents the detailed capabilities of a runner
|
||||
type RunnerCapability struct {
|
||||
OS string `json:"os"`
|
||||
Arch string `json:"arch"`
|
||||
Distro *DistroInfo `json:"distro,omitempty"`
|
||||
Xcode *XcodeInfo `json:"xcode,omitempty"`
|
||||
Docker bool `json:"docker"`
|
||||
DockerCompose bool `json:"docker_compose"`
|
||||
ContainerRuntime string `json:"container_runtime,omitempty"`
|
||||
Shell []string `json:"shell,omitempty"`
|
||||
Tools map[string][]string `json:"tools,omitempty"`
|
||||
BuildTools []string `json:"build_tools,omitempty"`
|
||||
PackageManagers []string `json:"package_managers,omitempty"`
|
||||
Features *CapabilityFeatures `json:"features,omitempty"`
|
||||
Limitations []string `json:"limitations,omitempty"`
|
||||
Disk *DiskInfo `json:"disk,omitempty"`
|
||||
Bandwidth *BandwidthInfo `json:"bandwidth,omitempty"`
|
||||
SuggestedLabels []string `json:"suggested_labels,omitempty"`
|
||||
}
|
||||
|
||||
// CapabilityFeatures represents feature support flags
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2017 The Gitea Authors and MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package structs // import "code.gitea.io/gitea/modules/structs"
|
||||
|
||||
@@ -179,10 +179,10 @@ type OrgOverview struct {
|
||||
|
||||
// OrgOverviewStats represents organization statistics
|
||||
type OrgOverviewStats struct {
|
||||
MemberCount int64 `json:"member_count"`
|
||||
RepoCount int64 `json:"repo_count"`
|
||||
PublicRepoCount int64 `json:"public_repo_count"`
|
||||
TeamCount int64 `json:"team_count"`
|
||||
TotalRepos int64 `json:"total_repos"`
|
||||
TotalMembers int64 `json:"total_members"`
|
||||
TotalTeams int64 `json:"total_teams"`
|
||||
TotalStars int64 `json:"total_stars"`
|
||||
}
|
||||
|
||||
// OrgProfileContent represents the organization profile content
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2016 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2016 The Gitea Authors and MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package structs
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package structs
|
||||
@@ -38,6 +38,8 @@ type AddPagesDomainOption struct {
|
||||
// The custom domain to add
|
||||
// required: true
|
||||
Domain string `json:"domain" binding:"Required"`
|
||||
// Mark SSL as handled externally (e.g., by Cloudflare)
|
||||
SSLExternal bool `json:"ssl_external"`
|
||||
}
|
||||
|
||||
// PagesInfo represents the full pages information for a repository
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package structs
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2018 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2018 The Gitea Authors and MarketAlly. All rights reserved.
|
||||
// Copyright 2014 The Gogs Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
@@ -39,6 +39,7 @@ func NewFuncMap() template.FuncMap {
|
||||
"QueryEscape": queryEscape,
|
||||
"QueryBuild": QueryBuild,
|
||||
"SanitizeHTML": SanitizeHTML,
|
||||
"SafeHTML": SafeHTML,
|
||||
"URLJoin": util.URLJoin,
|
||||
"DotEscape": dotEscape,
|
||||
|
||||
@@ -46,10 +47,19 @@ func NewFuncMap() template.FuncMap {
|
||||
"PathEscapeSegments": util.PathEscapeSegments,
|
||||
|
||||
// utils
|
||||
"StringUtils": NewStringUtils,
|
||||
"SliceUtils": NewSliceUtils,
|
||||
"JsonUtils": NewJsonUtils,
|
||||
"DateUtils": NewDateUtils,
|
||||
"StringUtils": NewStringUtils,
|
||||
"SliceUtils": NewSliceUtils,
|
||||
"newSlice": func() []any { return []any{} },
|
||||
"Append": func(s []any, v any) []any { return append(s, v) },
|
||||
"Int64ToFloat64": func(i uint64) float64 { return float64(i) },
|
||||
"DivideFloat64": func(a, b float64) float64 {
|
||||
if b == 0 {
|
||||
return 0
|
||||
}
|
||||
return a / b
|
||||
},
|
||||
"JsonUtils": NewJsonUtils,
|
||||
"DateUtils": NewDateUtils,
|
||||
|
||||
// -----------------------------------------------------------------
|
||||
// svg / avatar / icon / color
|
||||
@@ -163,6 +173,11 @@ func SanitizeHTML(s string) template.HTML {
|
||||
return markup.Sanitize(s)
|
||||
}
|
||||
|
||||
// SafeHTML marks a string as safe HTML (no sanitization). Use with caution - only for trusted admin content.
|
||||
func SafeHTML(s string) template.HTML {
|
||||
return template.HTML(s)
|
||||
}
|
||||
|
||||
func htmlFormat(s any, args ...any) template.HTML {
|
||||
if len(args) == 0 {
|
||||
// to prevent developers from calling "HTMLFormat $userInput" by mistake which will lead to XSS
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2023 The Gitea Authors and MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package templates
|
||||
@@ -33,3 +33,17 @@ func (su *SliceUtils) Contains(s, v any) bool {
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// Append appends an element to a slice and returns the new slice
|
||||
func (su *SliceUtils) Append(s, v any) any {
|
||||
if s == nil {
|
||||
return []any{v}
|
||||
}
|
||||
sv := reflect.ValueOf(s)
|
||||
if sv.Kind() != reflect.Slice {
|
||||
panic(fmt.Sprintf("invalid type, expected slice, but got: %T", s))
|
||||
}
|
||||
// Create a new slice with the appended element
|
||||
newSlice := reflect.Append(sv, reflect.ValueOf(v))
|
||||
return newSlice.Interface()
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2023 The Gitea Authors and MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package templates
|
||||
@@ -35,6 +35,7 @@ func (su *StringUtils) ToString(v any) string {
|
||||
func (su *StringUtils) HasPrefix(s, prefix string) bool {
|
||||
return strings.HasPrefix(s, prefix)
|
||||
}
|
||||
func (su *StringUtils) HasSuffix(s, suffix string) bool { return strings.HasSuffix(s, suffix) }
|
||||
|
||||
func (su *StringUtils) Contains(s, substr string) bool {
|
||||
return strings.Contains(s, substr)
|
||||
@@ -61,6 +62,10 @@ func (su *StringUtils) ToUpper(s string) string {
|
||||
return strings.ToUpper(s)
|
||||
}
|
||||
|
||||
func (su *StringUtils) ToLower(s string) string {
|
||||
return strings.ToLower(s)
|
||||
}
|
||||
|
||||
func (su *StringUtils) TrimPrefix(s, prefix string) string {
|
||||
return strings.TrimPrefix(s, prefix)
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2017 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2017 The Gitea Authors and MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package validation
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package middleware
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package middleware
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2026 MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package webhook
|
||||
|
||||
@@ -174,14 +174,14 @@
|
||||
"error.report_message": "Pokud jste si jisti, že se jedná o chybu Gitea, prosím vyhledejte problémy na <a href=\"%s\" target=\"_blank\">GitHub</a> a v případě potřeby založte nový problém.",
|
||||
"error.not_found": "Cíl nebyl nalezen.",
|
||||
"error.network_error": "Chyba sítě",
|
||||
"startpage.app_desc": "Snadno přístupný vlastní Git",
|
||||
"startpage.install": "Jednoduchá na instalaci",
|
||||
"startpage.install_desc": "Jednoduše <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">spusťte jako binární program</a> pro vaši platformu, nasaďte jej pomocí <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">Docker</a>, nebo jej stáhněte jako <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">balíček</a>.",
|
||||
"startpage.platform": "Multiplatformní",
|
||||
"startpage.platform_desc": "Gitea běží všude, kde <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">Go</a> může kompilovat: Windows, macOS, Linux, ARM, atd. Vyberte si ten, který milujete!",
|
||||
"startpage.lightweight": "Lehká",
|
||||
"startpage.lightweight_desc": "Gitea má minimální požadavky a může běžet na Raspberry Pi. Šetřete energii vašeho stroje!",
|
||||
"startpage.license_desc": "Vše je na <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%[1]s\">%[2]s</a>! Připojte se tím, že <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%[3]s\">přispějete</a> a uděláte tento projekt ještě lepší. Nestyďte se být přispěvatel!",
|
||||
"startpage.app_desc": "Steeped in your workflow",
|
||||
"startpage.install": "Deploy Anywhere",
|
||||
"startpage.install_desc": "Run the binary, deploy with Docker, or use your favorite package manager. GitCaddy runs wherever you need it.",
|
||||
"startpage.platform": "AI-Native Platform",
|
||||
"startpage.platform_desc": "Built for the age of AI-assisted development. Structured APIs, capability discovery, and intelligent context for AI tools.",
|
||||
"startpage.lightweight": "Lightning Fast",
|
||||
"startpage.lightweight_desc": "Minimal footprint, maximum performance. GitCaddy runs efficiently on everything from Raspberry Pi to enterprise servers.",
|
||||
"startpage.license_desc": "GitCaddy is open source and built on the shoulders of giants. Based on Gitea, enhanced for the AI era.",
|
||||
"install.install": "Instalace",
|
||||
"install.title": "Výchozí konfigurace",
|
||||
"install.docker_helper": "Pokud spouštíte Gitea v Dockeru, přečtěte si <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">dokumentaci</a>, než budete měnit jakákoliv nastavení.",
|
||||
@@ -3307,4 +3307,4 @@
|
||||
"git.filemode.executable_file": "Spustitelný soubor",
|
||||
"git.filemode.symbolic_link": "Symbolický odkaz",
|
||||
"git.filemode.submodule": "Submodul"
|
||||
}
|
||||
}
|
||||
@@ -149,12 +149,12 @@
|
||||
"error.occurred": "Παρουσιάστηκε ένα σφάλμα",
|
||||
"error.not_found": "Ο προορισμός δεν βρέθηκε.",
|
||||
"error.network_error": "Σφάλμα δικτύου",
|
||||
"startpage.app_desc": "Μια ανώδυνη, αυτο-φιλοξενούμενη υπηρεσία Git",
|
||||
"startpage.install": "Εύκολο στην εγκατάσταση",
|
||||
"startpage.platform": "Πολυπλατφορμικό",
|
||||
"startpage.lightweight": "Ελαφρύ",
|
||||
"startpage.lightweight_desc": "Gitea έχει χαμηλές ελάχιστες απαιτήσεις και μπορεί να τρέξει σε ένα οικονομικό Raspberry Pi. Εξοικονομήστε ενέργεια!",
|
||||
"startpage.license": "Ανοικτού κώδικα",
|
||||
"startpage.app_desc": "Steeped in your workflow",
|
||||
"startpage.install": "Deploy Anywhere",
|
||||
"startpage.platform": "AI-Native Platform",
|
||||
"startpage.lightweight": "Lightning Fast",
|
||||
"startpage.lightweight_desc": "Minimal footprint, maximum performance. GitCaddy runs efficiently on everything from Raspberry Pi to enterprise servers.",
|
||||
"startpage.license": "Open Source",
|
||||
"install.install": "Εγκατάσταση",
|
||||
"install.title": "Αρχικές Ρυθμίσεις",
|
||||
"install.docker_helper": "Αν εκτελέσετε το Gitea μέσα στο Docker, παρακαλώ διαβάστε την <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">τεκμηρίωση</a> πριν αλλάξετε τις ρυθμίσεις.",
|
||||
@@ -3001,4 +3001,4 @@
|
||||
"git.filemode.normal_file": "Κανονικό αρχείο",
|
||||
"git.filemode.executable_file": "Εκτελέσιμο αρχείο",
|
||||
"git.filemode.submodule": "Υπομονάδα"
|
||||
}
|
||||
}
|
||||
@@ -13,6 +13,7 @@
|
||||
"register": "Register",
|
||||
"version": "Version",
|
||||
"powered_by": "Powered by %s",
|
||||
"based_on": "Based on",
|
||||
"page": "Page",
|
||||
"template": "Template",
|
||||
"language": "Language",
|
||||
@@ -25,7 +26,7 @@
|
||||
"enable_javascript": "This website requires JavaScript.",
|
||||
"toc": "Table of Contents",
|
||||
"licenses": "Licenses",
|
||||
"return_to_gitea": "Return to Gitea",
|
||||
"return_to_gitea": "Return to GitCaddy",
|
||||
"more_items": "More items",
|
||||
"username": "Username",
|
||||
"email": "Email Address",
|
||||
@@ -206,23 +207,23 @@
|
||||
"filter.string.asc": "A–Z",
|
||||
"filter.string.desc": "Z–A",
|
||||
"error.occurred": "An error occurred",
|
||||
"error.report_message": "If you believe that this is a Gitea bug, please search for issues on <a href=\"%s\" target=\"_blank\">GitHub</a> or open a new issue if necessary.",
|
||||
"error.report_message": "If you believe that this is a GitCaddy bug, please search for issues on <a href=\"%s\" target=\"_blank\">GitCaddy GitCaddy</a> or open a new issue if necessary.",
|
||||
"error.not_found": "The target couldn't be found.",
|
||||
"error.network_error": "Network error",
|
||||
"startpage.app_desc": "A painless, self-hosted Git service",
|
||||
"startpage.install": "Easy to install",
|
||||
"startpage.install_desc": "Simply <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%[1]s\">run the binary</a> for your platform, ship it with <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%[2]s\">Docker</a>, or get it <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%[3]s\">packaged</a>.",
|
||||
"startpage.platform": "Cross-platform",
|
||||
"startpage.platform_desc": "Gitea runs anywhere <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">Go</a> can compile for: Windows, macOS, Linux, ARM, etc. Choose the one you love!",
|
||||
"startpage.lightweight": "Lightweight",
|
||||
"startpage.lightweight_desc": "Gitea has low minimal requirements and can run on an inexpensive Raspberry Pi. Save your machine energy!",
|
||||
"startpage.app_desc": "Steeped in your workflow",
|
||||
"startpage.install": "Deploy Anywhere",
|
||||
"startpage.install_desc": "Run the binary, deploy with Docker, or use your favorite package manager. GitCaddy runs wherever you need it.",
|
||||
"startpage.platform": "AI-Native Platform",
|
||||
"startpage.platform_desc": "Built for the age of AI-assisted development. Structured APIs, capability discovery, and intelligent context for AI tools.",
|
||||
"startpage.lightweight": "Lightning Fast",
|
||||
"startpage.lightweight_desc": "Minimal footprint, maximum performance. GitCaddy runs efficiently on everything from Raspberry Pi to enterprise servers.",
|
||||
"startpage.license": "Open Source",
|
||||
"startpage.license_desc": "Go get <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%[1]s\">%[2]s</a>! Join us by <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%[3]s\">contributing</a> to make this project even better. Don't be shy to be a contributor!",
|
||||
"startpage.license_desc": "GitCaddy is open source and built on the shoulders of giants. Based on GitCaddy, enhanced for the AI era.",
|
||||
"install.install": "Installation",
|
||||
"install.installing_desc": "Installing now, please wait…",
|
||||
"install.title": "Initial Configuration",
|
||||
"install.docker_helper": "If you run Gitea inside Docker, please read the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">documentation</a> before changing any settings.",
|
||||
"install.require_db_desc": "Gitea requires MySQL, PostgreSQL, MSSQL, SQLite3 or TiDB (MySQL protocol).",
|
||||
"install.docker_helper": "If you run GitCaddy inside Docker, please read the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">documentation</a> before changing any settings.",
|
||||
"install.require_db_desc": "GitCaddy requires MySQL, PostgreSQL, MSSQL, SQLite3 or TiDB (MySQL protocol).",
|
||||
"install.db_title": "Database Settings",
|
||||
"install.db_type": "Database Type",
|
||||
"install.host": "Host",
|
||||
@@ -233,12 +234,12 @@
|
||||
"install.db_schema_helper": "Leave blank for database default (\"public\").",
|
||||
"install.ssl_mode": "SSL",
|
||||
"install.path": "Path",
|
||||
"install.sqlite_helper": "File path for the SQLite3 database.<br>Enter an absolute path if you run Gitea as a service.",
|
||||
"install.reinstall_error": "You are trying to install into an existing Gitea database",
|
||||
"install.reinstall_confirm_message": "Re-installing with an existing Gitea database can cause multiple problems. In most cases, you should use your existing \"app.ini\" to run Gitea. If you know what you are doing, confirm the following:",
|
||||
"install.sqlite_helper": "File path for the SQLite3 database.<br>Enter an absolute path if you run GitCaddy as a service.",
|
||||
"install.reinstall_error": "You are trying to install into an existing GitCaddy database",
|
||||
"install.reinstall_confirm_message": "Re-installing with an existing GitCaddy database can cause multiple problems. In most cases, you should use your existing \"app.ini\" to run GitCaddy. If you know what you are doing, confirm the following:",
|
||||
"install.reinstall_confirm_check_1": "The data encrypted by the SECRET_KEY in app.ini may be lost: users may not be able to log in with 2FA/OTP and mirrors may not function correctly. By checking this box, you confirm that the current app.ini file contains the correct SECRET_KEY.",
|
||||
"install.reinstall_confirm_check_2": "The repositories and settings may need to be resynchronized. By checking this box, you confirm that you will resynchronize the hooks for the repositories and authorized_keys file manually. You confirm that you will ensure that repository and mirror settings are correct.",
|
||||
"install.reinstall_confirm_check_3": "You confirm that you are absolutely sure that this Gitea is running with the correct app.ini location and that you are sure that you have to re-install. You confirm that you acknowledge the above risks.",
|
||||
"install.reinstall_confirm_check_3": "You confirm that you are absolutely sure that this GitCaddy is running with the correct app.ini location and that you are sure that you have to re-install. You confirm that you acknowledge the above risks.",
|
||||
"install.err_empty_db_path": "The SQLite3 database path cannot be empty.",
|
||||
"install.no_admin_and_disable_registration": "You cannot disable user self-registration without creating an administrator account.",
|
||||
"install.err_empty_admin_password": "The administrator password cannot be empty.",
|
||||
@@ -254,14 +255,14 @@
|
||||
"install.lfs_path": "Git LFS Root Path",
|
||||
"install.lfs_path_helper": "Files tracked by Git LFS will be stored in this directory. Leave empty to disable.",
|
||||
"install.run_user": "Run As Username",
|
||||
"install.run_user_helper": "The operating system username that Gitea runs as. Note that this user must have access to the repository root path.",
|
||||
"install.run_user_helper": "The operating system username that GitCaddy runs as. Note that this user must have access to the repository root path.",
|
||||
"install.domain": "Server Domain",
|
||||
"install.domain_helper": "Domain or host address for the server.",
|
||||
"install.ssh_port": "SSH Server Port",
|
||||
"install.ssh_port_helper": "Port number your SSH server listens on. Leave empty to disable.",
|
||||
"install.http_port": "Gitea HTTP Listen Port",
|
||||
"install.http_port_helper": "Port number the Gitea web server will listen on.",
|
||||
"install.app_url": "Gitea Base URL",
|
||||
"install.http_port": "GitCaddy HTTP Listen Port",
|
||||
"install.http_port_helper": "Port number the GitCaddy web server will listen on.",
|
||||
"install.app_url": "GitCaddy Base URL",
|
||||
"install.app_url_helper": "Base address for HTTP(S) clone URLs and email notifications.",
|
||||
"install.log_root_path": "Log Path",
|
||||
"install.log_root_path_helper": "Log files will be written to this directory.",
|
||||
@@ -271,7 +272,7 @@
|
||||
"install.smtp_port": "SMTP Port",
|
||||
"install.smtp_from": "Send Email As",
|
||||
"install.smtp_from_invalid": "The \"Send Email As\" address is invalid",
|
||||
"install.smtp_from_helper": "Email address Gitea will use. Enter a plain email address or use the \"Name\" <email@example.com> format.",
|
||||
"install.smtp_from_helper": "Email address GitCaddy will use. Enter a plain email address or use the \"Name\" <email@example.com> format.",
|
||||
"install.mailer_user": "SMTP Username",
|
||||
"install.mailer_password": "SMTP Password",
|
||||
"install.register_confirm": "Require Email Confirmation to Register",
|
||||
@@ -300,9 +301,9 @@
|
||||
"install.admin_password": "Password",
|
||||
"install.confirm_password": "Confirm Password",
|
||||
"install.admin_email": "Email Address",
|
||||
"install.install_btn_confirm": "Install Gitea",
|
||||
"install.install_btn_confirm": "Install GitCaddy",
|
||||
"install.test_git_failed": "Could not test 'git' command: %v",
|
||||
"install.sqlite3_not_available": "This Gitea version does not support SQLite3. Please download the official binary version from %s (not the 'gobuild' version).",
|
||||
"install.sqlite3_not_available": "This GitCaddy version does not support SQLite3. Please download the official binary version from %s (not the 'gobuild' version).",
|
||||
"install.invalid_db_setting": "The database settings are invalid: %v",
|
||||
"install.invalid_db_table": "The database table \"%s\" is invalid: %v",
|
||||
"install.invalid_repo_path": "The repository root path is invalid: %v",
|
||||
@@ -338,6 +339,7 @@
|
||||
"home.collaborative_repos": "Collaborative Repositories",
|
||||
"home.my_orgs": "My Organizations",
|
||||
"home.my_mirrors": "My Mirrors",
|
||||
"home.featured_organizations": "Featured Organizations",
|
||||
"home.view_home": "View %s",
|
||||
"home.filter": "Other Filters",
|
||||
"home.filter_by_team_repositories": "Filter by team repositories",
|
||||
@@ -376,7 +378,7 @@
|
||||
"auth.forgot_password_title": "Forgot Password",
|
||||
"auth.forgot_password": "Forgot password?",
|
||||
"auth.need_account": "Need an account?",
|
||||
"auth.sign_up_tip": "You are registering the first account in the system, which has administrator privileges. Please carefully remember your username and password. If you forget the username or password, please refer to the Gitea documentation to recover the account.",
|
||||
"auth.sign_up_tip": "You are registering the first account in the system, which has administrator privileges. Please carefully remember your username and password. If you forget the username or password, please refer to the GitCaddy documentation to recover the account.",
|
||||
"auth.sign_up_now": "Register now.",
|
||||
"auth.sign_up_successful": "Account was successfully created. Welcome!",
|
||||
"auth.confirmation_mail_sent_prompt_ex": "A new confirmation email has been sent to <b>%s</b>. Please check your inbox within the next %s to complete the registration process. If your registration email address is incorrect, you can sign in again and change it.",
|
||||
@@ -400,7 +402,7 @@
|
||||
"auth.reset_password_helper": "Recover Account",
|
||||
"auth.reset_password_wrong_user": "You are signed in as %s, but the account recovery link is meant for %s",
|
||||
"auth.password_too_short": "Password length cannot be less than %d characters.",
|
||||
"auth.non_local_account": "Non-local users cannot update their password through the Gitea web interface.",
|
||||
"auth.non_local_account": "Non-local users cannot update their password through the GitCaddy web interface.",
|
||||
"auth.verify": "Verify",
|
||||
"auth.scratch_code": "Scratch code",
|
||||
"auth.use_scratch_code": "Use a scratch code",
|
||||
@@ -721,7 +723,7 @@
|
||||
"settings.retype_new_password": "Confirm New Password",
|
||||
"settings.password_incorrect": "The current password is incorrect.",
|
||||
"settings.change_password_success": "Your password has been updated. Sign in using your new password from now on.",
|
||||
"settings.password_change_disabled": "Non-local users cannot update their password through the Gitea web interface.",
|
||||
"settings.password_change_disabled": "Non-local users cannot update their password through the GitCaddy web interface.",
|
||||
"settings.emails": "Email Addresses",
|
||||
"settings.manage_emails": "Manage Email Addresses",
|
||||
"settings.manage_themes": "Select default theme",
|
||||
@@ -729,7 +731,7 @@
|
||||
"settings.email_desc": "Your primary email address will be used for notifications, password recovery and, provided that it is not hidden, web-based Git operations.",
|
||||
"settings.theme_desc": "This will be your default theme across the site.",
|
||||
"settings.theme_colorblindness_help": "Color blindness Theme Support",
|
||||
"settings.theme_colorblindness_prompt": "Gitea only has a few themes with basic color blindness support, which only have a few colors defined. The work is still in progress. More improvements could be made by defining more colors in the theme CSS files.",
|
||||
"settings.theme_colorblindness_prompt": "GitCaddy only has a few themes with basic color blindness support, which only have a few colors defined. The work is still in progress. More improvements could be made by defining more colors in the theme CSS files.",
|
||||
"settings.primary": "Primary",
|
||||
"settings.activated": "Activated",
|
||||
"settings.requires_activation": "Requires activation",
|
||||
@@ -837,7 +839,7 @@
|
||||
"settings.unbind_success": "The social account has been removed successfully.",
|
||||
"settings.manage_access_token": "Manage Access Tokens",
|
||||
"settings.generate_new_token": "Generate New Token",
|
||||
"settings.tokens_desc": "These tokens grant access to your account using the Gitea API.",
|
||||
"settings.tokens_desc": "These tokens grant access to your account using the GitCaddy API.",
|
||||
"settings.token_name": "Token Name",
|
||||
"settings.generate_token": "Generate Token",
|
||||
"settings.generate_token_success": "Your new token has been generated. Copy it now as it will not be shown again.",
|
||||
@@ -863,7 +865,7 @@
|
||||
"settings.permissions_list": "Permissions:",
|
||||
"settings.manage_oauth2_applications": "Manage OAuth2 Applications",
|
||||
"settings.edit_oauth2_application": "Edit OAuth2 Application",
|
||||
"settings.oauth2_applications_desc": "OAuth2 applications enables your third-party application to securely authenticate users at this Gitea instance.",
|
||||
"settings.oauth2_applications_desc": "OAuth2 applications enables your third-party application to securely authenticate users at this GitCaddy instance.",
|
||||
"settings.remove_oauth2_application": "Remove OAuth2 Application",
|
||||
"settings.remove_oauth2_application_desc": "Removing an OAuth2 application will revoke access to all signed access tokens. Continue?",
|
||||
"settings.remove_oauth2_application_success": "The application has been deleted.",
|
||||
@@ -884,9 +886,9 @@
|
||||
"settings.oauth2_application_edit": "Edit",
|
||||
"settings.oauth2_application_create_description": "OAuth2 applications gives your third-party application access to user accounts on this instance.",
|
||||
"settings.oauth2_application_remove_description": "Removing an OAuth2 application will prevent it from accessing authorized user accounts on this instance. Continue?",
|
||||
"settings.oauth2_application_locked": "Gitea pre-registers some OAuth2 applications on startup if enabled in config. To prevent unexpected behavior, these can neither be edited nor removed. Please refer to the OAuth2 documentation for more information.",
|
||||
"settings.oauth2_application_locked": "GitCaddy pre-registers some OAuth2 applications on startup if enabled in config. To prevent unexpected behavior, these can neither be edited nor removed. Please refer to the OAuth2 documentation for more information.",
|
||||
"settings.authorized_oauth2_applications": "Authorized OAuth2 Applications",
|
||||
"settings.authorized_oauth2_applications_description": "You have granted access to your personal Gitea account to these third-party applications. Please revoke access for applications you no longer need.",
|
||||
"settings.authorized_oauth2_applications_description": "You have granted access to your personal GitCaddy account to these third-party applications. Please revoke access for applications you no longer need.",
|
||||
"settings.revoke_key": "Revoke",
|
||||
"settings.revoke_oauth2_grant": "Revoke Access",
|
||||
"settings.revoke_oauth2_grant_description": "Revoking access for this third-party application will prevent this application from accessing your data. Are you sure?",
|
||||
@@ -917,11 +919,11 @@
|
||||
"settings.webauthn_key_loss_warning": "If you lose your security keys, you will lose access to your account.",
|
||||
"settings.webauthn_alternative_tip": "You may want to configure an additional authentication method.",
|
||||
"settings.manage_account_links": "Manage Linked Accounts",
|
||||
"settings.manage_account_links_desc": "These external accounts are linked to your Gitea account.",
|
||||
"settings.account_links_not_available": "No external accounts are currently linked to your Gitea account.",
|
||||
"settings.manage_account_links_desc": "These external accounts are linked to your GitCaddy account.",
|
||||
"settings.account_links_not_available": "No external accounts are currently linked to your GitCaddy account.",
|
||||
"settings.link_account": "Link Account",
|
||||
"settings.remove_account_link": "Remove Linked Account",
|
||||
"settings.remove_account_link_desc": "Removing a linked account will revoke its access to your Gitea account. Continue?",
|
||||
"settings.remove_account_link_desc": "Removing a linked account will revoke its access to your GitCaddy account. Continue?",
|
||||
"settings.remove_account_link_success": "The linked account has been removed.",
|
||||
"settings.hooks.desc": "Add webhooks which will be triggered for <strong>all repositories</strong> that you own.",
|
||||
"settings.orgs_none": "You are not a member of any organizations.",
|
||||
@@ -937,7 +939,7 @@
|
||||
"settings.email_notifications.disable": "Disable Email Notifications",
|
||||
"settings.email_notifications.submit": "Set Email Preference",
|
||||
"settings.email_notifications.andyourown": "And Your Own Notifications",
|
||||
"settings.email_notifications.actions.desc": "Notifications for workflow runs on repositories set up with <a target=\"_blank\" href=\"%s\">Gitea Actions</a>.",
|
||||
"settings.email_notifications.actions.desc": "Notifications for workflow runs on repositories set up with <a target=\"_blank\" href=\"%s\">GitCaddy Actions</a>.",
|
||||
"settings.email_notifications.actions.failure_only": "Only notify for failed workflow runs",
|
||||
"settings.visibility": "User visibility",
|
||||
"settings.visibility.public": "Public",
|
||||
@@ -1118,7 +1120,7 @@
|
||||
"repo.migrate.github.description": "Migrate data from github.com or other GitHub instances.",
|
||||
"repo.migrate.git.description": "Migrate a repository only from any Git service.",
|
||||
"repo.migrate.gitlab.description": "Migrate data from gitlab.com or other GitLab instances.",
|
||||
"repo.migrate.gitea.description": "Migrate data from gitea.com or other Gitea instances.",
|
||||
"repo.migrate.gitea.description": "Migrate data from gitea.com or other GitCaddy instances.",
|
||||
"repo.migrate.gogs.description": "Migrate data from notabug.org or other Gogs instances.",
|
||||
"repo.migrate.onedev.description": "Migrate data from code.onedev.io or other OneDev instances.",
|
||||
"repo.migrate.codebase.description": "Migrate data from codebasehq.com.",
|
||||
@@ -1868,7 +1870,7 @@
|
||||
"repo.pulls.cmd_instruction_checkout_title": "Checkout",
|
||||
"repo.pulls.cmd_instruction_checkout_desc": "From your project repository, check out a new branch and test the changes.",
|
||||
"repo.pulls.cmd_instruction_merge_title": "Merge",
|
||||
"repo.pulls.cmd_instruction_merge_desc": "Merge the changes and update on Gitea.",
|
||||
"repo.pulls.cmd_instruction_merge_desc": "Merge the changes and update on GitCaddy.",
|
||||
"repo.pulls.cmd_instruction_merge_warning": "Warning: This operation cannot merge pull request because \"autodetect manual merge\" is not enabled.",
|
||||
"repo.pulls.clear_merge_message": "Clear merge message",
|
||||
"repo.pulls.clear_merge_message_hint": "Clearing the merge message will only remove the commit message content and keep generated git trailers such as \"Co-Authored-By…\".",
|
||||
@@ -2174,11 +2176,11 @@
|
||||
"repo.settings.trust_model.collaborator.long": "Collaborator: Trust signatures by collaborators",
|
||||
"repo.settings.trust_model.collaborator.desc": "Valid signatures by collaborators of this repository will be marked \"trusted\", whether they match the committer or not. Otherwise, valid signatures will be marked \"untrusted\" if the signature matches the committer and \"unmatched\" if not.",
|
||||
"repo.settings.trust_model.committer": "Committer",
|
||||
"repo.settings.trust_model.committer.long": "Committer: Trust signatures that match committers. This matches GitHub's behavior and will force commits signed by Gitea to have Gitea as the committer.",
|
||||
"repo.settings.trust_model.committer.desc": "Valid signatures will only be marked \"trusted\" if they match the committer, otherwise they will be marked \"unmatched\". This forces Gitea to be the committer on signed commits, with the actual committer marked as Co-authored-by: and Co-committed-by: trailer in the commit. The default Gitea key must match a user in the database.",
|
||||
"repo.settings.trust_model.committer.long": "Committer: Trust signatures that match committers. This matches GitHub's behavior and will force commits signed by GitCaddy to have GitCaddy as the committer.",
|
||||
"repo.settings.trust_model.committer.desc": "Valid signatures will only be marked \"trusted\" if they match the committer, otherwise they will be marked \"unmatched\". This forces GitCaddy to be the committer on signed commits, with the actual committer marked as Co-authored-by: and Co-committed-by: trailer in the commit. The default GitCaddy key must match a user in the database.",
|
||||
"repo.settings.trust_model.collaboratorcommitter": "Collaborator+Committer",
|
||||
"repo.settings.trust_model.collaboratorcommitter.long": "Collaborator+Committer: Trust signatures by collaborators which match the committer",
|
||||
"repo.settings.trust_model.collaboratorcommitter.desc": "Valid signatures by collaborators of this repository will be marked \"trusted\" if they match the committer. Otherwise, valid signatures will be marked \"untrusted\" if the signature matches the committer and \"unmatched\" otherwise. This will force Gitea to be marked as the committer on signed commits, with the actual committer marked as Co-Authored-By: and Co-Committed-By: trailer in the commit. The default Gitea key must match a user in the database.",
|
||||
"repo.settings.trust_model.collaboratorcommitter.desc": "Valid signatures by collaborators of this repository will be marked \"trusted\" if they match the committer. Otherwise, valid signatures will be marked \"untrusted\" if the signature matches the committer and \"unmatched\" otherwise. This will force GitCaddy to be marked as the committer on signed commits, with the actual committer marked as Co-Authored-By: and Co-Committed-By: trailer in the commit. The default GitCaddy key must match a user in the database.",
|
||||
"repo.settings.wiki_delete": "Delete Wiki Data",
|
||||
"repo.settings.wiki_delete_desc": "Deleting repository wiki data is permanent and cannot be undone.",
|
||||
"repo.settings.wiki_delete_notices_1": "- This will permanently delete and disable the repository wiki for %s.",
|
||||
@@ -2215,7 +2217,7 @@
|
||||
"repo.settings.remove_team_success": "The team's access to the repository has been removed.",
|
||||
"repo.settings.add_webhook": "Add Webhook",
|
||||
"repo.settings.add_webhook.invalid_channel_name": "Webhook channel name cannot be empty and cannot contain only a # character.",
|
||||
"repo.settings.hooks_desc": "Webhooks automatically make HTTP POST requests to a server when certain Gitea events trigger. Read more in the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">webhooks guide</a>.",
|
||||
"repo.settings.hooks_desc": "Webhooks automatically make HTTP POST requests to a server when certain GitCaddy events trigger. Read more in the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">webhooks guide</a>.",
|
||||
"repo.settings.webhook_deletion": "Remove Webhook",
|
||||
"repo.settings.webhook_deletion_desc": "Removing a webhook deletes its settings and delivery history. Continue?",
|
||||
"repo.settings.webhook_deletion_success": "The webhook has been removed.",
|
||||
@@ -2235,7 +2237,7 @@
|
||||
"repo.settings.githook_name": "Hook Name",
|
||||
"repo.settings.githook_content": "Hook Content",
|
||||
"repo.settings.update_githook": "Update Hook",
|
||||
"repo.settings.add_webhook_desc": "Gitea will send <code>POST</code> requests with a specified content type to the target URL. Read more in the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">webhooks guide</a>.",
|
||||
"repo.settings.add_webhook_desc": "GitCaddy will send <code>POST</code> requests with a specified content type to the target URL. Read more in the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">webhooks guide</a>.",
|
||||
"repo.settings.payload_url": "Target URL",
|
||||
"repo.settings.http_method": "HTTP Method",
|
||||
"repo.settings.content_type": "POST Content Type",
|
||||
@@ -2300,9 +2302,9 @@
|
||||
"repo.settings.event_pull_request_merge": "Pull Request Merge",
|
||||
"repo.settings.event_header_workflow": "Workflow Events",
|
||||
"repo.settings.event_workflow_run": "Workflow Run",
|
||||
"repo.settings.event_workflow_run_desc": "Gitea Actions Workflow run queued, waiting, in progress, or completed.",
|
||||
"repo.settings.event_workflow_run_desc": "GitCaddy Actions Workflow run queued, waiting, in progress, or completed.",
|
||||
"repo.settings.event_workflow_job": "Workflow Jobs",
|
||||
"repo.settings.event_workflow_job_desc": "Gitea Actions Workflow job queued, waiting, in progress, or completed.",
|
||||
"repo.settings.event_workflow_job_desc": "GitCaddy Actions Workflow job queued, waiting, in progress, or completed.",
|
||||
"repo.settings.event_package": "Package",
|
||||
"repo.settings.event_package_desc": "Package created or deleted in a repository.",
|
||||
"repo.settings.branch_filter": "Branch filter",
|
||||
@@ -2323,7 +2325,7 @@
|
||||
"repo.settings.slack_domain": "Domain",
|
||||
"repo.settings.slack_channel": "Channel",
|
||||
"repo.settings.add_web_hook_desc": "Integrate <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">%s</a> into your repository.",
|
||||
"repo.settings.web_hook_name_gitea": "Gitea",
|
||||
"repo.settings.web_hook_name_gitea": "GitCaddy",
|
||||
"repo.settings.web_hook_name_gogs": "Gogs",
|
||||
"repo.settings.web_hook_name_slack": "Slack",
|
||||
"repo.settings.web_hook_name_discord": "Discord",
|
||||
@@ -2512,15 +2514,15 @@
|
||||
"repo.settings.rename_branch_from": "old branch name",
|
||||
"repo.settings.rename_branch_to": "new branch name",
|
||||
"repo.settings.rename_branch": "Rename branch",
|
||||
"repo.settings.pages": "Pages",
|
||||
"repo.settings.pages.enabled": "Pages Enabled",
|
||||
"repo.settings.pages": "Landing Page",
|
||||
"repo.settings.pages.enabled": "Landing Page Enabled",
|
||||
"repo.settings.pages.enabled_desc": "Your landing page is now accessible to visitors.",
|
||||
"repo.settings.pages.not_enabled": "Pages Not Enabled",
|
||||
"repo.settings.pages.not_enabled_desc": "Enable Pages to create a landing page for your repository.",
|
||||
"repo.settings.pages.enable": "Enable Pages",
|
||||
"repo.settings.pages.disable": "Disable Pages",
|
||||
"repo.settings.pages.enabled_success": "Pages have been enabled for this repository.",
|
||||
"repo.settings.pages.disabled_success": "Pages have been disabled for this repository.",
|
||||
"repo.settings.pages.not_enabled": "Landing Page Not Enabled",
|
||||
"repo.settings.pages.not_enabled_desc": "Enable the landing page feature to create a public page for your repository.",
|
||||
"repo.settings.pages.enable": "Enable Landing Page",
|
||||
"repo.settings.pages.disable": "Disable Landing Page",
|
||||
"repo.settings.pages.enabled_success": "Landing page has been enabled for this repository.",
|
||||
"repo.settings.pages.disabled_success": "Landing page has been disabled for this repository.",
|
||||
"repo.settings.pages.template": "Template",
|
||||
"repo.settings.pages.update_template": "Update Template",
|
||||
"repo.settings.pages.subdomain": "Subdomain URL",
|
||||
@@ -2536,6 +2538,10 @@
|
||||
"repo.settings.pages.pending": "Pending",
|
||||
"repo.settings.pages.ssl_active": "Active",
|
||||
"repo.settings.pages.ssl_pending": "Pending",
|
||||
"repo.settings.pages.ssl_external": "SSL handled externally (e.g., Cloudflare)",
|
||||
"repo.settings.pages.ssl_external_desc": "Check this if SSL is managed by a CDN or reverse proxy like Cloudflare",
|
||||
"repo.settings.pages.activate_ssl": "Activate SSL",
|
||||
"repo.settings.pages.ssl_activated": "SSL has been activated for this domain",
|
||||
"repo.settings.pages.ssl_none": "None",
|
||||
"repo.settings.pages.verify": "Verify",
|
||||
"repo.settings.pages.verify_dns_hint": "Add the following TXT record to your DNS to verify domain ownership:",
|
||||
@@ -2642,7 +2648,7 @@
|
||||
"repo.release.delete_release": "Delete Release",
|
||||
"repo.release.delete_tag": "Delete Tag",
|
||||
"repo.release.deletion": "Delete Release",
|
||||
"repo.release.deletion_desc": "Deleting a release only removes it from Gitea. It will not affect the Git tag, the contents of your repository or its history. Continue?",
|
||||
"repo.release.deletion_desc": "Deleting a release only removes it from GitCaddy. It will not affect the Git tag, the contents of your repository or its history. Continue?",
|
||||
"repo.release.deletion_success": "The release has been deleted.",
|
||||
"repo.release.deletion_tag_desc": "Will delete this tag from repository. Repository contents and history remain unchanged. Continue?",
|
||||
"repo.release.deletion_tag_success": "The tag has been deleted.",
|
||||
@@ -2794,6 +2800,9 @@
|
||||
"org.settings.confirm_delete_account": "Confirm Deletion",
|
||||
"org.settings.delete_failed": "Deleting organization failed due to an internal error",
|
||||
"org.settings.delete_successful": "Organization <b>%s</b> has been deleted successfully.",
|
||||
"org.settings.homepage_pinning": "Homepage Visibility",
|
||||
"org.settings.pin_to_homepage": "Pin this organization to the homepage",
|
||||
"org.settings.pin_to_homepage_help": "When enabled, this organization will be featured on the public homepage. Only administrators can change this setting.",
|
||||
"org.settings.hooks_desc": "Add webhooks which will be triggered for <strong>all repositories</strong> under this organization.",
|
||||
"org.settings.labels_desc": "Add labels which can be used on issues for <strong>all repositories</strong> under this organization.",
|
||||
"org.members.membership_visibility": "Membership Visibility:",
|
||||
@@ -2893,7 +2902,7 @@
|
||||
"admin.last_page": "Last",
|
||||
"admin.total": "Total: %d",
|
||||
"admin.settings": "Admin Settings",
|
||||
"admin.dashboard.new_version_hint": "Gitea %s is now available, you are running %s. Check <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">the blog</a> for more details.",
|
||||
"admin.dashboard.new_version_hint": "GitCaddy %s is now available, you are running %s. Check <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">the blog</a> for more details.",
|
||||
"admin.dashboard.statistic": "Summary",
|
||||
"admin.dashboard.maintenance_operations": "Maintenance Operations",
|
||||
"admin.dashboard.system_status": "System Status",
|
||||
@@ -2929,8 +2938,8 @@
|
||||
"admin.dashboard.deleted_branches_cleanup": "Clean up deleted branches",
|
||||
"admin.dashboard.update_migration_poster_id": "Update migration poster IDs",
|
||||
"admin.dashboard.git_gc_repos": "Garbage-collect all repositories",
|
||||
"admin.dashboard.resync_all_sshkeys": "Update the '.ssh/authorized_keys' file with Gitea SSH keys",
|
||||
"admin.dashboard.resync_all_sshprincipals": "Update the '.ssh/authorized_principals' file with Gitea SSH principals",
|
||||
"admin.dashboard.resync_all_sshkeys": "Update the '.ssh/authorized_keys' file with GitCaddy SSH keys",
|
||||
"admin.dashboard.resync_all_sshprincipals": "Update the '.ssh/authorized_principals' file with GitCaddy SSH principals",
|
||||
"admin.dashboard.resync_all_hooks": "Resynchronize git hooks of all repositories (pre-receive, update, post-receive, proc-receive, ...)",
|
||||
"admin.dashboard.reinit_missing_repos": "Reinitialize all missing Git repositories for which records exist",
|
||||
"admin.dashboard.sync_external_users": "Synchronize external user data",
|
||||
@@ -3011,7 +3020,7 @@
|
||||
"admin.users.is_admin": "Is Administrator",
|
||||
"admin.users.is_restricted": "Is Restricted",
|
||||
"admin.users.allow_git_hook": "May Create Git Hooks",
|
||||
"admin.users.allow_git_hook_tooltip": "Git Hooks are executed as the OS user running Gitea and will have the same level of host access. As a result, users with this special Git Hook privilege can access and modify all Gitea repositories as well as the database used by Gitea. Consequently they are also able to gain Gitea administrator privileges.",
|
||||
"admin.users.allow_git_hook_tooltip": "Git Hooks are executed as the OS user running GitCaddy and will have the same level of host access. As a result, users with this special Git Hook privilege can access and modify all GitCaddy repositories as well as the database used by GitCaddy. Consequently they are also able to gain GitCaddy administrator privileges.",
|
||||
"admin.users.allow_import_local": "May Import Local Repositories",
|
||||
"admin.users.allow_create_organization": "May Create Organizations",
|
||||
"admin.users.update_profile": "Update User Account",
|
||||
@@ -3081,11 +3090,11 @@
|
||||
"admin.packages.size": "Size",
|
||||
"admin.packages.published": "Published",
|
||||
"admin.defaulthooks": "Default Webhooks",
|
||||
"admin.defaulthooks.desc": "Webhooks automatically make HTTP POST requests to a server when certain Gitea events trigger. Webhooks defined here are defaults and will be copied into all new repositories. Read more in the <a target=\"_blank\" rel=\"noopener\" href=\"%s\">webhooks guide</a>.",
|
||||
"admin.defaulthooks.desc": "Webhooks automatically make HTTP POST requests to a server when certain GitCaddy events trigger. Webhooks defined here are defaults and will be copied into all new repositories. Read more in the <a target=\"_blank\" rel=\"noopener\" href=\"%s\">webhooks guide</a>.",
|
||||
"admin.defaulthooks.add_webhook": "Add Default Webhook",
|
||||
"admin.defaulthooks.update_webhook": "Update Default Webhook",
|
||||
"admin.systemhooks": "System Webhooks",
|
||||
"admin.systemhooks.desc": "Webhooks automatically make HTTP POST requests to a server when certain Gitea events trigger. Webhooks defined here will act on all repositories on the system, so please consider any performance implications this may have. Read more in the <a target=\"_blank\" rel=\"noopener\" href=\"%s\">webhooks guide</a>.",
|
||||
"admin.systemhooks.desc": "Webhooks automatically make HTTP POST requests to a server when certain GitCaddy events trigger. Webhooks defined here will act on all repositories on the system, so please consider any performance implications this may have. Read more in the <a target=\"_blank\" rel=\"noopener\" href=\"%s\">webhooks guide</a>.",
|
||||
"admin.systemhooks.add_webhook": "Add System Webhook",
|
||||
"admin.systemhooks.update_webhook": "Update System Webhook",
|
||||
"admin.auths.auth_manage_panel": "Authentication Source Management",
|
||||
@@ -3106,7 +3115,7 @@
|
||||
"admin.auths.user_base": "User Search Base",
|
||||
"admin.auths.user_dn": "User DN",
|
||||
"admin.auths.attribute_username": "Username Attribute",
|
||||
"admin.auths.attribute_username_placeholder": "Leave empty to use the username entered in Gitea.",
|
||||
"admin.auths.attribute_username_placeholder": "Leave empty to use the username entered in GitCaddy.",
|
||||
"admin.auths.attribute_name": "First Name Attribute",
|
||||
"admin.auths.attribute_surname": "Surname Attribute",
|
||||
"admin.auths.attribute_mail": "Email Attribute",
|
||||
@@ -3211,8 +3220,8 @@
|
||||
"admin.auths.invalid_openIdConnectAutoDiscoveryURL": "Invalid Auto Discovery URL (this must be a valid URL starting with http:// or https://)",
|
||||
"admin.config.server_config": "Server Configuration",
|
||||
"admin.config.app_name": "Site Title",
|
||||
"admin.config.app_ver": "Gitea Version",
|
||||
"admin.config.app_url": "Gitea Base URL",
|
||||
"admin.config.app_ver": "GitCaddy Version",
|
||||
"admin.config.app_url": "GitCaddy Base URL",
|
||||
"admin.config.custom_conf": "Configuration File Path",
|
||||
"admin.config.custom_file_root_path": "Custom File Root Path",
|
||||
"admin.config.domain": "Server Domain",
|
||||
@@ -3251,7 +3260,7 @@
|
||||
"admin.config.service_config": "Service Configuration",
|
||||
"admin.config.register_email_confirm": "Require Email Confirmation to Register",
|
||||
"admin.config.disable_register": "Disable Self-Registration",
|
||||
"admin.config.allow_only_internal_registration": "Allow Registration Only Through Gitea itself",
|
||||
"admin.config.allow_only_internal_registration": "Allow Registration Only Through GitCaddy itself",
|
||||
"admin.config.allow_only_external_registration": "Allow Registration Only Through External Services",
|
||||
"admin.config.enable_openid_signup": "Enable OpenID Self-Registration",
|
||||
"admin.config.enable_openid_signin": "Enable OpenID Sign-In",
|
||||
@@ -3390,11 +3399,11 @@
|
||||
"admin.self_check.no_problem_found": "No problem found yet.",
|
||||
"admin.self_check.startup_warnings": "Startup warnings:",
|
||||
"admin.self_check.database_collation_mismatch": "Expect database to use collation: %s",
|
||||
"admin.self_check.database_collation_case_insensitive": "Database is using collation %s, which is a case-insensitive collation. Although Gitea could work with it, there might be some rare cases which don't work as expected.",
|
||||
"admin.self_check.database_collation_case_insensitive": "Database is using collation %s, which is a case-insensitive collation. Although GitCaddy could work with it, there might be some rare cases which don't work as expected.",
|
||||
"admin.self_check.database_inconsistent_collation_columns": "Database is using collation %s, but these columns are using mismatched collations. This might cause some unexpected problems.",
|
||||
"admin.self_check.database_fix_mysql": "For MySQL/MariaDB users, you could use the \"gitea doctor convert\" command to fix the collation problems, or you could also fix the problem manually with \"ALTER ... COLLATE ...\" SQL queries.",
|
||||
"admin.self_check.database_fix_mssql": "For MSSQL users, you could only fix the problem manually with \"ALTER ... COLLATE ...\" SQL queries at the moment.",
|
||||
"admin.self_check.location_origin_mismatch": "Current URL (%[1]s) doesn't match the URL seen by Gitea (%[2]s). If you are using a reverse proxy, please make sure the \"Host\" and \"X-Forwarded-Proto\" headers are set correctly.",
|
||||
"admin.self_check.location_origin_mismatch": "Current URL (%[1]s) doesn't match the URL seen by GitCaddy (%[2]s). If you are using a reverse proxy, please make sure the \"Host\" and \"X-Forwarded-Proto\" headers are set correctly.",
|
||||
"action.create_repo": "created repository <a href=\"%s\">%s</a>",
|
||||
"action.rename_repo": "renamed repository from <code>%[1]s</code> to <a href=\"%[2]s\">%[3]s</a>",
|
||||
"action.commit_repo": "pushed to <a href=\"%[2]s\">%[3]s</a> at <a href=\"%[1]s\">%[4]s</a>",
|
||||
@@ -3704,6 +3713,15 @@
|
||||
"actions.runners.capabilities.tools": "Tools",
|
||||
"actions.runners.capabilities.limitations": "Limitations",
|
||||
"actions.runners.capabilities.available": "Available",
|
||||
"actions.runners.capabilities.disk": "Disk Space",
|
||||
"actions.runners.capabilities.disk_free": "free",
|
||||
"actions.runners.capabilities.disk_total": "total",
|
||||
"actions.runners.capabilities.disk_warning": "Low disk space",
|
||||
"actions.runners.capabilities.disk_critical": "Critical: disk almost full",
|
||||
"actions.runners.capabilities.bandwidth": "Network Bandwidth",
|
||||
"actions.runners.bandwidth_test_requested": "Bandwidth test requested. Results will appear on next poll.",
|
||||
"actions.runners.bandwidth_test_request_failed": "Failed to request bandwidth test.",
|
||||
"actions.runners.check_bandwidth_now": "Check Bandwidth",
|
||||
"actions.runs.all_workflows": "All Workflows",
|
||||
"actions.runs.commit": "Commit",
|
||||
"actions.runs.scheduled": "Scheduled",
|
||||
@@ -3718,8 +3736,8 @@
|
||||
"actions.runs.status_no_select": "All status",
|
||||
"actions.runs.no_results": "No results matched.",
|
||||
"actions.runs.no_workflows": "There are no workflows yet.",
|
||||
"actions.runs.no_workflows.quick_start": "Don't know how to start with Gitea Actions? See <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">the quick start guide</a>.",
|
||||
"actions.runs.no_workflows.documentation": "For more information on Gitea Actions, see <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">the documentation</a>.",
|
||||
"actions.runs.no_workflows.quick_start": "Don't know how to start with GitCaddy Actions? See <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">the quick start guide</a>.",
|
||||
"actions.runs.no_workflows.documentation": "For more information on GitCaddy Actions, see <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">the documentation</a>.",
|
||||
"actions.runs.no_runs": "The workflow has no runs yet.",
|
||||
"actions.runs.empty_commit_message": "(empty commit message)",
|
||||
"actions.runs.expire_log_message": "Logs have been purged because they were too old.",
|
||||
@@ -3777,5 +3795,155 @@
|
||||
"git.filemode.normal_file": "Normal file",
|
||||
"git.filemode.executable_file": "Executable file",
|
||||
"git.filemode.symbolic_link": "Symbolic link",
|
||||
"git.filemode.submodule": "Submodule"
|
||||
}
|
||||
"git.filemode.submodule": "Submodule",
|
||||
"org.pinned_repos_empty_title": "Showcase your best work",
|
||||
"org.pinned_repos_empty_desc": "Pin up to 6 repositories to highlight your organization's most important projects.",
|
||||
"org.settings.pinned.manage": "Manage Pins",
|
||||
"org.settings.pinned.setup": "Set Up Pinned Repos",
|
||||
"org.no_public_members": "No public members yet",
|
||||
"org.profile_readme_empty_title": "Add a profile README",
|
||||
"org.profile_readme_empty_desc": "Create a .profile repository with a README.md to introduce your organization.",
|
||||
"org.create_profile_repo": "Create Profile Repository",
|
||||
"org.activity": "Activity",
|
||||
"org.repositories": "Repositories",
|
||||
"repo.pin": "Pin",
|
||||
"repo.pin.tooltip": "Pin this repository",
|
||||
"repo.pin.pin_to_profile": "Pin to your profile",
|
||||
"repo.pin.unpin_from_profile": "Unpin from profile",
|
||||
"repo.pin.pin_to_org": "Pin to organization",
|
||||
"repo.pin.unpin_from_org": "Unpin from organization",
|
||||
"repo.pin.success_profile": "Repository pinned to your profile",
|
||||
"repo.pin.success_org": "Repository pinned to organization",
|
||||
"repo.pin.unpin_success_profile": "Repository unpinned from your profile",
|
||||
"repo.pin.unpin_success_org": "Repository unpinned from organization",
|
||||
"repo.pin.already_pinned_org": "Repository is already pinned",
|
||||
"repo.pin.error_limit": "You have reached the maximum number of pinned repositories (6)",
|
||||
"repo.pin.error_org_limit": "Organization has reached the maximum number of pinned repositories",
|
||||
"repo.pin.error_not_org": "This repository does not belong to an organization",
|
||||
"repo.pin.error_not_member": "You must be a member of the organization to pin repositories",
|
||||
"repo.pin.error_generic": "Failed to update pin status",
|
||||
"repo.pin.error_invalid_type": "Invalid pin type",
|
||||
"user.pinned_repos": "Pinned Repositories",
|
||||
"user.pinned_repos_hint": "Pin repos from the repo page",
|
||||
"user.pinned_repos_empty_title": "No pinned repositories",
|
||||
"user.pinned_repos_empty_desc": "Pin repositories to showcase your best work. Visit a repository and use the Pin dropdown.",
|
||||
"settings.show_heatmap_on_profile": "Show activity heatmap on profile",
|
||||
"settings.show_heatmap_on_profile_popup": "Display your contribution heatmap on your profile overview page",
|
||||
"user.activity_heatmap": "Activity Heatmap",
|
||||
"org.stats": "Stats",
|
||||
"org.recent_activity": "Recent Activity",
|
||||
"org.profile_repo_no_permission": "You do not have permission to create repositories in this organization.",
|
||||
"org.profile_repo_create_failed": "Failed to create the profile repository.",
|
||||
"admin.config.theme_config": "Theme Configuration",
|
||||
"admin.config.disable_registration": "Disable Registration",
|
||||
"admin.config.disable_registration_desc": "When enabled, new users cannot sign up. Only administrators can create new accounts.",
|
||||
"admin.config.custom_home_logo": "Homepage Logo",
|
||||
"admin.config.custom_logo_url_placeholder": "Enter URL or upload a file below",
|
||||
"admin.config.upload_logo": "Upload Logo File",
|
||||
"admin.config.reset_logo": "Reset to Default",
|
||||
"admin.config.custom_home_html": "Custom Homepage Content",
|
||||
"admin.config.custom_home_html_placeholder": "Enter custom HTML for the homepage (shown to non-logged-in users)",
|
||||
"admin.config.custom_home_html_help": "This HTML will replace the default homepage content. Leave empty to use the default.",
|
||||
"admin.config.help_url": "Help URL",
|
||||
"admin.config.help_url_placeholder": "https://docs.example.com",
|
||||
"admin.config.help_url_help": "URL for the Help link in the navigation. Leave empty to hide the Help link.",
|
||||
"admin.config.hide_explore_users": "Hide Explore Users",
|
||||
"admin.config.hide_explore_users_desc": "Hide the Users tab from the Explore menu",
|
||||
"admin.config.custom_home_title": "Homepage Title",
|
||||
"admin.config.custom_home_title_placeholder": "Leave empty to use app name",
|
||||
"admin.config.custom_home_title_help": "Custom title displayed on the homepage. Leave empty to use the default app name.",
|
||||
"admin.config.custom_home_tagline": "Homepage Tagline",
|
||||
"admin.config.custom_home_tagline_placeholder": "Leave empty to use default tagline",
|
||||
"admin.config.custom_home_tagline_help": "Custom tagline displayed below the title on the homepage. Leave empty to use the default.",
|
||||
"admin.config.pinned_org_display_format": "Pinned Organization Display Format",
|
||||
"admin.config.pinned_org_format_promotional": "Promotional Content (hide pinned orgs)",
|
||||
"admin.config.pinned_org_format_condensed": "Condensed (icon on left)",
|
||||
"admin.config.pinned_org_format_regular": "Regular (icon above)",
|
||||
"admin.config.pinned_org_display_format_help": "Choose how pinned organizations are displayed on the homepage.",
|
||||
"admin.config.logo_upload_success": "Homepage logo uploaded successfully",
|
||||
"admin.config.logo_url_success": "Homepage logo URL updated successfully",
|
||||
"admin.config.logo_reset_success": "Homepage logo reset to default",
|
||||
"admin.config.logo_invalid_type": "Invalid file type. Allowed: SVG, PNG, JPG, GIF",
|
||||
"admin.config.home_logo_help": "This logo will be displayed on the homepage for non-logged-in users. Recommended: SVG, PNG, JPG or GIF.",
|
||||
"admin.config.custom_site_icon": "Site Icon (Favicon & Navbar)",
|
||||
"admin.config.custom_icon_url_placeholder": "Enter icon URL or upload a file below",
|
||||
"admin.config.upload_icon": "Upload Icon File",
|
||||
"admin.config.reset_icon": "Reset to Default",
|
||||
"admin.config.current_icon": "Current Icon",
|
||||
"admin.config.icon_url": "Icon URL",
|
||||
"admin.config.icon_upload_success": "Site icon uploaded successfully",
|
||||
"admin.config.icon_url_success": "Site icon URL updated successfully",
|
||||
"admin.config.icon_reset_success": "Site icon reset to default",
|
||||
"admin.config.icon_invalid_type": "Invalid file type. Allowed: SVG, PNG, ICO",
|
||||
"admin.config.site_icon_help": "This icon will be used as the site favicon and in the navbar. Recommended: SVG or PNG, square dimensions.",
|
||||
"admin.config.current_logo": "Current Homepage Logo",
|
||||
"admin.config.logo_url": "Logo URL",
|
||||
"repo.settings.display_title": "Display Title",
|
||||
"repo.settings.display_title_placeholder": "Optional display title for this repository",
|
||||
"repo.settings.display_title_help": "A custom title shown prominently on the repository page. Leave empty to use the repository name.",
|
||||
"repo.settings.license": "License",
|
||||
"repo.settings.license_type": "License Type",
|
||||
"repo.settings.license_none": "No license selected",
|
||||
"repo.settings.license_help": "Select a license for your repository. This will create a LICENSE.md file in the repository root.",
|
||||
"repo.settings.license_saved": "License has been saved and LICENSE.md has been created.",
|
||||
"repo.settings.license_cleared": "License has been cleared.",
|
||||
"repo.settings.license_file_error": "License saved but failed to create LICENSE.md file. You may need to create it manually.",
|
||||
"repo.settings.current_license": "Current License",
|
||||
"repo.settings.view_license_file": "View LICENSE.md file",
|
||||
"api": "API",
|
||||
"admin.config.api_header_url": "API Header Link",
|
||||
"admin.config.api_header_url_placeholder": "https://example.com/api/docs",
|
||||
"admin.config.api_header_url_help": "URL for the API documentation link in the header. Leave empty to hide the link.",
|
||||
"admin.config.explore_org_display_format": "Explore Organizations Display",
|
||||
"admin.config.explore_org_display_format_help": "Choose how organizations are displayed on the explore/organizations page",
|
||||
"admin.config.explore_org_format_list": "List View",
|
||||
"admin.config.explore_org_format_tiles": "Tile Cards",
|
||||
"repo.settings.pages.general": "General",
|
||||
"repo.settings.pages.brand": "Brand",
|
||||
"repo.settings.pages.hero": "Hero",
|
||||
"repo.settings.pages.content": "Content",
|
||||
"repo.settings.pages.social": "Social Proof",
|
||||
"repo.settings.pages.pricing": "Pricing",
|
||||
"repo.settings.pages.footer": "Footer & CTA",
|
||||
"repo.settings.pages.theme": "Theme & SEO",
|
||||
"repo.settings.pages.saved": "Settings saved successfully",
|
||||
"repo.settings.pages.brand_name": "Brand Name",
|
||||
"repo.settings.pages.brand_name_help": "The name displayed on your landing page",
|
||||
"repo.settings.pages.brand_logo_url": "Logo URL",
|
||||
"repo.settings.pages.brand_logo_url_help": "URL to your logo image (SVG or PNG)",
|
||||
"repo.settings.pages.brand_tagline": "Tagline",
|
||||
"repo.settings.pages.headline": "Headline",
|
||||
"repo.settings.pages.subheadline": "Subheadline",
|
||||
"repo.settings.pages.image_url": "Hero Image URL",
|
||||
"repo.settings.pages.video_url": "Demo Video URL",
|
||||
"repo.settings.pages.code_example": "Code Example",
|
||||
"repo.settings.pages.primary_cta": "Primary Call to Action",
|
||||
"repo.settings.pages.secondary_cta": "Secondary Call to Action",
|
||||
"repo.settings.pages.cta_label": "Button Label",
|
||||
"repo.settings.pages.cta_url": "Button URL",
|
||||
"repo.settings.pages.stats": "Stats",
|
||||
"repo.settings.pages.value_props": "Value Propositions",
|
||||
"repo.settings.pages.features": "Features",
|
||||
"repo.settings.pages.company_logos": "Company Logos",
|
||||
"repo.settings.pages.testimonials": "Testimonials",
|
||||
"repo.settings.pages.pricing_headline": "Pricing Headline",
|
||||
"repo.settings.pages.pricing_subheadline": "Pricing Subheadline",
|
||||
"repo.settings.pages.plans": "Pricing Plans",
|
||||
"repo.settings.pages.cta_section": "Call to Action Section",
|
||||
"repo.settings.pages.cta_headline": "CTA Headline",
|
||||
"repo.settings.pages.cta_subheadline": "CTA Subheadline",
|
||||
"repo.settings.pages.cta_button_label": "CTA Button Label",
|
||||
"repo.settings.pages.cta_button_url": "CTA Button URL",
|
||||
"repo.settings.pages.footer_links": "Footer Links",
|
||||
"repo.settings.pages.social_links": "Social Links",
|
||||
"repo.settings.pages.copyright": "Copyright Text",
|
||||
"repo.settings.pages.theme_colors": "Theme Colors",
|
||||
"repo.settings.pages.primary_color": "Primary Color",
|
||||
"repo.settings.pages.accent_color": "Accent Color",
|
||||
"repo.settings.pages.theme_mode": "Theme Mode",
|
||||
"repo.settings.pages.seo": "SEO Settings",
|
||||
"repo.settings.pages.seo_title": "SEO Title",
|
||||
"repo.settings.pages.seo_description": "Meta Description",
|
||||
"repo.settings.pages.seo_keywords": "Keywords",
|
||||
"repo.settings.pages.og_image": "Open Graph Image URL"
|
||||
}
|
||||
@@ -87,12 +87,12 @@
|
||||
"filter.public": "عمومی",
|
||||
"filter.private": "خصوصی",
|
||||
"editor.buttons.table.add.insert": "افزودن",
|
||||
"startpage.app_desc": "یک سرویس گیت بیدرد سر و راحت",
|
||||
"startpage.install": "راهاندازی ساده",
|
||||
"startpage.platform": "مستقل از سکو",
|
||||
"startpage.lightweight": "ابزارک سبک",
|
||||
"startpage.lightweight_desc": "گیتی با حداقل منابع میتوانید برای روی دستگاه Raspberry Pi اجرا شود و مصرف انرژی شما را کاهش دهد!",
|
||||
"startpage.license": "متن باز",
|
||||
"startpage.app_desc": "Steeped in your workflow",
|
||||
"startpage.install": "Deploy Anywhere",
|
||||
"startpage.platform": "AI-Native Platform",
|
||||
"startpage.lightweight": "Lightning Fast",
|
||||
"startpage.lightweight_desc": "Minimal footprint, maximum performance. GitCaddy runs efficiently on everything from Raspberry Pi to enterprise servers.",
|
||||
"startpage.license": "Open Source",
|
||||
"install.install": "نصب و راه اندازی",
|
||||
"install.title": "تنظیمات اولیه",
|
||||
"install.docker_helper": "اگر گیتی را با داکر اجرا کردهاید، لطفا قبل از هر تغییری <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">مستندات</a> را مطالعه نمایید.",
|
||||
@@ -2229,4 +2229,4 @@
|
||||
"actions.runners.version": "نسخه",
|
||||
"actions.runs.commit": "کامیت",
|
||||
"git.filemode.symbolic_link": "پیوند نمادین"
|
||||
}
|
||||
}
|
||||
@@ -101,12 +101,12 @@
|
||||
"error.occurred": "Virhe tapahtui",
|
||||
"error.not_found": "Kohdetta ei löytynyt.",
|
||||
"error.network_error": "Verkkovirhe",
|
||||
"startpage.app_desc": "Kivuton, itsehostattu Git-palvelu",
|
||||
"startpage.install": "Helppo asentaa",
|
||||
"startpage.platform": "Alustariippumaton",
|
||||
"startpage.lightweight": "Kevyt",
|
||||
"startpage.lightweight_desc": "Gitealla on vähäiset vähimmäisvaatimukset, joten se toimii jopa halvassa Raspberry Pi:ssä. Säästä koneesi energiaa!",
|
||||
"startpage.license": "Avoin lähdekoodi",
|
||||
"startpage.app_desc": "Steeped in your workflow",
|
||||
"startpage.install": "Deploy Anywhere",
|
||||
"startpage.platform": "AI-Native Platform",
|
||||
"startpage.lightweight": "Lightning Fast",
|
||||
"startpage.lightweight_desc": "Minimal footprint, maximum performance. GitCaddy runs efficiently on everything from Raspberry Pi to enterprise servers.",
|
||||
"startpage.license": "Open Source",
|
||||
"install.install": "Asennus",
|
||||
"install.title": "Alkuperäiset asetukset",
|
||||
"install.docker_helper": "Jos ajat Giteaa Dockerin sisällä, lue <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">ohjeet</a> ennen minkään asetuksen muuttamista.",
|
||||
@@ -1475,4 +1475,4 @@
|
||||
"actions.runners.task_list.run": "Suorita",
|
||||
"actions.runners.task_list.repository": "Repo",
|
||||
"actions.runners.version": "Versio"
|
||||
}
|
||||
}
|
||||
@@ -207,15 +207,15 @@
|
||||
"error.report_message": "Má chreideann tú gur fabht Gitea é seo, déan cuardach le haghaidh ceisteanna ar <a href=\"%s\" target=\"_blank\">GitHub</a> nó oscail eagrán nua más gá.",
|
||||
"error.not_found": "Ní raibh an sprioc in ann a fháil.",
|
||||
"error.network_error": "Earráid líonra",
|
||||
"startpage.app_desc": "Seirbhís Git gan phian, féin-óstáil",
|
||||
"startpage.install": "Éasca a shuiteáil",
|
||||
"startpage.install_desc": "Níl ort ach <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%[1]s\">rith an dénártha</a> do d'ardán, seol é le <a target=\"_blank\" rel=\"noopener noreferrer \" href=\"%[2]s\">Docker</a>, nó faigh <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%[3]s\">pacáilte</a> é.",
|
||||
"startpage.platform": "Tras-ardán",
|
||||
"startpage.platform_desc": "Ritheann Gitea áit ar <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://go.dev/\">bith is féidir le Go</a> tiomsú le haghaidh: Windows, macOS, Linux, ARM, srl Roghnaigh an ceann is breá leat!",
|
||||
"startpage.lightweight": "Éadrom",
|
||||
"startpage.lightweight_desc": "Tá íosta riachtanais íseal ag Gitea agus is féidir leo rith ar Raspberry Pi saor. Sábháil fuinneamh do mheaisín!",
|
||||
"startpage.license": "Foinse Oscailte",
|
||||
"startpage.license_desc": "Téigh go bhfaighidh <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%[1]s\">%[2]s</a>! Bí linn trí <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%[3]s\">cur leis</a> chun an tionscadal seo a fheabhsú fós. Ná bíodh cúthail ort a bheith i do rannpháirtí!",
|
||||
"startpage.app_desc": "Steeped in your workflow",
|
||||
"startpage.install": "Deploy Anywhere",
|
||||
"startpage.install_desc": "Run the binary, deploy with Docker, or use your favorite package manager. GitCaddy runs wherever you need it.",
|
||||
"startpage.platform": "AI-Native Platform",
|
||||
"startpage.platform_desc": "Built for the age of AI-assisted development. Structured APIs, capability discovery, and intelligent context for AI tools.",
|
||||
"startpage.lightweight": "Lightning Fast",
|
||||
"startpage.lightweight_desc": "Minimal footprint, maximum performance. GitCaddy runs efficiently on everything from Raspberry Pi to enterprise servers.",
|
||||
"startpage.license": "Open Source",
|
||||
"startpage.license_desc": "GitCaddy is open source and built on the shoulders of giants. Based on Gitea, enhanced for the AI era.",
|
||||
"install.install": "Suiteáil",
|
||||
"install.installing_desc": "Suiteáil anois, fan go fóill…",
|
||||
"install.title": "Cumraíocht Tosaigh",
|
||||
@@ -3698,4 +3698,4 @@
|
||||
"git.filemode.executable_file": "Comhad infheidhmithe",
|
||||
"git.filemode.symbolic_link": "Nasc siombalach",
|
||||
"git.filemode.submodule": "Fo-mhodúl"
|
||||
}
|
||||
}
|
||||
@@ -75,11 +75,11 @@
|
||||
"filter.public": "Nyilvános",
|
||||
"filter.private": "Privát",
|
||||
"editor.buttons.table.add.insert": "Hozzáadás",
|
||||
"startpage.app_desc": "Fájdalommentes, saját gépre telepíthető Git szolgáltatás",
|
||||
"startpage.install": "Könnyen telepíthető",
|
||||
"startpage.platform": "Keresztplatformos",
|
||||
"startpage.lightweight": "Könnyűsúlyú",
|
||||
"startpage.license": "Nyílt forráskódú",
|
||||
"startpage.app_desc": "Steeped in your workflow",
|
||||
"startpage.install": "Deploy Anywhere",
|
||||
"startpage.platform": "AI-Native Platform",
|
||||
"startpage.lightweight": "Lightning Fast",
|
||||
"startpage.license": "Open Source",
|
||||
"install.install": "Telepítés",
|
||||
"install.title": "Kezdeti konfiguráció",
|
||||
"install.docker_helper": "Ha ön a Gitea-t Docker-ből futtatja, kérem olvassa el a <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">dokumentációt</a> a beállítások megváltoztatása előtt.",
|
||||
@@ -1384,4 +1384,4 @@
|
||||
"actions.runners.status.active": "Aktív",
|
||||
"actions.runners.version": "Verzió",
|
||||
"git.filemode.symbolic_link": "Szimbolikus hivatkozás"
|
||||
}
|
||||
}
|
||||
@@ -147,12 +147,12 @@
|
||||
"error.occurred": "Terjadi kesalahan",
|
||||
"error.report_message": "Jika Anda yakin ini adalah bug Gitea, silakan cari isu di <a href=\"%s\" target=\"_blank\">GitHub</a> atau buka isu baru jika diperlukan.",
|
||||
"error.not_found": "Target tidak dapat ditemukan.",
|
||||
"startpage.app_desc": "Sebuah layanan hosting Git sendiri yang tanpa kesulitan",
|
||||
"startpage.install": "Mudah dipasang",
|
||||
"startpage.platform": "Lintas platform",
|
||||
"startpage.lightweight": "Ringan",
|
||||
"startpage.lightweight_desc": "Gitea hanya membutuhkan persyaratan minimal dan bisa berjalan pada Raspberry Pi yang murah. Bisa menghemat listrik!",
|
||||
"startpage.license": "Sumber Terbuka",
|
||||
"startpage.app_desc": "Steeped in your workflow",
|
||||
"startpage.install": "Deploy Anywhere",
|
||||
"startpage.platform": "AI-Native Platform",
|
||||
"startpage.lightweight": "Lightning Fast",
|
||||
"startpage.lightweight_desc": "Minimal footprint, maximum performance. GitCaddy runs efficiently on everything from Raspberry Pi to enterprise servers.",
|
||||
"startpage.license": "Open Source",
|
||||
"install.title": "Konfigurasi Awal",
|
||||
"install.user": "Nama Pengguna",
|
||||
"install.password": "Kata Sandi",
|
||||
@@ -1199,4 +1199,4 @@
|
||||
"projects.type-1.display_name": "Proyek Individu",
|
||||
"projects.type-2.display_name": "Proyek Repositori",
|
||||
"projects.type-3.display_name": "Proyek Organisasi"
|
||||
}
|
||||
}
|
||||
@@ -100,12 +100,12 @@
|
||||
"error.occurred": "Villa kom upp",
|
||||
"error.not_found": "Markmiðið fannst ekki.",
|
||||
"error.network_error": "Netkerfisvilla",
|
||||
"startpage.app_desc": "Þrautalaus og sjálfhýst Git þjónusta",
|
||||
"startpage.install": "Einföld uppsetning",
|
||||
"startpage.platform": "Fjölvettvangur",
|
||||
"startpage.lightweight": "Létt",
|
||||
"startpage.lightweight_desc": "Gitea hefur lágar lágmarkskröfur og getur keyrt á ódýrum Raspberry Pi. Sparaðu orku!",
|
||||
"startpage.license": "Frjáls Hugbúnaður",
|
||||
"startpage.app_desc": "Steeped in your workflow",
|
||||
"startpage.install": "Deploy Anywhere",
|
||||
"startpage.platform": "AI-Native Platform",
|
||||
"startpage.lightweight": "Lightning Fast",
|
||||
"startpage.lightweight_desc": "Minimal footprint, maximum performance. GitCaddy runs efficiently on everything from Raspberry Pi to enterprise servers.",
|
||||
"startpage.license": "Open Source",
|
||||
"install.install": "Uppsetning",
|
||||
"install.title": "Upphafleg Uppsetning",
|
||||
"install.docker_helper": "Ef þú keyrir Gitea inni í Docker þá viltu vinsamlegast lesa <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">leiðbeiningaritið</a> áður en þú breytir stillingum.",
|
||||
@@ -1117,4 +1117,4 @@
|
||||
"actions.runners.status.active": "Virkt",
|
||||
"actions.runners.version": "Útgáfa",
|
||||
"actions.runs.commit": "Framlag"
|
||||
}
|
||||
}
|
||||
@@ -155,12 +155,12 @@
|
||||
"error.occurred": "Radusies kļūda",
|
||||
"error.not_found": "Pieprasītie dati netika atrasti.",
|
||||
"error.network_error": "Tīkla kļūda",
|
||||
"startpage.app_desc": "Viegli uzstādāms Git serviss",
|
||||
"startpage.install": "Vienkārši instalējams",
|
||||
"startpage.platform": "Pieejama dažādām platformām",
|
||||
"startpage.lightweight": "Viegla",
|
||||
"startpage.lightweight_desc": "Gitea ir miminālas prasības un to var darbināt uz nedārga Raspberry Pi datora. Ietaupi savai ierīcei resursus!",
|
||||
"startpage.license": "Atvērtā pirmkoda",
|
||||
"startpage.app_desc": "Steeped in your workflow",
|
||||
"startpage.install": "Deploy Anywhere",
|
||||
"startpage.platform": "AI-Native Platform",
|
||||
"startpage.lightweight": "Lightning Fast",
|
||||
"startpage.lightweight_desc": "Minimal footprint, maximum performance. GitCaddy runs efficiently on everything from Raspberry Pi to enterprise servers.",
|
||||
"startpage.license": "Open Source",
|
||||
"install.install": "Instalācija",
|
||||
"install.title": "Sākotnējā konfigurācija",
|
||||
"install.docker_helper": "Ja Gitea ir uzstādīts Docker konteinerī, izlasiet <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">vadlīninas</a> pirms maināt iestatījumus.",
|
||||
@@ -3043,4 +3043,4 @@
|
||||
"git.filemode.executable_file": "Izpildāmais fails",
|
||||
"git.filemode.symbolic_link": "Simboliska saite",
|
||||
"git.filemode.submodule": "Apakšmodulis"
|
||||
}
|
||||
}
|
||||
@@ -87,12 +87,12 @@
|
||||
"filter.public": "ප්රසිද්ධ",
|
||||
"filter.private": "පෞද්ගලික",
|
||||
"editor.buttons.table.add.insert": "එකතු",
|
||||
"startpage.app_desc": "වේදනාකාරී, ස්වයං-සත්කාරක Git සේවාවක්",
|
||||
"startpage.install": "ස්ථාපනයට පහසුය",
|
||||
"startpage.platform": "හරස් වේදිකාව",
|
||||
"startpage.lightweight": "සැහැල්ලු",
|
||||
"startpage.lightweight_desc": "Gitea අඩු අවම අවශ්යතා ඇති අතර මිල අඩු Raspberry Pi මත ධාවනය කළ හැකිය. ඔබේ යන්ත්ර ශක්තිය සුරකින්න!",
|
||||
"startpage.license": "විවෘත මූලාශ්ර",
|
||||
"startpage.app_desc": "Steeped in your workflow",
|
||||
"startpage.install": "Deploy Anywhere",
|
||||
"startpage.platform": "AI-Native Platform",
|
||||
"startpage.lightweight": "Lightning Fast",
|
||||
"startpage.lightweight_desc": "Minimal footprint, maximum performance. GitCaddy runs efficiently on everything from Raspberry Pi to enterprise servers.",
|
||||
"startpage.license": "Open Source",
|
||||
"install.install": "ස්ථාපනය",
|
||||
"install.title": "මූලික වින්යාසය",
|
||||
"install.docker_helper": "ඔබ Docker තුළ Gitea ධාවනය කරන්නේ නම්, කරුණාකර ඕනෑම සැකසුම් වෙනස් කිරීමට පෙර <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">ලියකියවිලි</a> කියවන්න.",
|
||||
@@ -2190,4 +2190,4 @@
|
||||
"actions.runners.version": "අනුවාදය",
|
||||
"actions.runs.commit": "කැප",
|
||||
"git.filemode.symbolic_link": "සංකේතාත්මක සබැඳිය"
|
||||
}
|
||||
}
|
||||
@@ -147,12 +147,12 @@
|
||||
"error.occurred": "Vyskytla sa chyba",
|
||||
"error.not_found": "Nebolo možné nájsť cieľ.",
|
||||
"error.network_error": "Chyba siete",
|
||||
"startpage.app_desc": "Jednoducho prístupný vlastný Git",
|
||||
"startpage.install": "Jednoduchá inštalácia",
|
||||
"startpage.platform": "Multiplatformový",
|
||||
"startpage.lightweight": "Ľahká",
|
||||
"startpage.lightweight_desc": "Gitea má minimálne požiadavky a môže bežať na Raspberry Pi. Šetrite energiou vášho stroja!",
|
||||
"startpage.license": "Otvorený zdrojový kód",
|
||||
"startpage.app_desc": "Steeped in your workflow",
|
||||
"startpage.install": "Deploy Anywhere",
|
||||
"startpage.platform": "AI-Native Platform",
|
||||
"startpage.lightweight": "Lightning Fast",
|
||||
"startpage.lightweight_desc": "Minimal footprint, maximum performance. GitCaddy runs efficiently on everything from Raspberry Pi to enterprise servers.",
|
||||
"startpage.license": "Open Source",
|
||||
"install.install": "Inštalácia",
|
||||
"install.title": "Východzia konfigurácia",
|
||||
"install.docker_helper": "Ak spúšťate Gitea v Docker kontajneri, prečítajte si <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">dokumentáciu</a> pred zmenou akýchkoľvek nastavení.",
|
||||
@@ -1161,4 +1161,4 @@
|
||||
"actions.runners.status.unspecified": "Neznámy",
|
||||
"actions.runners.version": "Verzia",
|
||||
"git.filemode.symbolic_link": "Symbolický odkaz"
|
||||
}
|
||||
}
|
||||
@@ -74,12 +74,12 @@
|
||||
"filter.public": "Offentlig",
|
||||
"filter.private": "Privat",
|
||||
"editor.buttons.table.add.insert": "Lägg till",
|
||||
"startpage.app_desc": "En smidig, självhostad Git-tjänst",
|
||||
"startpage.install": "Lätt att installera",
|
||||
"startpage.platform": "Plattformsoberoende",
|
||||
"startpage.lightweight": "Lättviktig",
|
||||
"startpage.lightweight_desc": "Gitea har låga minimum-krav och kan köras på en billig Rasperry Pi. Spara på din maskins kraft!",
|
||||
"startpage.license": "Öppen källkod",
|
||||
"startpage.app_desc": "Steeped in your workflow",
|
||||
"startpage.install": "Deploy Anywhere",
|
||||
"startpage.platform": "AI-Native Platform",
|
||||
"startpage.lightweight": "Lightning Fast",
|
||||
"startpage.lightweight_desc": "Minimal footprint, maximum performance. GitCaddy runs efficiently on everything from Raspberry Pi to enterprise servers.",
|
||||
"startpage.license": "Open Source",
|
||||
"install.title": "Ursprunglig konfiguration",
|
||||
"install.docker_helper": "Om du kör Gitea i Docker, vänligen läs igenom <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">dokumentationen</a> innan några inställningar ändras.",
|
||||
"install.db_title": "Databasinställningar",
|
||||
@@ -1734,4 +1734,4 @@
|
||||
"actions.runners.task_list.repository": "Utvecklingskatalog",
|
||||
"actions.runners.status.active": "Aktiv",
|
||||
"git.filemode.symbolic_link": "Symbolisk länk"
|
||||
}
|
||||
}
|
||||
@@ -1 +1,19 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 640 640" width="32" height="32"><path 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 12" style="fill:#fff"/><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.6M125.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.1m300.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.1" style="fill:#609926"/><path d="M326.8 380.1c-8.2.1-15.4 5.8-17.3 13.8s2 16.3 9.1 20c7.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.3s17.4 1.7 22.5-5.3c5-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.8z" style="fill:#609926"/></svg>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="374px" height="374px" viewBox="397.5 371.5 374 374" style="enable-background:new 397.5 371.5 374 374;"
|
||||
xml:space="preserve">
|
||||
<path style="fill:#609926;" d="M526.05,605.17c-0.69,0-1.39-0.14-2.08-0.46l-82.52-37.42v95.65l138.07,48.38V563.78l-50.37,40.29
|
||||
C528.27,604.76,527.16,605.17,526.05,605.17L526.05,605.17z"/>
|
||||
<path style="fill:#609926;" d="M643.03,605.17c-1.16,0-2.26-0.42-3.15-1.11l-50.37-40.29v147.55l138.16-48.38v-95.65l-82.56,37.42
|
||||
c-0.65,0.28-1.34,0.46-2.04,0.46L643.03,605.17z"/>
|
||||
<path style="fill:#609926;" d="M525.31,594.35l49.08-39.22l-137-48.06l-37.88,30.34L525.31,594.35z"/>
|
||||
<path style="fill:#609926;" d="M594.69,555.13l49.03,39.22l125.81-56.94l-37.88-30.34L594.69,555.13z"/>
|
||||
<path style="fill:#609926;" d="M525.36,438.98c-11.01-3.42-23.22-7.26-36.22-13.46c-1.62,64.89,35.94,80.94,52.68,84.88
|
||||
c16.47,3.88,30.57,0.55,35.48-3.88c-11.24-14.06-25.81-26.6-43.43-31.45c16.19,1.76,31.13,9.62,43.99,19.89
|
||||
c-3.88-40.66-22.76-46.62-52.45-55.97H525.36z"/>
|
||||
<path style="fill:#609926;" d="M589.74,491.11c5.23,5,20.81,8.79,38.85,4.53c18.22-4.3,59.16-21.79,57.22-92.6
|
||||
c-14.2,6.8-27.57,10.96-39.59,14.76c-32.47,10.17-53.01,16.6-56.98,61.52c13.92-11.38,30.16-20.26,47.96-22.29
|
||||
c-19.24,5.23-35.2,18.87-47.41,34.04L589.74,491.11z"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 1.6 KiB |
19
public/assets/img/gitcaddy-icon.svg
Normal file
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="374px" height="374px" viewBox="397.5 371.5 374 374" style="enable-background:new 397.5 371.5 374 374;"
|
||||
xml:space="preserve">
|
||||
<path style="fill:#609926;" d="M526.05,605.17c-0.69,0-1.39-0.14-2.08-0.46l-82.52-37.42v95.65l138.07,48.38V563.78l-50.37,40.29
|
||||
C528.27,604.76,527.16,605.17,526.05,605.17L526.05,605.17z"/>
|
||||
<path style="fill:#609926;" d="M643.03,605.17c-1.16,0-2.26-0.42-3.15-1.11l-50.37-40.29v147.55l138.16-48.38v-95.65l-82.56,37.42
|
||||
c-0.65,0.28-1.34,0.46-2.04,0.46L643.03,605.17z"/>
|
||||
<path style="fill:#609926;" d="M525.31,594.35l49.08-39.22l-137-48.06l-37.88,30.34L525.31,594.35z"/>
|
||||
<path style="fill:#609926;" d="M594.69,555.13l49.03,39.22l125.81-56.94l-37.88-30.34L594.69,555.13z"/>
|
||||
<path style="fill:#609926;" d="M525.36,438.98c-11.01-3.42-23.22-7.26-36.22-13.46c-1.62,64.89,35.94,80.94,52.68,84.88
|
||||
c16.47,3.88,30.57,0.55,35.48-3.88c-11.24-14.06-25.81-26.6-43.43-31.45c16.19,1.76,31.13,9.62,43.99,19.89
|
||||
c-3.88-40.66-22.76-46.62-52.45-55.97H525.36z"/>
|
||||
<path style="fill:#609926;" d="M589.74,491.11c5.23,5,20.81,8.79,38.85,4.53c18.22-4.3,59.16-21.79,57.22-92.6
|
||||
c-14.2,6.8-27.57,10.96-39.59,14.76c-32.47,10.17-53.01,16.6-56.98,61.52c13.92-11.38,30.16-20.26,47.96-22.29
|
||||
c-19.24,5.23-35.2,18.87-47.41,34.04L589.74,491.11z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
1062
public/assets/img/gitcaddy-logo.svg
Normal file
|
After Width: | Height: | Size: 105 KiB |
@@ -1 +1,19 @@
|
||||
<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>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="374px" height="374px" viewBox="397.5 371.5 374 374" style="enable-background:new 397.5 371.5 374 374;"
|
||||
xml:space="preserve">
|
||||
<path style="fill:#609926;" d="M526.05,605.17c-0.69,0-1.39-0.14-2.08-0.46l-82.52-37.42v95.65l138.07,48.38V563.78l-50.37,40.29
|
||||
C528.27,604.76,527.16,605.17,526.05,605.17L526.05,605.17z"/>
|
||||
<path style="fill:#609926;" d="M643.03,605.17c-1.16,0-2.26-0.42-3.15-1.11l-50.37-40.29v147.55l138.16-48.38v-95.65l-82.56,37.42
|
||||
c-0.65,0.28-1.34,0.46-2.04,0.46L643.03,605.17z"/>
|
||||
<path style="fill:#609926;" d="M525.31,594.35l49.08-39.22l-137-48.06l-37.88,30.34L525.31,594.35z"/>
|
||||
<path style="fill:#609926;" d="M594.69,555.13l49.03,39.22l125.81-56.94l-37.88-30.34L594.69,555.13z"/>
|
||||
<path style="fill:#609926;" d="M525.36,438.98c-11.01-3.42-23.22-7.26-36.22-13.46c-1.62,64.89,35.94,80.94,52.68,84.88
|
||||
c16.47,3.88,30.57,0.55,35.48-3.88c-11.24-14.06-25.81-26.6-43.43-31.45c16.19,1.76,31.13,9.62,43.99,19.89
|
||||
c-3.88-40.66-22.76-46.62-52.45-55.97H525.36z"/>
|
||||
<path style="fill:#609926;" d="M589.74,491.11c5.23,5,20.81,8.79,38.85,4.53c18.22-4.3,59.16-21.79,57.22-92.6
|
||||
c-14.2,6.8-27.57,10.96-39.59,14.76c-32.47,10.17-53.01,16.6-56.98,61.52c13.92-11.38,30.16-20.26,47.96-22.29
|
||||
c-19.24,5.23-35.2,18.87-47.41,34.04L589.74,491.11z"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 1.6 KiB |
@@ -1 +1,19 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 640 640" width="32" height="32"><path 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 12" style="fill:#fff"/><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.6M125.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.1m300.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.1" style="fill:#609926"/><path d="M326.8 380.1c-8.2.1-15.4 5.8-17.3 13.8s2 16.3 9.1 20c7.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.3s17.4 1.7 22.5-5.3c5-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.8z" style="fill:#609926"/></svg>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="374px" height="374px" viewBox="397.5 371.5 374 374" style="enable-background:new 397.5 371.5 374 374;"
|
||||
xml:space="preserve">
|
||||
<path style="fill:#609926;" d="M526.05,605.17c-0.69,0-1.39-0.14-2.08-0.46l-82.52-37.42v95.65l138.07,48.38V563.78l-50.37,40.29
|
||||
C528.27,604.76,527.16,605.17,526.05,605.17L526.05,605.17z"/>
|
||||
<path style="fill:#609926;" d="M643.03,605.17c-1.16,0-2.26-0.42-3.15-1.11l-50.37-40.29v147.55l138.16-48.38v-95.65l-82.56,37.42
|
||||
c-0.65,0.28-1.34,0.46-2.04,0.46L643.03,605.17z"/>
|
||||
<path style="fill:#609926;" d="M525.31,594.35l49.08-39.22l-137-48.06l-37.88,30.34L525.31,594.35z"/>
|
||||
<path style="fill:#609926;" d="M594.69,555.13l49.03,39.22l125.81-56.94l-37.88-30.34L594.69,555.13z"/>
|
||||
<path style="fill:#609926;" d="M525.36,438.98c-11.01-3.42-23.22-7.26-36.22-13.46c-1.62,64.89,35.94,80.94,52.68,84.88
|
||||
c16.47,3.88,30.57,0.55,35.48-3.88c-11.24-14.06-25.81-26.6-43.43-31.45c16.19,1.76,31.13,9.62,43.99,19.89
|
||||
c-3.88-40.66-22.76-46.62-52.45-55.97H525.36z"/>
|
||||
<path style="fill:#609926;" d="M589.74,491.11c5.23,5,20.81,8.79,38.85,4.53c18.22-4.3,59.16-21.79,57.22-92.6
|
||||
c-14.2,6.8-27.57,10.96-39.59,14.76c-32.47,10.17-53.01,16.6-56.98,61.52c13.92-11.38,30.16-20.26,47.96-22.29
|
||||
c-19.24,5.23-35.2,18.87-47.41,34.04L589.74,491.11z"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 1.6 KiB |
27629
public/assets/licenses.txt
Normal file
@@ -1,4 +1,4 @@
|
||||
// Copyright 2022 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2022 The Gitea Authors and MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package runner
|
||||
@@ -115,10 +115,10 @@ func (s *Service) Declare(
|
||||
req *connect.Request[runnerv1.DeclareRequest],
|
||||
) (*connect.Response[runnerv1.DeclareResponse], error) {
|
||||
runner := GetRunner(ctx)
|
||||
runner.AgentLabels = req.Msg.Labels
|
||||
runner.Version = req.Msg.Version
|
||||
runner.CapabilitiesJSON = req.Msg.CapabilitiesJson
|
||||
if err := actions_model.UpdateRunner(ctx, runner, "agent_labels", "version", "capabilities_json"); err != nil {
|
||||
if err := actions_model.UpdateRunner(ctx, runner, "version", "capabilities_json"); err != nil {
|
||||
log.Error("Declare: failed to update runner %d: %v", runner.ID, err)
|
||||
return nil, status.Errorf(codes.Internal, "update runner: %v", err)
|
||||
}
|
||||
|
||||
@@ -141,6 +141,15 @@ func (s *Service) FetchTask(
|
||||
) (*connect.Response[runnerv1.FetchTaskResponse], error) {
|
||||
runner := GetRunner(ctx)
|
||||
|
||||
// Update runner capabilities if provided
|
||||
if capsJSON := req.Msg.GetCapabilitiesJson(); capsJSON != "" && capsJSON != runner.CapabilitiesJSON {
|
||||
runner.CapabilitiesJSON = capsJSON
|
||||
if err := actions_model.UpdateRunner(ctx, runner, "capabilities_json"); err != nil {
|
||||
log.Warn("failed to update runner capabilities: %v", err)
|
||||
// Don't return error, just log warning - capabilities update is not critical
|
||||
}
|
||||
}
|
||||
|
||||
var task *runnerv1.Task
|
||||
tasksVersion := req.Msg.TasksVersion // task version from runner
|
||||
latestVersion, err := actions_model.GetTasksVersionByScope(ctx, runner.OwnerID, runner.RepoID)
|
||||
@@ -167,9 +176,22 @@ func (s *Service) FetchTask(
|
||||
task = t
|
||||
}
|
||||
}
|
||||
|
||||
// Check if admin requested a bandwidth test
|
||||
requestBandwidthTest := false
|
||||
if runner.BandwidthTestRequestedAt > 0 {
|
||||
requestBandwidthTest = true
|
||||
// Clear the request after sending
|
||||
runner.BandwidthTestRequestedAt = 0
|
||||
if err := actions_model.UpdateRunner(ctx, runner, "bandwidth_test_requested_at"); err != nil {
|
||||
log.Warn("failed to clear bandwidth test request: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
res := connect.NewResponse(&runnerv1.FetchTaskResponse{
|
||||
Task: task,
|
||||
TasksVersion: latestVersion,
|
||||
Task: task,
|
||||
TasksVersion: latestVersion,
|
||||
RequestBandwidthTest: requestBandwidthTest,
|
||||
})
|
||||
return res, nil
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// Copyright 2015 The Gogs Authors. All rights reserved.
|
||||
// Copyright 2016 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2016 The Gitea Authors and MarketAlly. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
// Package v1 Gitea API
|
||||
|
||||