mirror of https://github.com/go-gitea/gitea.git
Merge branch 'main' into fix-email-header-gitea-reason
This commit is contained in:
commit
abd005013f
11
.air.toml
11
.air.toml
|
@ -8,6 +8,15 @@ delay = 1000
|
||||||
include_ext = ["go", "tmpl"]
|
include_ext = ["go", "tmpl"]
|
||||||
include_file = ["main.go"]
|
include_file = ["main.go"]
|
||||||
include_dir = ["cmd", "models", "modules", "options", "routers", "services"]
|
include_dir = ["cmd", "models", "modules", "options", "routers", "services"]
|
||||||
exclude_dir = ["modules/git/tests", "services/gitdiff/testdata", "modules/avatar/testdata", "models/fixtures", "models/migrations/fixtures", "modules/migration/file_format_testdata", "modules/avatar/identicon/testdata"]
|
exclude_dir = [
|
||||||
|
"models/fixtures",
|
||||||
|
"models/migrations/fixtures",
|
||||||
|
"modules/avatar/identicon/testdata",
|
||||||
|
"modules/avatar/testdata",
|
||||||
|
"modules/git/tests",
|
||||||
|
"modules/migration/file_format_testdata",
|
||||||
|
"routers/private/tests",
|
||||||
|
"services/gitdiff/testdata",
|
||||||
|
]
|
||||||
exclude_regex = ["_test.go$", "_gen.go$"]
|
exclude_regex = ["_test.go$", "_gen.go$"]
|
||||||
stop_on_error = true
|
stop_on_error = true
|
||||||
|
|
|
@ -13,46 +13,42 @@ groups:
|
||||||
-
|
-
|
||||||
name: BREAKING
|
name: BREAKING
|
||||||
labels:
|
labels:
|
||||||
- kind/breaking
|
- pr/breaking
|
||||||
-
|
-
|
||||||
name: SECURITY
|
name: SECURITY
|
||||||
labels:
|
labels:
|
||||||
- kind/security
|
- topic/security
|
||||||
-
|
-
|
||||||
name: FEATURES
|
name: FEATURES
|
||||||
labels:
|
labels:
|
||||||
- kind/feature
|
- type/feature
|
||||||
-
|
-
|
||||||
name: API
|
name: API
|
||||||
labels:
|
labels:
|
||||||
- kind/api
|
- modifies/api
|
||||||
-
|
-
|
||||||
name: ENHANCEMENTS
|
name: ENHANCEMENTS
|
||||||
labels:
|
labels:
|
||||||
- kind/enhancement
|
- type/enhancement
|
||||||
- kind/refactor
|
- type/refactoring
|
||||||
- kind/ui
|
- topic/ui
|
||||||
-
|
-
|
||||||
name: BUGFIXES
|
name: BUGFIXES
|
||||||
labels:
|
labels:
|
||||||
- kind/bug
|
- type/bug
|
||||||
-
|
-
|
||||||
name: TESTING
|
name: TESTING
|
||||||
labels:
|
labels:
|
||||||
- kind/testing
|
- type/testing
|
||||||
-
|
|
||||||
name: TRANSLATION
|
|
||||||
labels:
|
|
||||||
- kind/translation
|
|
||||||
-
|
-
|
||||||
name: BUILD
|
name: BUILD
|
||||||
labels:
|
labels:
|
||||||
- kind/build
|
- topic/build
|
||||||
- kind/lint
|
- topic/code-linting
|
||||||
-
|
-
|
||||||
name: DOCS
|
name: DOCS
|
||||||
labels:
|
labels:
|
||||||
- kind/docs
|
- type/docs
|
||||||
-
|
-
|
||||||
name: MISC
|
name: MISC
|
||||||
default: true
|
default: true
|
||||||
|
|
|
@ -1,14 +1,16 @@
|
||||||
{
|
{
|
||||||
"name": "Gitea DevContainer",
|
"name": "Gitea DevContainer",
|
||||||
"image": "mcr.microsoft.com/devcontainers/go:1.21-bullseye",
|
"image": "mcr.microsoft.com/devcontainers/go:1.22-bullseye",
|
||||||
"features": {
|
"features": {
|
||||||
// installs nodejs into container
|
// installs nodejs into container
|
||||||
"ghcr.io/devcontainers/features/node:1": {
|
"ghcr.io/devcontainers/features/node:1": {
|
||||||
"version":"20"
|
"version": "20"
|
||||||
},
|
},
|
||||||
"ghcr.io/devcontainers/features/git-lfs:1.1.0": {},
|
"ghcr.io/devcontainers/features/git-lfs:1.1.0": {},
|
||||||
"ghcr.io/devcontainers-contrib/features/poetry:2": {},
|
"ghcr.io/devcontainers-contrib/features/poetry:2": {},
|
||||||
"ghcr.io/devcontainers/features/python:1": {}
|
"ghcr.io/devcontainers/features/python:1": {
|
||||||
|
"version": "3.12"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"customizations": {
|
"customizations": {
|
||||||
"vscode": {
|
"vscode": {
|
||||||
|
@ -22,7 +24,7 @@
|
||||||
"DavidAnson.vscode-markdownlint",
|
"DavidAnson.vscode-markdownlint",
|
||||||
"Vue.volar",
|
"Vue.volar",
|
||||||
"ms-azuretools.vscode-docker",
|
"ms-azuretools.vscode-docker",
|
||||||
"zixuanchen.vitest-explorer",
|
"vitest.explorer",
|
||||||
"qwtel.sqlite-viewer",
|
"qwtel.sqlite-viewer",
|
||||||
"GitHub.vscode-pull-request-github"
|
"GitHub.vscode-pull-request-github"
|
||||||
]
|
]
|
||||||
|
|
|
@ -14,7 +14,7 @@ _test
|
||||||
|
|
||||||
# MS VSCode
|
# MS VSCode
|
||||||
.vscode
|
.vscode
|
||||||
__debug_bin
|
__debug_bin*
|
||||||
|
|
||||||
# Architecture specific extensions/prefixes
|
# Architecture specific extensions/prefixes
|
||||||
*.[568vq]
|
*.[568vq]
|
||||||
|
@ -62,7 +62,6 @@ cpu.out
|
||||||
/data
|
/data
|
||||||
/indexers
|
/indexers
|
||||||
/log
|
/log
|
||||||
/public/img/avatar
|
|
||||||
/tests/integration/gitea-integration-*
|
/tests/integration/gitea-integration-*
|
||||||
/tests/integration/indexers-*
|
/tests/integration/indexers-*
|
||||||
/tests/e2e/gitea-e2e-*
|
/tests/e2e/gitea-e2e-*
|
||||||
|
@ -78,7 +77,7 @@ cpu.out
|
||||||
/public/assets/js
|
/public/assets/js
|
||||||
/public/assets/css
|
/public/assets/css
|
||||||
/public/assets/fonts
|
/public/assets/fonts
|
||||||
/public/assets/img/webpack
|
/public/assets/img/avatar
|
||||||
/vendor
|
/vendor
|
||||||
/web_src/fomantic/node_modules
|
/web_src/fomantic/node_modules
|
||||||
/web_src/fomantic/build/*
|
/web_src/fomantic/build/*
|
||||||
|
|
425
.drone.yml
425
.drone.yml
|
@ -1,425 +0,0 @@
|
||||||
---
|
|
||||||
kind: pipeline
|
|
||||||
name: release-version
|
|
||||||
|
|
||||||
platform:
|
|
||||||
os: linux
|
|
||||||
arch: amd64
|
|
||||||
|
|
||||||
workspace:
|
|
||||||
base: /source
|
|
||||||
path: /
|
|
||||||
|
|
||||||
trigger:
|
|
||||||
event:
|
|
||||||
- tag
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
- name: deps
|
|
||||||
temp: {}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: fetch-tags
|
|
||||||
image: docker:git
|
|
||||||
pull: always
|
|
||||||
commands:
|
|
||||||
- git fetch --tags --force
|
|
||||||
|
|
||||||
- name: deps-frontend
|
|
||||||
image: node:20
|
|
||||||
pull: always
|
|
||||||
commands:
|
|
||||||
- make deps-frontend
|
|
||||||
|
|
||||||
- name: deps-backend
|
|
||||||
image: gitea/test_env:linux-1.20-amd64
|
|
||||||
pull: always
|
|
||||||
commands:
|
|
||||||
- make deps-backend
|
|
||||||
volumes:
|
|
||||||
- name: deps
|
|
||||||
path: /go
|
|
||||||
|
|
||||||
- name: static
|
|
||||||
image: techknowlogick/xgo:go-1.21.x
|
|
||||||
pull: always
|
|
||||||
commands:
|
|
||||||
- curl -sL https://deb.nodesource.com/setup_20.x | bash - && apt-get -qqy install nodejs
|
|
||||||
- export PATH=$PATH:$GOPATH/bin
|
|
||||||
- make release
|
|
||||||
environment:
|
|
||||||
GOPROXY: https://goproxy.io # proxy.golang.org is blocked in China, this proxy is not
|
|
||||||
TAGS: bindata sqlite sqlite_unlock_notify
|
|
||||||
DEBIAN_FRONTEND: noninteractive
|
|
||||||
depends_on: [fetch-tags]
|
|
||||||
volumes:
|
|
||||||
- name: deps
|
|
||||||
path: /go
|
|
||||||
|
|
||||||
- name: gpg-sign
|
|
||||||
image: plugins/gpgsign:1
|
|
||||||
pull: always
|
|
||||||
settings:
|
|
||||||
detach_sign: true
|
|
||||||
excludes:
|
|
||||||
- "dist/release/*.sha256"
|
|
||||||
files:
|
|
||||||
- "dist/release/*"
|
|
||||||
environment:
|
|
||||||
GPGSIGN_KEY:
|
|
||||||
from_secret: gpgsign_key
|
|
||||||
GPGSIGN_PASSPHRASE:
|
|
||||||
from_secret: gpgsign_passphrase
|
|
||||||
depends_on: [static]
|
|
||||||
|
|
||||||
- name: release-tag
|
|
||||||
image: woodpeckerci/plugin-s3:latest
|
|
||||||
pull: always
|
|
||||||
settings:
|
|
||||||
acl:
|
|
||||||
from_secret: aws_s3_acl
|
|
||||||
region:
|
|
||||||
from_secret: aws_s3_region
|
|
||||||
bucket:
|
|
||||||
from_secret: aws_s3_bucket
|
|
||||||
endpoint:
|
|
||||||
from_secret: aws_s3_endpoint
|
|
||||||
path_style:
|
|
||||||
from_secret: aws_s3_path_style
|
|
||||||
source: "dist/release/*"
|
|
||||||
strip_prefix: dist/release/
|
|
||||||
target: "/gitea/${DRONE_TAG##v}"
|
|
||||||
environment:
|
|
||||||
AWS_ACCESS_KEY_ID:
|
|
||||||
from_secret: aws_access_key_id
|
|
||||||
AWS_SECRET_ACCESS_KEY:
|
|
||||||
from_secret: aws_secret_access_key
|
|
||||||
depends_on: [gpg-sign]
|
|
||||||
|
|
||||||
- name: github
|
|
||||||
image: plugins/github-release:latest
|
|
||||||
pull: always
|
|
||||||
settings:
|
|
||||||
files:
|
|
||||||
- "dist/release/*"
|
|
||||||
file_exists: overwrite
|
|
||||||
environment:
|
|
||||||
GITHUB_TOKEN:
|
|
||||||
from_secret: github_token
|
|
||||||
depends_on: [gpg-sign]
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: pipeline
|
|
||||||
type: docker
|
|
||||||
name: docker-linux-amd64-release-version
|
|
||||||
|
|
||||||
platform:
|
|
||||||
os: linux
|
|
||||||
arch: amd64
|
|
||||||
|
|
||||||
trigger:
|
|
||||||
ref:
|
|
||||||
include:
|
|
||||||
- "refs/tags/**"
|
|
||||||
exclude:
|
|
||||||
- "refs/tags/**-rc*"
|
|
||||||
paths:
|
|
||||||
exclude:
|
|
||||||
- "docs/**"
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: fetch-tags
|
|
||||||
image: docker:git
|
|
||||||
pull: always
|
|
||||||
commands:
|
|
||||||
- git fetch --tags --force
|
|
||||||
|
|
||||||
- name: publish
|
|
||||||
image: plugins/docker:latest
|
|
||||||
pull: always
|
|
||||||
settings:
|
|
||||||
auto_tag: true
|
|
||||||
auto_tag_suffix: linux-amd64
|
|
||||||
repo: gitea/gitea
|
|
||||||
build_args:
|
|
||||||
- GOPROXY=https://goproxy.io
|
|
||||||
password:
|
|
||||||
from_secret: docker_password
|
|
||||||
username:
|
|
||||||
from_secret: docker_username
|
|
||||||
environment:
|
|
||||||
PLUGIN_MIRROR:
|
|
||||||
from_secret: plugin_mirror
|
|
||||||
DOCKER_BUILDKIT: 1
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
exclude:
|
|
||||||
- pull_request
|
|
||||||
|
|
||||||
- name: publish-rootless
|
|
||||||
image: plugins/docker:latest
|
|
||||||
settings:
|
|
||||||
dockerfile: Dockerfile.rootless
|
|
||||||
auto_tag: true
|
|
||||||
auto_tag_suffix: linux-amd64-rootless
|
|
||||||
repo: gitea/gitea
|
|
||||||
build_args:
|
|
||||||
- GOPROXY=https://goproxy.io
|
|
||||||
password:
|
|
||||||
from_secret: docker_password
|
|
||||||
username:
|
|
||||||
from_secret: docker_username
|
|
||||||
environment:
|
|
||||||
PLUGIN_MIRROR:
|
|
||||||
from_secret: plugin_mirror
|
|
||||||
DOCKER_BUILDKIT: 1
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
exclude:
|
|
||||||
- pull_request
|
|
||||||
---
|
|
||||||
|
|
||||||
kind: pipeline
|
|
||||||
type: docker
|
|
||||||
name: docker-linux-amd64-release-candidate-version
|
|
||||||
|
|
||||||
platform:
|
|
||||||
os: linux
|
|
||||||
arch: amd64
|
|
||||||
|
|
||||||
trigger:
|
|
||||||
ref:
|
|
||||||
- "refs/tags/**-rc*"
|
|
||||||
paths:
|
|
||||||
exclude:
|
|
||||||
- "docs/**"
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: fetch-tags
|
|
||||||
image: docker:git
|
|
||||||
pull: always
|
|
||||||
commands:
|
|
||||||
- git fetch --tags --force
|
|
||||||
|
|
||||||
- name: publish
|
|
||||||
image: plugins/docker:latest
|
|
||||||
pull: always
|
|
||||||
settings:
|
|
||||||
tags: ${DRONE_TAG##v}-linux-amd64
|
|
||||||
repo: gitea/gitea
|
|
||||||
build_args:
|
|
||||||
- GOPROXY=https://goproxy.io
|
|
||||||
password:
|
|
||||||
from_secret: docker_password
|
|
||||||
username:
|
|
||||||
from_secret: docker_username
|
|
||||||
environment:
|
|
||||||
PLUGIN_MIRROR:
|
|
||||||
from_secret: plugin_mirror
|
|
||||||
DOCKER_BUILDKIT: 1
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
exclude:
|
|
||||||
- pull_request
|
|
||||||
|
|
||||||
- name: publish-rootless
|
|
||||||
image: plugins/docker:latest
|
|
||||||
settings:
|
|
||||||
dockerfile: Dockerfile.rootless
|
|
||||||
tags: ${DRONE_TAG##v}-linux-amd64-rootless
|
|
||||||
repo: gitea/gitea
|
|
||||||
build_args:
|
|
||||||
- GOPROXY=https://goproxy.io
|
|
||||||
password:
|
|
||||||
from_secret: docker_password
|
|
||||||
username:
|
|
||||||
from_secret: docker_username
|
|
||||||
environment:
|
|
||||||
PLUGIN_MIRROR:
|
|
||||||
from_secret: plugin_mirror
|
|
||||||
DOCKER_BUILDKIT: 1
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
exclude:
|
|
||||||
- pull_request
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: pipeline
|
|
||||||
type: docker
|
|
||||||
name: docker-linux-arm64-release-version
|
|
||||||
|
|
||||||
platform:
|
|
||||||
os: linux
|
|
||||||
arch: arm64
|
|
||||||
|
|
||||||
trigger:
|
|
||||||
ref:
|
|
||||||
include:
|
|
||||||
- "refs/tags/**"
|
|
||||||
exclude:
|
|
||||||
- "refs/tags/**-rc*"
|
|
||||||
paths:
|
|
||||||
exclude:
|
|
||||||
- "docs/**"
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: fetch-tags
|
|
||||||
image: docker:git
|
|
||||||
pull: always
|
|
||||||
commands:
|
|
||||||
- git fetch --tags --force
|
|
||||||
|
|
||||||
- name: publish
|
|
||||||
image: plugins/docker:latest
|
|
||||||
pull: always
|
|
||||||
settings:
|
|
||||||
auto_tag: true
|
|
||||||
auto_tag_suffix: linux-arm64
|
|
||||||
repo: gitea/gitea
|
|
||||||
build_args:
|
|
||||||
- GOPROXY=https://goproxy.io
|
|
||||||
password:
|
|
||||||
from_secret: docker_password
|
|
||||||
username:
|
|
||||||
from_secret: docker_username
|
|
||||||
environment:
|
|
||||||
PLUGIN_MIRROR:
|
|
||||||
from_secret: plugin_mirror
|
|
||||||
DOCKER_BUILDKIT: 1
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
exclude:
|
|
||||||
- pull_request
|
|
||||||
|
|
||||||
- name: publish-rootless
|
|
||||||
image: plugins/docker:latest
|
|
||||||
settings:
|
|
||||||
dockerfile: Dockerfile.rootless
|
|
||||||
auto_tag: true
|
|
||||||
auto_tag_suffix: linux-arm64-rootless
|
|
||||||
repo: gitea/gitea
|
|
||||||
build_args:
|
|
||||||
- GOPROXY=https://goproxy.io
|
|
||||||
password:
|
|
||||||
from_secret: docker_password
|
|
||||||
username:
|
|
||||||
from_secret: docker_username
|
|
||||||
environment:
|
|
||||||
PLUGIN_MIRROR:
|
|
||||||
from_secret: plugin_mirror
|
|
||||||
DOCKER_BUILDKIT: 1
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
exclude:
|
|
||||||
- pull_request
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: pipeline
|
|
||||||
type: docker
|
|
||||||
name: docker-linux-arm64-release-candidate-version
|
|
||||||
|
|
||||||
platform:
|
|
||||||
os: linux
|
|
||||||
arch: arm64
|
|
||||||
|
|
||||||
trigger:
|
|
||||||
ref:
|
|
||||||
- "refs/tags/**-rc*"
|
|
||||||
paths:
|
|
||||||
exclude:
|
|
||||||
- "docs/**"
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: fetch-tags
|
|
||||||
image: docker:git
|
|
||||||
pull: always
|
|
||||||
commands:
|
|
||||||
- git fetch --tags --force
|
|
||||||
|
|
||||||
- name: publish
|
|
||||||
image: plugins/docker:latest
|
|
||||||
pull: always
|
|
||||||
settings:
|
|
||||||
tags: ${DRONE_TAG##v}-linux-arm64
|
|
||||||
repo: gitea/gitea
|
|
||||||
build_args:
|
|
||||||
- GOPROXY=https://goproxy.io
|
|
||||||
password:
|
|
||||||
from_secret: docker_password
|
|
||||||
username:
|
|
||||||
from_secret: docker_username
|
|
||||||
environment:
|
|
||||||
PLUGIN_MIRROR:
|
|
||||||
from_secret: plugin_mirror
|
|
||||||
DOCKER_BUILDKIT: 1
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
exclude:
|
|
||||||
- pull_request
|
|
||||||
|
|
||||||
- name: publish-rootless
|
|
||||||
image: plugins/docker:latest
|
|
||||||
settings:
|
|
||||||
dockerfile: Dockerfile.rootless
|
|
||||||
tags: ${DRONE_TAG##v}-linux-arm64-rootless
|
|
||||||
repo: gitea/gitea
|
|
||||||
build_args:
|
|
||||||
- GOPROXY=https://goproxy.io
|
|
||||||
password:
|
|
||||||
from_secret: docker_password
|
|
||||||
username:
|
|
||||||
from_secret: docker_username
|
|
||||||
environment:
|
|
||||||
PLUGIN_MIRROR:
|
|
||||||
from_secret: plugin_mirror
|
|
||||||
DOCKER_BUILDKIT: 1
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
exclude:
|
|
||||||
- pull_request
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: pipeline
|
|
||||||
type: docker
|
|
||||||
name: docker-manifest-version
|
|
||||||
|
|
||||||
platform:
|
|
||||||
os: linux
|
|
||||||
arch: amd64
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: manifest-rootless
|
|
||||||
image: plugins/manifest
|
|
||||||
pull: always
|
|
||||||
settings:
|
|
||||||
auto_tag: true
|
|
||||||
ignore_missing: true
|
|
||||||
spec: docker/manifest.rootless.tmpl
|
|
||||||
password:
|
|
||||||
from_secret: docker_password
|
|
||||||
username:
|
|
||||||
from_secret: docker_username
|
|
||||||
|
|
||||||
- name: manifest
|
|
||||||
image: plugins/manifest
|
|
||||||
settings:
|
|
||||||
auto_tag: true
|
|
||||||
ignore_missing: true
|
|
||||||
spec: docker/manifest.tmpl
|
|
||||||
password:
|
|
||||||
from_secret: docker_password
|
|
||||||
username:
|
|
||||||
from_secret: docker_username
|
|
||||||
|
|
||||||
trigger:
|
|
||||||
ref:
|
|
||||||
- "refs/tags/**"
|
|
||||||
paths:
|
|
||||||
exclude:
|
|
||||||
- "docs/**"
|
|
||||||
|
|
||||||
depends_on:
|
|
||||||
- docker-linux-amd64-release-version
|
|
||||||
- docker-linux-amd64-release-candidate-version
|
|
||||||
- docker-linux-arm64-release-version
|
|
||||||
- docker-linux-arm64-release-candidate-version
|
|
373
.eslintrc.yaml
373
.eslintrc.yaml
|
@ -3,6 +3,7 @@ reportUnusedDisableDirectives: true
|
||||||
|
|
||||||
ignorePatterns:
|
ignorePatterns:
|
||||||
- /web_src/js/vendor
|
- /web_src/js/vendor
|
||||||
|
- /web_src/fomantic
|
||||||
|
|
||||||
parserOptions:
|
parserOptions:
|
||||||
sourceType: module
|
sourceType: module
|
||||||
|
@ -10,15 +11,18 @@ parserOptions:
|
||||||
|
|
||||||
plugins:
|
plugins:
|
||||||
- "@eslint-community/eslint-plugin-eslint-comments"
|
- "@eslint-community/eslint-plugin-eslint-comments"
|
||||||
|
- "@stylistic/eslint-plugin-js"
|
||||||
- eslint-plugin-array-func
|
- eslint-plugin-array-func
|
||||||
- eslint-plugin-custom-elements
|
- eslint-plugin-github
|
||||||
- eslint-plugin-import
|
- eslint-plugin-i
|
||||||
- eslint-plugin-jquery
|
- eslint-plugin-jquery
|
||||||
- eslint-plugin-no-jquery
|
- eslint-plugin-no-jquery
|
||||||
- eslint-plugin-no-use-extend-native
|
- eslint-plugin-no-use-extend-native
|
||||||
- eslint-plugin-regexp
|
- eslint-plugin-regexp
|
||||||
- eslint-plugin-sonarjs
|
- eslint-plugin-sonarjs
|
||||||
- eslint-plugin-unicorn
|
- eslint-plugin-unicorn
|
||||||
|
- eslint-plugin-vitest
|
||||||
|
- eslint-plugin-vitest-globals
|
||||||
- eslint-plugin-wc
|
- eslint-plugin-wc
|
||||||
|
|
||||||
env:
|
env:
|
||||||
|
@ -39,13 +43,65 @@ overrides:
|
||||||
worker: true
|
worker: true
|
||||||
rules:
|
rules:
|
||||||
no-restricted-globals: [2, addEventListener, blur, close, closed, confirm, defaultStatus, defaultstatus, error, event, external, find, focus, frameElement, frames, history, innerHeight, innerWidth, isFinite, isNaN, length, locationbar, menubar, moveBy, moveTo, name, onblur, onerror, onfocus, onload, onresize, onunload, open, opener, opera, outerHeight, outerWidth, pageXOffset, pageYOffset, parent, print, removeEventListener, resizeBy, resizeTo, screen, screenLeft, screenTop, screenX, screenY, scroll, scrollbars, scrollBy, scrollTo, scrollX, scrollY, status, statusbar, stop, toolbar, top]
|
no-restricted-globals: [2, addEventListener, blur, close, closed, confirm, defaultStatus, defaultstatus, error, event, external, find, focus, frameElement, frames, history, innerHeight, innerWidth, isFinite, isNaN, length, locationbar, menubar, moveBy, moveTo, name, onblur, onerror, onfocus, onload, onresize, onunload, open, opener, opera, outerHeight, outerWidth, pageXOffset, pageYOffset, parent, print, removeEventListener, resizeBy, resizeTo, screen, screenLeft, screenTop, screenX, screenY, scroll, scrollbars, scrollBy, scrollTo, scrollX, scrollY, status, statusbar, stop, toolbar, top]
|
||||||
- files: ["build/generate-images.js"]
|
|
||||||
rules:
|
|
||||||
import/no-unresolved: [0]
|
|
||||||
import/no-extraneous-dependencies: [0]
|
|
||||||
- files: ["*.config.*"]
|
- files: ["*.config.*"]
|
||||||
rules:
|
rules:
|
||||||
import/no-unused-modules: [0]
|
i/no-unused-modules: [0]
|
||||||
|
- files: ["**/*.test.*", "web_src/js/test/setup.js"]
|
||||||
|
env:
|
||||||
|
vitest-globals/env: true
|
||||||
|
rules:
|
||||||
|
vitest/consistent-test-filename: [0]
|
||||||
|
vitest/consistent-test-it: [0]
|
||||||
|
vitest/expect-expect: [0]
|
||||||
|
vitest/max-expects: [0]
|
||||||
|
vitest/max-nested-describe: [0]
|
||||||
|
vitest/no-alias-methods: [0]
|
||||||
|
vitest/no-commented-out-tests: [0]
|
||||||
|
vitest/no-conditional-expect: [0]
|
||||||
|
vitest/no-conditional-in-test: [0]
|
||||||
|
vitest/no-conditional-tests: [0]
|
||||||
|
vitest/no-disabled-tests: [0]
|
||||||
|
vitest/no-done-callback: [0]
|
||||||
|
vitest/no-duplicate-hooks: [0]
|
||||||
|
vitest/no-focused-tests: [0]
|
||||||
|
vitest/no-hooks: [0]
|
||||||
|
vitest/no-identical-title: [2]
|
||||||
|
vitest/no-interpolation-in-snapshots: [0]
|
||||||
|
vitest/no-large-snapshots: [0]
|
||||||
|
vitest/no-mocks-import: [0]
|
||||||
|
vitest/no-restricted-matchers: [0]
|
||||||
|
vitest/no-restricted-vi-methods: [0]
|
||||||
|
vitest/no-standalone-expect: [0]
|
||||||
|
vitest/no-test-prefixes: [0]
|
||||||
|
vitest/no-test-return-statement: [0]
|
||||||
|
vitest/prefer-called-with: [0]
|
||||||
|
vitest/prefer-comparison-matcher: [0]
|
||||||
|
vitest/prefer-each: [0]
|
||||||
|
vitest/prefer-equality-matcher: [0]
|
||||||
|
vitest/prefer-expect-resolves: [0]
|
||||||
|
vitest/prefer-hooks-in-order: [0]
|
||||||
|
vitest/prefer-hooks-on-top: [2]
|
||||||
|
vitest/prefer-lowercase-title: [0]
|
||||||
|
vitest/prefer-mock-promise-shorthand: [0]
|
||||||
|
vitest/prefer-snapshot-hint: [0]
|
||||||
|
vitest/prefer-spy-on: [0]
|
||||||
|
vitest/prefer-strict-equal: [0]
|
||||||
|
vitest/prefer-to-be: [0]
|
||||||
|
vitest/prefer-to-be-falsy: [0]
|
||||||
|
vitest/prefer-to-be-object: [0]
|
||||||
|
vitest/prefer-to-be-truthy: [0]
|
||||||
|
vitest/prefer-to-contain: [0]
|
||||||
|
vitest/prefer-to-have-length: [0]
|
||||||
|
vitest/prefer-todo: [0]
|
||||||
|
vitest/require-hook: [0]
|
||||||
|
vitest/require-to-throw-message: [0]
|
||||||
|
vitest/require-top-level-describe: [0]
|
||||||
|
vitest/valid-describe-callback: [2]
|
||||||
|
vitest/valid-expect: [2]
|
||||||
|
vitest/valid-title: [2]
|
||||||
|
- files: ["web_src/js/modules/fetch.js", "web_src/js/standalone/**/*"]
|
||||||
|
rules:
|
||||||
|
no-restricted-syntax: [2, WithStatement, ForInStatement, LabeledStatement, SequenceExpression]
|
||||||
|
|
||||||
rules:
|
rules:
|
||||||
"@eslint-community/eslint-comments/disable-enable-pair": [2]
|
"@eslint-community/eslint-comments/disable-enable-pair": [2]
|
||||||
|
@ -57,11 +113,74 @@ rules:
|
||||||
"@eslint-community/eslint-comments/no-unused-enable": [2]
|
"@eslint-community/eslint-comments/no-unused-enable": [2]
|
||||||
"@eslint-community/eslint-comments/no-use": [0]
|
"@eslint-community/eslint-comments/no-use": [0]
|
||||||
"@eslint-community/eslint-comments/require-description": [0]
|
"@eslint-community/eslint-comments/require-description": [0]
|
||||||
|
"@stylistic/js/array-bracket-newline": [0]
|
||||||
|
"@stylistic/js/array-bracket-spacing": [2, never]
|
||||||
|
"@stylistic/js/array-element-newline": [0]
|
||||||
|
"@stylistic/js/arrow-parens": [2, always]
|
||||||
|
"@stylistic/js/arrow-spacing": [2, {before: true, after: true}]
|
||||||
|
"@stylistic/js/block-spacing": [0]
|
||||||
|
"@stylistic/js/brace-style": [2, 1tbs, {allowSingleLine: true}]
|
||||||
|
"@stylistic/js/comma-dangle": [2, always-multiline]
|
||||||
|
"@stylistic/js/comma-spacing": [2, {before: false, after: true}]
|
||||||
|
"@stylistic/js/comma-style": [2, last]
|
||||||
|
"@stylistic/js/computed-property-spacing": [2, never]
|
||||||
|
"@stylistic/js/dot-location": [2, property]
|
||||||
|
"@stylistic/js/eol-last": [2]
|
||||||
|
"@stylistic/js/function-call-spacing": [2, never]
|
||||||
|
"@stylistic/js/function-call-argument-newline": [0]
|
||||||
|
"@stylistic/js/function-paren-newline": [0]
|
||||||
|
"@stylistic/js/generator-star-spacing": [0]
|
||||||
|
"@stylistic/js/implicit-arrow-linebreak": [0]
|
||||||
|
"@stylistic/js/indent": [2, 2, {ignoreComments: true, SwitchCase: 1}]
|
||||||
|
"@stylistic/js/key-spacing": [2]
|
||||||
|
"@stylistic/js/keyword-spacing": [2]
|
||||||
|
"@stylistic/js/linebreak-style": [2, unix]
|
||||||
|
"@stylistic/js/lines-around-comment": [0]
|
||||||
|
"@stylistic/js/lines-between-class-members": [0]
|
||||||
|
"@stylistic/js/max-len": [0]
|
||||||
|
"@stylistic/js/max-statements-per-line": [0]
|
||||||
|
"@stylistic/js/multiline-ternary": [0]
|
||||||
|
"@stylistic/js/new-parens": [2]
|
||||||
|
"@stylistic/js/newline-per-chained-call": [0]
|
||||||
|
"@stylistic/js/no-confusing-arrow": [0]
|
||||||
|
"@stylistic/js/no-extra-parens": [0]
|
||||||
|
"@stylistic/js/no-extra-semi": [2]
|
||||||
|
"@stylistic/js/no-floating-decimal": [0]
|
||||||
|
"@stylistic/js/no-mixed-operators": [0]
|
||||||
|
"@stylistic/js/no-mixed-spaces-and-tabs": [2]
|
||||||
|
"@stylistic/js/no-multi-spaces": [2, {ignoreEOLComments: true, exceptions: {Property: true}}]
|
||||||
|
"@stylistic/js/no-multiple-empty-lines": [2, {max: 1, maxEOF: 0, maxBOF: 0}]
|
||||||
|
"@stylistic/js/no-tabs": [2]
|
||||||
|
"@stylistic/js/no-trailing-spaces": [2]
|
||||||
|
"@stylistic/js/no-whitespace-before-property": [2]
|
||||||
|
"@stylistic/js/nonblock-statement-body-position": [2]
|
||||||
|
"@stylistic/js/object-curly-newline": [0]
|
||||||
|
"@stylistic/js/object-curly-spacing": [2, never]
|
||||||
|
"@stylistic/js/object-property-newline": [0]
|
||||||
|
"@stylistic/js/one-var-declaration-per-line": [0]
|
||||||
|
"@stylistic/js/operator-linebreak": [2, after]
|
||||||
|
"@stylistic/js/padded-blocks": [2, never]
|
||||||
|
"@stylistic/js/padding-line-between-statements": [0]
|
||||||
|
"@stylistic/js/quote-props": [0]
|
||||||
|
"@stylistic/js/quotes": [2, single, {avoidEscape: true, allowTemplateLiterals: true}]
|
||||||
|
"@stylistic/js/rest-spread-spacing": [2, never]
|
||||||
|
"@stylistic/js/semi": [2, always, {omitLastInOneLineBlock: true}]
|
||||||
|
"@stylistic/js/semi-spacing": [2, {before: false, after: true}]
|
||||||
|
"@stylistic/js/semi-style": [2, last]
|
||||||
|
"@stylistic/js/space-before-blocks": [2, always]
|
||||||
|
"@stylistic/js/space-before-function-paren": [2, {anonymous: ignore, named: never, asyncArrow: always}]
|
||||||
|
"@stylistic/js/space-in-parens": [2, never]
|
||||||
|
"@stylistic/js/space-infix-ops": [2]
|
||||||
|
"@stylistic/js/space-unary-ops": [2]
|
||||||
|
"@stylistic/js/spaced-comment": [2, always]
|
||||||
|
"@stylistic/js/switch-colon-spacing": [2]
|
||||||
|
"@stylistic/js/template-curly-spacing": [2, never]
|
||||||
|
"@stylistic/js/template-tag-spacing": [2, never]
|
||||||
|
"@stylistic/js/wrap-iife": [2, inside]
|
||||||
|
"@stylistic/js/wrap-regex": [0]
|
||||||
|
"@stylistic/js/yield-star-spacing": [2, after]
|
||||||
accessor-pairs: [2]
|
accessor-pairs: [2]
|
||||||
array-bracket-newline: [0]
|
|
||||||
array-bracket-spacing: [2, never]
|
|
||||||
array-callback-return: [2, {checkForEach: true}]
|
array-callback-return: [2, {checkForEach: true}]
|
||||||
array-element-newline: [0]
|
|
||||||
array-func/avoid-reverse: [2]
|
array-func/avoid-reverse: [2]
|
||||||
array-func/from-map: [2]
|
array-func/from-map: [2]
|
||||||
array-func/no-unnecessary-this-arg: [2]
|
array-func/no-unnecessary-this-arg: [2]
|
||||||
|
@ -69,117 +188,112 @@ rules:
|
||||||
array-func/prefer-flat-map: [0] # handled by unicorn/prefer-array-flat-map
|
array-func/prefer-flat-map: [0] # handled by unicorn/prefer-array-flat-map
|
||||||
array-func/prefer-flat: [0] # handled by unicorn/prefer-array-flat
|
array-func/prefer-flat: [0] # handled by unicorn/prefer-array-flat
|
||||||
arrow-body-style: [0]
|
arrow-body-style: [0]
|
||||||
arrow-parens: [2, always]
|
|
||||||
arrow-spacing: [2, {before: true, after: true}]
|
|
||||||
block-scoped-var: [2]
|
block-scoped-var: [2]
|
||||||
brace-style: [2, 1tbs, {allowSingleLine: true}]
|
|
||||||
camelcase: [0]
|
camelcase: [0]
|
||||||
capitalized-comments: [0]
|
capitalized-comments: [0]
|
||||||
class-methods-use-this: [0]
|
class-methods-use-this: [0]
|
||||||
comma-dangle: [2, only-multiline]
|
|
||||||
comma-spacing: [2, {before: false, after: true}]
|
|
||||||
comma-style: [2, last]
|
|
||||||
complexity: [0]
|
complexity: [0]
|
||||||
computed-property-spacing: [2, never]
|
|
||||||
consistent-return: [0]
|
consistent-return: [0]
|
||||||
consistent-this: [0]
|
consistent-this: [0]
|
||||||
constructor-super: [2]
|
constructor-super: [2]
|
||||||
curly: [0]
|
curly: [0]
|
||||||
custom-elements/expose-class-on-global: [0]
|
|
||||||
custom-elements/extends-correct-class: [2]
|
|
||||||
custom-elements/file-name-matches-element: [2]
|
|
||||||
custom-elements/no-constructor: [2]
|
|
||||||
custom-elements/no-customized-built-in-elements: [2]
|
|
||||||
custom-elements/no-dom-traversal-in-attributechangedcallback: [2]
|
|
||||||
custom-elements/no-dom-traversal-in-connectedcallback: [2]
|
|
||||||
custom-elements/no-exports-with-element: [2]
|
|
||||||
custom-elements/no-method-prefixed-with-on: [2]
|
|
||||||
custom-elements/no-unchecked-define: [0]
|
|
||||||
custom-elements/one-element-per-file: [0]
|
|
||||||
custom-elements/tag-name-matches-class: [2]
|
|
||||||
custom-elements/valid-tag-name: [2]
|
|
||||||
default-case-last: [2]
|
default-case-last: [2]
|
||||||
default-case: [0]
|
default-case: [0]
|
||||||
default-param-last: [0]
|
default-param-last: [0]
|
||||||
dot-location: [2, property]
|
|
||||||
dot-notation: [0]
|
dot-notation: [0]
|
||||||
eol-last: [2]
|
|
||||||
eqeqeq: [2]
|
eqeqeq: [2]
|
||||||
for-direction: [2]
|
for-direction: [2]
|
||||||
func-call-spacing: [2, never]
|
|
||||||
func-name-matching: [2]
|
func-name-matching: [2]
|
||||||
func-names: [0]
|
func-names: [0]
|
||||||
func-style: [0]
|
func-style: [0]
|
||||||
function-call-argument-newline: [0]
|
|
||||||
function-paren-newline: [0]
|
|
||||||
generator-star-spacing: [0]
|
|
||||||
getter-return: [2]
|
getter-return: [2]
|
||||||
|
github/a11y-aria-label-is-well-formatted: [0]
|
||||||
|
github/a11y-no-title-attribute: [0]
|
||||||
|
github/a11y-no-visually-hidden-interactive-element: [0]
|
||||||
|
github/a11y-role-supports-aria-props: [0]
|
||||||
|
github/a11y-svg-has-accessible-name: [0]
|
||||||
|
github/array-foreach: [0]
|
||||||
|
github/async-currenttarget: [2]
|
||||||
|
github/async-preventdefault: [2]
|
||||||
|
github/authenticity-token: [0]
|
||||||
|
github/get-attribute: [0]
|
||||||
|
github/js-class-name: [0]
|
||||||
|
github/no-blur: [0]
|
||||||
|
github/no-d-none: [0]
|
||||||
|
github/no-dataset: [2]
|
||||||
|
github/no-dynamic-script-tag: [2]
|
||||||
|
github/no-implicit-buggy-globals: [2]
|
||||||
|
github/no-inner-html: [0]
|
||||||
|
github/no-innerText: [2]
|
||||||
|
github/no-then: [2]
|
||||||
|
github/no-useless-passive: [2]
|
||||||
|
github/prefer-observers: [2]
|
||||||
|
github/require-passive-events: [2]
|
||||||
|
github/unescaped-html-literal: [0]
|
||||||
grouped-accessor-pairs: [2]
|
grouped-accessor-pairs: [2]
|
||||||
guard-for-in: [0]
|
guard-for-in: [0]
|
||||||
id-blacklist: [0]
|
id-blacklist: [0]
|
||||||
id-length: [0]
|
id-length: [0]
|
||||||
id-match: [0]
|
id-match: [0]
|
||||||
implicit-arrow-linebreak: [0]
|
i/consistent-type-specifier-style: [0]
|
||||||
import/consistent-type-specifier-style: [0]
|
i/default: [0]
|
||||||
import/default: [0]
|
i/dynamic-import-chunkname: [0]
|
||||||
import/dynamic-import-chunkname: [0]
|
i/export: [2]
|
||||||
import/export: [2]
|
i/exports-last: [0]
|
||||||
import/exports-last: [0]
|
i/extensions: [2, always, {ignorePackages: true}]
|
||||||
import/extensions: [2, always, {ignorePackages: true}]
|
i/first: [2]
|
||||||
import/first: [2]
|
i/group-exports: [0]
|
||||||
import/group-exports: [0]
|
i/max-dependencies: [0]
|
||||||
import/max-dependencies: [0]
|
i/named: [2]
|
||||||
import/named: [2]
|
i/namespace: [0]
|
||||||
import/namespace: [0]
|
i/newline-after-import: [0]
|
||||||
import/newline-after-import: [0]
|
i/no-absolute-path: [0]
|
||||||
import/no-absolute-path: [0]
|
i/no-amd: [2]
|
||||||
import/no-amd: [2]
|
i/no-anonymous-default-export: [0]
|
||||||
import/no-anonymous-default-export: [0]
|
i/no-commonjs: [2]
|
||||||
import/no-commonjs: [2]
|
i/no-cycle: [2, {ignoreExternal: true, maxDepth: 1}]
|
||||||
import/no-cycle: [2, {ignoreExternal: true, maxDepth: 1}]
|
i/no-default-export: [0]
|
||||||
import/no-default-export: [0]
|
i/no-deprecated: [0]
|
||||||
import/no-deprecated: [0]
|
i/no-dynamic-require: [0]
|
||||||
import/no-dynamic-require: [0]
|
i/no-empty-named-blocks: [2]
|
||||||
import/no-empty-named-blocks: [2]
|
i/no-extraneous-dependencies: [2]
|
||||||
import/no-extraneous-dependencies: [2]
|
i/no-import-module-exports: [0]
|
||||||
import/no-import-module-exports: [0]
|
i/no-internal-modules: [0]
|
||||||
import/no-internal-modules: [0]
|
i/no-mutable-exports: [0]
|
||||||
import/no-mutable-exports: [0]
|
i/no-named-as-default-member: [0]
|
||||||
import/no-named-as-default-member: [0]
|
i/no-named-as-default: [2]
|
||||||
import/no-named-as-default: [2]
|
i/no-named-default: [0]
|
||||||
import/no-named-default: [0]
|
i/no-named-export: [0]
|
||||||
import/no-named-export: [0]
|
i/no-namespace: [0]
|
||||||
import/no-namespace: [0]
|
i/no-nodejs-modules: [0]
|
||||||
import/no-nodejs-modules: [0]
|
i/no-relative-packages: [0]
|
||||||
import/no-relative-packages: [0]
|
i/no-relative-parent-imports: [0]
|
||||||
import/no-relative-parent-imports: [0]
|
i/no-restricted-paths: [0]
|
||||||
import/no-restricted-paths: [0]
|
i/no-self-import: [2]
|
||||||
import/no-self-import: [2]
|
i/no-unassigned-import: [0]
|
||||||
import/no-unassigned-import: [0]
|
i/no-unresolved: [2, {commonjs: true, ignore: ["\\?.+$", ^vitest/]}]
|
||||||
import/no-unresolved: [2, {commonjs: true, ignore: [\?.+$, ^vitest/]}]
|
i/no-unused-modules: [2, {unusedExports: true}]
|
||||||
import/no-unused-modules: [2, {unusedExports: true}]
|
i/no-useless-path-segments: [2, {commonjs: true}]
|
||||||
import/no-useless-path-segments: [2, {commonjs: true}]
|
i/no-webpack-loader-syntax: [2]
|
||||||
import/no-webpack-loader-syntax: [2]
|
i/order: [0]
|
||||||
import/order: [0]
|
i/prefer-default-export: [0]
|
||||||
import/prefer-default-export: [0]
|
i/unambiguous: [0]
|
||||||
import/unambiguous: [0]
|
|
||||||
indent: [2, 2, {SwitchCase: 1}]
|
|
||||||
init-declarations: [0]
|
init-declarations: [0]
|
||||||
jquery/no-ajax-events: [2]
|
jquery/no-ajax-events: [2]
|
||||||
jquery/no-ajax: [0]
|
jquery/no-ajax: [2]
|
||||||
jquery/no-animate: [2]
|
jquery/no-animate: [2]
|
||||||
jquery/no-attr: [0]
|
jquery/no-attr: [2]
|
||||||
jquery/no-bind: [2]
|
jquery/no-bind: [2]
|
||||||
jquery/no-class: [0]
|
jquery/no-class: [0]
|
||||||
jquery/no-clone: [2]
|
jquery/no-clone: [2]
|
||||||
jquery/no-closest: [0]
|
jquery/no-closest: [0]
|
||||||
jquery/no-css: [0]
|
jquery/no-css: [2]
|
||||||
jquery/no-data: [0]
|
jquery/no-data: [0]
|
||||||
jquery/no-deferred: [2]
|
jquery/no-deferred: [2]
|
||||||
jquery/no-delegate: [2]
|
jquery/no-delegate: [2]
|
||||||
jquery/no-each: [0]
|
jquery/no-each: [0]
|
||||||
jquery/no-extend: [2]
|
jquery/no-extend: [2]
|
||||||
jquery/no-fade: [0]
|
jquery/no-fade: [2]
|
||||||
jquery/no-filter: [0]
|
jquery/no-filter: [0]
|
||||||
jquery/no-find: [0]
|
jquery/no-find: [0]
|
||||||
jquery/no-global-eval: [2]
|
jquery/no-global-eval: [2]
|
||||||
|
@ -190,15 +304,15 @@ rules:
|
||||||
jquery/no-in-array: [2]
|
jquery/no-in-array: [2]
|
||||||
jquery/no-is-array: [2]
|
jquery/no-is-array: [2]
|
||||||
jquery/no-is-function: [2]
|
jquery/no-is-function: [2]
|
||||||
jquery/no-is: [0]
|
jquery/no-is: [2]
|
||||||
jquery/no-load: [2]
|
jquery/no-load: [2]
|
||||||
jquery/no-map: [0]
|
jquery/no-map: [2]
|
||||||
jquery/no-merge: [2]
|
jquery/no-merge: [2]
|
||||||
jquery/no-param: [2]
|
jquery/no-param: [2]
|
||||||
jquery/no-parent: [0]
|
jquery/no-parent: [0]
|
||||||
jquery/no-parents: [0]
|
jquery/no-parents: [0]
|
||||||
jquery/no-parse-html: [2]
|
jquery/no-parse-html: [2]
|
||||||
jquery/no-prop: [0]
|
jquery/no-prop: [2]
|
||||||
jquery/no-proxy: [2]
|
jquery/no-proxy: [2]
|
||||||
jquery/no-ready: [2]
|
jquery/no-ready: [2]
|
||||||
jquery/no-serialize: [2]
|
jquery/no-serialize: [2]
|
||||||
|
@ -214,27 +328,17 @@ rules:
|
||||||
jquery/no-val: [0]
|
jquery/no-val: [0]
|
||||||
jquery/no-when: [2]
|
jquery/no-when: [2]
|
||||||
jquery/no-wrap: [2]
|
jquery/no-wrap: [2]
|
||||||
key-spacing: [2]
|
|
||||||
keyword-spacing: [2]
|
|
||||||
line-comment-position: [0]
|
line-comment-position: [0]
|
||||||
linebreak-style: [2, unix]
|
|
||||||
lines-around-comment: [0]
|
|
||||||
lines-between-class-members: [0]
|
|
||||||
logical-assignment-operators: [0]
|
logical-assignment-operators: [0]
|
||||||
max-classes-per-file: [0]
|
max-classes-per-file: [0]
|
||||||
max-depth: [0]
|
max-depth: [0]
|
||||||
max-len: [0]
|
|
||||||
max-lines-per-function: [0]
|
max-lines-per-function: [0]
|
||||||
max-lines: [0]
|
max-lines: [0]
|
||||||
max-nested-callbacks: [0]
|
max-nested-callbacks: [0]
|
||||||
max-params: [0]
|
max-params: [0]
|
||||||
max-statements-per-line: [0]
|
|
||||||
max-statements: [0]
|
max-statements: [0]
|
||||||
multiline-comment-style: [2, separate-lines]
|
multiline-comment-style: [2, separate-lines]
|
||||||
multiline-ternary: [0]
|
|
||||||
new-cap: [0]
|
new-cap: [0]
|
||||||
new-parens: [2]
|
|
||||||
newline-per-chained-call: [0]
|
|
||||||
no-alert: [0]
|
no-alert: [0]
|
||||||
no-array-constructor: [2]
|
no-array-constructor: [2]
|
||||||
no-async-promise-executor: [0]
|
no-async-promise-executor: [0]
|
||||||
|
@ -246,7 +350,6 @@ rules:
|
||||||
no-class-assign: [2]
|
no-class-assign: [2]
|
||||||
no-compare-neg-zero: [2]
|
no-compare-neg-zero: [2]
|
||||||
no-cond-assign: [2, except-parens]
|
no-cond-assign: [2, except-parens]
|
||||||
no-confusing-arrow: [0]
|
|
||||||
no-console: [1, {allow: [debug, info, warn, error]}]
|
no-console: [1, {allow: [debug, info, warn, error]}]
|
||||||
no-const-assign: [2]
|
no-const-assign: [2]
|
||||||
no-constant-binary-expression: [2]
|
no-constant-binary-expression: [2]
|
||||||
|
@ -276,10 +379,7 @@ rules:
|
||||||
no-extra-bind: [2]
|
no-extra-bind: [2]
|
||||||
no-extra-boolean-cast: [2]
|
no-extra-boolean-cast: [2]
|
||||||
no-extra-label: [0]
|
no-extra-label: [0]
|
||||||
no-extra-parens: [0]
|
|
||||||
no-extra-semi: [2]
|
|
||||||
no-fallthrough: [2]
|
no-fallthrough: [2]
|
||||||
no-floating-decimal: [0]
|
|
||||||
no-func-assign: [2]
|
no-func-assign: [2]
|
||||||
no-global-assign: [2]
|
no-global-assign: [2]
|
||||||
no-implicit-coercion: [2]
|
no-implicit-coercion: [2]
|
||||||
|
@ -293,12 +393,12 @@ rules:
|
||||||
no-irregular-whitespace: [2]
|
no-irregular-whitespace: [2]
|
||||||
no-iterator: [2]
|
no-iterator: [2]
|
||||||
no-jquery/no-ajax-events: [2]
|
no-jquery/no-ajax-events: [2]
|
||||||
no-jquery/no-ajax: [0]
|
no-jquery/no-ajax: [2]
|
||||||
no-jquery/no-and-self: [2]
|
no-jquery/no-and-self: [2]
|
||||||
no-jquery/no-animate-toggle: [2]
|
no-jquery/no-animate-toggle: [2]
|
||||||
no-jquery/no-animate: [2]
|
no-jquery/no-animate: [2]
|
||||||
no-jquery/no-append-html: [0]
|
no-jquery/no-append-html: [2]
|
||||||
no-jquery/no-attr: [0]
|
no-jquery/no-attr: [2]
|
||||||
no-jquery/no-bind: [2]
|
no-jquery/no-bind: [2]
|
||||||
no-jquery/no-box-model: [2]
|
no-jquery/no-box-model: [2]
|
||||||
no-jquery/no-browser: [2]
|
no-jquery/no-browser: [2]
|
||||||
|
@ -310,7 +410,7 @@ rules:
|
||||||
no-jquery/no-constructor-attributes: [2]
|
no-jquery/no-constructor-attributes: [2]
|
||||||
no-jquery/no-contains: [2]
|
no-jquery/no-contains: [2]
|
||||||
no-jquery/no-context-prop: [2]
|
no-jquery/no-context-prop: [2]
|
||||||
no-jquery/no-css: [0]
|
no-jquery/no-css: [2]
|
||||||
no-jquery/no-data: [0]
|
no-jquery/no-data: [0]
|
||||||
no-jquery/no-deferred: [2]
|
no-jquery/no-deferred: [2]
|
||||||
no-jquery/no-delegate: [2]
|
no-jquery/no-delegate: [2]
|
||||||
|
@ -341,14 +441,14 @@ rules:
|
||||||
no-jquery/no-is-numeric: [2]
|
no-jquery/no-is-numeric: [2]
|
||||||
no-jquery/no-is-plain-object: [2]
|
no-jquery/no-is-plain-object: [2]
|
||||||
no-jquery/no-is-window: [2]
|
no-jquery/no-is-window: [2]
|
||||||
no-jquery/no-is: [0]
|
no-jquery/no-is: [2]
|
||||||
no-jquery/no-jquery-constructor: [0]
|
no-jquery/no-jquery-constructor: [0]
|
||||||
no-jquery/no-live: [2]
|
no-jquery/no-live: [2]
|
||||||
no-jquery/no-load-shorthand: [2]
|
no-jquery/no-load-shorthand: [2]
|
||||||
no-jquery/no-load: [2]
|
no-jquery/no-load: [2]
|
||||||
no-jquery/no-map-collection: [0]
|
no-jquery/no-map-collection: [0]
|
||||||
no-jquery/no-map-util: [2]
|
no-jquery/no-map-util: [2]
|
||||||
no-jquery/no-map: [0]
|
no-jquery/no-map: [2]
|
||||||
no-jquery/no-merge: [2]
|
no-jquery/no-merge: [2]
|
||||||
no-jquery/no-node-name: [2]
|
no-jquery/no-node-name: [2]
|
||||||
no-jquery/no-noop: [2]
|
no-jquery/no-noop: [2]
|
||||||
|
@ -363,7 +463,7 @@ rules:
|
||||||
no-jquery/no-parse-html: [2]
|
no-jquery/no-parse-html: [2]
|
||||||
no-jquery/no-parse-json: [2]
|
no-jquery/no-parse-json: [2]
|
||||||
no-jquery/no-parse-xml: [2]
|
no-jquery/no-parse-xml: [2]
|
||||||
no-jquery/no-prop: [0]
|
no-jquery/no-prop: [2]
|
||||||
no-jquery/no-proxy: [2]
|
no-jquery/no-proxy: [2]
|
||||||
no-jquery/no-ready-shorthand: [2]
|
no-jquery/no-ready-shorthand: [2]
|
||||||
no-jquery/no-ready: [2]
|
no-jquery/no-ready: [2]
|
||||||
|
@ -384,7 +484,7 @@ rules:
|
||||||
no-jquery/no-visibility: [2]
|
no-jquery/no-visibility: [2]
|
||||||
no-jquery/no-when: [2]
|
no-jquery/no-when: [2]
|
||||||
no-jquery/no-wrap: [2]
|
no-jquery/no-wrap: [2]
|
||||||
no-jquery/variable-pattern: [0]
|
no-jquery/variable-pattern: [2]
|
||||||
no-label-var: [2]
|
no-label-var: [2]
|
||||||
no-labels: [0] # handled by no-restricted-syntax
|
no-labels: [0] # handled by no-restricted-syntax
|
||||||
no-lone-blocks: [2]
|
no-lone-blocks: [2]
|
||||||
|
@ -393,10 +493,7 @@ rules:
|
||||||
no-loss-of-precision: [2]
|
no-loss-of-precision: [2]
|
||||||
no-magic-numbers: [0]
|
no-magic-numbers: [0]
|
||||||
no-misleading-character-class: [2]
|
no-misleading-character-class: [2]
|
||||||
no-mixed-operators: [0]
|
|
||||||
no-mixed-spaces-and-tabs: [2]
|
|
||||||
no-multi-assign: [0]
|
no-multi-assign: [0]
|
||||||
no-multi-spaces: [2, {ignoreEOLComments: true, exceptions: {Property: true}}]
|
|
||||||
no-multi-str: [2]
|
no-multi-str: [2]
|
||||||
no-negated-condition: [0]
|
no-negated-condition: [0]
|
||||||
no-nested-ternary: [0]
|
no-nested-ternary: [0]
|
||||||
|
@ -420,7 +517,7 @@ rules:
|
||||||
no-restricted-exports: [0]
|
no-restricted-exports: [0]
|
||||||
no-restricted-globals: [2, addEventListener, blur, close, closed, confirm, defaultStatus, defaultstatus, error, event, external, find, focus, frameElement, frames, history, innerHeight, innerWidth, isFinite, isNaN, length, location, locationbar, menubar, moveBy, moveTo, name, onblur, onerror, onfocus, onload, onresize, onunload, open, opener, opera, outerHeight, outerWidth, pageXOffset, pageYOffset, parent, print, removeEventListener, resizeBy, resizeTo, screen, screenLeft, screenTop, screenX, screenY, scroll, scrollbars, scrollBy, scrollTo, scrollX, scrollY, self, status, statusbar, stop, toolbar, top, __dirname, __filename]
|
no-restricted-globals: [2, addEventListener, blur, close, closed, confirm, defaultStatus, defaultstatus, error, event, external, find, focus, frameElement, frames, history, innerHeight, innerWidth, isFinite, isNaN, length, location, locationbar, menubar, moveBy, moveTo, name, onblur, onerror, onfocus, onload, onresize, onunload, open, opener, opera, outerHeight, outerWidth, pageXOffset, pageYOffset, parent, print, removeEventListener, resizeBy, resizeTo, screen, screenLeft, screenTop, screenX, screenY, scroll, scrollbars, scrollBy, scrollTo, scrollX, scrollY, self, status, statusbar, stop, toolbar, top, __dirname, __filename]
|
||||||
no-restricted-imports: [0]
|
no-restricted-imports: [0]
|
||||||
no-restricted-syntax: [2, WithStatement, ForInStatement, LabeledStatement, SequenceExpression]
|
no-restricted-syntax: [2, WithStatement, ForInStatement, LabeledStatement, SequenceExpression, {selector: "CallExpression[callee.name='fetch']", message: "use modules/fetch.js instead"}]
|
||||||
no-return-assign: [0]
|
no-return-assign: [0]
|
||||||
no-script-url: [2]
|
no-script-url: [2]
|
||||||
no-self-assign: [2, {props: true}]
|
no-self-assign: [2, {props: true}]
|
||||||
|
@ -430,12 +527,10 @@ rules:
|
||||||
no-shadow-restricted-names: [2]
|
no-shadow-restricted-names: [2]
|
||||||
no-shadow: [0]
|
no-shadow: [0]
|
||||||
no-sparse-arrays: [2]
|
no-sparse-arrays: [2]
|
||||||
no-tabs: [2]
|
|
||||||
no-template-curly-in-string: [2]
|
no-template-curly-in-string: [2]
|
||||||
no-ternary: [0]
|
no-ternary: [0]
|
||||||
no-this-before-super: [2]
|
no-this-before-super: [2]
|
||||||
no-throw-literal: [2]
|
no-throw-literal: [2]
|
||||||
no-trailing-spaces: [2]
|
|
||||||
no-undef-init: [2]
|
no-undef-init: [2]
|
||||||
no-undef: [2, {typeof: true}]
|
no-undef: [2, {typeof: true}]
|
||||||
no-undefined: [0]
|
no-undefined: [0]
|
||||||
|
@ -465,33 +560,25 @@ rules:
|
||||||
no-var: [2]
|
no-var: [2]
|
||||||
no-void: [2]
|
no-void: [2]
|
||||||
no-warning-comments: [0]
|
no-warning-comments: [0]
|
||||||
no-whitespace-before-property: [2]
|
|
||||||
no-with: [0] # handled by no-restricted-syntax
|
no-with: [0] # handled by no-restricted-syntax
|
||||||
nonblock-statement-body-position: [2]
|
|
||||||
object-curly-newline: [0]
|
|
||||||
object-curly-spacing: [2, never]
|
|
||||||
object-shorthand: [2, always]
|
object-shorthand: [2, always]
|
||||||
one-var-declaration-per-line: [0]
|
one-var-declaration-per-line: [0]
|
||||||
one-var: [0]
|
one-var: [0]
|
||||||
operator-assignment: [2, always]
|
operator-assignment: [2, always]
|
||||||
operator-linebreak: [2, after]
|
operator-linebreak: [2, after]
|
||||||
padded-blocks: [2, never]
|
|
||||||
padding-line-between-statements: [0]
|
|
||||||
prefer-arrow-callback: [2, {allowNamedFunctions: true, allowUnboundThis: true}]
|
prefer-arrow-callback: [2, {allowNamedFunctions: true, allowUnboundThis: true}]
|
||||||
prefer-const: [2, {destructuring: all, ignoreReadBeforeAssign: true}]
|
prefer-const: [2, {destructuring: all, ignoreReadBeforeAssign: true}]
|
||||||
prefer-destructuring: [0]
|
prefer-destructuring: [0]
|
||||||
prefer-exponentiation-operator: [2]
|
prefer-exponentiation-operator: [2]
|
||||||
prefer-named-capture-group: [0]
|
prefer-named-capture-group: [0]
|
||||||
prefer-numeric-literals: [2]
|
prefer-numeric-literals: [2]
|
||||||
prefer-object-has-own: [0]
|
prefer-object-has-own: [2]
|
||||||
prefer-object-spread: [2]
|
prefer-object-spread: [2]
|
||||||
prefer-promise-reject-errors: [2, {allowEmptyReject: false}]
|
prefer-promise-reject-errors: [2, {allowEmptyReject: false}]
|
||||||
prefer-regex-literals: [2]
|
prefer-regex-literals: [2]
|
||||||
prefer-rest-params: [2]
|
prefer-rest-params: [2]
|
||||||
prefer-spread: [2]
|
prefer-spread: [2]
|
||||||
prefer-template: [2]
|
prefer-template: [2]
|
||||||
quote-props: [0]
|
|
||||||
quotes: [2, single, {avoidEscape: true, allowTemplateLiterals: true}]
|
|
||||||
radix: [2, as-needed]
|
radix: [2, as-needed]
|
||||||
regexp/confusing-quantifier: [2]
|
regexp/confusing-quantifier: [2]
|
||||||
regexp/control-character-escape: [2]
|
regexp/control-character-escape: [2]
|
||||||
|
@ -508,6 +595,7 @@ rules:
|
||||||
regexp/no-empty-character-class: [0]
|
regexp/no-empty-character-class: [0]
|
||||||
regexp/no-empty-group: [2]
|
regexp/no-empty-group: [2]
|
||||||
regexp/no-empty-lookarounds-assertion: [2]
|
regexp/no-empty-lookarounds-assertion: [2]
|
||||||
|
regexp/no-empty-string-literal: [2]
|
||||||
regexp/no-escape-backspace: [2]
|
regexp/no-escape-backspace: [2]
|
||||||
regexp/no-extra-lookaround-assertions: [0]
|
regexp/no-extra-lookaround-assertions: [0]
|
||||||
regexp/no-invalid-regexp: [2]
|
regexp/no-invalid-regexp: [2]
|
||||||
|
@ -538,6 +626,8 @@ rules:
|
||||||
regexp/no-useless-non-capturing-group: [2]
|
regexp/no-useless-non-capturing-group: [2]
|
||||||
regexp/no-useless-quantifier: [2]
|
regexp/no-useless-quantifier: [2]
|
||||||
regexp/no-useless-range: [2]
|
regexp/no-useless-range: [2]
|
||||||
|
regexp/no-useless-set-operand: [2]
|
||||||
|
regexp/no-useless-string-literal: [2]
|
||||||
regexp/no-useless-two-nums-quantifier: [2]
|
regexp/no-useless-two-nums-quantifier: [2]
|
||||||
regexp/no-zero-quantifier: [2]
|
regexp/no-zero-quantifier: [2]
|
||||||
regexp/optimal-lookaround-quantifier: [2]
|
regexp/optimal-lookaround-quantifier: [2]
|
||||||
|
@ -557,10 +647,12 @@ rules:
|
||||||
regexp/prefer-regexp-exec: [2]
|
regexp/prefer-regexp-exec: [2]
|
||||||
regexp/prefer-regexp-test: [2]
|
regexp/prefer-regexp-test: [2]
|
||||||
regexp/prefer-result-array-groups: [0]
|
regexp/prefer-result-array-groups: [0]
|
||||||
|
regexp/prefer-set-operation: [2]
|
||||||
regexp/prefer-star-quantifier: [2]
|
regexp/prefer-star-quantifier: [2]
|
||||||
regexp/prefer-unicode-codepoint-escapes: [2]
|
regexp/prefer-unicode-codepoint-escapes: [2]
|
||||||
regexp/prefer-w: [0]
|
regexp/prefer-w: [0]
|
||||||
regexp/require-unicode-regexp: [0]
|
regexp/require-unicode-regexp: [0]
|
||||||
|
regexp/simplify-set-operations: [2]
|
||||||
regexp/sort-alternatives: [0]
|
regexp/sort-alternatives: [0]
|
||||||
regexp/sort-character-class-elements: [0]
|
regexp/sort-character-class-elements: [0]
|
||||||
regexp/sort-flags: [0]
|
regexp/sort-flags: [0]
|
||||||
|
@ -571,10 +663,6 @@ rules:
|
||||||
require-await: [0]
|
require-await: [0]
|
||||||
require-unicode-regexp: [0]
|
require-unicode-regexp: [0]
|
||||||
require-yield: [2]
|
require-yield: [2]
|
||||||
rest-spread-spacing: [2, never]
|
|
||||||
semi-spacing: [2, {before: false, after: true}]
|
|
||||||
semi-style: [2, last]
|
|
||||||
semi: [2, always, {omitLastInOneLineBlock: true}]
|
|
||||||
sonarjs/cognitive-complexity: [0]
|
sonarjs/cognitive-complexity: [0]
|
||||||
sonarjs/elseif-without-else: [0]
|
sonarjs/elseif-without-else: [0]
|
||||||
sonarjs/max-switch-cases: [0]
|
sonarjs/max-switch-cases: [0]
|
||||||
|
@ -610,16 +698,8 @@ rules:
|
||||||
sort-imports: [0]
|
sort-imports: [0]
|
||||||
sort-keys: [0]
|
sort-keys: [0]
|
||||||
sort-vars: [0]
|
sort-vars: [0]
|
||||||
space-before-blocks: [2, always]
|
|
||||||
space-in-parens: [2, never]
|
|
||||||
space-infix-ops: [2]
|
|
||||||
space-unary-ops: [2]
|
|
||||||
spaced-comment: [2, always]
|
|
||||||
strict: [0]
|
strict: [0]
|
||||||
switch-colon-spacing: [2]
|
|
||||||
symbol-description: [2]
|
symbol-description: [2]
|
||||||
template-curly-spacing: [2, never]
|
|
||||||
template-tag-spacing: [2, never]
|
|
||||||
unicode-bom: [2, never]
|
unicode-bom: [2, never]
|
||||||
unicorn/better-regex: [0]
|
unicorn/better-regex: [0]
|
||||||
unicorn/catch-error-name: [0]
|
unicorn/catch-error-name: [0]
|
||||||
|
@ -663,6 +743,7 @@ rules:
|
||||||
unicorn/no-this-assignment: [2]
|
unicorn/no-this-assignment: [2]
|
||||||
unicorn/no-typeof-undefined: [2]
|
unicorn/no-typeof-undefined: [2]
|
||||||
unicorn/no-unnecessary-await: [2]
|
unicorn/no-unnecessary-await: [2]
|
||||||
|
unicorn/no-unnecessary-polyfills: [2]
|
||||||
unicorn/no-unreadable-array-destructuring: [0]
|
unicorn/no-unreadable-array-destructuring: [0]
|
||||||
unicorn/no-unreadable-iife: [2]
|
unicorn/no-unreadable-iife: [2]
|
||||||
unicorn/no-unused-properties: [2]
|
unicorn/no-unused-properties: [2]
|
||||||
|
@ -737,15 +818,25 @@ rules:
|
||||||
valid-typeof: [2, {requireStringLiterals: true}]
|
valid-typeof: [2, {requireStringLiterals: true}]
|
||||||
vars-on-top: [0]
|
vars-on-top: [0]
|
||||||
wc/attach-shadow-constructor: [2]
|
wc/attach-shadow-constructor: [2]
|
||||||
|
wc/define-tag-after-class-definition: [0]
|
||||||
|
wc/expose-class-on-global: [0]
|
||||||
|
wc/file-name-matches-element: [2]
|
||||||
|
wc/guard-define-call: [0]
|
||||||
wc/guard-super-call: [2]
|
wc/guard-super-call: [2]
|
||||||
|
wc/max-elements-per-file: [0]
|
||||||
|
wc/no-child-traversal-in-attributechangedcallback: [2]
|
||||||
|
wc/no-child-traversal-in-connectedcallback: [2]
|
||||||
wc/no-closed-shadow-root: [2]
|
wc/no-closed-shadow-root: [2]
|
||||||
wc/no-constructor-attributes: [2]
|
wc/no-constructor-attributes: [2]
|
||||||
wc/no-constructor-params: [2]
|
wc/no-constructor-params: [2]
|
||||||
wc/no-invalid-element-name: [0] # covered by custom-elements/valid-tag-name
|
wc/no-constructor: [2]
|
||||||
|
wc/no-customized-built-in-elements: [2]
|
||||||
|
wc/no-exports-with-element: [0]
|
||||||
|
wc/no-invalid-element-name: [2]
|
||||||
|
wc/no-invalid-extends: [2]
|
||||||
|
wc/no-method-prefixed-with-on: [2]
|
||||||
wc/no-self-class: [2]
|
wc/no-self-class: [2]
|
||||||
wc/no-typos: [2]
|
wc/no-typos: [2]
|
||||||
wc/require-listener-teardown: [2]
|
wc/require-listener-teardown: [2]
|
||||||
wrap-iife: [2, inside]
|
wc/tag-name-matches-class: [2]
|
||||||
wrap-regex: [0]
|
|
||||||
yield-star-spacing: [2, after]
|
|
||||||
yoda: [2, never]
|
yoda: [2, never]
|
||||||
|
|
|
@ -1,2 +1 @@
|
||||||
open_collective: gitea
|
open_collective: gitea
|
||||||
custom: https://www.bountysource.com/teams/gitea
|
|
||||||
|
|
|
@ -1,91 +1,91 @@
|
||||||
name: Bug Report
|
name: Bug Report
|
||||||
description: Found something you weren't expecting? Report it here!
|
description: Found something you weren't expecting? Report it here!
|
||||||
labels: ["kind/bug"]
|
labels: ["type/bug"]
|
||||||
body:
|
body:
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
value: |
|
value: |
|
||||||
NOTE: If your issue is a security concern, please send an email to security@gitea.io instead of opening a public issue.
|
NOTE: If your issue is a security concern, please send an email to security@gitea.io instead of opening a public issue.
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
value: |
|
value: |
|
||||||
1. Please speak English, this is the language all maintainers can speak and write.
|
1. Please speak English, this is the language all maintainers can speak and write.
|
||||||
2. Please ask questions or configuration/deploy problems on our Discord
|
2. Please ask questions or configuration/deploy problems on our Discord
|
||||||
server (https://discord.gg/gitea) or forum (https://discourse.gitea.io).
|
server (https://discord.gg/gitea) or forum (https://discourse.gitea.io).
|
||||||
3. Make sure you are using the latest release and
|
3. Make sure you are using the latest release and
|
||||||
take a moment to check that your issue hasn't been reported before.
|
take a moment to check that your issue hasn't been reported before.
|
||||||
4. Make sure it's not mentioned in the FAQ (https://docs.gitea.com/help/faq)
|
4. Make sure it's not mentioned in the FAQ (https://docs.gitea.com/help/faq)
|
||||||
5. It's really important to provide pertinent details and logs (https://docs.gitea.com/help/support),
|
5. It's really important to provide pertinent details and logs (https://docs.gitea.com/help/support),
|
||||||
incomplete details will be handled as an invalid report.
|
incomplete details will be handled as an invalid report.
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: description
|
id: description
|
||||||
attributes:
|
attributes:
|
||||||
label: Description
|
label: Description
|
||||||
description: |
|
description: |
|
||||||
Please provide a description of your issue here, with a URL if you were able to reproduce the issue (see below)
|
Please provide a description of your issue here, with a URL if you were able to reproduce the issue (see below)
|
||||||
If you are using a proxy or a CDN (e.g. Cloudflare) in front of Gitea, please disable the proxy/CDN fully and access Gitea directly to confirm the issue still persists without those services.
|
If you are using a proxy or a CDN (e.g. Cloudflare) in front of Gitea, please disable the proxy/CDN fully and access Gitea directly to confirm the issue still persists without those services.
|
||||||
- type: input
|
- type: input
|
||||||
id: gitea-ver
|
id: gitea-ver
|
||||||
attributes:
|
attributes:
|
||||||
label: Gitea Version
|
label: Gitea Version
|
||||||
description: Gitea version (or commit reference) of your instance
|
description: Gitea version (or commit reference) of your instance
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: dropdown
|
- type: dropdown
|
||||||
id: can-reproduce
|
id: can-reproduce
|
||||||
attributes:
|
attributes:
|
||||||
label: Can you reproduce the bug on the Gitea demo site?
|
label: Can you reproduce the bug on the Gitea demo site?
|
||||||
description: |
|
description: |
|
||||||
If so, please provide a URL in the Description field
|
If so, please provide a URL in the Description field
|
||||||
URL of Gitea demo: https://try.gitea.io
|
URL of Gitea demo: https://try.gitea.io
|
||||||
options:
|
options:
|
||||||
- "Yes"
|
- "Yes"
|
||||||
- "No"
|
- "No"
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
value: |
|
value: |
|
||||||
It's really important to provide pertinent logs
|
It's really important to provide pertinent logs
|
||||||
Please read https://docs.gitea.com/administration/logging-config#collecting-logs-for-help
|
Please read https://docs.gitea.com/administration/logging-config#collecting-logs-for-help
|
||||||
In addition, if your problem relates to git commands set `RUN_MODE=dev` at the top of app.ini
|
In addition, if your problem relates to git commands set `RUN_MODE=dev` at the top of app.ini
|
||||||
- type: input
|
- type: input
|
||||||
id: logs
|
id: logs
|
||||||
attributes:
|
attributes:
|
||||||
label: Log Gist
|
label: Log Gist
|
||||||
description: Please provide a gist URL of your logs, with any sensitive information (e.g. API keys) removed/hidden
|
description: Please provide a gist URL of your logs, with any sensitive information (e.g. API keys) removed/hidden
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: screenshots
|
id: screenshots
|
||||||
attributes:
|
attributes:
|
||||||
label: Screenshots
|
label: Screenshots
|
||||||
description: If this issue involves the Web Interface, please provide one or more screenshots
|
description: If this issue involves the Web Interface, please provide one or more screenshots
|
||||||
- type: input
|
- type: input
|
||||||
id: git-ver
|
id: git-ver
|
||||||
attributes:
|
attributes:
|
||||||
label: Git Version
|
label: Git Version
|
||||||
description: The version of git running on the server
|
description: The version of git running on the server
|
||||||
- type: input
|
- type: input
|
||||||
id: os-ver
|
id: os-ver
|
||||||
attributes:
|
attributes:
|
||||||
label: Operating System
|
label: Operating System
|
||||||
description: The operating system you are using to run Gitea
|
description: The operating system you are using to run Gitea
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: run-info
|
id: run-info
|
||||||
attributes:
|
attributes:
|
||||||
label: How are you running Gitea?
|
label: How are you running Gitea?
|
||||||
description: |
|
description: |
|
||||||
Please include information on whether you built Gitea yourself, used one of our downloads, are using https://try.gitea.io or are using some other package
|
Please include information on whether you built Gitea yourself, used one of our downloads, are using https://try.gitea.io or are using some other package
|
||||||
Please also tell us how you are running Gitea, e.g. if it is being run from docker, a command-line, systemd etc.
|
Please also tell us how you are running Gitea, e.g. if it is being run from docker, a command-line, systemd etc.
|
||||||
If you are using a package or systemd tell us what distribution you are using
|
If you are using a package or systemd tell us what distribution you are using
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: dropdown
|
- type: dropdown
|
||||||
id: database
|
id: database
|
||||||
attributes:
|
attributes:
|
||||||
label: Database
|
label: Database
|
||||||
description: What database system are you running?
|
description: What database system are you running?
|
||||||
options:
|
options:
|
||||||
- PostgreSQL
|
- PostgreSQL
|
||||||
- MySQL/MariaDB
|
- MySQL/MariaDB
|
||||||
- MSSQL
|
- MSSQL
|
||||||
- SQLite
|
- SQLite
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
name: Feature Request
|
name: Feature Request
|
||||||
description: Got an idea for a feature that Gitea doesn't have currently? Submit your idea here!
|
description: Got an idea for a feature that Gitea doesn't have currently? Submit your idea here!
|
||||||
labels: ["kind/proposal"]
|
labels: ["type/proposal"]
|
||||||
body:
|
body:
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
value: |
|
value: |
|
||||||
1. Please speak English, this is the language all maintainers can speak and write.
|
1. Please speak English, this is the language all maintainers can speak and write.
|
||||||
2. Please ask questions or configuration/deploy problems on our Discord
|
2. Please ask questions or configuration/deploy problems on our Discord
|
||||||
server (https://discord.gg/gitea) or forum (https://discourse.gitea.io).
|
server (https://discord.gg/gitea) or forum (https://discourse.gitea.io).
|
||||||
3. Please take a moment to check that your feature hasn't already been suggested.
|
3. Please take a moment to check that your feature hasn't already been suggested.
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: description
|
id: description
|
||||||
attributes:
|
attributes:
|
||||||
label: Feature Description
|
label: Feature Description
|
||||||
placeholder: |
|
placeholder: |
|
||||||
I think it would be great if Gitea had...
|
I think it would be great if Gitea had...
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: screenshots
|
id: screenshots
|
||||||
attributes:
|
attributes:
|
||||||
label: Screenshots
|
label: Screenshots
|
||||||
description: If you can, provide screenshots of an implementation on another site e.g. GitHub
|
description: If you can, provide screenshots of an implementation on another site e.g. GitHub
|
||||||
|
|
|
@ -1,66 +1,66 @@
|
||||||
name: Web Interface Bug Report
|
name: Web Interface Bug Report
|
||||||
description: Something doesn't look quite as it should? Report it here!
|
description: Something doesn't look quite as it should? Report it here!
|
||||||
labels: ["kind/bug", "kind/ui"]
|
labels: ["type/bug", "topic/ui"]
|
||||||
body:
|
body:
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
value: |
|
value: |
|
||||||
NOTE: If your issue is a security concern, please send an email to security@gitea.io instead of opening a public issue.
|
NOTE: If your issue is a security concern, please send an email to security@gitea.io instead of opening a public issue.
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
value: |
|
value: |
|
||||||
1. Please speak English, this is the language all maintainers can speak and write.
|
1. Please speak English, this is the language all maintainers can speak and write.
|
||||||
2. Please ask questions or configuration/deploy problems on our Discord
|
2. Please ask questions or configuration/deploy problems on our Discord
|
||||||
server (https://discord.gg/gitea) or forum (https://discourse.gitea.io).
|
server (https://discord.gg/gitea) or forum (https://discourse.gitea.io).
|
||||||
3. Please take a moment to check that your issue doesn't already exist.
|
3. Please take a moment to check that your issue doesn't already exist.
|
||||||
4. Make sure it's not mentioned in the FAQ (https://docs.gitea.com/help/faq)
|
4. Make sure it's not mentioned in the FAQ (https://docs.gitea.com/help/faq)
|
||||||
5. Please give all relevant information below for bug reports, because
|
5. Please give all relevant information below for bug reports, because
|
||||||
incomplete details will be handled as an invalid report.
|
incomplete details will be handled as an invalid report.
|
||||||
6. In particular it's really important to provide pertinent logs. If you are certain that this is a javascript
|
6. In particular it's really important to provide pertinent logs. If you are certain that this is a javascript
|
||||||
error, show us the javascript console. If the error appears to relate to Gitea the server you must also give us
|
error, show us the javascript console. If the error appears to relate to Gitea the server you must also give us
|
||||||
DEBUG level logs. (See https://docs.gitea.com/administration/logging-config#collecting-logs-for-help)
|
DEBUG level logs. (See https://docs.gitea.com/administration/logging-config#collecting-logs-for-help)
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: description
|
id: description
|
||||||
attributes:
|
attributes:
|
||||||
label: Description
|
label: Description
|
||||||
description: |
|
description: |
|
||||||
Please provide a description of your issue here, with a URL if you were able to reproduce the issue (see below)
|
Please provide a description of your issue here, with a URL if you were able to reproduce the issue (see below)
|
||||||
If using a proxy or a CDN (e.g. CloudFlare) in front of gitea, please disable the proxy/CDN fully and connect to gitea directly to confirm the issue still persists without those services.
|
If using a proxy or a CDN (e.g. CloudFlare) in front of gitea, please disable the proxy/CDN fully and connect to gitea directly to confirm the issue still persists without those services.
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: screenshots
|
id: screenshots
|
||||||
attributes:
|
attributes:
|
||||||
label: Screenshots
|
label: Screenshots
|
||||||
description: Please provide at least 1 screenshot showing the issue.
|
description: Please provide at least 1 screenshot showing the issue.
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: input
|
- type: input
|
||||||
id: gitea-ver
|
id: gitea-ver
|
||||||
attributes:
|
attributes:
|
||||||
label: Gitea Version
|
label: Gitea Version
|
||||||
description: Gitea version (or commit reference) your instance is running
|
description: Gitea version (or commit reference) your instance is running
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: dropdown
|
- type: dropdown
|
||||||
id: can-reproduce
|
id: can-reproduce
|
||||||
attributes:
|
attributes:
|
||||||
label: Can you reproduce the bug on the Gitea demo site?
|
label: Can you reproduce the bug on the Gitea demo site?
|
||||||
description: |
|
description: |
|
||||||
If so, please provide a URL in the Description field
|
If so, please provide a URL in the Description field
|
||||||
URL of Gitea demo: https://try.gitea.io
|
URL of Gitea demo: https://try.gitea.io
|
||||||
options:
|
options:
|
||||||
- "Yes"
|
- "Yes"
|
||||||
- "No"
|
- "No"
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: input
|
- type: input
|
||||||
id: os-ver
|
id: os-ver
|
||||||
attributes:
|
attributes:
|
||||||
label: Operating System
|
label: Operating System
|
||||||
description: The operating system you are using to access Gitea
|
description: The operating system you are using to access Gitea
|
||||||
- type: input
|
- type: input
|
||||||
id: browser-ver
|
id: browser-ver
|
||||||
attributes:
|
attributes:
|
||||||
label: Browser Version
|
label: Browser Version
|
||||||
description: The browser and version that you are using to access Gitea
|
description: The browser and version that you are using to access Gitea
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
self-hosted-runner:
|
||||||
|
labels:
|
||||||
|
- actuated-4cpu-8gb
|
||||||
|
- actuated-4cpu-16gb
|
||||||
|
- nscloud
|
|
@ -0,0 +1,77 @@
|
||||||
|
modifies/docs:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file:
|
||||||
|
- "**/*.md"
|
||||||
|
- "docs/**"
|
||||||
|
|
||||||
|
modifies/templates:
|
||||||
|
- changed-files:
|
||||||
|
- all-globs-to-any-file:
|
||||||
|
- "templates/**"
|
||||||
|
- "!templates/swagger/v1_json.tmpl"
|
||||||
|
|
||||||
|
modifies/api:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file:
|
||||||
|
- "routers/api/**"
|
||||||
|
- "templates/swagger/v1_json.tmpl"
|
||||||
|
|
||||||
|
modifies/cli:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file:
|
||||||
|
- "cmd/**"
|
||||||
|
|
||||||
|
modifies/translation:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file:
|
||||||
|
- "options/locale/*.ini"
|
||||||
|
|
||||||
|
modifies/migrations:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file:
|
||||||
|
- "models/migrations/**"
|
||||||
|
|
||||||
|
modifies/internal:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file:
|
||||||
|
- ".air.toml"
|
||||||
|
- "Makefile"
|
||||||
|
- "Dockerfile"
|
||||||
|
- "Dockerfile.rootless"
|
||||||
|
- ".dockerignore"
|
||||||
|
- "docker/**"
|
||||||
|
- ".editorconfig"
|
||||||
|
- ".eslintrc.yaml"
|
||||||
|
- ".golangci.yml"
|
||||||
|
- ".gitpod.yml"
|
||||||
|
- ".markdownlint.yaml"
|
||||||
|
- ".spectral.yaml"
|
||||||
|
- "stylelint.config.js"
|
||||||
|
- ".yamllint.yaml"
|
||||||
|
- ".github/**"
|
||||||
|
- ".gitea/"
|
||||||
|
- ".devcontainer/**"
|
||||||
|
- "build.go"
|
||||||
|
- "build/**"
|
||||||
|
- "contrib/**"
|
||||||
|
|
||||||
|
modifies/dependencies:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file:
|
||||||
|
- "package.json"
|
||||||
|
- "package-lock.json"
|
||||||
|
- "pyproject.toml"
|
||||||
|
- "poetry.lock"
|
||||||
|
- "go.mod"
|
||||||
|
- "go.sum"
|
||||||
|
|
||||||
|
modifies/go:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file:
|
||||||
|
- "**/*.go"
|
||||||
|
|
||||||
|
modifies/js:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file:
|
||||||
|
- "**/*.js"
|
||||||
|
- "**/*.vue"
|
|
@ -1,54 +0,0 @@
|
||||||
# Configuration for probot-stale - https://github.com/probot/stale
|
|
||||||
|
|
||||||
# Number of days of inactivity before an Issue or Pull Request becomes stale
|
|
||||||
daysUntilStale: 60
|
|
||||||
|
|
||||||
# Number of days of inactivity before an Issue or Pull Request with the stale label is closed.
|
|
||||||
# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale.
|
|
||||||
daysUntilClose: 14
|
|
||||||
|
|
||||||
# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
|
|
||||||
exemptLabels:
|
|
||||||
- status/blocked
|
|
||||||
- kind/security
|
|
||||||
- lgtm/done
|
|
||||||
- reviewed/confirmed
|
|
||||||
- priority/critical
|
|
||||||
- kind/proposal
|
|
||||||
|
|
||||||
# Set to true to ignore issues in a project (defaults to false)
|
|
||||||
exemptProjects: false
|
|
||||||
|
|
||||||
# Set to true to ignore issues in a milestone (defaults to false)
|
|
||||||
exemptMilestones: false
|
|
||||||
|
|
||||||
# Label to use when marking as stale
|
|
||||||
staleLabel: stale
|
|
||||||
|
|
||||||
# Comment to post when marking as stale. Set to `false` to disable
|
|
||||||
markComment: >
|
|
||||||
This issue has been automatically marked as stale because it has not had recent activity.
|
|
||||||
I am here to help clear issues left open even if solved or waiting for more insight.
|
|
||||||
This issue will be closed if no further activity occurs during the next 2 weeks.
|
|
||||||
If the issue is still valid just add a comment to keep it alive.
|
|
||||||
Thank you for your contributions.
|
|
||||||
|
|
||||||
# Comment to post when closing a stale Issue or Pull Request.
|
|
||||||
closeComment: >
|
|
||||||
This issue has been automatically closed because of inactivity.
|
|
||||||
You can re-open it if needed.
|
|
||||||
|
|
||||||
# Limit the number of actions per hour, from 1-30. Default is 30
|
|
||||||
limitPerRun: 1
|
|
||||||
|
|
||||||
# Optionally, specify configuration settings that are specific to just 'issues' or 'pulls':
|
|
||||||
pulls:
|
|
||||||
daysUntilStale: 60
|
|
||||||
daysUntilClose: 60
|
|
||||||
markComment: >
|
|
||||||
This pull request has been automatically marked as stale because it has not had
|
|
||||||
recent activity. It will be closed if no further activity occurs during the next 2 months. Thank you
|
|
||||||
for your contributions.
|
|
||||||
closeComment: >
|
|
||||||
This pull request has been automatically closed because of inactivity.
|
|
||||||
You can re-open it if needed.
|
|
|
@ -10,15 +10,15 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
if: github.repository == 'go-gitea/gitea'
|
if: github.repository == 'go-gitea/gitea'
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-go@v4
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "~1.21"
|
go-version-file: go.mod
|
||||||
check-latest: true
|
check-latest: true
|
||||||
- run: make generate-license generate-gitignore
|
- run: make generate-license generate-gitignore
|
||||||
timeout-minutes: 40
|
timeout-minutes: 40
|
||||||
- name: push translations to repo
|
- name: push translations to repo
|
||||||
uses: appleboy/git-push-action@v0.0.2
|
uses: appleboy/git-push-action@v0.0.3
|
||||||
with:
|
with:
|
||||||
author_email: "teabot@gitea.io"
|
author_email: "teabot@gitea.io"
|
||||||
author_name: GiteaBot
|
author_name: GiteaBot
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
name: cron-lock
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: "0 0 * * *" # every day at 00:00 UTC
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
issues: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: lock
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
action:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: github.repository == 'go-gitea/gitea'
|
|
||||||
steps:
|
|
||||||
- uses: dessant/lock-threads@v4
|
|
||||||
with:
|
|
||||||
issue-inactive-days: 45
|
|
|
@ -10,19 +10,24 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
if: github.repository == 'go-gitea/gitea'
|
if: github.repository == 'go-gitea/gitea'
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- name: download from crowdin
|
- uses: crowdin/github-action@v1
|
||||||
uses: docker://jonasfranz/crowdin
|
with:
|
||||||
|
upload_sources: true
|
||||||
|
upload_translations: false
|
||||||
|
download_sources: false
|
||||||
|
download_translations: true
|
||||||
|
push_translations: false
|
||||||
|
push_sources: false
|
||||||
|
create_pull_request: false
|
||||||
|
config: crowdin.yml
|
||||||
env:
|
env:
|
||||||
|
CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}
|
||||||
CROWDIN_KEY: ${{ secrets.CROWDIN_KEY }}
|
CROWDIN_KEY: ${{ secrets.CROWDIN_KEY }}
|
||||||
PLUGIN_DOWNLOAD: true
|
|
||||||
PLUGIN_EXPORT_DIR: options/locale/
|
|
||||||
PLUGIN_IGNORE_BRANCH: true
|
|
||||||
PLUGIN_PROJECT_IDENTIFIER: gitea
|
|
||||||
- name: update locales
|
- name: update locales
|
||||||
run: ./build/update-locales.sh
|
run: ./build/update-locales.sh
|
||||||
- name: push translations to repo
|
- name: push translations to repo
|
||||||
uses: appleboy/git-push-action@v0.0.2
|
uses: appleboy/git-push-action@v0.0.3
|
||||||
with:
|
with:
|
||||||
author_email: "teabot@gitea.io"
|
author_email: "teabot@gitea.io"
|
||||||
author_name: GiteaBot
|
author_name: GiteaBot
|
||||||
|
@ -31,19 +36,3 @@ jobs:
|
||||||
commit_message: "[skip ci] Updated translations via Crowdin"
|
commit_message: "[skip ci] Updated translations via Crowdin"
|
||||||
remote: "git@github.com:go-gitea/gitea.git"
|
remote: "git@github.com:go-gitea/gitea.git"
|
||||||
ssh_key: ${{ secrets.DEPLOY_KEY }}
|
ssh_key: ${{ secrets.DEPLOY_KEY }}
|
||||||
crowdin-push:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: github.repository == 'go-gitea/gitea'
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: push translations to crowdin
|
|
||||||
uses: docker://jonasfranz/crowdin
|
|
||||||
env:
|
|
||||||
CROWDIN_KEY: ${{ secrets.CROWDIN_KEY }}
|
|
||||||
PLUGIN_UPLOAD: true
|
|
||||||
PLUGIN_EXPORT_DIR: options/locale/
|
|
||||||
PLUGIN_IGNORE_BRANCH: true
|
|
||||||
PLUGIN_PROJECT_IDENTIFIER: gitea
|
|
||||||
PLUGIN_FILES: |
|
|
||||||
locale_en-US.ini: options/locale/locale_en-US.ini
|
|
||||||
PLUGIN_BRANCH: main
|
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
name: disk-clean
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
triage:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Free Disk Space (Ubuntu)
|
||||||
|
uses: jlumbroso/free-disk-space@main
|
||||||
|
with:
|
||||||
|
# this might remove tools that are actually needed,
|
||||||
|
# if set to "true" but frees about 6 GB
|
||||||
|
tool-cache: false
|
||||||
|
|
||||||
|
# all of these default to true, but feel free to set to
|
||||||
|
# "false" if necessary for your workflow
|
||||||
|
android: true
|
||||||
|
dotnet: true
|
||||||
|
haskell: true
|
||||||
|
large-packages: false
|
||||||
|
docker-images: false
|
||||||
|
swap-storage: true
|
|
@ -17,6 +17,8 @@ on:
|
||||||
value: ${{ jobs.detect.outputs.docker }}
|
value: ${{ jobs.detect.outputs.docker }}
|
||||||
swagger:
|
swagger:
|
||||||
value: ${{ jobs.detect.outputs.swagger }}
|
value: ${{ jobs.detect.outputs.swagger }}
|
||||||
|
yaml:
|
||||||
|
value: ${{ jobs.detect.outputs.yaml }}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
detect:
|
detect:
|
||||||
|
@ -30,9 +32,10 @@ jobs:
|
||||||
templates: ${{ steps.changes.outputs.templates }}
|
templates: ${{ steps.changes.outputs.templates }}
|
||||||
docker: ${{ steps.changes.outputs.docker }}
|
docker: ${{ steps.changes.outputs.docker }}
|
||||||
swagger: ${{ steps.changes.outputs.swagger }}
|
swagger: ${{ steps.changes.outputs.swagger }}
|
||||||
|
yaml: ${{ steps.changes.outputs.yaml }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: dorny/paths-filter@v2
|
- uses: dorny/paths-filter@v3
|
||||||
id: changes
|
id: changes
|
||||||
with:
|
with:
|
||||||
filters: |
|
filters: |
|
||||||
|
@ -43,6 +46,9 @@ jobs:
|
||||||
- "go.mod"
|
- "go.mod"
|
||||||
- "go.sum"
|
- "go.sum"
|
||||||
- "Makefile"
|
- "Makefile"
|
||||||
|
- ".golangci.yml"
|
||||||
|
- ".editorconfig"
|
||||||
|
- "options/locale/locale_en-US.ini"
|
||||||
|
|
||||||
frontend:
|
frontend:
|
||||||
- "**/*.js"
|
- "**/*.js"
|
||||||
|
@ -51,16 +57,25 @@ jobs:
|
||||||
- "package.json"
|
- "package.json"
|
||||||
- "package-lock.json"
|
- "package-lock.json"
|
||||||
- "Makefile"
|
- "Makefile"
|
||||||
|
- ".eslintrc.yaml"
|
||||||
|
- "stylelint.config.js"
|
||||||
|
- ".npmrc"
|
||||||
|
|
||||||
docs:
|
docs:
|
||||||
- "**/*.md"
|
- "**/*.md"
|
||||||
- "docs/**"
|
- "docs/**"
|
||||||
|
- ".markdownlint.yaml"
|
||||||
|
- "package.json"
|
||||||
|
- "package-lock.json"
|
||||||
|
|
||||||
actions:
|
actions:
|
||||||
- ".github/workflows/*"
|
- ".github/workflows/*"
|
||||||
|
- "Makefile"
|
||||||
|
|
||||||
templates:
|
templates:
|
||||||
|
- "tools/lint-templates-*.js"
|
||||||
- "templates/**/*.tmpl"
|
- "templates/**/*.tmpl"
|
||||||
|
- "pyproject.toml"
|
||||||
- "poetry.lock"
|
- "poetry.lock"
|
||||||
|
|
||||||
docker:
|
docker:
|
||||||
|
@ -72,3 +87,13 @@ jobs:
|
||||||
swagger:
|
swagger:
|
||||||
- "templates/swagger/v1_json.tmpl"
|
- "templates/swagger/v1_json.tmpl"
|
||||||
- "Makefile"
|
- "Makefile"
|
||||||
|
- "package.json"
|
||||||
|
- "package-lock.json"
|
||||||
|
- ".spectral.yaml"
|
||||||
|
|
||||||
|
yaml:
|
||||||
|
- "**/*.yml"
|
||||||
|
- "**/*.yaml"
|
||||||
|
- ".yamllint.yaml"
|
||||||
|
- "pyproject.toml"
|
||||||
|
- "poetry.lock"
|
||||||
|
|
|
@ -16,10 +16,10 @@ jobs:
|
||||||
needs: files-changed
|
needs: files-changed
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-go@v4
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "~1.21"
|
go-version-file: go.mod
|
||||||
check-latest: true
|
check-latest: true
|
||||||
- run: make deps-backend deps-tools
|
- run: make deps-backend deps-tools
|
||||||
- run: make lint-backend
|
- run: make lint-backend
|
||||||
|
@ -31,35 +31,64 @@ jobs:
|
||||||
needs: files-changed
|
needs: files-changed
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-python@v4
|
- uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: "3.11"
|
python-version: "3.12"
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: 20
|
||||||
- run: pip install poetry
|
- run: pip install poetry
|
||||||
- run: make deps-py
|
- run: make deps-py
|
||||||
|
- run: make deps-frontend
|
||||||
- run: make lint-templates
|
- run: make lint-templates
|
||||||
|
|
||||||
|
lint-yaml:
|
||||||
|
if: needs.files-changed.outputs.yaml == 'true'
|
||||||
|
needs: files-changed
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: "3.12"
|
||||||
|
- run: pip install poetry
|
||||||
|
- run: make deps-py
|
||||||
|
- run: make lint-yaml
|
||||||
|
|
||||||
lint-swagger:
|
lint-swagger:
|
||||||
if: needs.files-changed.outputs.swagger == 'true'
|
if: needs.files-changed.outputs.swagger == 'true'
|
||||||
needs: files-changed
|
needs: files-changed
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 20
|
||||||
- run: make deps-frontend
|
- run: make deps-frontend
|
||||||
- run: make lint-swagger
|
- run: make lint-swagger
|
||||||
|
|
||||||
|
lint-spell:
|
||||||
|
if: needs.files-changed.outputs.backend == 'true' || needs.files-changed.outputs.frontend == 'true' || needs.files-changed.outputs.actions == 'true' || needs.files-changed.outputs.docs == 'true' || needs.files-changed.outputs.templates == 'true'
|
||||||
|
needs: files-changed
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version-file: go.mod
|
||||||
|
check-latest: true
|
||||||
|
- run: make lint-spell
|
||||||
|
|
||||||
lint-go-windows:
|
lint-go-windows:
|
||||||
if: needs.files-changed.outputs.backend == 'true' || needs.files-changed.outputs.actions == 'true'
|
if: needs.files-changed.outputs.backend == 'true' || needs.files-changed.outputs.actions == 'true'
|
||||||
needs: files-changed
|
needs: files-changed
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-go@v4
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "~1.21"
|
go-version-file: go.mod
|
||||||
check-latest: true
|
check-latest: true
|
||||||
- run: make deps-backend deps-tools
|
- run: make deps-backend deps-tools
|
||||||
- run: make lint-go-windows lint-go-vet
|
- run: make lint-go-windows lint-go-vet
|
||||||
|
@ -73,10 +102,10 @@ jobs:
|
||||||
needs: files-changed
|
needs: files-changed
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-go@v4
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "~1.21"
|
go-version-file: go.mod
|
||||||
check-latest: true
|
check-latest: true
|
||||||
- run: make deps-backend deps-tools
|
- run: make deps-backend deps-tools
|
||||||
- run: make lint-go
|
- run: make lint-go
|
||||||
|
@ -88,10 +117,10 @@ jobs:
|
||||||
needs: files-changed
|
needs: files-changed
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-go@v4
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "~1.21"
|
go-version-file: go.mod
|
||||||
check-latest: true
|
check-latest: true
|
||||||
- run: make deps-backend deps-tools
|
- run: make deps-backend deps-tools
|
||||||
- run: make --always-make checks-backend # ensure the "go-licenses" make target runs
|
- run: make --always-make checks-backend # ensure the "go-licenses" make target runs
|
||||||
|
@ -101,8 +130,8 @@ jobs:
|
||||||
needs: files-changed
|
needs: files-changed
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 20
|
||||||
- run: make deps-frontend
|
- run: make deps-frontend
|
||||||
|
@ -116,10 +145,10 @@ jobs:
|
||||||
needs: files-changed
|
needs: files-changed
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-go@v4
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "~1.21"
|
go-version-file: go.mod
|
||||||
check-latest: true
|
check-latest: true
|
||||||
# no frontend build here as backend should be able to build
|
# no frontend build here as backend should be able to build
|
||||||
# even without any frontend files
|
# even without any frontend files
|
||||||
|
@ -148,8 +177,8 @@ jobs:
|
||||||
needs: files-changed
|
needs: files-changed
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 20
|
||||||
- run: make deps-frontend
|
- run: make deps-frontend
|
||||||
|
@ -161,6 +190,9 @@ jobs:
|
||||||
needs: files-changed
|
needs: files-changed
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-go@v4
|
- uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version-file: go.mod
|
||||||
|
check-latest: true
|
||||||
- run: make lint-actions
|
- run: make lint-actions
|
||||||
|
|
|
@ -17,7 +17,7 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
services:
|
services:
|
||||||
pgsql:
|
pgsql:
|
||||||
image: postgres:15
|
image: postgres:12
|
||||||
env:
|
env:
|
||||||
POSTGRES_DB: test
|
POSTGRES_DB: test
|
||||||
POSTGRES_PASSWORD: postgres
|
POSTGRES_PASSWORD: postgres
|
||||||
|
@ -31,17 +31,17 @@ jobs:
|
||||||
minio:
|
minio:
|
||||||
# as github actions doesn't support "entrypoint", we need to use a non-official image
|
# as github actions doesn't support "entrypoint", we need to use a non-official image
|
||||||
# that has a custom entrypoint set to "minio server /data"
|
# that has a custom entrypoint set to "minio server /data"
|
||||||
image: bitnami/minio:2021.3.17
|
image: bitnami/minio:2023.8.31
|
||||||
env:
|
env:
|
||||||
MINIO_ACCESS_KEY: 123456
|
MINIO_ROOT_USER: 123456
|
||||||
MINIO_SECRET_KEY: 12345678
|
MINIO_ROOT_PASSWORD: 12345678
|
||||||
ports:
|
ports:
|
||||||
- "9000:9000"
|
- "9000:9000"
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-go@v4
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "~1.21"
|
go-version-file: go.mod
|
||||||
check-latest: true
|
check-latest: true
|
||||||
- name: Add hosts to /etc/hosts
|
- name: Add hosts to /etc/hosts
|
||||||
run: '[ -e "/.dockerenv" ] || [ -e "/run/.containerenv" ] || echo "127.0.0.1 pgsql ldap minio" | sudo tee -a /etc/hosts'
|
run: '[ -e "/.dockerenv" ] || [ -e "/run/.containerenv" ] || echo "127.0.0.1 pgsql ldap minio" | sudo tee -a /etc/hosts'
|
||||||
|
@ -49,7 +49,10 @@ jobs:
|
||||||
- run: make backend
|
- run: make backend
|
||||||
env:
|
env:
|
||||||
TAGS: bindata
|
TAGS: bindata
|
||||||
- run: make test-pgsql-migration test-pgsql
|
- name: run migration tests
|
||||||
|
run: make test-pgsql-migration
|
||||||
|
- name: run tests
|
||||||
|
run: make test-pgsql
|
||||||
timeout-minutes: 50
|
timeout-minutes: 50
|
||||||
env:
|
env:
|
||||||
TAGS: bindata gogit
|
TAGS: bindata gogit
|
||||||
|
@ -63,16 +66,19 @@ jobs:
|
||||||
needs: files-changed
|
needs: files-changed
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-go@v4
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "~1.21"
|
go-version-file: go.mod
|
||||||
check-latest: true
|
check-latest: true
|
||||||
- run: make deps-backend
|
- run: make deps-backend
|
||||||
- run: make backend
|
- run: make backend
|
||||||
env:
|
env:
|
||||||
TAGS: bindata gogit sqlite sqlite_unlock_notify
|
TAGS: bindata gogit sqlite sqlite_unlock_notify
|
||||||
- run: make test-sqlite-migration test-sqlite
|
- name: run migration tests
|
||||||
|
run: make test-sqlite-migration
|
||||||
|
- name: run tests
|
||||||
|
run: make test-sqlite
|
||||||
timeout-minutes: 50
|
timeout-minutes: 50
|
||||||
env:
|
env:
|
||||||
TAGS: bindata gogit sqlite sqlite_unlock_notify
|
TAGS: bindata gogit sqlite sqlite_unlock_notify
|
||||||
|
@ -85,13 +91,6 @@ jobs:
|
||||||
needs: files-changed
|
needs: files-changed
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
services:
|
services:
|
||||||
mysql:
|
|
||||||
image: mysql:5.7
|
|
||||||
env:
|
|
||||||
MYSQL_ALLOW_EMPTY_PASSWORD: yes
|
|
||||||
MYSQL_DATABASE: test
|
|
||||||
ports:
|
|
||||||
- "3306:3306"
|
|
||||||
elasticsearch:
|
elasticsearch:
|
||||||
image: elasticsearch:7.5.0
|
image: elasticsearch:7.5.0
|
||||||
env:
|
env:
|
||||||
|
@ -104,13 +103,6 @@ jobs:
|
||||||
MEILI_ENV: development # disable auth
|
MEILI_ENV: development # disable auth
|
||||||
ports:
|
ports:
|
||||||
- "7700:7700"
|
- "7700:7700"
|
||||||
smtpimap:
|
|
||||||
image: tabascoterrier/docker-imap-devel:latest
|
|
||||||
ports:
|
|
||||||
- "25:25"
|
|
||||||
- "143:143"
|
|
||||||
- "587:587"
|
|
||||||
- "993:993"
|
|
||||||
redis:
|
redis:
|
||||||
image: redis
|
image: redis
|
||||||
options: >- # wait until redis has started
|
options: >- # wait until redis has started
|
||||||
|
@ -128,10 +120,10 @@ jobs:
|
||||||
ports:
|
ports:
|
||||||
- "9000:9000"
|
- "9000:9000"
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-go@v4
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "~1.21"
|
go-version-file: go.mod
|
||||||
check-latest: true
|
check-latest: true
|
||||||
- name: Add hosts to /etc/hosts
|
- name: Add hosts to /etc/hosts
|
||||||
run: '[ -e "/.dockerenv" ] || [ -e "/run/.containerenv" ] || echo "127.0.0.1 mysql elasticsearch meilisearch smtpimap" | sudo tee -a /etc/hosts'
|
run: '[ -e "/.dockerenv" ] || [ -e "/run/.containerenv" ] || echo "127.0.0.1 mysql elasticsearch meilisearch smtpimap" | sudo tee -a /etc/hosts'
|
||||||
|
@ -152,16 +144,16 @@ jobs:
|
||||||
RACE_ENABLED: true
|
RACE_ENABLED: true
|
||||||
GITHUB_READ_TOKEN: ${{ secrets.GITHUB_READ_TOKEN }}
|
GITHUB_READ_TOKEN: ${{ secrets.GITHUB_READ_TOKEN }}
|
||||||
|
|
||||||
test-mysql5:
|
test-mysql:
|
||||||
if: needs.files-changed.outputs.backend == 'true' || needs.files-changed.outputs.actions == 'true'
|
if: needs.files-changed.outputs.backend == 'true' || needs.files-changed.outputs.actions == 'true'
|
||||||
needs: files-changed
|
needs: files-changed
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
services:
|
services:
|
||||||
mysql:
|
mysql:
|
||||||
image: mysql:5.7
|
image: mysql:8.0
|
||||||
env:
|
env:
|
||||||
MYSQL_ALLOW_EMPTY_PASSWORD: yes
|
MYSQL_ALLOW_EMPTY_PASSWORD: true
|
||||||
MYSQL_DATABASE: test
|
MYSQL_DATABASE: testgitea
|
||||||
ports:
|
ports:
|
||||||
- "3306:3306"
|
- "3306:3306"
|
||||||
elasticsearch:
|
elasticsearch:
|
||||||
|
@ -178,10 +170,10 @@ jobs:
|
||||||
- "587:587"
|
- "587:587"
|
||||||
- "993:993"
|
- "993:993"
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-go@v4
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "~1.21"
|
go-version-file: go.mod
|
||||||
check-latest: true
|
check-latest: true
|
||||||
- name: Add hosts to /etc/hosts
|
- name: Add hosts to /etc/hosts
|
||||||
run: '[ -e "/.dockerenv" ] || [ -e "/run/.containerenv" ] || echo "127.0.0.1 mysql elasticsearch smtpimap" | sudo tee -a /etc/hosts'
|
run: '[ -e "/.dockerenv" ] || [ -e "/run/.containerenv" ] || echo "127.0.0.1 mysql elasticsearch smtpimap" | sudo tee -a /etc/hosts'
|
||||||
|
@ -189,51 +181,23 @@ jobs:
|
||||||
- run: make backend
|
- run: make backend
|
||||||
env:
|
env:
|
||||||
TAGS: bindata
|
TAGS: bindata
|
||||||
|
- name: run migration tests
|
||||||
|
run: make test-mysql-migration
|
||||||
- name: run tests
|
- name: run tests
|
||||||
run: make test-mysql-migration integration-test-coverage
|
run: make integration-test-coverage
|
||||||
env:
|
env:
|
||||||
TAGS: bindata
|
TAGS: bindata
|
||||||
RACE_ENABLED: true
|
RACE_ENABLED: true
|
||||||
USE_REPO_TEST_DIR: 1
|
USE_REPO_TEST_DIR: 1
|
||||||
TEST_INDEXER_CODE_ES_URL: "http://elastic:changeme@elasticsearch:9200"
|
TEST_INDEXER_CODE_ES_URL: "http://elastic:changeme@elasticsearch:9200"
|
||||||
|
|
||||||
test-mysql8:
|
|
||||||
if: needs.files-changed.outputs.backend == 'true' || needs.files-changed.outputs.actions == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
services:
|
|
||||||
mysql8:
|
|
||||||
image: mysql:8
|
|
||||||
env:
|
|
||||||
MYSQL_ALLOW_EMPTY_PASSWORD: yes
|
|
||||||
MYSQL_DATABASE: testgitea
|
|
||||||
ports:
|
|
||||||
- "3306:3306"
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: actions/setup-go@v4
|
|
||||||
with:
|
|
||||||
go-version: "~1.21"
|
|
||||||
check-latest: true
|
|
||||||
- name: Add hosts to /etc/hosts
|
|
||||||
run: '[ -e "/.dockerenv" ] || [ -e "/run/.containerenv" ] || echo "127.0.0.1 mysql8" | sudo tee -a /etc/hosts'
|
|
||||||
- run: make deps-backend
|
|
||||||
- run: make backend
|
|
||||||
env:
|
|
||||||
TAGS: bindata
|
|
||||||
- run: make test-mysql8-migration test-mysql8
|
|
||||||
timeout-minutes: 50
|
|
||||||
env:
|
|
||||||
TAGS: bindata
|
|
||||||
USE_REPO_TEST_DIR: 1
|
|
||||||
|
|
||||||
test-mssql:
|
test-mssql:
|
||||||
if: needs.files-changed.outputs.backend == 'true' || needs.files-changed.outputs.actions == 'true'
|
if: needs.files-changed.outputs.backend == 'true' || needs.files-changed.outputs.actions == 'true'
|
||||||
needs: files-changed
|
needs: files-changed
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
services:
|
services:
|
||||||
mssql:
|
mssql:
|
||||||
image: mcr.microsoft.com/mssql/server:latest
|
image: mcr.microsoft.com/mssql/server:2017-latest
|
||||||
env:
|
env:
|
||||||
ACCEPT_EULA: Y
|
ACCEPT_EULA: Y
|
||||||
MSSQL_PID: Standard
|
MSSQL_PID: Standard
|
||||||
|
@ -241,10 +205,10 @@ jobs:
|
||||||
ports:
|
ports:
|
||||||
- "1433:1433"
|
- "1433:1433"
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-go@v4
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "~1.21"
|
go-version-file: go.mod
|
||||||
check-latest: true
|
check-latest: true
|
||||||
- name: Add hosts to /etc/hosts
|
- name: Add hosts to /etc/hosts
|
||||||
run: '[ -e "/.dockerenv" ] || [ -e "/run/.containerenv" ] || echo "127.0.0.1 mssql" | sudo tee -a /etc/hosts'
|
run: '[ -e "/.dockerenv" ] || [ -e "/run/.containerenv" ] || echo "127.0.0.1 mssql" | sudo tee -a /etc/hosts'
|
||||||
|
@ -252,7 +216,9 @@ jobs:
|
||||||
- run: make backend
|
- run: make backend
|
||||||
env:
|
env:
|
||||||
TAGS: bindata
|
TAGS: bindata
|
||||||
- run: make test-mssql-migration test-mssql
|
- run: make test-mssql-migration
|
||||||
|
- name: run tests
|
||||||
|
run: make test-mssql
|
||||||
timeout-minutes: 50
|
timeout-minutes: 50
|
||||||
env:
|
env:
|
||||||
TAGS: bindata
|
TAGS: bindata
|
||||||
|
|
|
@ -16,8 +16,8 @@ jobs:
|
||||||
needs: files-changed
|
needs: files-changed
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: docker/setup-buildx-action@v2
|
- uses: docker/setup-buildx-action@v3
|
||||||
- uses: docker/build-push-action@v4
|
- uses: docker/build-push-action@v5
|
||||||
with:
|
with:
|
||||||
push: false
|
push: false
|
||||||
tags: gitea/gitea:linux-amd64
|
tags: gitea/gitea:linux-amd64
|
||||||
|
@ -27,8 +27,8 @@ jobs:
|
||||||
needs: files-changed
|
needs: files-changed
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: docker/setup-buildx-action@v2
|
- uses: docker/setup-buildx-action@v3
|
||||||
- uses: docker/build-push-action@v4
|
- uses: docker/build-push-action@v5
|
||||||
with:
|
with:
|
||||||
push: false
|
push: false
|
||||||
file: Dockerfile.rootless
|
file: Dockerfile.rootless
|
||||||
|
|
|
@ -16,12 +16,12 @@ jobs:
|
||||||
needs: files-changed
|
needs: files-changed
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-go@v4
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "~1.21"
|
go-version-file: go.mod
|
||||||
check-latest: true
|
check-latest: true
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 20
|
||||||
- run: make deps-frontend frontend deps-backend
|
- run: make deps-frontend frontend deps-backend
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
name: labeler
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
types: [opened, synchronize, reopened]
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
labeler:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write
|
||||||
|
steps:
|
||||||
|
- uses: actions/labeler@v5
|
||||||
|
with:
|
||||||
|
sync-labels: true
|
|
@ -1,22 +1,28 @@
|
||||||
name: release-nightly-assets
|
name: release-nightly
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ main, release/v* ]
|
branches: [main, release/v*]
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
disk-clean:
|
||||||
|
uses: ./.github/workflows/disk-clean.yml
|
||||||
nightly-binary:
|
nightly-binary:
|
||||||
runs-on: ubuntu-latest
|
runs-on: nscloud
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
# fetch all commits instead of only the last as some branches are long lived and could have many between versions
|
# fetch all commits instead of only the last as some branches are long lived and could have many between versions
|
||||||
# fetch all tags to ensure that "git describe" reports expected Gitea version, eg. v1.21.0-dev-1-g1234567
|
# fetch all tags to ensure that "git describe" reports expected Gitea version, eg. v1.21.0-dev-1-g1234567
|
||||||
- run: git fetch --unshallow --quiet --tags --force
|
- run: git fetch --unshallow --quiet --tags --force
|
||||||
- uses: actions/setup-go@v4
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "~1.21"
|
go-version-file: go.mod
|
||||||
check-latest: true
|
check-latest: true
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 20
|
||||||
- run: make deps-frontend deps-backend
|
- run: make deps-frontend deps-backend
|
||||||
|
@ -26,7 +32,7 @@ jobs:
|
||||||
TAGS: bindata sqlite sqlite_unlock_notify
|
TAGS: bindata sqlite sqlite_unlock_notify
|
||||||
- name: import gpg key
|
- name: import gpg key
|
||||||
id: import_gpg
|
id: import_gpg
|
||||||
uses: crazy-max/ghaction-import-gpg@v5
|
uses: crazy-max/ghaction-import-gpg@v6
|
||||||
with:
|
with:
|
||||||
gpg_private_key: ${{ secrets.GPGSIGN_KEY }}
|
gpg_private_key: ${{ secrets.GPGSIGN_KEY }}
|
||||||
passphrase: ${{ secrets.GPGSIGN_PASSPHRASE }}
|
passphrase: ${{ secrets.GPGSIGN_PASSPHRASE }}
|
||||||
|
@ -42,24 +48,28 @@ jobs:
|
||||||
REF_NAME=$(echo "${{ github.ref }}" | sed -e 's/refs\/heads\///' -e 's/refs\/tags\///' -e 's/release\/v//')
|
REF_NAME=$(echo "${{ github.ref }}" | sed -e 's/refs\/heads\///' -e 's/refs\/tags\///' -e 's/release\/v//')
|
||||||
echo "Cleaned name is ${REF_NAME}"
|
echo "Cleaned name is ${REF_NAME}"
|
||||||
echo "branch=${REF_NAME}" >> "$GITHUB_OUTPUT"
|
echo "branch=${REF_NAME}" >> "$GITHUB_OUTPUT"
|
||||||
|
- name: configure aws
|
||||||
|
uses: aws-actions/configure-aws-credentials@v4
|
||||||
|
with:
|
||||||
|
aws-region: ${{ secrets.AWS_REGION }}
|
||||||
|
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||||
|
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||||
- name: upload binaries to s3
|
- name: upload binaries to s3
|
||||||
uses: jakejarvis/s3-sync-action@master
|
run: |
|
||||||
env:
|
aws s3 sync dist/release s3://${{ secrets.AWS_S3_BUCKET }}/gitea/${{ steps.clean_name.outputs.branch }} --no-progress
|
||||||
AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }}
|
nightly-docker-rootful:
|
||||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
|
||||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
|
||||||
AWS_REGION: ${{ secrets.AWS_REGION }}
|
|
||||||
SOURCE_DIR: dist/release
|
|
||||||
DEST_DIR: gitea/${{ steps.clean_name.outputs.branch }}
|
|
||||||
nightly-docker:
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
# fetch all commits instead of only the last as some branches are long lived and could have many between versions
|
# fetch all commits instead of only the last as some branches are long lived and could have many between versions
|
||||||
# fetch all tags to ensure that "git describe" reports expected Gitea version, eg. v1.21.0-dev-1-g1234567
|
# fetch all tags to ensure that "git describe" reports expected Gitea version, eg. v1.21.0-dev-1-g1234567
|
||||||
- run: git fetch --unshallow --quiet --tags --force
|
- run: git fetch --unshallow --quiet --tags --force
|
||||||
- uses: docker/setup-qemu-action@v2
|
- uses: actions/setup-go@v5
|
||||||
- uses: docker/setup-buildx-action@v2
|
with:
|
||||||
|
go-version-file: go.mod
|
||||||
|
check-latest: true
|
||||||
|
- uses: docker/setup-qemu-action@v3
|
||||||
|
- uses: docker/setup-buildx-action@v3
|
||||||
- name: Get cleaned branch name
|
- name: Get cleaned branch name
|
||||||
id: clean_name
|
id: clean_name
|
||||||
run: |
|
run: |
|
||||||
|
@ -71,19 +81,51 @@ jobs:
|
||||||
REF_NAME=$(echo "${{ github.ref }}" | sed -e 's/refs\/heads\///' -e 's/refs\/tags\///' -e 's/release\/v//')
|
REF_NAME=$(echo "${{ github.ref }}" | sed -e 's/refs\/heads\///' -e 's/refs\/tags\///' -e 's/release\/v//')
|
||||||
echo "branch=${REF_NAME}-nightly" >> "$GITHUB_OUTPUT"
|
echo "branch=${REF_NAME}-nightly" >> "$GITHUB_OUTPUT"
|
||||||
- name: Login to Docker Hub
|
- name: Login to Docker Hub
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
- name: fetch go modules
|
||||||
|
run: make vendor
|
||||||
- name: build rootful docker image
|
- name: build rootful docker image
|
||||||
uses: docker/build-push-action@v4
|
uses: docker/build-push-action@v5
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
push: true
|
push: true
|
||||||
tags: gitea/gitea:${{ steps.clean_name.outputs.branch }}
|
tags: gitea/gitea:${{ steps.clean_name.outputs.branch }}
|
||||||
|
nightly-docker-rootless:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
# fetch all commits instead of only the last as some branches are long lived and could have many between versions
|
||||||
|
# fetch all tags to ensure that "git describe" reports expected Gitea version, eg. v1.21.0-dev-1-g1234567
|
||||||
|
- run: git fetch --unshallow --quiet --tags --force
|
||||||
|
- uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version-file: go.mod
|
||||||
|
check-latest: true
|
||||||
|
- uses: docker/setup-qemu-action@v3
|
||||||
|
- uses: docker/setup-buildx-action@v3
|
||||||
|
- name: Get cleaned branch name
|
||||||
|
id: clean_name
|
||||||
|
run: |
|
||||||
|
# if main then say nightly otherwise cleanup name
|
||||||
|
if [ "${{ github.ref }}" = "refs/heads/main" ]; then
|
||||||
|
echo "branch=nightly" >> "$GITHUB_OUTPUT"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
REF_NAME=$(echo "${{ github.ref }}" | sed -e 's/refs\/heads\///' -e 's/refs\/tags\///' -e 's/release\/v//')
|
||||||
|
echo "branch=${REF_NAME}-nightly" >> "$GITHUB_OUTPUT"
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
- name: fetch go modules
|
||||||
|
run: make vendor
|
||||||
- name: build rootless docker image
|
- name: build rootless docker image
|
||||||
uses: docker/build-push-action@v4
|
uses: docker/build-push-action@v5
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
|
|
|
@ -0,0 +1,132 @@
|
||||||
|
name: release-tag-rc
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- "v1*-rc*"
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
binary:
|
||||||
|
runs-on: nscloud
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
# fetch all commits instead of only the last as some branches are long lived and could have many between versions
|
||||||
|
# fetch all tags to ensure that "git describe" reports expected Gitea version, eg. v1.21.0-dev-1-g1234567
|
||||||
|
- run: git fetch --unshallow --quiet --tags --force
|
||||||
|
- uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version-file: go.mod
|
||||||
|
check-latest: true
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: 20
|
||||||
|
- run: make deps-frontend deps-backend
|
||||||
|
# xgo build
|
||||||
|
- run: make release
|
||||||
|
env:
|
||||||
|
TAGS: bindata sqlite sqlite_unlock_notify
|
||||||
|
- name: import gpg key
|
||||||
|
id: import_gpg
|
||||||
|
uses: crazy-max/ghaction-import-gpg@v6
|
||||||
|
with:
|
||||||
|
gpg_private_key: ${{ secrets.GPGSIGN_KEY }}
|
||||||
|
passphrase: ${{ secrets.GPGSIGN_PASSPHRASE }}
|
||||||
|
- name: sign binaries
|
||||||
|
run: |
|
||||||
|
for f in dist/release/*; do
|
||||||
|
echo '${{ secrets.GPGSIGN_PASSPHRASE }}' | gpg --pinentry-mode loopback --passphrase-fd 0 --batch --yes --detach-sign -u ${{ steps.import_gpg.outputs.fingerprint }} --output "$f.asc" "$f"
|
||||||
|
done
|
||||||
|
# clean branch name to get the folder name in S3
|
||||||
|
- name: Get cleaned branch name
|
||||||
|
id: clean_name
|
||||||
|
run: |
|
||||||
|
REF_NAME=$(echo "${{ github.ref }}" | sed -e 's/refs\/heads\///' -e 's/refs\/tags\/v//' -e 's/release\/v//')
|
||||||
|
echo "Cleaned name is ${REF_NAME}"
|
||||||
|
echo "branch=${REF_NAME}" >> "$GITHUB_OUTPUT"
|
||||||
|
- name: configure aws
|
||||||
|
uses: aws-actions/configure-aws-credentials@v4
|
||||||
|
with:
|
||||||
|
aws-region: ${{ secrets.AWS_REGION }}
|
||||||
|
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||||
|
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||||
|
- name: upload binaries to s3
|
||||||
|
run: |
|
||||||
|
aws s3 sync dist/release s3://${{ secrets.AWS_S3_BUCKET }}/gitea/${{ steps.clean_name.outputs.branch }} --no-progress
|
||||||
|
- name: Install GH CLI
|
||||||
|
uses: dev-hanz-ops/install-gh-cli-action@v0.1.0
|
||||||
|
with:
|
||||||
|
gh-cli-version: 2.39.1
|
||||||
|
- name: create github release
|
||||||
|
run: |
|
||||||
|
gh release create ${{ github.ref_name }} --title ${{ github.ref_name }} --draft --notes-from-tag dist/release/*
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
||||||
|
docker-rootful:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
# fetch all commits instead of only the last as some branches are long lived and could have many between versions
|
||||||
|
# fetch all tags to ensure that "git describe" reports expected Gitea version, eg. v1.21.0-dev-1-g1234567
|
||||||
|
- run: git fetch --unshallow --quiet --tags --force
|
||||||
|
- uses: docker/setup-qemu-action@v3
|
||||||
|
- uses: docker/setup-buildx-action@v3
|
||||||
|
- uses: docker/metadata-action@v5
|
||||||
|
id: meta
|
||||||
|
with:
|
||||||
|
images: gitea/gitea
|
||||||
|
flavor: |
|
||||||
|
latest=false
|
||||||
|
# 1.2.3-rc0
|
||||||
|
tags: |
|
||||||
|
type=semver,pattern={{version}}
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
- name: build rootful docker image
|
||||||
|
uses: docker/build-push-action@v5
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
push: true
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
docker-rootless:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
# fetch all commits instead of only the last as some branches are long lived and could have many between versions
|
||||||
|
# fetch all tags to ensure that "git describe" reports expected Gitea version, eg. v1.21.0-dev-1-g1234567
|
||||||
|
- run: git fetch --unshallow --quiet --tags --force
|
||||||
|
- uses: docker/setup-qemu-action@v3
|
||||||
|
- uses: docker/setup-buildx-action@v3
|
||||||
|
- uses: docker/metadata-action@v5
|
||||||
|
id: meta
|
||||||
|
with:
|
||||||
|
images: gitea/gitea
|
||||||
|
# each tag below will have the suffix of -rootless
|
||||||
|
flavor: |
|
||||||
|
latest=false
|
||||||
|
suffix=-rootless
|
||||||
|
# 1.2.3-rc0
|
||||||
|
tags: |
|
||||||
|
type=semver,pattern={{version}}
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
- name: build rootless docker image
|
||||||
|
uses: docker/build-push-action@v5
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
push: true
|
||||||
|
file: Dockerfile.rootless
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
|
@ -0,0 +1,143 @@
|
||||||
|
name: release-tag-version
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- "v1.*"
|
||||||
|
- "!v1*-rc*"
|
||||||
|
- "!v1*-dev"
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
binary:
|
||||||
|
runs-on: nscloud
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
# fetch all commits instead of only the last as some branches are long lived and could have many between versions
|
||||||
|
# fetch all tags to ensure that "git describe" reports expected Gitea version, eg. v1.21.0-dev-1-g1234567
|
||||||
|
- run: git fetch --unshallow --quiet --tags --force
|
||||||
|
- uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version-file: go.mod
|
||||||
|
check-latest: true
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: 20
|
||||||
|
- run: make deps-frontend deps-backend
|
||||||
|
# xgo build
|
||||||
|
- run: make release
|
||||||
|
env:
|
||||||
|
TAGS: bindata sqlite sqlite_unlock_notify
|
||||||
|
- name: import gpg key
|
||||||
|
id: import_gpg
|
||||||
|
uses: crazy-max/ghaction-import-gpg@v6
|
||||||
|
with:
|
||||||
|
gpg_private_key: ${{ secrets.GPGSIGN_KEY }}
|
||||||
|
passphrase: ${{ secrets.GPGSIGN_PASSPHRASE }}
|
||||||
|
- name: sign binaries
|
||||||
|
run: |
|
||||||
|
for f in dist/release/*; do
|
||||||
|
echo '${{ secrets.GPGSIGN_PASSPHRASE }}' | gpg --pinentry-mode loopback --passphrase-fd 0 --batch --yes --detach-sign -u ${{ steps.import_gpg.outputs.fingerprint }} --output "$f.asc" "$f"
|
||||||
|
done
|
||||||
|
# clean branch name to get the folder name in S3
|
||||||
|
- name: Get cleaned branch name
|
||||||
|
id: clean_name
|
||||||
|
run: |
|
||||||
|
REF_NAME=$(echo "${{ github.ref }}" | sed -e 's/refs\/heads\///' -e 's/refs\/tags\/v//' -e 's/release\/v//')
|
||||||
|
echo "Cleaned name is ${REF_NAME}"
|
||||||
|
echo "branch=${REF_NAME}" >> "$GITHUB_OUTPUT"
|
||||||
|
- name: configure aws
|
||||||
|
uses: aws-actions/configure-aws-credentials@v4
|
||||||
|
with:
|
||||||
|
aws-region: ${{ secrets.AWS_REGION }}
|
||||||
|
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||||
|
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||||
|
- name: upload binaries to s3
|
||||||
|
run: |
|
||||||
|
aws s3 sync dist/release s3://${{ secrets.AWS_S3_BUCKET }}/gitea/${{ steps.clean_name.outputs.branch }} --no-progress
|
||||||
|
- name: Install GH CLI
|
||||||
|
uses: dev-hanz-ops/install-gh-cli-action@v0.1.0
|
||||||
|
with:
|
||||||
|
gh-cli-version: 2.39.1
|
||||||
|
- name: create github release
|
||||||
|
run: |
|
||||||
|
gh release create ${{ github.ref_name }} --title ${{ github.ref_name }} --notes-from-tag dist/release/*
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
||||||
|
docker-rootful:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
# fetch all commits instead of only the last as some branches are long lived and could have many between versions
|
||||||
|
# fetch all tags to ensure that "git describe" reports expected Gitea version, eg. v1.21.0-dev-1-g1234567
|
||||||
|
- run: git fetch --unshallow --quiet --tags --force
|
||||||
|
- uses: docker/setup-qemu-action@v3
|
||||||
|
- uses: docker/setup-buildx-action@v3
|
||||||
|
- uses: docker/metadata-action@v5
|
||||||
|
id: meta
|
||||||
|
with:
|
||||||
|
images: gitea/gitea
|
||||||
|
# this will generate tags in the following format:
|
||||||
|
# latest
|
||||||
|
# 1
|
||||||
|
# 1.2
|
||||||
|
# 1.2.3
|
||||||
|
tags: |
|
||||||
|
type=semver,pattern={{major}}
|
||||||
|
type=semver,pattern={{major}}.{{minor}}
|
||||||
|
type=semver,pattern={{version}}
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
- name: build rootful docker image
|
||||||
|
uses: docker/build-push-action@v5
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
push: true
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
docker-rootless:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
# fetch all commits instead of only the last as some branches are long lived and could have many between versions
|
||||||
|
# fetch all tags to ensure that "git describe" reports expected Gitea version, eg. v1.21.0-dev-1-g1234567
|
||||||
|
- run: git fetch --unshallow --quiet --tags --force
|
||||||
|
- uses: docker/setup-qemu-action@v3
|
||||||
|
- uses: docker/setup-buildx-action@v3
|
||||||
|
- uses: docker/metadata-action@v5
|
||||||
|
id: meta
|
||||||
|
with:
|
||||||
|
images: gitea/gitea
|
||||||
|
# each tag below will have the suffix of -rootless
|
||||||
|
flavor: |
|
||||||
|
suffix=-rootless,onlatest=true
|
||||||
|
# this will generate tags in the following format (with -rootless suffix added):
|
||||||
|
# latest
|
||||||
|
# 1
|
||||||
|
# 1.2
|
||||||
|
# 1.2.3
|
||||||
|
tags: |
|
||||||
|
type=semver,pattern={{major}}
|
||||||
|
type=semver,pattern={{major}}.{{minor}}
|
||||||
|
type=semver,pattern={{version}}
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
- name: build rootless docker image
|
||||||
|
uses: docker/build-push-action@v5
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
push: true
|
||||||
|
file: Dockerfile.rootless
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
|
@ -11,10 +11,11 @@ _test
|
||||||
.idea
|
.idea
|
||||||
# Goland's output filename can not be set manually
|
# Goland's output filename can not be set manually
|
||||||
/go_build_*
|
/go_build_*
|
||||||
|
/gitea_*
|
||||||
|
|
||||||
# MS VSCode
|
# MS VSCode
|
||||||
.vscode
|
.vscode
|
||||||
__debug_bin
|
__debug_bin*
|
||||||
|
|
||||||
*.cgo1.go
|
*.cgo1.go
|
||||||
*.cgo2.c
|
*.cgo2.c
|
||||||
|
@ -57,7 +58,7 @@ cpu.out
|
||||||
/data
|
/data
|
||||||
/indexers
|
/indexers
|
||||||
/log
|
/log
|
||||||
/public/img/avatar
|
/public/assets/img/avatar
|
||||||
/tests/integration/gitea-integration-*
|
/tests/integration/gitea-integration-*
|
||||||
/tests/integration/indexers-*
|
/tests/integration/indexers-*
|
||||||
/tests/e2e/gitea-e2e-*
|
/tests/e2e/gitea-e2e-*
|
||||||
|
@ -75,7 +76,7 @@ cpu.out
|
||||||
/public/assets/js
|
/public/assets/js
|
||||||
/public/assets/css
|
/public/assets/css
|
||||||
/public/assets/fonts
|
/public/assets/fonts
|
||||||
/public/assets/img/webpack
|
/public/assets/licenses.txt
|
||||||
/vendor
|
/vendor
|
||||||
/web_src/fomantic/node_modules
|
/web_src/fomantic/node_modules
|
||||||
/web_src/fomantic/build/*
|
/web_src/fomantic/build/*
|
||||||
|
@ -94,6 +95,7 @@ cpu.out
|
||||||
/.go-licenses
|
/.go-licenses
|
||||||
|
|
||||||
# Snapcraft
|
# Snapcraft
|
||||||
|
/gitea_a*.txt
|
||||||
snap/.snapcraft/
|
snap/.snapcraft/
|
||||||
parts/
|
parts/
|
||||||
stage/
|
stage/
|
||||||
|
|
17
.gitpod.yml
17
.gitpod.yml
|
@ -10,10 +10,19 @@ tasks:
|
||||||
- name: Run backend
|
- name: Run backend
|
||||||
command: |
|
command: |
|
||||||
gp sync-await setup
|
gp sync-await setup
|
||||||
if [ ! -f custom/conf/app.ini ]
|
|
||||||
then
|
# Get the URL and extract the domain
|
||||||
|
url=$(gp url 3000)
|
||||||
|
domain=$(echo $url | awk -F[/:] '{print $4}')
|
||||||
|
|
||||||
|
if [ -f custom/conf/app.ini ]; then
|
||||||
|
sed -i "s|^ROOT_URL =.*|ROOT_URL = ${url}/|" custom/conf/app.ini
|
||||||
|
sed -i "s|^DOMAIN =.*|DOMAIN = ${domain}|" custom/conf/app.ini
|
||||||
|
sed -i "s|^SSH_DOMAIN =.*|SSH_DOMAIN = ${domain}|" custom/conf/app.ini
|
||||||
|
sed -i "s|^NO_REPLY_ADDRESS =.*|SSH_DOMAIN = noreply.${domain}|" custom/conf/app.ini
|
||||||
|
else
|
||||||
mkdir -p custom/conf/
|
mkdir -p custom/conf/
|
||||||
echo -e "[server]\nROOT_URL=$(gp url 3000)/" > custom/conf/app.ini
|
echo -e "[server]\nROOT_URL = ${url}/" > custom/conf/app.ini
|
||||||
echo -e "\n[database]\nDB_TYPE = sqlite3\nPATH = $GITPOD_REPO_ROOT/data/gitea.db" >> custom/conf/app.ini
|
echo -e "\n[database]\nDB_TYPE = sqlite3\nPATH = $GITPOD_REPO_ROOT/data/gitea.db" >> custom/conf/app.ini
|
||||||
fi
|
fi
|
||||||
export TAGS="sqlite sqlite_unlock_notify"
|
export TAGS="sqlite sqlite_unlock_notify"
|
||||||
|
@ -33,7 +42,7 @@ vscode:
|
||||||
- DavidAnson.vscode-markdownlint
|
- DavidAnson.vscode-markdownlint
|
||||||
- Vue.volar
|
- Vue.volar
|
||||||
- ms-azuretools.vscode-docker
|
- ms-azuretools.vscode-docker
|
||||||
- zixuanchen.vitest-explorer
|
- vitest.explorer
|
||||||
- qwtel.sqlite-viewer
|
- qwtel.sqlite-viewer
|
||||||
- GitHub.vscode-pull-request-github
|
- GitHub.vscode-pull-request-github
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,6 @@ linters:
|
||||||
fast: false
|
fast: false
|
||||||
|
|
||||||
run:
|
run:
|
||||||
go: "1.21"
|
|
||||||
timeout: 10m
|
timeout: 10m
|
||||||
skip-dirs:
|
skip-dirs:
|
||||||
- node_modules
|
- node_modules
|
||||||
|
@ -75,7 +74,6 @@ linters-settings:
|
||||||
- name: modifies-value-receiver
|
- name: modifies-value-receiver
|
||||||
gofumpt:
|
gofumpt:
|
||||||
extra-rules: true
|
extra-rules: true
|
||||||
lang-version: "1.21"
|
|
||||||
depguard:
|
depguard:
|
||||||
rules:
|
rules:
|
||||||
main:
|
main:
|
||||||
|
|
4
.ignore
4
.ignore
|
@ -4,6 +4,8 @@
|
||||||
/modules/options/bindata.go
|
/modules/options/bindata.go
|
||||||
/modules/public/bindata.go
|
/modules/public/bindata.go
|
||||||
/modules/templates/bindata.go
|
/modules/templates/bindata.go
|
||||||
/vendor
|
/options/gitignore
|
||||||
|
/options/license
|
||||||
/public/assets
|
/public/assets
|
||||||
|
/vendor
|
||||||
node_modules
|
node_modules
|
||||||
|
|
|
@ -1,18 +1,15 @@
|
||||||
commands-show-output: false
|
commands-show-output: false
|
||||||
fenced-code-language: false
|
fenced-code-language: false
|
||||||
first-line-h1: false
|
first-line-h1: false
|
||||||
header-increment: false
|
heading-increment: false
|
||||||
line-length: {code_blocks: false, tables: false, stern: true, line_length: -1}
|
line-length: {code_blocks: false, tables: false, stern: true, line_length: -1}
|
||||||
no-alt-text: false
|
no-alt-text: false
|
||||||
no-bare-urls: false
|
no-bare-urls: false
|
||||||
no-blanks-blockquote: false
|
no-emphasis-as-heading: false
|
||||||
no-duplicate-header: {allow_different_nesting: true}
|
|
||||||
no-emphasis-as-header: false
|
|
||||||
no-empty-links: false
|
no-empty-links: false
|
||||||
no-hard-tabs: {code_blocks: false}
|
no-hard-tabs: {code_blocks: false}
|
||||||
no-inline-html: false
|
no-inline-html: false
|
||||||
no-space-in-code: false
|
no-space-in-code: false
|
||||||
no-space-in-emphasis: false
|
no-space-in-emphasis: false
|
||||||
no-trailing-punctuation: false
|
|
||||||
no-trailing-spaces: {br_spaces: 0}
|
no-trailing-spaces: {br_spaces: 0}
|
||||||
single-h1: false
|
single-h1: false
|
||||||
|
|
|
@ -1,221 +0,0 @@
|
||||||
plugins:
|
|
||||||
- stylelint-declaration-strict-value
|
|
||||||
- stylelint-declaration-block-no-ignored-properties
|
|
||||||
- stylelint-stylistic
|
|
||||||
|
|
||||||
ignoreFiles:
|
|
||||||
- "**/*.go"
|
|
||||||
|
|
||||||
overrides:
|
|
||||||
- files: ["**/chroma/*", "**/codemirror/*", "**/standalone/*", "**/console.css", "font_i18n.css"]
|
|
||||||
rules:
|
|
||||||
scale-unlimited/declaration-strict-value: null
|
|
||||||
- files: ["**/chroma/*", "**/codemirror/*"]
|
|
||||||
rules:
|
|
||||||
block-no-empty: null
|
|
||||||
- files: ["**/*.vue"]
|
|
||||||
customSyntax: postcss-html
|
|
||||||
|
|
||||||
rules:
|
|
||||||
alpha-value-notation: null
|
|
||||||
annotation-no-unknown: true
|
|
||||||
at-rule-allowed-list: null
|
|
||||||
at-rule-disallowed-list: null
|
|
||||||
at-rule-empty-line-before: null
|
|
||||||
at-rule-no-unknown: true
|
|
||||||
at-rule-no-vendor-prefix: true
|
|
||||||
at-rule-property-required-list: null
|
|
||||||
block-no-empty: true
|
|
||||||
color-function-notation: null
|
|
||||||
color-hex-alpha: null
|
|
||||||
color-hex-length: null
|
|
||||||
color-named: null
|
|
||||||
color-no-hex: null
|
|
||||||
color-no-invalid-hex: true
|
|
||||||
comment-empty-line-before: null
|
|
||||||
comment-no-empty: true
|
|
||||||
comment-pattern: null
|
|
||||||
comment-whitespace-inside: null
|
|
||||||
comment-word-disallowed-list: null
|
|
||||||
custom-media-pattern: null
|
|
||||||
custom-property-empty-line-before: null
|
|
||||||
custom-property-no-missing-var-function: true
|
|
||||||
custom-property-pattern: null
|
|
||||||
declaration-block-no-duplicate-custom-properties: true
|
|
||||||
declaration-block-no-duplicate-properties: [true, {ignore: [consecutive-duplicates-with-different-values]}]
|
|
||||||
declaration-block-no-redundant-longhand-properties: null
|
|
||||||
declaration-block-no-shorthand-property-overrides: null
|
|
||||||
declaration-block-single-line-max-declarations: null
|
|
||||||
declaration-empty-line-before: null
|
|
||||||
declaration-no-important: null
|
|
||||||
declaration-property-max-values: null
|
|
||||||
declaration-property-unit-allowed-list: null
|
|
||||||
declaration-property-unit-disallowed-list: {line-height: [em]}
|
|
||||||
declaration-property-value-allowed-list: null
|
|
||||||
declaration-property-value-disallowed-list: null
|
|
||||||
declaration-property-value-no-unknown: true
|
|
||||||
font-family-name-quotes: always-where-recommended
|
|
||||||
font-family-no-duplicate-names: true
|
|
||||||
font-family-no-missing-generic-family-keyword: true
|
|
||||||
font-weight-notation: null
|
|
||||||
function-allowed-list: null
|
|
||||||
function-calc-no-unspaced-operator: true
|
|
||||||
function-disallowed-list: null
|
|
||||||
function-linear-gradient-no-nonstandard-direction: true
|
|
||||||
function-name-case: lower
|
|
||||||
function-no-unknown: null
|
|
||||||
function-url-no-scheme-relative: null
|
|
||||||
function-url-quotes: always
|
|
||||||
function-url-scheme-allowed-list: null
|
|
||||||
function-url-scheme-disallowed-list: null
|
|
||||||
hue-degree-notation: null
|
|
||||||
import-notation: string
|
|
||||||
keyframe-block-no-duplicate-selectors: true
|
|
||||||
keyframe-declaration-no-important: true
|
|
||||||
keyframe-selector-notation: null
|
|
||||||
keyframes-name-pattern: null
|
|
||||||
length-zero-no-unit: true
|
|
||||||
max-nesting-depth: null
|
|
||||||
media-feature-name-allowed-list: null
|
|
||||||
media-feature-name-disallowed-list: null
|
|
||||||
media-feature-name-no-unknown: true
|
|
||||||
media-feature-name-no-vendor-prefix: true
|
|
||||||
media-feature-name-unit-allowed-list: null
|
|
||||||
media-feature-name-value-allowed-list: null
|
|
||||||
media-feature-name-value-no-unknown: true
|
|
||||||
media-feature-range-notation: null
|
|
||||||
media-query-no-invalid: true
|
|
||||||
named-grid-areas-no-invalid: true
|
|
||||||
no-descending-specificity: null
|
|
||||||
no-duplicate-at-import-rules: true
|
|
||||||
no-duplicate-selectors: true
|
|
||||||
no-empty-source: true
|
|
||||||
no-invalid-double-slash-comments: true
|
|
||||||
no-invalid-position-at-import-rule: null
|
|
||||||
no-irregular-whitespace: true
|
|
||||||
no-unknown-animations: null
|
|
||||||
no-unknown-custom-properties: null
|
|
||||||
number-max-precision: null
|
|
||||||
plugin/declaration-block-no-ignored-properties: true
|
|
||||||
property-allowed-list: null
|
|
||||||
property-disallowed-list: null
|
|
||||||
property-no-unknown: true
|
|
||||||
property-no-vendor-prefix: null
|
|
||||||
rule-empty-line-before: null
|
|
||||||
rule-selector-property-disallowed-list: null
|
|
||||||
scale-unlimited/declaration-strict-value: [[color, background-color, border-color, font-weight], {ignoreValues: /^(inherit|transparent|unset|initial|currentcolor|none)$/, ignoreFunctions: false, disableFix: true}]
|
|
||||||
selector-attribute-name-disallowed-list: null
|
|
||||||
selector-attribute-operator-allowed-list: null
|
|
||||||
selector-attribute-operator-disallowed-list: null
|
|
||||||
selector-attribute-quotes: always
|
|
||||||
selector-class-pattern: null
|
|
||||||
selector-combinator-allowed-list: null
|
|
||||||
selector-combinator-disallowed-list: null
|
|
||||||
selector-disallowed-list: null
|
|
||||||
selector-id-pattern: null
|
|
||||||
selector-max-attribute: null
|
|
||||||
selector-max-class: null
|
|
||||||
selector-max-combinators: null
|
|
||||||
selector-max-compound-selectors: null
|
|
||||||
selector-max-id: null
|
|
||||||
selector-max-pseudo-class: null
|
|
||||||
selector-max-specificity: null
|
|
||||||
selector-max-type: null
|
|
||||||
selector-max-universal: null
|
|
||||||
selector-nested-pattern: null
|
|
||||||
selector-no-qualifying-type: null
|
|
||||||
selector-no-vendor-prefix: true
|
|
||||||
selector-not-notation: null
|
|
||||||
selector-pseudo-class-allowed-list: null
|
|
||||||
selector-pseudo-class-disallowed-list: null
|
|
||||||
selector-pseudo-class-no-unknown: true
|
|
||||||
selector-pseudo-element-allowed-list: null
|
|
||||||
selector-pseudo-element-colon-notation: double
|
|
||||||
selector-pseudo-element-disallowed-list: null
|
|
||||||
selector-pseudo-element-no-unknown: true
|
|
||||||
selector-type-case: lower
|
|
||||||
selector-type-no-unknown: [true, {ignore: [custom-elements]}]
|
|
||||||
shorthand-property-no-redundant-values: true
|
|
||||||
string-no-newline: true
|
|
||||||
stylistic/at-rule-name-case: null
|
|
||||||
stylistic/at-rule-name-newline-after: null
|
|
||||||
stylistic/at-rule-name-space-after: null
|
|
||||||
stylistic/at-rule-semicolon-newline-after: null
|
|
||||||
stylistic/at-rule-semicolon-space-before: null
|
|
||||||
stylistic/block-closing-brace-empty-line-before: null
|
|
||||||
stylistic/block-closing-brace-newline-after: null
|
|
||||||
stylistic/block-closing-brace-newline-before: null
|
|
||||||
stylistic/block-closing-brace-space-after: null
|
|
||||||
stylistic/block-closing-brace-space-before: null
|
|
||||||
stylistic/block-opening-brace-newline-after: null
|
|
||||||
stylistic/block-opening-brace-newline-before: null
|
|
||||||
stylistic/block-opening-brace-space-after: null
|
|
||||||
stylistic/block-opening-brace-space-before: null
|
|
||||||
stylistic/color-hex-case: lower
|
|
||||||
stylistic/declaration-bang-space-after: never
|
|
||||||
stylistic/declaration-bang-space-before: null
|
|
||||||
stylistic/declaration-block-semicolon-newline-after: null
|
|
||||||
stylistic/declaration-block-semicolon-newline-before: null
|
|
||||||
stylistic/declaration-block-semicolon-space-after: null
|
|
||||||
stylistic/declaration-block-semicolon-space-before: never
|
|
||||||
stylistic/declaration-block-trailing-semicolon: null
|
|
||||||
stylistic/declaration-colon-newline-after: null
|
|
||||||
stylistic/declaration-colon-space-after: null
|
|
||||||
stylistic/declaration-colon-space-before: never
|
|
||||||
stylistic/function-comma-newline-after: null
|
|
||||||
stylistic/function-comma-newline-before: null
|
|
||||||
stylistic/function-comma-space-after: null
|
|
||||||
stylistic/function-comma-space-before: null
|
|
||||||
stylistic/function-max-empty-lines: 0
|
|
||||||
stylistic/function-parentheses-newline-inside: never-multi-line
|
|
||||||
stylistic/function-parentheses-space-inside: null
|
|
||||||
stylistic/function-whitespace-after: null
|
|
||||||
stylistic/indentation: 2
|
|
||||||
stylistic/linebreaks: null
|
|
||||||
stylistic/max-empty-lines: 1
|
|
||||||
stylistic/max-line-length: null
|
|
||||||
stylistic/media-feature-colon-space-after: null
|
|
||||||
stylistic/media-feature-colon-space-before: never
|
|
||||||
stylistic/media-feature-name-case: null
|
|
||||||
stylistic/media-feature-parentheses-space-inside: null
|
|
||||||
stylistic/media-feature-range-operator-space-after: always
|
|
||||||
stylistic/media-feature-range-operator-space-before: always
|
|
||||||
stylistic/media-query-list-comma-newline-after: null
|
|
||||||
stylistic/media-query-list-comma-newline-before: null
|
|
||||||
stylistic/media-query-list-comma-space-after: null
|
|
||||||
stylistic/media-query-list-comma-space-before: null
|
|
||||||
stylistic/no-empty-first-line: null
|
|
||||||
stylistic/no-eol-whitespace: true
|
|
||||||
stylistic/no-extra-semicolons: true
|
|
||||||
stylistic/no-missing-end-of-source-newline: null
|
|
||||||
stylistic/number-leading-zero: null
|
|
||||||
stylistic/number-no-trailing-zeros: null
|
|
||||||
stylistic/property-case: lower
|
|
||||||
stylistic/selector-attribute-brackets-space-inside: null
|
|
||||||
stylistic/selector-attribute-operator-space-after: null
|
|
||||||
stylistic/selector-attribute-operator-space-before: null
|
|
||||||
stylistic/selector-combinator-space-after: null
|
|
||||||
stylistic/selector-combinator-space-before: null
|
|
||||||
stylistic/selector-descendant-combinator-no-non-space: null
|
|
||||||
stylistic/selector-list-comma-newline-after: null
|
|
||||||
stylistic/selector-list-comma-newline-before: null
|
|
||||||
stylistic/selector-list-comma-space-after: always-single-line
|
|
||||||
stylistic/selector-list-comma-space-before: never-single-line
|
|
||||||
stylistic/selector-max-empty-lines: 0
|
|
||||||
stylistic/selector-pseudo-class-case: lower
|
|
||||||
stylistic/selector-pseudo-class-parentheses-space-inside: never
|
|
||||||
stylistic/selector-pseudo-element-case: lower
|
|
||||||
stylistic/string-quotes: double
|
|
||||||
stylistic/unicode-bom: null
|
|
||||||
stylistic/unit-case: lower
|
|
||||||
stylistic/value-list-comma-newline-after: null
|
|
||||||
stylistic/value-list-comma-newline-before: null
|
|
||||||
stylistic/value-list-comma-space-after: null
|
|
||||||
stylistic/value-list-comma-space-before: null
|
|
||||||
stylistic/value-list-max-empty-lines: 0
|
|
||||||
time-min-milliseconds: null
|
|
||||||
unit-allowed-list: null
|
|
||||||
unit-disallowed-list: null
|
|
||||||
unit-no-unknown: true
|
|
||||||
value-keyword-case: null
|
|
||||||
value-no-vendor-prefix: [true, {ignoreValues: [box, inline-box]}]
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
extends: default
|
||||||
|
|
||||||
|
rules:
|
||||||
|
braces:
|
||||||
|
min-spaces-inside: 0
|
||||||
|
max-spaces-inside: 1
|
||||||
|
min-spaces-inside-empty: 0
|
||||||
|
max-spaces-inside-empty: 0
|
||||||
|
|
||||||
|
brackets:
|
||||||
|
min-spaces-inside: 0
|
||||||
|
max-spaces-inside: 1
|
||||||
|
min-spaces-inside-empty: 0
|
||||||
|
max-spaces-inside-empty: 0
|
||||||
|
|
||||||
|
comments:
|
||||||
|
require-starting-space: true
|
||||||
|
ignore-shebangs: true
|
||||||
|
min-spaces-from-content: 1
|
||||||
|
|
||||||
|
comments-indentation:
|
||||||
|
level: error
|
||||||
|
|
||||||
|
document-start:
|
||||||
|
level: error
|
||||||
|
present: false
|
||||||
|
|
||||||
|
document-end:
|
||||||
|
present: false
|
||||||
|
|
||||||
|
empty-lines:
|
||||||
|
max: 1
|
||||||
|
|
||||||
|
indentation:
|
||||||
|
spaces: 2
|
||||||
|
|
||||||
|
line-length: disable
|
||||||
|
|
||||||
|
truthy:
|
||||||
|
allowed-values: ["true", "false", "on", "off"]
|
||||||
|
|
||||||
|
ignore: |
|
||||||
|
.venv
|
||||||
|
node_modules
|
|
@ -42,13 +42,13 @@ GARGS = "--no-print-directory"
|
||||||
|
|
||||||
# The GNU convention is to use the lowercased `prefix` variable/macro to
|
# The GNU convention is to use the lowercased `prefix` variable/macro to
|
||||||
# specify the installation directory. Humor them.
|
# specify the installation directory. Humor them.
|
||||||
GPREFIX = ""
|
GPREFIX =
|
||||||
.if defined(PREFIX) && ! defined(prefix)
|
.if defined(PREFIX) && ! defined(prefix)
|
||||||
GPREFIX = 'prefix = "$(PREFIX)"'
|
GPREFIX = 'prefix = "$(PREFIX)"'
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
.BEGIN: .SILENT
|
.BEGIN: .SILENT
|
||||||
which $(GMAKE) || printf "Error: GNU Make is required!\n\n" 1>&2 && false
|
which $(GMAKE) || (printf "Error: GNU Make is required!\n\n" 1>&2 && false)
|
||||||
|
|
||||||
.PHONY: FRC
|
.PHONY: FRC
|
||||||
$(.TARGETS): FRC
|
$(.TARGETS): FRC
|
||||||
|
|
738
CHANGELOG.md
738
CHANGELOG.md
|
@ -4,6 +4,743 @@ This changelog goes through all the changes that have been made in each release
|
||||||
without substantial changes to our git log; to see the highlights of what has
|
without substantial changes to our git log; to see the highlights of what has
|
||||||
been added to each release, please refer to the [blog](https://blog.gitea.com).
|
been added to each release, please refer to the [blog](https://blog.gitea.com).
|
||||||
|
|
||||||
|
## [1.21.6](https://github.com/go-gitea/gitea/releases/tag/v1.21.6) - 2024-02-22
|
||||||
|
|
||||||
|
* SECURITY
|
||||||
|
* Fix XSS vulnerabilities (#29336)
|
||||||
|
* Use general token signing secret (#29205) (#29325)
|
||||||
|
* ENHANCEMENTS
|
||||||
|
* Refactor git version functions and check compatibility (#29155) (#29157)
|
||||||
|
* Improve user experience for outdated comments (#29050) (#29086)
|
||||||
|
* Hide code links on release page if user cannot read code (#29064) (#29066)
|
||||||
|
* Wrap contained tags and branches again (#29021) (#29026)
|
||||||
|
* Fix incorrect button CSS usages (#29015) (#29023)
|
||||||
|
* Strip trailing newline in markdown code copy (#29019) (#29022)
|
||||||
|
* Implement some action notifier functions (#29173) (#29308)
|
||||||
|
* Load outdated comments when (un)resolving conversation on PR timeline (#29203) (#29221)
|
||||||
|
* BUGFIXES
|
||||||
|
* Refactor issue template parsing and fix API endpoint (#29069) (#29140)
|
||||||
|
* Fix swift packages not resolving (#29095) (#29102)
|
||||||
|
* Remove SSH workaround (#27893) (#29332)
|
||||||
|
* Only log error when tag sync fails (#29295) (#29327)
|
||||||
|
* Fix SSPI user creation (#28948) (#29323)
|
||||||
|
* Improve the `issue_comment` workflow trigger event (#29277) (#29322)
|
||||||
|
* Discard unread data of `git cat-file` (#29297) (#29310)
|
||||||
|
* Fix error display when merging PRs (#29288) (#29309)
|
||||||
|
* Prevent double use of `git cat-file` session. (#29298) (#29301)
|
||||||
|
* Fix missing link on outgoing new release notifications (#29079) (#29300)
|
||||||
|
* Fix debian InRelease Acquire-By-Hash newline (#29204) (#29299)
|
||||||
|
* Always write proc-receive hook for all git versions (#29287) (#29291)
|
||||||
|
* Do not show delete button when time tracker is disabled (#29257) (#29279)
|
||||||
|
* Workaround to clean up old reviews on creating a new one (#28554) (#29264)
|
||||||
|
* Fix bug when the linked account was disactived and list the linked accounts (#29263)
|
||||||
|
* Do not use lower tag names to find releases/tags (#29261) (#29262)
|
||||||
|
* Fix missed edit issues event for actions (#29237) (#29251)
|
||||||
|
* Only delete scheduled workflows when needed (#29091) (#29235)
|
||||||
|
* Make submit event code work with both jQuery event and native event (#29223) (#29234)
|
||||||
|
* Fix push to create with capitalize repo name (#29090) (#29206)
|
||||||
|
* Use ghost user if user was not found (#29161) (#29169)
|
||||||
|
* Dont load Review if Comment is CommentTypeReviewRequest (#28551) (#29160)
|
||||||
|
* Refactor parseSignatureFromCommitLine (#29054) (#29108)
|
||||||
|
* Avoid showing unnecessary JS errors when there are elements with different origin on the page (#29081) (#29089)
|
||||||
|
* Fix gitea-origin-url with default ports (#29085) (#29088)
|
||||||
|
* Fix orgmode link resolving (#29024) (#29076)
|
||||||
|
* Fix Elasticsearh Request Entity Too Large #28117 (#29062) (#29075)
|
||||||
|
* Do not render empty comments (#29039) (#29049)
|
||||||
|
* Avoid sending update/delete release notice when it is draft (#29008) (#29025)
|
||||||
|
* Fix gitea-action user avatar broken on edited menu (#29190) (#29307)
|
||||||
|
* Disallow merge when required checked are missing (#29143) (#29268)
|
||||||
|
* Fix incorrect link to swift doc and swift package-registry login command (#29096) (#29103)
|
||||||
|
* Convert visibility to number (#29226) (#29244)
|
||||||
|
* DOCS
|
||||||
|
* Remove outdated docs from some languages (#27530) (#29208)
|
||||||
|
* Fix typos in the documentation (#29048) (#29056)
|
||||||
|
* Explained where create issue/PR template (#29035)
|
||||||
|
|
||||||
|
## [1.21.5](https://github.com/go-gitea/gitea/releases/tag/v1.21.5) - 2024-01-31
|
||||||
|
|
||||||
|
* SECURITY
|
||||||
|
* Prevent anonymous container access if `RequireSignInView` is enabled (#28877) (#28882)
|
||||||
|
* Update go dependencies and fix go-git (#28893) (#28934)
|
||||||
|
* BUGFIXES
|
||||||
|
* Revert "Speed up loading the dashboard on mysql/mariadb (#28546)" (#29006) (#29007)
|
||||||
|
* Fix an actions schedule bug (#28942) (#28999)
|
||||||
|
* Fix update enable_prune even if mirror_interval is not provided (#28905) (#28929)
|
||||||
|
* Fix uploaded artifacts should be overwritten (#28726) backport v1.21 (#28832)
|
||||||
|
* Preserve BOM in web editor (#28935) (#28959)
|
||||||
|
* Strip `/` from relative links (#28932) (#28952)
|
||||||
|
* Don't remove all mirror repository's releases when mirroring (#28817) (#28939)
|
||||||
|
* Implement `MigrateRepository` for the actions notifier (#28920) (#28923)
|
||||||
|
* Respect branch info for relative links (#28909) (#28922)
|
||||||
|
* Don't reload timeline page when (un)resolving or replying conversation (#28654) (#28917)
|
||||||
|
* Only migrate the first 255 chars of a Github issue title (#28902) (#28912)
|
||||||
|
* Fix sort bug on repository issues list (#28897) (#28901)
|
||||||
|
* Fix `DeleteCollaboration` transaction behaviour (#28886) (#28889)
|
||||||
|
* Fix schedule not trigger bug because matching full ref name with short ref name (#28874) (#28888)
|
||||||
|
* Fix migrate storage bug (#28830) (#28867)
|
||||||
|
* Fix archive creating LFS hooks and breaking pull requests (#28848) (#28851)
|
||||||
|
* Fix reverting a merge commit failing (#28794) (#28825)
|
||||||
|
* Upgrade xorm to v1.3.7 to fix a resource leak problem caused by Iterate (#28891) (#28895)
|
||||||
|
* Fix incorrect PostgreSQL connection string for Unix sockets (#28865) (#28870)
|
||||||
|
* ENHANCEMENTS
|
||||||
|
* Make loading animation less aggressive (#28955) (#28956)
|
||||||
|
* Avoid duplicate JS error messages on UI (#28873) (#28881)
|
||||||
|
* Bump `@github/relative-time-element` to 4.3.1 (#28819) (#28826)
|
||||||
|
* MISC
|
||||||
|
* Warn that `DISABLE_QUERY_AUTH_TOKEN` is false only if it's explicitly defined (#28783) (#28868)
|
||||||
|
* Remove duplicated checkinit on git module (#28824) (#28831)
|
||||||
|
|
||||||
|
## [1.21.4](https://github.com/go-gitea/gitea/releases/tag/v1.21.4) - 2024-01-16
|
||||||
|
|
||||||
|
* SECURITY
|
||||||
|
* Update github.com/cloudflare/circl (#28789) (#28790)
|
||||||
|
* Require token for GET subscription endpoint (#28765) (#28768)
|
||||||
|
* BUGFIXES
|
||||||
|
* Use refname:strip-2 instead of refname:short when syncing tags (#28797) (#28811)
|
||||||
|
* Fix links in issue card (#28806) (#28807)
|
||||||
|
* Fix nil pointer panic when exec some gitea cli command (#28791) (#28795)
|
||||||
|
* Require token for GET subscription endpoint (#28765) (#28778)
|
||||||
|
* Fix button size in "attached header right" (#28770) (#28774)
|
||||||
|
* Fix `convert.ToTeams` on empty input (#28426) (#28767)
|
||||||
|
* Hide code related setting options in repository when code unit is disabled (#28631) (#28749)
|
||||||
|
* Fix incorrect URL for "Reference in New Issue" (#28716) (#28723)
|
||||||
|
* Fix panic when parsing empty pgsql host (#28708) (#28709)
|
||||||
|
* Upgrade xorm to new version which supported update join for all supported databases (#28590) (#28668)
|
||||||
|
* Fix alpine package files are not rebuilt (#28638) (#28665)
|
||||||
|
* Avoid cycle-redirecting user/login page (#28636) (#28658)
|
||||||
|
* Fix empty ref for cron workflow runs (#28640) (#28647)
|
||||||
|
* Remove unnecessary syncbranchToDB with tests (#28624) (#28629)
|
||||||
|
* Use known issue IID to generate new PR index number when migrating from GitLab (#28616) (#28618)
|
||||||
|
* Fix flex container width (#28603) (#28605)
|
||||||
|
* Fix the scroll behavior for emoji/mention list (#28597) (#28601)
|
||||||
|
* Fix wrong due date rendering in issue list page (#28588) (#28591)
|
||||||
|
* Fix `status_check_contexts` matching bug (#28582) (#28589)
|
||||||
|
* Fix 500 error of searching commits (#28576) (#28579)
|
||||||
|
* Use information from previous blame parts (#28572) (#28577)
|
||||||
|
* Update mermaid for 1.21 (#28571)
|
||||||
|
* Fix 405 method not allowed CORS / OIDC (#28583) (#28586) (#28587) (#28611)
|
||||||
|
* Fix `GetCommitStatuses` (#28787) (#28804)
|
||||||
|
* Forbid removing the last admin user (#28337) (#28793)
|
||||||
|
* Fix schedule tasks bugs (#28691) (#28780)
|
||||||
|
* Fix issue dependencies (#27736) (#28776)
|
||||||
|
* Fix system webhooks API bug (#28531) (#28666)
|
||||||
|
* Fix when private user following user, private user will not be counted in his own view (#28037) (#28792)
|
||||||
|
* Render code block in activity tab (#28816) (#28818)
|
||||||
|
* ENHANCEMENTS
|
||||||
|
* Rework markup link rendering (#26745) (#28803)
|
||||||
|
* Modernize merge button (#28140) (#28786)
|
||||||
|
* Speed up loading the dashboard on mysql/mariadb (#28546) (#28784)
|
||||||
|
* Assign pull request to project during creation (#28227) (#28775)
|
||||||
|
* Show description as tooltip instead of title for labels (#28754) (#28766)
|
||||||
|
* Make template `DateTime` show proper tooltip (#28677) (#28683)
|
||||||
|
* Switch destination directory for apt signing keys (#28639) (#28642)
|
||||||
|
* Include heap pprof in diagnosis report to help debugging memory leaks (#28596) (#28599)
|
||||||
|
* DOCS
|
||||||
|
* Suggest to use Type=simple for systemd service (#28717) (#28722)
|
||||||
|
* Extend description for ARTIFACT_RETENTION_DAYS (#28626) (#28630)
|
||||||
|
* MISC
|
||||||
|
* Add -F to commit search to treat keywords as strings (#28744) (#28748)
|
||||||
|
* Add download attribute to release attachments (#28739) (#28740)
|
||||||
|
* Concatenate error in `checkIfPRContentChanged` (#28731) (#28737)
|
||||||
|
* Improve 1.21 document for Database Preparation (#28643) (#28644)
|
||||||
|
|
||||||
|
## [1.21.3](https://github.com/go-gitea/gitea/releases/tag/v1.21.3) - 2023-12-21
|
||||||
|
|
||||||
|
* SECURITY
|
||||||
|
* Update golang.org/x/crypto (#28519)
|
||||||
|
* API
|
||||||
|
* chore(api): support ignore password if login source type is LDAP for creating user API (#28491) (#28525)
|
||||||
|
* Add endpoint for not implemented Docker auth (#28457) (#28462)
|
||||||
|
* ENHANCEMENTS
|
||||||
|
* Add option to disable ambiguous unicode characters detection (#28454) (#28499)
|
||||||
|
* Refactor SSH clone URL generation code (#28421) (#28480)
|
||||||
|
* Polyfill SubmitEvent for PaleMoon (#28441) (#28478)
|
||||||
|
* BUGFIXES
|
||||||
|
* Fix the issue ref rendering for wiki (#28556) (#28559)
|
||||||
|
* Fix duplicate ID when deleting repo (#28520) (#28528)
|
||||||
|
* Only check online runner when detecting matching runners in workflows (#28286) (#28512)
|
||||||
|
* Initalize stroage for orphaned repository doctor (#28487) (#28490)
|
||||||
|
* Fix possible nil pointer access (#28428) (#28440)
|
||||||
|
* Don't show unnecessary citation JS error on UI (#28433) (#28437)
|
||||||
|
* DOCS
|
||||||
|
* Update actions document about comparsion as Github Actions (#28560) (#28564)
|
||||||
|
* Fix documents for "custom/public/assets/" (#28465) (#28467)
|
||||||
|
* MISC
|
||||||
|
* Fix inperformant query on retrifing review from database. (#28552) (#28562)
|
||||||
|
* Improve the prompt for "ssh-keygen sign" (#28509) (#28510)
|
||||||
|
* Update docs for DISABLE_QUERY_AUTH_TOKEN (#28485) (#28488)
|
||||||
|
* Fix Chinese translation of config cheat sheet[API] (#28472) (#28473)
|
||||||
|
* Retry SSH key verification with additional CRLF if it failed (#28392) (#28464)
|
||||||
|
|
||||||
|
## [1.21.2](https://github.com/go-gitea/gitea/releases/tag/v1.21.2) - 2023-12-12
|
||||||
|
|
||||||
|
* SECURITY
|
||||||
|
* Rebuild with recently released golang version
|
||||||
|
* Fix missing check (#28406) (#28411)
|
||||||
|
* Do some missing checks (#28423) (#28432)
|
||||||
|
* BUGFIXES
|
||||||
|
* Fix margin in server signed signature verification view (#28379) (#28381)
|
||||||
|
* Fix object does not exist error when checking citation file (#28314) (#28369)
|
||||||
|
* Use `filepath` instead of `path` to create SQLite3 database file (#28374) (#28378)
|
||||||
|
* Fix the runs will not be displayed bug when the main branch have no workflows but other branches have (#28359) (#28365)
|
||||||
|
* Handle repository.size column being NULL in migration v263 (#28336) (#28363)
|
||||||
|
* Convert git commit summary to valid UTF8. (#28356) (#28358)
|
||||||
|
* Fix migration panic due to an empty review comment diff (#28334) (#28362)
|
||||||
|
* Add `HEAD` support for rpm repo files (#28309) (#28360)
|
||||||
|
* Fix RPM/Debian signature key creation (#28352) (#28353)
|
||||||
|
* Keep profile tab when clicking on Language (#28320) (#28331)
|
||||||
|
* Fix missing issue search index update when changing status (#28325) (#28330)
|
||||||
|
* Fix wrong link in `protect_branch_name_pattern_desc` (#28313) (#28315)
|
||||||
|
* Read `previous` info from git blame (#28306) (#28310)
|
||||||
|
* Ignore "non-existing" errors when getDirectorySize calculates the size (#28276) (#28285)
|
||||||
|
* Use appSubUrl for OAuth2 callback URL tip (#28266) (#28275)
|
||||||
|
* Meilisearch: require all query terms to be matched (#28293) (#28296)
|
||||||
|
* Fix required error for token name (#28267) (#28284)
|
||||||
|
* Fix issue will be detected as pull request when checking `First-time contributor` (#28237) (#28271)
|
||||||
|
* Use full width for project boards (#28225) (#28245)
|
||||||
|
* Increase "version" when update the setting value to a same value as before (#28243) (#28244)
|
||||||
|
* Also sync DB branches on push if necessary (#28361) (#28403)
|
||||||
|
* Make gogit Repository.GetBranchNames consistent (#28348) (#28386)
|
||||||
|
* Recover from panic in cron task (#28409) (#28425)
|
||||||
|
* Deprecate query string auth tokens (#28390) (#28430)
|
||||||
|
* ENHANCEMENTS
|
||||||
|
* Improve doctor cli behavior (#28422) (#28424)
|
||||||
|
* Fix margin in server signed signature verification view (#28379) (#28381)
|
||||||
|
* Refactor template empty checks (#28351) (#28354)
|
||||||
|
* Read `previous` info from git blame (#28306) (#28310)
|
||||||
|
* Use full width for project boards (#28225) (#28245)
|
||||||
|
* Enable system users search via the API (#28013) (#28018)
|
||||||
|
|
||||||
|
## [1.21.1](https://github.com/go-gitea/gitea/releases/tag/v1.21.1) - 2023-11-26
|
||||||
|
|
||||||
|
* SECURITY
|
||||||
|
* Fix comment permissions (#28213) (#28216)
|
||||||
|
* BUGFIXES
|
||||||
|
* Fix delete-orphaned-repos (#28200) (#28202)
|
||||||
|
* Make CORS work for oauth2 handlers (#28184) (#28185)
|
||||||
|
* Fix missing buttons (#28179) (#28181)
|
||||||
|
* Fix no ActionTaskOutput table waring (#28149) (#28152)
|
||||||
|
* Fix empty action run title (#28113) (#28148)
|
||||||
|
* Use "is-loading" to avoid duplicate form submit for code comment (#28143) (#28147)
|
||||||
|
* Fix Matrix and MSTeams nil dereference (#28089) (#28105)
|
||||||
|
* Fix incorrect pgsql conn builder behavior (#28085) (#28098)
|
||||||
|
* Fix system config cache expiration timing (#28072) (#28090)
|
||||||
|
* Restricted users only see repos in orgs which their team was assigned to (#28025) (#28051)
|
||||||
|
* API
|
||||||
|
* Fix permissions for Token DELETE endpoint to match GET and POST (#27610) (#28099)
|
||||||
|
* ENHANCEMENTS
|
||||||
|
* Do not display search box when there's no packages yet (#28146) (#28159)
|
||||||
|
* Add missing `packages.cleanup.success` (#28129) (#28132)
|
||||||
|
* DOCS
|
||||||
|
* Docs: Replace deprecated IS_TLS_ENABLED mailer setting in email setup (#28205) (#28208)
|
||||||
|
* Fix the description about the default setting for action in quick start document (#28160) (#28168)
|
||||||
|
* Add guide page to actions when there's no workflows (#28145) (#28153)
|
||||||
|
* MISC
|
||||||
|
* Use full width for PR comparison (#28182) (#28186)
|
||||||
|
|
||||||
|
## [1.21.0](https://github.com/go-gitea/gitea/releases/tag/v1.21.0) - 2023-11-14
|
||||||
|
|
||||||
|
* BREAKING
|
||||||
|
* Restrict certificate type for builtin SSH server (#26789)
|
||||||
|
* Refactor to use urfave/cli/v2 (#25959)
|
||||||
|
* Move public asset files to the proper directory (#25907)
|
||||||
|
* Remove commit status running and warning to align GitHub (#25839) (partially reverted: Restore warning commit status (#27504) (#27529))
|
||||||
|
* Remove "CHARSET" config option for MySQL, always use "utf8mb4" (#25413)
|
||||||
|
* Set SSH_AUTHORIZED_KEYS_BACKUP to false (#25412)
|
||||||
|
* FEATURES
|
||||||
|
* User details page (#26713)
|
||||||
|
* Chore(actions): support cron schedule task (#26655)
|
||||||
|
* Support rebuilding issue indexer manually (#26546)
|
||||||
|
* Allow to archive labels (#26478)
|
||||||
|
* Add disable workflow feature (#26413)
|
||||||
|
* Support `.git-blame-ignore-revs` file (#26395)
|
||||||
|
* Pre-register OAuth2 applications for git credential helpers (#26291)
|
||||||
|
* Add `Retry` button when creating a mirror-repo fails (#26228)
|
||||||
|
* Artifacts retention and auto clean up (#26131)
|
||||||
|
* Serve pre-defined files in "public", add "security.txt", add CORS header for ".well-known" (#25974)
|
||||||
|
* Implement auto-cancellation of concurrent jobs if the event is push (#25716)
|
||||||
|
* Newly pushed branches hints on repository home page (#25715)
|
||||||
|
* Display branch commit status (#25608)
|
||||||
|
* Add direct serving of package content (#25543)
|
||||||
|
* Add commits dropdown in PR files view and allow commit by commit review (#25528)
|
||||||
|
* Allow package cleanup from admin page (#25307)
|
||||||
|
* Batch delete issue and improve tippy opts (#25253)
|
||||||
|
* Show branches and tags that contain a commit (#25180)
|
||||||
|
* Add actor and status dropdowns to run list (#25118)
|
||||||
|
* Allow Organisations to have a E-Mail (#25082)
|
||||||
|
* Add codeowners feature (#24910)
|
||||||
|
* Actions Artifacts support uploading multiple files and directories (#24874)
|
||||||
|
* Support configuration variables on Gitea Actions (#24724)
|
||||||
|
* Support downloading raw task logs (#24451)
|
||||||
|
* API
|
||||||
|
* Unify two factor check (#27915) (#27929)
|
||||||
|
* Fix package webhook (#27839) (#27855)
|
||||||
|
* Fix/upload artifact error windows (#27802) (#27840)
|
||||||
|
* Fix bad method call when deleting user secrets via API (#27829) (#27831)
|
||||||
|
* Do not force creation of _cargo-index repo on publish (#27266) (#27765)
|
||||||
|
* Delete repos of org when purge delete user (#27273) (#27728)
|
||||||
|
* Fix org team endpoint (#27721) (#27727)
|
||||||
|
* Api: GetPullRequestCommits: return file list (#27483) (#27539)
|
||||||
|
* Don't let API add 2 exclusive labels from same scope (#27433) (#27460)
|
||||||
|
* Redefine the meaning of column is_active to make Actions Registration Token generation easier (#27143) (#27304)
|
||||||
|
* Fix PushEvent NullPointerException jenkinsci/github-plugin (#27203) (#27251)
|
||||||
|
* Fix organization field being null in POST /orgs/{orgid}/teams (#27150) (#27163)
|
||||||
|
* Allow empty Conan files (#27092)
|
||||||
|
* Fix token endpoints ignore specified account (#27080)
|
||||||
|
* Reduce usage of `db.DefaultContext` (#27073) (#27083) (#27089) (#27103) (#27262) (#27265) (#27347) (#26076)
|
||||||
|
* Make SSPI auth mockable (#27036)
|
||||||
|
* Extract auth middleware from service (#27028)
|
||||||
|
* Add `RemoteAddress` to mirrors (#26952)
|
||||||
|
* Feat(API): add routes and functions for managing user's secrets (#26909)
|
||||||
|
* Feat(API): add secret deletion functionality for repository (#26808)
|
||||||
|
* Feat(API): add route and implementation for creating/updating repository secret (#26766)
|
||||||
|
* Add Upload URL to release API (#26663)
|
||||||
|
* Feat(API): update and delete secret for managing organization secrets (#26660)
|
||||||
|
* Feat: implement organization secret creation API (#26566)
|
||||||
|
* Add API route to list org secrets (#26485)
|
||||||
|
* Set commit id when ref used explicitly (#26447)
|
||||||
|
* PATCH branch-protection updates check list even when checks are disabled (#26351)
|
||||||
|
* Add file status for API "Get a single commit from a repository" (#16205) (#25831)
|
||||||
|
* Add API for changing Avatars (#25369)
|
||||||
|
* BUGFIXES
|
||||||
|
* Fix viewing wiki commit on empty repo (#28040) (#28044)
|
||||||
|
* Enable system users for comment.LoadPoster (#28014) (#28032)
|
||||||
|
* Fixed duplicate attachments on dump on windows (#28019) (#28031)
|
||||||
|
* Fix wrong xorm Delete usage(backport for 1.21) (#28002)
|
||||||
|
* Add word-break to repo description in home page (#27924) (#27957)
|
||||||
|
* Fix rendering assignee changed comments without assignee (#27927) (#27952)
|
||||||
|
* Add word break to release title (#27942) (#27947)
|
||||||
|
* Fix JS NPE when viewing specific range of PR commits (#27912) (#27923)
|
||||||
|
* Show correct commit sha when viewing single commit diff (#27916) (#27921)
|
||||||
|
* Fix 500 when deleting a dismissed review (#27903) (#27910)
|
||||||
|
* Fix DownloadFunc when migrating releases (#27887) (#27890)
|
||||||
|
* Fix http protocol auth (#27875) (#27876)
|
||||||
|
* Refactor postgres connection string building (#27723) (#27869)
|
||||||
|
* Close all hashed buffers (#27787) (#27790)
|
||||||
|
* Fix label render containing invalid HTML (#27752) (#27762)
|
||||||
|
* Fix duplicate project board when hitting `enter` key (#27746) (#27751)
|
||||||
|
* Fix `link-action` redirect network error (#27734) (#27749)
|
||||||
|
* Fix sticky diff header background (#27697) (#27712)
|
||||||
|
* Always delete existing scheduled action tasks (#27662) (#27688)
|
||||||
|
* Support allowed hosts for webhook to work with proxy (#27655) (#27675)
|
||||||
|
* Fix poster is not loaded in get default merge message (#27657) (#27666)
|
||||||
|
* Improve dropdown button alignment and fix hover bug (#27632) (#27637)
|
||||||
|
* Improve retrying index issues (#27554) (#27634)
|
||||||
|
* Fix 404 when deleting Docker package with an internal version (#27615) (#27630)
|
||||||
|
* Backport manually for a tmpl issue in v1.21 (#27612)
|
||||||
|
* Don't show Link to TOTP if not set up (#27585) (#27588)
|
||||||
|
* Fix data-race bug when accessing task.LastRun (#27584) (#27586)
|
||||||
|
* Fix attachment download bug (#27486) (#27571)
|
||||||
|
* Respect SSH.KeygenPath option when calculating ssh key fingerprints (#27536) (#27551)
|
||||||
|
* Improve dropdown's behavior when there is a search input in menu (#27526) (#27534)
|
||||||
|
* Fix panic in storageHandler (#27446) (#27479)
|
||||||
|
* When comparing with an non-exist repository, return 404 but 500 (#27437) (#27442)
|
||||||
|
* Fix pr template (#27436) (#27440)
|
||||||
|
* Fix git 2.11 error when checking IsEmpty (#27393) (#27397)
|
||||||
|
* Allow get release download files and lfs files with oauth2 token format (#26430) (#27379)
|
||||||
|
* Fix missing ctx for GetRepoLink in dashboard (#27372) (#27375)
|
||||||
|
* Absolute positioned checkboxes overlay floated elements (#26870) (#27366)
|
||||||
|
* Introduce fixes and more rigorous tests for 'Show on a map' feature (#26803) (#27365)
|
||||||
|
* Fix repo count in org action settings (#27245) (#27353)
|
||||||
|
* Add logs for data broken of comment review (#27326) (#27345)
|
||||||
|
* Fix the approval count of PR when there is no protection branch rule (#27272) (#27343)
|
||||||
|
* Fix Bug in Issue Config when only contact links are set (#26521) (#27334)
|
||||||
|
* Improve issue history dialog and make poster can delete their own history (#27323) (#27327)
|
||||||
|
* Fix orphan check for deleted branch (#27310) (#27321)
|
||||||
|
* Fix protected branch icon location (#26576) (#27317)
|
||||||
|
* Fix yaml test (#27297) (#27303)
|
||||||
|
* Fix some animation bugs (#27287) (#27294)
|
||||||
|
* Fix incorrect change from #27231 (#27275) (#27282)
|
||||||
|
* Add missing public user visibility in user details page (#27246) (#27250)
|
||||||
|
* Fix EOL handling in web editor (#27141) (#27234)
|
||||||
|
* Fix issues on action runners page (#27226) (#27233)
|
||||||
|
* Quote table `release` in sql queries (#27205) (#27218)
|
||||||
|
* Fix release URL in webhooks (#27182) (#27185)
|
||||||
|
* Fix review request number and add more tests (#27104) (#27168)
|
||||||
|
* Fix the variable regexp pattern on web page (#27161) (#27164)
|
||||||
|
* Fix: treat tab "overview" as "repositories" in user profiles without readme (#27124)
|
||||||
|
* Fix NPE when editing OAuth2 applications (#27078)
|
||||||
|
* Fix the incorrect route path in the user edit page. (#27007)
|
||||||
|
* Fix the secret regexp pattern on web page (#26910)
|
||||||
|
* Allow users with write permissions for issues to add attachments with API (#26837)
|
||||||
|
* Make "link-action" backend code respond correct JSON content (#26680)
|
||||||
|
* Use line-height: normal by default (#26635)
|
||||||
|
* Fix NPM packages name validation (#26595)
|
||||||
|
* Rewrite the DiffFileTreeItem and fix misalignment (#26565)
|
||||||
|
* Return empty when searching issues with no repos (#26545)
|
||||||
|
* Explain SearchOptions and fix ToSearchOptions (#26542)
|
||||||
|
* Add missing triggers to update issue indexer (#26539)
|
||||||
|
* Handle base64 decoding correctly to avoid panic (#26483)
|
||||||
|
* Avoiding accessing undefined mentionValues (#26461)
|
||||||
|
* Fix incorrect redirection in new issue using references (#26440)
|
||||||
|
* Fix the bug when getting files changed for `pull_request_target` event (#26320)
|
||||||
|
* Remove IsWarning in tmpl (#26120)
|
||||||
|
* Fix loading `LFS_JWT_SECRET` from wrong section (#26109)
|
||||||
|
* Fixing redirection issue for logged-in users (#26105)
|
||||||
|
* Improve "gitea doctor" sub-command and fix "help" commands (#26072)
|
||||||
|
* Fix the truncate and alignment problem for some admin tables (#26042)
|
||||||
|
* Update minimum password length requirements (#25946)
|
||||||
|
* Do not "guess" the file encoding/BOM when using API to upload files (#25828)
|
||||||
|
* Restructure issue list template, styles (#25750)
|
||||||
|
* Fix `ref` for workflows triggered by `pull_request_target` (#25743)
|
||||||
|
* Fix issues indexer document mapping (#25619)
|
||||||
|
* Use JSON response for "user/logout" (#25522)
|
||||||
|
* Fix migrate page layout on mobile (#25507)
|
||||||
|
* Link to existing PR when trying to open a new PR on the same branches (#25494)
|
||||||
|
* Do not publish docker release images on `-dev` tags (#25471)
|
||||||
|
* Support `pull_request_target` event (#25229)
|
||||||
|
* Modify the content format of the Feishu webhook (#25106)
|
||||||
|
* ENHANCEMENTS
|
||||||
|
* Render email addresses as such if followed by punctuation (#27987) (#27992)
|
||||||
|
* Show error toast when file size exceeds the limits (#27985) (#27986)
|
||||||
|
* Fix citation error when the file size is larger than 1024 bytes (#27958) (#27965)
|
||||||
|
* Remove action runners on user deletion (#27902) (#27908)
|
||||||
|
* Remove set tabindex on view issue (#27892) (#27896)
|
||||||
|
* Reduce margin/padding on flex-list items and divider (#27872) (#27874)
|
||||||
|
* Change katex limits (#27823) (#27868)
|
||||||
|
* Clean up template locale usage (#27856) (#27857)
|
||||||
|
* Add dedicated class for empty placeholders (#27788) (#27792)
|
||||||
|
* Add gap between diff boxes (#27776) (#27781)
|
||||||
|
* Fix incorrect "tab" parameter for repo search sub-template (#27755) (#27764)
|
||||||
|
* Enable followCursor for language stats bar (#27713) (#27739)
|
||||||
|
* Improve diff tree spacing (#27714) (#27719)
|
||||||
|
* Feed UI Improvements (#27356) (#27717)
|
||||||
|
* Improve feed icons and feed merge text color (#27498) (#27716)
|
||||||
|
* [FIX] resolve confusing colors in languages stats by insert a gap (#27704) (#27715)
|
||||||
|
* Add doctor dbconsistency fix to delete repos with no owner (#27290) (#27693)
|
||||||
|
* Fix required checkboxes in issue forms (#27592) (#27692)
|
||||||
|
* Hide archived labels by default from the suggestions when assigning labels for an issue (#27451) (#27661)
|
||||||
|
* Cleanup repo details icons/labels (#27644) (#27654)
|
||||||
|
* Keep filter when showing unfiltered results on explore page (#27192) (#27589)
|
||||||
|
* Show manual cron run's last time (#27544) (#27577)
|
||||||
|
* Revert "Fix pr template (#27436)" (#27567)
|
||||||
|
* Increase queue length (#27555) (#27562)
|
||||||
|
* Avoid run change title process when the title is same (#27467) (#27558)
|
||||||
|
* Remove max-width and add hide text overflow (#27359) (#27550)
|
||||||
|
* Add hover background to wiki list page (#27507) (#27521)
|
||||||
|
* Fix mermaid flowchart margin issue (#27503) (#27516)
|
||||||
|
* Refactor system setting (#27000) (#27452)
|
||||||
|
* Fix missing `ctx` in new_form.tmpl (#27434) (#27438)
|
||||||
|
* Add Index to `action.user_id` (#27403) (#27425)
|
||||||
|
* Don't use subselect in `DeleteIssuesByRepoID` (#27332) (#27408)
|
||||||
|
* Add support for HEAD ref in /src/branch and /src/commit routes (#27384) (#27407)
|
||||||
|
* Make Actions tasks/jobs timeouts configurable by the user (#27400) (#27402)
|
||||||
|
* Hide archived labels when filtering by labels on the issue list (#27115) (#27381)
|
||||||
|
* Highlight user details link (#26998) (#27376)
|
||||||
|
* Add protected branch name description (#27257) (#27351)
|
||||||
|
* Improve tree not found page (#26570) (#27346)
|
||||||
|
* Add Index to `comment.dependent_issue_id` (#27325) (#27340)
|
||||||
|
* Improve branch list UI (#27319) (#27324)
|
||||||
|
* Fix divider in subscription page (#27298) (#27301)
|
||||||
|
* Add missed return to actions view fetch (#27289) (#27293)
|
||||||
|
* Backport ctx locale refactoring manually (#27231) (#27259) (#27260)
|
||||||
|
* Disable `Test Delivery` and `Replay` webhook buttons when webhook is inactive (#27211) (#27253)
|
||||||
|
* Use mask-based fade-out effect for `.new-menu` (#27181) (#27243)
|
||||||
|
* Cleanup locale function usage (#27227) (#27240)
|
||||||
|
* Fix z-index on markdown completion (#27237) (#27239)
|
||||||
|
* Fix Fomantic UI dropdown icon bug when there is a search input in menu (#27225) (#27228)
|
||||||
|
* Allow copying issue comment link on archived repos and when not logged in (#27193) (#27210)
|
||||||
|
* Fix: text decorator on issue sidebar menu label (#27206) (#27209)
|
||||||
|
* Fix dropdown icon position (#27175) (#27177)
|
||||||
|
* Add index to `issue_user.issue_id` (#27154) (#27158)
|
||||||
|
* Increase auth provider icon size on login page (#27122)
|
||||||
|
* Remove a `gt-float-right` and some unnecessary helpers (#27110)
|
||||||
|
* Change green buttons to primary color (#27099)
|
||||||
|
* Use db.WithTx for AddTeamMember to avoid ctx abuse (#27095)
|
||||||
|
* Use `print` instead of `printf` (#27093)
|
||||||
|
* Remove the useless function `GetUserIssueStats` and move relevant tests to `indexer_test.go` (#27067)
|
||||||
|
* Search branches (#27055)
|
||||||
|
* Display all user types and org types on admin management UI (#27050)
|
||||||
|
* Ui correction in mobile view nav bar left aligned items. (#27046)
|
||||||
|
* Chroma color tweaks (#26978)
|
||||||
|
* Move some functions to service layer (#26969)
|
||||||
|
* Improve "language stats" UI (#26968)
|
||||||
|
* Replace `util.SliceXxx` with `slices.Xxx` (#26958)
|
||||||
|
* Refactor dashboard/feed.tmpl (#26956)
|
||||||
|
* Move repository deletion to service layer (#26948)
|
||||||
|
* Fix the missing repo count (#26942)
|
||||||
|
* Improve hint when uploading a too large avatar (#26935)
|
||||||
|
* Extract common code to new template (#26933)
|
||||||
|
* Move createrepository from module to service layer (#26927)
|
||||||
|
* Move notification interface to services layer (#26915)
|
||||||
|
* Move feed notification service layer (#26908)
|
||||||
|
* Move ui notification to service layer (#26907)
|
||||||
|
* Move indexer notification to service layer (#26906)
|
||||||
|
* Move mail notification logic to service layer (#26905)
|
||||||
|
* Extract common code to new template (#26903)
|
||||||
|
* Show queue's active worker number (#26896)
|
||||||
|
* Fix media description render for orgmode (#26895)
|
||||||
|
* Remove CSS `has` selector and improve various styles (#26891)
|
||||||
|
* Relocate the `RSS user feed` button (#26882)
|
||||||
|
* Refactor "shortsha" (#26877)
|
||||||
|
* Refactor `og:description` to limit the max length (#26876)
|
||||||
|
* Move web/api context related testing function into a separate package (#26859)
|
||||||
|
* Redable error on S3 storage connection failure (#26856)
|
||||||
|
* Improve opengraph previews (#26851)
|
||||||
|
* Add more descriptive error on forgot password page (#26848)
|
||||||
|
* Show always repo count in header (#26842)
|
||||||
|
* Remove "TODO" tasks from CSS file (#26835)
|
||||||
|
* Render code blocks in repo description (#26830)
|
||||||
|
* Minor dashboard tweaks, fix flex-list margins (#26829)
|
||||||
|
* Remove polluted `.ui.right` (#26825)
|
||||||
|
* Display archived labels specially when listing labels (#26820)
|
||||||
|
* Remove polluted ".ui.left" style (#26809)
|
||||||
|
* Make it posible to customize nav text color via css var (#26807)
|
||||||
|
* Refactor lfs requests (#26783)
|
||||||
|
* Improve flex list item padding (#26779)
|
||||||
|
* Remove fomantic `text` module (#26777)
|
||||||
|
* Remove fomantic `item` module (#26775)
|
||||||
|
* Remove redundant nil check in `WalkGitLog` (#26773)
|
||||||
|
* Reduce some allocations in type conversion (#26772)
|
||||||
|
* Refactor some CSS styles and simplify code (#26771)
|
||||||
|
* Unify `border-radius` behavior (#26770)
|
||||||
|
* Improve modal dialog UI (#26764)
|
||||||
|
* Allow "latest" to be used in release vTag when downloading file (#26748)
|
||||||
|
* Adding hint `Archived` to archive label. (#26741)
|
||||||
|
* Move `modules/mirror` to `services` (#26737)
|
||||||
|
* Add "dir=auto" for input/textarea elements by default (#26735)
|
||||||
|
* Add auth-required to config.json for Cargo http registry (#26729)
|
||||||
|
* Simplify helper CSS classes and avoid abuse (#26728)
|
||||||
|
* Make web context initialize correctly for different cases (#26726)
|
||||||
|
* Focus editor on "Write" tab click (#26714)
|
||||||
|
* Remove incorrect CSS helper classes (#26712)
|
||||||
|
* Fix review bar misalignment (#26711)
|
||||||
|
* Add reverseproxy auth for API back with default disabled (#26703)
|
||||||
|
* Add default label in branch select list (#26697)
|
||||||
|
* Improve Image Diff UI (#26696)
|
||||||
|
* Fixed text overflow in dropdown menu (#26694)
|
||||||
|
* [Refactor] getIssueStatsChunk to move inner function into own one (#26671)
|
||||||
|
* Remove fomantic loader module (#26670)
|
||||||
|
* Add `member`, `collaborator`, `contributor`, and `first-time contributor` roles and tooltips (#26658)
|
||||||
|
* Improve some flex layouts (#26649)
|
||||||
|
* Improve the branch selector tab UI (#26631)
|
||||||
|
* Improve show role (#26621)
|
||||||
|
* Remove avatarHTML from template helpers (#26598)
|
||||||
|
* Allow text selection in actions step header (#26588)
|
||||||
|
* Improve translation of milestone filters (#26569)
|
||||||
|
* Add optimistic lock to ActionRun table (#26563)
|
||||||
|
* Update team invitation email link (#26550)
|
||||||
|
* Differentiate better between user settings and admin settings (#26538)
|
||||||
|
* Check disabled workflow when rerun jobs (#26535)
|
||||||
|
* Improve deadline icon location in milestone list page (#26532)
|
||||||
|
* Improve repo sub menu (#26531)
|
||||||
|
* Fix the display of org level badges (#26504)
|
||||||
|
* Rename `Sync2` -> `Sync` (#26479)
|
||||||
|
* Fix stderr usages (#26477)
|
||||||
|
* Remove fomantic transition module (#26469)
|
||||||
|
* Refactor tests (#26464)
|
||||||
|
* Refactor project templates (#26448)
|
||||||
|
* Fall back to esbuild for css minify (#26445)
|
||||||
|
* Always show usernames in reaction tooltips (#26444)
|
||||||
|
* Use correct pull request commit link instead of a generic commit link (#26434)
|
||||||
|
* Refactor "editorconfig" (#26391)
|
||||||
|
* Make `user-content-* ` consistent with github (#26388)
|
||||||
|
* Remove unnecessary template helper repoAvatar (#26387)
|
||||||
|
* Remove unnecessary template helper DisableGravatar (#26386)
|
||||||
|
* Use template context function for avatar rendering (#26385)
|
||||||
|
* Rename code_langauge.go to code_language.go (#26377)
|
||||||
|
* Use more `IssueList` instead of `[]*Issue` (#26369)
|
||||||
|
* Do not highlight `#number` in documents (#26365)
|
||||||
|
* Fix display problems of members and teams unit (#26363)
|
||||||
|
* Fix 404 error when remove self from an organization (#26362)
|
||||||
|
* Improve CLI and messages (#26341)
|
||||||
|
* Refactor backend SVG package and add tests (#26335)
|
||||||
|
* Add link to job details and tooltip to commit status in repo list in dashboard (#26326)
|
||||||
|
* Use yellow if an approved review is stale (#26312)
|
||||||
|
* Remove commit load branches and tags in wiki repo (#26304)
|
||||||
|
* Add highlight to selected repos in milestone dashboard (#26300)
|
||||||
|
* Delete `issue_service.CreateComment` (#26298)
|
||||||
|
* Do not show Profile README when repository is private (#26295)
|
||||||
|
* Tweak actions menu (#26278)
|
||||||
|
* Start using template context function (#26254)
|
||||||
|
* Use calendar icon for `Joined on...` in profiles (#26215)
|
||||||
|
* Add 'Show on a map' button to Location in profile, fix layout (#26214)
|
||||||
|
* Render plaintext task list items for markdown files (#26186)
|
||||||
|
* Add tooltip to describe LFS table column and color `delete LFS file` button red (#26181)
|
||||||
|
* Release attachments duplicated check (#26176)
|
||||||
|
* De-emphasize issue sidebar buttons (#26171)
|
||||||
|
* Fixing the align of commit stats in commit_page template. (#26161)
|
||||||
|
* Allow editing push mirrors after creation (#26151)
|
||||||
|
* Move web JSON functions to web context and simplify code (#26132)
|
||||||
|
* Refactor improve NoBetterThan (#26126)
|
||||||
|
* Improve clickable area in repo action view page (#26115)
|
||||||
|
* Add context parameter to some database functions (#26055)
|
||||||
|
* Docusaurus-ify (#26051)
|
||||||
|
* Improve text for empty issue/pr description (#26047)
|
||||||
|
* Categorize admin settings sidebar panel (#26030)
|
||||||
|
* Remove redundant "RouteMethods" method (#26024)
|
||||||
|
* Refactor and enhance issue indexer to support both searching, filtering and paging (#26012)
|
||||||
|
* Add a link to OpenID Issuer URL in WebFinger response (#26000)
|
||||||
|
* Fix UI for release tag page / wiki page / subscription page (#25948)
|
||||||
|
* Support copy protected branch from template repository (#25889)
|
||||||
|
* Improve display of Labels/Projects/Assignees sort options (#25886)
|
||||||
|
* Fix margin on the new/edit project page. (#25885)
|
||||||
|
* Show image size on view page (#25884)
|
||||||
|
* Remove ref name in PR commits page (#25876)
|
||||||
|
* Allow the use of alternative net.Listener implementations by downstreams (#25855)
|
||||||
|
* Refactor "Content" for file uploading (#25851)
|
||||||
|
* Add error info if no user can fork the repo (#25820)
|
||||||
|
* Show edit title button on commits tab of PR, too (#25791)
|
||||||
|
* Introduce `flex-list` & `flex-item` elements for Gitea UI (#25790)
|
||||||
|
* Don't stack PR tab menu on small screens (#25789)
|
||||||
|
* Repository Archived text title center align (#25767)
|
||||||
|
* Make route middleware/handler mockable (#25766)
|
||||||
|
* Move issue filters to shared template (#25729)
|
||||||
|
* Use frontend fetch for branch dropdown component (#25719)
|
||||||
|
* Add open/closed field support for issue index (#25708)
|
||||||
|
* Some less naked returns (#25682)
|
||||||
|
* Fix inconsistent user profile layout across tabs (#25625)
|
||||||
|
* Get latest commit statuses from database instead of git data on dashboard for repositories (#25605)
|
||||||
|
* Adding branch-name copy to clipboard branches screen. (#25596)
|
||||||
|
* Update emoji set to Unicode 15 (#25595)
|
||||||
|
* Move some files under repo/setting (#25585)
|
||||||
|
* Add custom ansi colors and CSS variables for them (#25546)
|
||||||
|
* Add log line anchor for action logs (#25532)
|
||||||
|
* Use flex instead of float for sort button and search input (#25519)
|
||||||
|
* Update octicons and use `octicon-file-directory-symlink` (#25453)
|
||||||
|
* Add toasts to UI (#25449)
|
||||||
|
* Fine tune project board label colors and modal content background (#25419)
|
||||||
|
* Import additional secrets via file uri (#25408)
|
||||||
|
* Switch to ansi_up for ansi rendering in actions (#25401)
|
||||||
|
* Store and use seconds for timeline time comments (#25392)
|
||||||
|
* Support displaying diff stats in PR tab bar (#25387)
|
||||||
|
* Use fetch form action for lock/unlock/pin/unpin on sidebar (#25380)
|
||||||
|
* Refactor: TotalTimes return seconds (#25370)
|
||||||
|
* Navbar styling rework (#25343)
|
||||||
|
* Introduce shared template for search inputs (#25338)
|
||||||
|
* Only show 'Manage Account Links' when necessary (#25311)
|
||||||
|
* Improve 'Privacy' section in profile settings (#25309)
|
||||||
|
* Substitute variables in path names of template repos too (#25294)
|
||||||
|
* Fix tags line no margin see #25255 (#25280)
|
||||||
|
* Use fetch to send requests to create issues/comments (#25258)
|
||||||
|
* Change form actions to fetch for submit review box (#25219)
|
||||||
|
* Improve AJAX link and modal confirm dialog (#25210)
|
||||||
|
* Reduce unnecessary DB queries for Actions tasks (#25199)
|
||||||
|
* Disable `Create column` button while the column name is empty (#25192)
|
||||||
|
* Refactor indexer (#25174)
|
||||||
|
* Adjust style for action run list (align icons, adjust padding) (#25170)
|
||||||
|
* Remove duplicated functions when deleting a branch (#25128)
|
||||||
|
* Make confusable character warning less jarring (#25069)
|
||||||
|
* Highlight viewed files differently in the PR filetree (#24956)
|
||||||
|
* Support changing labels of Actions runner without re-registration (#24806)
|
||||||
|
* Fix duplicate Reviewed-by trailers (#24796)
|
||||||
|
* Resolve issue with sort icons on admin/users and admin/runners (#24360)
|
||||||
|
* Split lfs size from repository size (#22900)
|
||||||
|
* Sync branches into databases (#22743)
|
||||||
|
* Disable run user change in installation page (#22499)
|
||||||
|
* Add merge files files to GetCommitFileStatus (#20515)
|
||||||
|
* Show OpenID Connect and OAuth on signup page (#20242)
|
||||||
|
* SECURITY
|
||||||
|
* Dont leak private users via extensions (#28023) (#28029)
|
||||||
|
* Expanded minimum RSA Keylength to 3072 (#26604)
|
||||||
|
* TESTING
|
||||||
|
* Add user secrets API integration tests (#27832) (#27852)
|
||||||
|
* Add tests for db indexer in indexer_test.go (#27087)
|
||||||
|
* Speed up TestEventSourceManagerRun (#26262)
|
||||||
|
* Add unit test for user renaming (#26261)
|
||||||
|
* Add some Wiki unit tests (#26260)
|
||||||
|
* Improve unit test for caching (#26185)
|
||||||
|
* Add unit test for `HashAvatar` (#25662)
|
||||||
|
* TRANSLATION
|
||||||
|
* Backport translations to v1.21 (#27899)
|
||||||
|
* Fix issues in translation file (#27699) (#27737)
|
||||||
|
* Add locale for deleted head branch (#26296)
|
||||||
|
* Improve multiple strings in en-US locale (#26213)
|
||||||
|
* Fix broken translations for package documantion (#25742)
|
||||||
|
* Correct translation wrong format (#25643)
|
||||||
|
* BUILD
|
||||||
|
* Dockerfile small refactor (#27757) (#27826)
|
||||||
|
* Fix build errors on BSD (in BSDMakefile) (#27594) (#27608)
|
||||||
|
* Fully replace drone with actions (#27556) (#27575)
|
||||||
|
* Enable markdownlint `no-duplicate-header` (#27500) (#27506)
|
||||||
|
* Enable production source maps for index.js, fix CSS sourcemaps (#27291) (#27295)
|
||||||
|
* Update snap package (#27021)
|
||||||
|
* Bump go to 1.21 (#26608)
|
||||||
|
* Bump xgo to go-1.21.x and node to 20 in release-version (#26589)
|
||||||
|
* Add template linting via djlint (#25212)
|
||||||
|
* DOCS
|
||||||
|
* Change default size of issue/pr attachments and repo file (#27946) (#28017)
|
||||||
|
* Remove `known issue` section in Gitea Actions Doc (#27930) (#27938)
|
||||||
|
* Remove outdated paragraphs when comparing Gitea Actions to GitHub Actions (#27119)
|
||||||
|
* Update brew installation documentation since gitea moved to brew core package (#27070)
|
||||||
|
* Actions are no longer experimental, so enable them by default (#27054)
|
||||||
|
* Add a documentation note for Windows Service (#26938)
|
||||||
|
* Add sparse url in cargo package guide (#26937)
|
||||||
|
* Update nginx recommendations (#26924)
|
||||||
|
* Update backup instructions to align with archive structure (#26902)
|
||||||
|
* Expanding documentation in queue.go (#26889)
|
||||||
|
* Update info regarding internet connection for build (#26776)
|
||||||
|
* Docs: template variables (#26547)
|
||||||
|
* Update index doc (#26455)
|
||||||
|
* Update zh-cn documentation (#26406)
|
||||||
|
* Fix typos and grammer problems for actions documentation (#26328)
|
||||||
|
* Update documentation for 1.21 actions (#26317)
|
||||||
|
* Doc update swagger doc for POST /orgs/{org}/teams (#26155)
|
||||||
|
* Doc sync authentication.md to zh-cn (#26117)
|
||||||
|
* Doc guide the user to create the appropriate level runner (#26091)
|
||||||
|
* Make organization redirect warning more clear (#26077)
|
||||||
|
* Update blog links (#25843)
|
||||||
|
* Fix default value for LocalURL (#25426)
|
||||||
|
* Update `from-source.zh-cn.md` & `from-source.en-us.md` - Cross Compile Using Zig (#25194)
|
||||||
|
* MISC
|
||||||
|
* Replace deprecated `elliptic.Marshal` (#26800)
|
||||||
|
* Add elapsed time on debug for slow git commands (#25642)
|
||||||
|
|
||||||
|
## [1.20.5](https://github.com/go-gitea/gitea/releases/tag/v1.20.5) - 2023-10-03
|
||||||
|
|
||||||
|
* ENHANCEMENTS
|
||||||
|
* Fix z-index on markdown completion (#27237) (#27242 & #27238)
|
||||||
|
* Use secure cookie for HTTPS sites (#26999) (#27013)
|
||||||
|
* BUGFIXES
|
||||||
|
* Fix git 2.11 error when checking IsEmpty (#27393) (#27396)
|
||||||
|
* Allow get release download files and lfs files with oauth2 token format (#26430) (#27378)
|
||||||
|
* Fix orphan check for deleted branch (#27310) (#27320)
|
||||||
|
* Quote table `release` in sql queries (#27205) (#27219)
|
||||||
|
* Fix release URL in webhooks (#27182) (#27184)
|
||||||
|
* Fix successful return value for `SyncAndGetUserSpecificDiff` (#27152) (#27156)
|
||||||
|
* fix pagination for followers and following (#27127) (#27138)
|
||||||
|
* Fix issue templates when blank isses are disabled (#27061) (#27082)
|
||||||
|
* Fix context cache bug & enable context cache for dashabord commits' authors(#26991) (#27017)
|
||||||
|
* Fix INI parsing for value with trailing slash (#26995) (#27001)
|
||||||
|
* Fix PushEvent NullPointerException jenkinsci/github-plugin (#27203) (#27249)
|
||||||
|
* Fix organization field being null in POST /orgs/{orgid}/teams (#27150) (#27167 & #27162)
|
||||||
|
* Fix bug of review request number (#27406) (#27104)
|
||||||
|
* TESTING
|
||||||
|
* services/wiki: Close() after error handling (#27129) (#27137)
|
||||||
|
* DOCS
|
||||||
|
* Improve actions docs related to `pull_request` event (#27126) (#27145)
|
||||||
|
* MISC
|
||||||
|
* Add logs for data broken of comment review (#27326) (#27344)
|
||||||
|
* Load reviewer before sending notification (#27063) (#27064)
|
||||||
|
|
||||||
|
## [1.20.4](https://github.com/go-gitea/gitea/releases/tag/v1.20.4) - 2023-09-08
|
||||||
|
|
||||||
|
* SECURITY
|
||||||
|
* Check blocklist for emails when adding them to account (#26812) (#26831)
|
||||||
|
* ENHANCEMENTS
|
||||||
|
* Add `branch_filter` to hooks API endpoints (#26599) (#26632)
|
||||||
|
* Fix incorrect "tabindex" attributes (#26733) (#26734)
|
||||||
|
* Use line-height: normal by default (#26635) (#26708)
|
||||||
|
* Fix unable to display individual-level project (#26198) (#26636)
|
||||||
|
* BUGFIXES
|
||||||
|
* Fix wrong review requested number (#26784) (#26880)
|
||||||
|
* Avoid double-unescaping of form value (#26853) (#26863)
|
||||||
|
* Redirect from `{repo}/issues/new` to `{repo}/issues/new/choose` when blank issues are disabled (#26813) (#26847)
|
||||||
|
* Sync tags when adopting repos (#26816) (#26834)
|
||||||
|
* Fix verifyCommits error when push a new branch (#26664) (#26810)
|
||||||
|
* Include the GITHUB_TOKEN/GITEA_TOKEN secret for fork pull requests (#26759) (#26806)
|
||||||
|
* Fix some slice append usages (#26778) (#26798)
|
||||||
|
* Add fix incorrect can_create_org_repo for org owner team (#26683) (#26791)
|
||||||
|
* Fix bug for ctx usage (#26763)
|
||||||
|
* Make issue template field template access correct template data (#26698) (#26709)
|
||||||
|
* Use correct minio error (#26634) (#26639)
|
||||||
|
* Ignore the trailing slashes when comparing oauth2 redirect_uri (#26597) (#26618)
|
||||||
|
* Set errwriter for urfave/cli v1 (#26616)
|
||||||
|
* Fix reopen logic for agit flow pull request (#26399) (#26613)
|
||||||
|
* Fix context filter has no effect in dashboard (#26695) (#26811)
|
||||||
|
* Fix being unable to use a repo that prohibits accepting PRs as a PR source. (#26785) (#26790)
|
||||||
|
* Fix Page Not Found error (#26768)
|
||||||
|
|
||||||
## [1.20.3](https://github.com/go-gitea/gitea/releases/tag/v1.20.3) - 2023-08-20
|
## [1.20.3](https://github.com/go-gitea/gitea/releases/tag/v1.20.3) - 2023-08-20
|
||||||
|
|
||||||
* BREAKING
|
* BREAKING
|
||||||
|
@ -400,7 +1137,6 @@ been added to each release, please refer to the [blog](https://blog.gitea.com).
|
||||||
* Add option to search for users is active join a team (#24093)
|
* Add option to search for users is active join a team (#24093)
|
||||||
* Add PDF rendering via PDFObject (#24086)
|
* Add PDF rendering via PDFObject (#24086)
|
||||||
* Refactor web route (#24080)
|
* Refactor web route (#24080)
|
||||||
* Make more functions use ctx instead of db.DefaultContext (#24068)
|
|
||||||
* Make HTML template functions support context (#24056)
|
* Make HTML template functions support context (#24056)
|
||||||
* Refactor rename user and rename organization (#24052)
|
* Refactor rename user and rename organization (#24052)
|
||||||
* Localize milestone related time strings (#24051)
|
* Localize milestone related time strings (#24051)
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
- [How to report issues](#how-to-report-issues)
|
- [How to report issues](#how-to-report-issues)
|
||||||
- [Types of issues](#types-of-issues)
|
- [Types of issues](#types-of-issues)
|
||||||
- [Discuss your design before the implementation](#discuss-your-design-before-the-implementation)
|
- [Discuss your design before the implementation](#discuss-your-design-before-the-implementation)
|
||||||
|
- [Issue locking](#issue-locking)
|
||||||
- [Building Gitea](#building-gitea)
|
- [Building Gitea](#building-gitea)
|
||||||
- [Dependencies](#dependencies)
|
- [Dependencies](#dependencies)
|
||||||
- [Backend](#backend)
|
- [Backend](#backend)
|
||||||
|
@ -47,6 +48,7 @@
|
||||||
- [Release Cycle](#release-cycle)
|
- [Release Cycle](#release-cycle)
|
||||||
- [Maintainers](#maintainers)
|
- [Maintainers](#maintainers)
|
||||||
- [Technical Oversight Committee (TOC)](#technical-oversight-committee-toc)
|
- [Technical Oversight Committee (TOC)](#technical-oversight-committee-toc)
|
||||||
|
- [TOC election process](#toc-election-process)
|
||||||
- [Current TOC members](#current-toc-members)
|
- [Current TOC members](#current-toc-members)
|
||||||
- [Previous TOC/owners members](#previous-tocowners-members)
|
- [Previous TOC/owners members](#previous-tocowners-members)
|
||||||
- [Governance Compensation](#governance-compensation)
|
- [Governance Compensation](#governance-compensation)
|
||||||
|
@ -102,6 +104,13 @@ the goals for the project and tools.
|
||||||
|
|
||||||
Pull requests should not be the place for architecture discussions.
|
Pull requests should not be the place for architecture discussions.
|
||||||
|
|
||||||
|
### Issue locking
|
||||||
|
|
||||||
|
Commenting on closed or merged issues/PRs is strongly discouraged.
|
||||||
|
Such comments will likely be overlooked as some maintainers may not view notifications on closed issues, thinking that the item is resolved.
|
||||||
|
As such, commenting on closed/merged issues/PRs may be disabled prior to the scheduled auto-locking if a discussion starts or if unrelated comments are posted.
|
||||||
|
If further discussion is needed, we encourage you to open a new issue instead and we recommend linking to the issue/PR in question for context.
|
||||||
|
|
||||||
## Building Gitea
|
## Building Gitea
|
||||||
|
|
||||||
See the [development setup instructions](https://docs.gitea.com/development/hacking-on-gitea).
|
See the [development setup instructions](https://docs.gitea.com/development/hacking-on-gitea).
|
||||||
|
@ -110,7 +119,7 @@ See the [development setup instructions](https://docs.gitea.com/development/hack
|
||||||
|
|
||||||
### Backend
|
### Backend
|
||||||
|
|
||||||
Go dependencies are managed using [Go Modules](https://golang.org/cmd/go/#hdr-Module_maintenance). \
|
Go dependencies are managed using [Go Modules](https://go.dev/cmd/go/#hdr-Module_maintenance). \
|
||||||
You can find more details in the [go mod documentation](https://go.dev/ref/mod) and the [Go Modules Wiki](https://github.com/golang/go/wiki/Modules).
|
You can find more details in the [go mod documentation](https://go.dev/ref/mod) and the [Go Modules Wiki](https://github.com/golang/go/wiki/Modules).
|
||||||
|
|
||||||
Pull requests should only modify `go.mod` and `go.sum` where it is related to your change, be it a bugfix or a new feature. \
|
Pull requests should only modify `go.mod` and `go.sum` where it is related to your change, be it a bugfix or a new feature. \
|
||||||
|
@ -167,7 +176,7 @@ Here's how to run the test suite:
|
||||||
|
|
||||||
| Command | Action | |
|
| Command | Action | |
|
||||||
| :------------------------------------- | :----------------------------------------------- | ------------ |
|
| :------------------------------------- | :----------------------------------------------- | ------------ |
|
||||||
|``make test[\#SpecificTestName]`` | run unit test(s) |
|
|``make test[\#SpecificTestName]`` | run unit test(s) | |
|
||||||
|``make test-sqlite[\#SpecificTestName]``| run [integration](tests/integration) test(s) for SQLite |[More details](tests/integration/README.md) |
|
|``make test-sqlite[\#SpecificTestName]``| run [integration](tests/integration) test(s) for SQLite |[More details](tests/integration/README.md) |
|
||||||
|``make test-e2e-sqlite[\#SpecificTestName]``| run [end-to-end](tests/e2e) test(s) for SQLite |[More details](tests/e2e/README.md) |
|
|``make test-e2e-sqlite[\#SpecificTestName]``| run [end-to-end](tests/e2e) test(s) for SQLite |[More details](tests/e2e/README.md) |
|
||||||
|
|
||||||
|
@ -203,10 +212,20 @@ Some of the key points:
|
||||||
|
|
||||||
In the PR title, describe the problem you are fixing, not how you are fixing it. \
|
In the PR title, describe the problem you are fixing, not how you are fixing it. \
|
||||||
Use the first comment as a summary of your PR. \
|
Use the first comment as a summary of your PR. \
|
||||||
In the PR summary, you can describe exactly how you are fixing this problem. \
|
In the PR summary, you can describe exactly how you are fixing this problem.
|
||||||
|
|
||||||
Keep this summary up-to-date as the PR evolves. \
|
Keep this summary up-to-date as the PR evolves. \
|
||||||
If your PR changes the UI, you must add **after** screenshots in the PR summary. \
|
If your PR changes the UI, you must add **after** screenshots in the PR summary. \
|
||||||
If you are not implementing a new feature, you should also post **before** screenshots for comparison. \
|
If you are not implementing a new feature, you should also post **before** screenshots for comparison.
|
||||||
|
|
||||||
|
If you are implementing a new feature, your PR will only be merged if your screenshots are up to date.\
|
||||||
|
Furthermore, feature PRs will only be merged if their summary contains a clear usage description (understandable for users) and testing description (understandable for reviewers).
|
||||||
|
You should strive to combine both into a single description.
|
||||||
|
|
||||||
|
Another requirement for merging PRs is that the PR is labeled correctly.\
|
||||||
|
However, this is not your job as a contributor, but the job of the person merging your PR.\
|
||||||
|
If you think that your PR was labeled incorrectly, or notice that it was merged without labels, please let us know.
|
||||||
|
|
||||||
If your PR closes some issues, you must note that in a way that both GitHub and Gitea understand, i.e. by appending a paragraph like
|
If your PR closes some issues, you must note that in a way that both GitHub and Gitea understand, i.e. by appending a paragraph like
|
||||||
|
|
||||||
```text
|
```text
|
||||||
|
@ -225,17 +244,20 @@ PRs without a milestone may not be merged.
|
||||||
|
|
||||||
### Labels
|
### Labels
|
||||||
|
|
||||||
Every PR should be labeled correctly with every label that applies. \
|
Almost all labels used inside Gitea can be classified as one of the following:
|
||||||
This includes especially the distinction between `bug` (fixing existing functionality), `feature` (new functionality), `enhancement` (upgrades for existing functionality), and `refactoring` (improving the internal code structure without changing the output (much)). \
|
|
||||||
Furthermore,
|
- `modifies/…`: Determines which parts of the codebase are affected. These labels will be set through the CI.
|
||||||
|
- `topic/…`: Determines the conceptual component of Gitea that is affected, i.e. issues, projects, or authentication. At best, PRs should only target one component but there might be overlap. Must be set manually.
|
||||||
|
- `type/…`: Determines the type of an issue or PR (feature, refactoring, docs, bug, …). If GitHub supported scoped labels, these labels would be exclusive, so you should set **exactly** one, not more or less (every PR should fall into one of the provided categories, and only one).
|
||||||
|
- `issue/…` / `pr/…`: Labels that are specific to issues or PRs respectively and that are only necessary in a given context, i.e. `issue/not-a-bug` or `pr/need-2-approvals`
|
||||||
|
|
||||||
|
Every PR should be labeled correctly with every label that applies.
|
||||||
|
|
||||||
|
There are also some labels that will be managed automatically.\
|
||||||
|
In particular, these are
|
||||||
|
|
||||||
- the amount of pending required approvals
|
- the amount of pending required approvals
|
||||||
- whether this PR is `blocked`, a `backport` or `breaking`
|
- has all `backport`s or needs a manual backport
|
||||||
- if it targets the `ui` or `api`
|
|
||||||
- if it increases the application `speed`
|
|
||||||
- reduces `memory usage`
|
|
||||||
|
|
||||||
are oftentimes notable labels.
|
|
||||||
|
|
||||||
### Breaking PRs
|
### Breaking PRs
|
||||||
|
|
||||||
|
@ -252,13 +274,16 @@ Changing the default value of a setting or replacing the setting with another on
|
||||||
|
|
||||||
#### How to handle breaking PRs?
|
#### How to handle breaking PRs?
|
||||||
|
|
||||||
If your PR has a breaking change, you must add a `BREAKING` section to your PR summary, e.g.
|
If your PR has a breaking change, you must add two things to the summary of your PR:
|
||||||
|
|
||||||
```
|
1. A reasoning why this breaking change is necessary
|
||||||
|
2. A `BREAKING` section explaining in simple terms (understandable for a typical user) how this PR affects users and how to mitigate these changes. This section can look for example like
|
||||||
|
|
||||||
|
```md
|
||||||
## :warning: BREAKING :warning:
|
## :warning: BREAKING :warning:
|
||||||
```
|
```
|
||||||
|
|
||||||
To explain how this will affect users and how to mitigate these changes.
|
Breaking PRs will not be merged as long as not both of these requirements are met.
|
||||||
|
|
||||||
### Maintaining open PRs
|
### Maintaining open PRs
|
||||||
|
|
||||||
|
@ -439,7 +464,7 @@ We assume in good faith that the information you provide is legally binding.
|
||||||
We adopted a release schedule to streamline the process of working on, finishing, and issuing releases. \
|
We adopted a release schedule to streamline the process of working on, finishing, and issuing releases. \
|
||||||
The overall goal is to make a major release every three or four months, which breaks down into two or three months of general development followed by one month of testing and polishing known as the release freeze. \
|
The overall goal is to make a major release every three or four months, which breaks down into two or three months of general development followed by one month of testing and polishing known as the release freeze. \
|
||||||
All the feature pull requests should be
|
All the feature pull requests should be
|
||||||
merged before feature freeze. And, during the frozen period, a corresponding
|
merged before feature freeze. All feature pull requests haven't been merged before this feature freeze will be moved to next milestone, please notice our feature freeze announcement on discord. And, during the frozen period, a corresponding
|
||||||
release branch is open for fixes backported from main branch. Release candidates
|
release branch is open for fixes backported from main branch. Release candidates
|
||||||
are made during this period for user testing to
|
are made during this period for user testing to
|
||||||
obtain a final version that is maintained in this branch.
|
obtain a final version that is maintained in this branch.
|
||||||
|
@ -470,36 +495,53 @@ if possible provide GPG signed commits.
|
||||||
https://help.github.com/articles/securing-your-account-with-two-factor-authentication-2fa/
|
https://help.github.com/articles/securing-your-account-with-two-factor-authentication-2fa/
|
||||||
https://help.github.com/articles/signing-commits-with-gpg/
|
https://help.github.com/articles/signing-commits-with-gpg/
|
||||||
|
|
||||||
|
Furthermore, any account with write access (like bots and TOC members) **must** use 2FA.
|
||||||
|
https://help.github.com/articles/securing-your-account-with-two-factor-authentication-2fa/
|
||||||
|
|
||||||
## Technical Oversight Committee (TOC)
|
## Technical Oversight Committee (TOC)
|
||||||
|
|
||||||
At the start of 2023, the `Owners` team was dissolved. Instead, the governance charter proposed a technical oversight committee (TOC) which expands the ownership team of the Gitea project from three elected positions to six positions. Three positions would be elected as it has been over the past years, and the other three would consist of appointed members from the Gitea company.
|
At the start of 2023, the `Owners` team was dissolved. Instead, the governance charter proposed a technical oversight committee (TOC) which expands the ownership team of the Gitea project from three elected positions to six positions. Three positions are elected as it has been over the past years, and the other three consist of appointed members from the Gitea company.
|
||||||
https://blog.gitea.com/quarterly-23q1/
|
https://blog.gitea.com/quarterly-23q1/
|
||||||
|
|
||||||
When the new community members have been elected, the old members will give up ownership to the newly elected members. For security reasons, TOC members or any account with write access (like a bot) must use 2FA.
|
### TOC election process
|
||||||
https://help.github.com/articles/securing-your-account-with-two-factor-authentication-2fa/
|
|
||||||
|
Any maintainer is eligible to be part of the community TOC if they are not associated with the Gitea company.
|
||||||
|
A maintainer can either nominate themselves, or can be nominated by other maintainers to be a candidate for the TOC election.
|
||||||
|
If you are nominated by someone else, you must first accept your nomination before the vote starts to be a candidate.
|
||||||
|
|
||||||
|
The TOC is elected for one year, the TOC election happens yearly.
|
||||||
|
After the announcement of the results of the TOC election, elected members have two weeks time to confirm or refuse the seat.
|
||||||
|
If an elected member does not answer within this timeframe, they are automatically assumed to refuse the seat.
|
||||||
|
Refusals result in the person with the next highest vote getting the same choice.
|
||||||
|
As long as seats are empty in the TOC, members of the previous TOC can fill them until an elected member accepts the seat.
|
||||||
|
|
||||||
|
If an elected member that accepts the seat does not have 2FA configured yet, they will be temporarily counted as `answer pending` until they manage to configure 2FA, thus leaving their seat empty for this duration.
|
||||||
|
|
||||||
### Current TOC members
|
### Current TOC members
|
||||||
|
|
||||||
- 2023-01-01 ~ 2023-12-31 - https://blog.gitea.com/quarterly-23q1/
|
- 2024-01-01 ~ 2024-12-31
|
||||||
- Company
|
- Company
|
||||||
- [Jason Song](https://gitea.com/wolfogre) <i@wolfogre.com>
|
- [Jason Song](https://gitea.com/wolfogre) <i@wolfogre.com>
|
||||||
- [Lunny Xiao](https://gitea.com/lunny) <xiaolunwen@gmail.com>
|
- [Lunny Xiao](https://gitea.com/lunny) <xiaolunwen@gmail.com>
|
||||||
- [Matti Ranta](https://gitea.com/techknowlogick) <techknowlogick@gitea.io>
|
- [Matti Ranta](https://gitea.com/techknowlogick) <techknowlogick@gitea.com>
|
||||||
- Community
|
- Community
|
||||||
- [6543](https://gitea.com/6543) <6543@obermui.de>
|
- [6543](https://gitea.com/6543) <6543@obermui.de>
|
||||||
- [Andrew Thornton](https://gitea.com/zeripath) <art27@cantab.net>
|
- [delvh](https://gitea.com/delvh) <dev.lh@web.de>
|
||||||
- [John Olheiser](https://gitea.com/jolheiser) <john.olheiser@gmail.com>
|
- [John Olheiser](https://gitea.com/jolheiser) <john.olheiser@gmail.com>
|
||||||
|
|
||||||
### Previous TOC/owners members
|
### Previous TOC/owners members
|
||||||
|
|
||||||
Here's the history of the owners and the time they served:
|
Here's the history of the owners and the time they served:
|
||||||
|
|
||||||
- [Lunny Xiao](https://gitea.com/lunny) - 2016, 2017, [2018](https://github.com/go-gitea/gitea/issues/3255), [2019](https://github.com/go-gitea/gitea/issues/5572), [2020](https://github.com/go-gitea/gitea/issues/9230), [2021](https://github.com/go-gitea/gitea/issues/13801), [2022](https://github.com/go-gitea/gitea/issues/17872)
|
- [Lunny Xiao](https://gitea.com/lunny) - 2016, 2017, [2018](https://github.com/go-gitea/gitea/issues/3255), [2019](https://github.com/go-gitea/gitea/issues/5572), [2020](https://github.com/go-gitea/gitea/issues/9230), [2021](https://github.com/go-gitea/gitea/issues/13801), [2022](https://github.com/go-gitea/gitea/issues/17872), 2023
|
||||||
- [Kim Carlbäcker](https://github.com/bkcsoft) - 2016, 2017
|
- [Kim Carlbäcker](https://github.com/bkcsoft) - 2016, 2017
|
||||||
- [Thomas Boerger](https://gitea.com/tboerger) - 2016, 2017
|
- [Thomas Boerger](https://gitea.com/tboerger) - 2016, 2017
|
||||||
- [Lauris Bukšis-Haberkorns](https://gitea.com/lafriks) - [2018](https://github.com/go-gitea/gitea/issues/3255), [2019](https://github.com/go-gitea/gitea/issues/5572), [2020](https://github.com/go-gitea/gitea/issues/9230), [2021](https://github.com/go-gitea/gitea/issues/13801)
|
- [Lauris Bukšis-Haberkorns](https://gitea.com/lafriks) - [2018](https://github.com/go-gitea/gitea/issues/3255), [2019](https://github.com/go-gitea/gitea/issues/5572), [2020](https://github.com/go-gitea/gitea/issues/9230), [2021](https://github.com/go-gitea/gitea/issues/13801)
|
||||||
- [Matti Ranta](https://gitea.com/techknowlogick) - [2019](https://github.com/go-gitea/gitea/issues/5572), [2020](https://github.com/go-gitea/gitea/issues/9230), [2021](https://github.com/go-gitea/gitea/issues/13801), [2022](https://github.com/go-gitea/gitea/issues/17872)
|
- [Matti Ranta](https://gitea.com/techknowlogick) - [2019](https://github.com/go-gitea/gitea/issues/5572), [2020](https://github.com/go-gitea/gitea/issues/9230), [2021](https://github.com/go-gitea/gitea/issues/13801), [2022](https://github.com/go-gitea/gitea/issues/17872), 2023
|
||||||
- [Andrew Thornton](https://gitea.com/zeripath) - [2020](https://github.com/go-gitea/gitea/issues/9230), [2021](https://github.com/go-gitea/gitea/issues/13801), [2022](https://github.com/go-gitea/gitea/issues/17872)
|
- [Andrew Thornton](https://gitea.com/zeripath) - [2020](https://github.com/go-gitea/gitea/issues/9230), [2021](https://github.com/go-gitea/gitea/issues/13801), [2022](https://github.com/go-gitea/gitea/issues/17872), 2023
|
||||||
|
- [6543](https://gitea.com/6543) - 2023
|
||||||
|
- [John Olheiser](https://gitea.com/jolheiser) - 2023
|
||||||
|
- [Jason Song](https://gitea.com/wolfogre) - 2023
|
||||||
|
|
||||||
## Governance Compensation
|
## Governance Compensation
|
||||||
|
|
||||||
|
|
40
Dockerfile
40
Dockerfile
|
@ -1,5 +1,5 @@
|
||||||
#Build stage
|
# Build stage
|
||||||
FROM docker.io/library/golang:1.21-alpine3.18 AS build-env
|
FROM docker.io/library/golang:1.22-alpine3.19 AS build-env
|
||||||
|
|
||||||
ARG GOPROXY
|
ARG GOPROXY
|
||||||
ENV GOPROXY ${GOPROXY:-direct}
|
ENV GOPROXY ${GOPROXY:-direct}
|
||||||
|
@ -9,21 +9,39 @@ ARG TAGS="sqlite sqlite_unlock_notify"
|
||||||
ENV TAGS "bindata timetzdata $TAGS"
|
ENV TAGS "bindata timetzdata $TAGS"
|
||||||
ARG CGO_EXTRA_CFLAGS
|
ARG CGO_EXTRA_CFLAGS
|
||||||
|
|
||||||
#Build deps
|
# Build deps
|
||||||
RUN apk --no-cache add build-base git nodejs npm
|
RUN apk --no-cache add \
|
||||||
|
build-base \
|
||||||
|
git \
|
||||||
|
nodejs \
|
||||||
|
npm \
|
||||||
|
&& rm -rf /var/cache/apk/*
|
||||||
|
|
||||||
#Setup repo
|
# Setup repo
|
||||||
COPY . ${GOPATH}/src/code.gitea.io/gitea
|
COPY . ${GOPATH}/src/code.gitea.io/gitea
|
||||||
WORKDIR ${GOPATH}/src/code.gitea.io/gitea
|
WORKDIR ${GOPATH}/src/code.gitea.io/gitea
|
||||||
|
|
||||||
#Checkout version if set
|
# Checkout version if set
|
||||||
RUN if [ -n "${GITEA_VERSION}" ]; then git checkout "${GITEA_VERSION}"; fi \
|
RUN if [ -n "${GITEA_VERSION}" ]; then git checkout "${GITEA_VERSION}"; fi \
|
||||||
&& make clean-all build
|
&& make clean-all build
|
||||||
|
|
||||||
# Begin env-to-ini build
|
# Begin env-to-ini build
|
||||||
RUN go build contrib/environment-to-ini/environment-to-ini.go
|
RUN go build contrib/environment-to-ini/environment-to-ini.go
|
||||||
|
|
||||||
FROM docker.io/library/alpine:3.18
|
# Copy local files
|
||||||
|
COPY docker/root /tmp/local
|
||||||
|
|
||||||
|
# Set permissions
|
||||||
|
RUN chmod 755 /tmp/local/usr/bin/entrypoint \
|
||||||
|
/tmp/local/usr/local/bin/gitea \
|
||||||
|
/tmp/local/etc/s6/gitea/* \
|
||||||
|
/tmp/local/etc/s6/openssh/* \
|
||||||
|
/tmp/local/etc/s6/.s6-svscan/* \
|
||||||
|
/go/src/code.gitea.io/gitea/gitea \
|
||||||
|
/go/src/code.gitea.io/gitea/environment-to-ini
|
||||||
|
RUN chmod 644 /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete
|
||||||
|
|
||||||
|
FROM docker.io/library/alpine:3.19
|
||||||
LABEL maintainer="maintainers@gitea.io"
|
LABEL maintainer="maintainers@gitea.io"
|
||||||
|
|
||||||
EXPOSE 22 3000
|
EXPOSE 22 3000
|
||||||
|
@ -39,7 +57,8 @@ RUN apk --no-cache add \
|
||||||
s6 \
|
s6 \
|
||||||
sqlite \
|
sqlite \
|
||||||
su-exec \
|
su-exec \
|
||||||
gnupg
|
gnupg \
|
||||||
|
&& rm -rf /var/cache/apk/*
|
||||||
|
|
||||||
RUN addgroup \
|
RUN addgroup \
|
||||||
-S -g 1000 \
|
-S -g 1000 \
|
||||||
|
@ -61,10 +80,7 @@ VOLUME ["/data"]
|
||||||
ENTRYPOINT ["/usr/bin/entrypoint"]
|
ENTRYPOINT ["/usr/bin/entrypoint"]
|
||||||
CMD ["/bin/s6-svscan", "/etc/s6"]
|
CMD ["/bin/s6-svscan", "/etc/s6"]
|
||||||
|
|
||||||
COPY docker/root /
|
COPY --from=build-env /tmp/local /
|
||||||
COPY --from=build-env /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea
|
COPY --from=build-env /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea
|
||||||
COPY --from=build-env /go/src/code.gitea.io/gitea/environment-to-ini /usr/local/bin/environment-to-ini
|
COPY --from=build-env /go/src/code.gitea.io/gitea/environment-to-ini /usr/local/bin/environment-to-ini
|
||||||
COPY --from=build-env /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete /etc/profile.d/gitea_bash_autocomplete.sh
|
COPY --from=build-env /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete /etc/profile.d/gitea_bash_autocomplete.sh
|
||||||
RUN chmod 755 /usr/bin/entrypoint /app/gitea/gitea /usr/local/bin/gitea /usr/local/bin/environment-to-ini
|
|
||||||
RUN chmod 755 /etc/s6/gitea/* /etc/s6/openssh/* /etc/s6/.s6-svscan/*
|
|
||||||
RUN chmod 644 /etc/profile.d/gitea_bash_autocomplete.sh
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#Build stage
|
# Build stage
|
||||||
FROM docker.io/library/golang:1.21-alpine3.18 AS build-env
|
FROM docker.io/library/golang:1.22-alpine3.19 AS build-env
|
||||||
|
|
||||||
ARG GOPROXY
|
ARG GOPROXY
|
||||||
ENV GOPROXY ${GOPROXY:-direct}
|
ENV GOPROXY ${GOPROXY:-direct}
|
||||||
|
@ -10,20 +10,36 @@ ENV TAGS "bindata timetzdata $TAGS"
|
||||||
ARG CGO_EXTRA_CFLAGS
|
ARG CGO_EXTRA_CFLAGS
|
||||||
|
|
||||||
#Build deps
|
#Build deps
|
||||||
RUN apk --no-cache add build-base git nodejs npm
|
RUN apk --no-cache add \
|
||||||
|
build-base \
|
||||||
|
git \
|
||||||
|
nodejs \
|
||||||
|
npm \
|
||||||
|
&& rm -rf /var/cache/apk/*
|
||||||
|
|
||||||
#Setup repo
|
# Setup repo
|
||||||
COPY . ${GOPATH}/src/code.gitea.io/gitea
|
COPY . ${GOPATH}/src/code.gitea.io/gitea
|
||||||
WORKDIR ${GOPATH}/src/code.gitea.io/gitea
|
WORKDIR ${GOPATH}/src/code.gitea.io/gitea
|
||||||
|
|
||||||
#Checkout version if set
|
# Checkout version if set
|
||||||
RUN if [ -n "${GITEA_VERSION}" ]; then git checkout "${GITEA_VERSION}"; fi \
|
RUN if [ -n "${GITEA_VERSION}" ]; then git checkout "${GITEA_VERSION}"; fi \
|
||||||
&& make clean-all build
|
&& make clean-all build
|
||||||
|
|
||||||
# Begin env-to-ini build
|
# Begin env-to-ini build
|
||||||
RUN go build contrib/environment-to-ini/environment-to-ini.go
|
RUN go build contrib/environment-to-ini/environment-to-ini.go
|
||||||
|
|
||||||
FROM docker.io/library/alpine:3.18
|
# Copy local files
|
||||||
|
COPY docker/rootless /tmp/local
|
||||||
|
|
||||||
|
# Set permissions
|
||||||
|
RUN chmod 755 /tmp/local/usr/local/bin/docker-entrypoint.sh \
|
||||||
|
/tmp/local/usr/local/bin/docker-setup.sh \
|
||||||
|
/tmp/local/usr/local/bin/gitea \
|
||||||
|
/go/src/code.gitea.io/gitea/gitea \
|
||||||
|
/go/src/code.gitea.io/gitea/environment-to-ini
|
||||||
|
RUN chmod 644 /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete
|
||||||
|
|
||||||
|
FROM docker.io/library/alpine:3.19
|
||||||
LABEL maintainer="maintainers@gitea.io"
|
LABEL maintainer="maintainers@gitea.io"
|
||||||
|
|
||||||
EXPOSE 2222 3000
|
EXPOSE 2222 3000
|
||||||
|
@ -35,7 +51,8 @@ RUN apk --no-cache add \
|
||||||
gettext \
|
gettext \
|
||||||
git \
|
git \
|
||||||
curl \
|
curl \
|
||||||
gnupg
|
gnupg \
|
||||||
|
&& rm -rf /var/cache/apk/*
|
||||||
|
|
||||||
RUN addgroup \
|
RUN addgroup \
|
||||||
-S -g 1000 \
|
-S -g 1000 \
|
||||||
|
@ -51,21 +68,19 @@ RUN addgroup \
|
||||||
RUN mkdir -p /var/lib/gitea /etc/gitea
|
RUN mkdir -p /var/lib/gitea /etc/gitea
|
||||||
RUN chown git:git /var/lib/gitea /etc/gitea
|
RUN chown git:git /var/lib/gitea /etc/gitea
|
||||||
|
|
||||||
COPY docker/rootless /
|
COPY --from=build-env /tmp/local /
|
||||||
COPY --from=build-env --chown=root:root /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea
|
COPY --from=build-env --chown=root:root /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea
|
||||||
COPY --from=build-env --chown=root:root /go/src/code.gitea.io/gitea/environment-to-ini /usr/local/bin/environment-to-ini
|
COPY --from=build-env --chown=root:root /go/src/code.gitea.io/gitea/environment-to-ini /usr/local/bin/environment-to-ini
|
||||||
COPY --from=build-env /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete /etc/profile.d/gitea_bash_autocomplete.sh
|
COPY --from=build-env /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete /etc/profile.d/gitea_bash_autocomplete.sh
|
||||||
RUN chmod 755 /usr/local/bin/docker-entrypoint.sh /usr/local/bin/docker-setup.sh /app/gitea/gitea /usr/local/bin/gitea /usr/local/bin/environment-to-ini
|
|
||||||
RUN chmod 644 /etc/profile.d/gitea_bash_autocomplete.sh
|
|
||||||
|
|
||||||
#git:git
|
# git:git
|
||||||
USER 1000:1000
|
USER 1000:1000
|
||||||
ENV GITEA_WORK_DIR /var/lib/gitea
|
ENV GITEA_WORK_DIR /var/lib/gitea
|
||||||
ENV GITEA_CUSTOM /var/lib/gitea/custom
|
ENV GITEA_CUSTOM /var/lib/gitea/custom
|
||||||
ENV GITEA_TEMP /tmp/gitea
|
ENV GITEA_TEMP /tmp/gitea
|
||||||
ENV TMPDIR /tmp/gitea
|
ENV TMPDIR /tmp/gitea
|
||||||
|
|
||||||
#TODO add to docs the ability to define the ini to load (useful to test and revert a config)
|
# TODO add to docs the ability to define the ini to load (useful to test and revert a config)
|
||||||
ENV GITEA_APP_INI /etc/gitea/app.ini
|
ENV GITEA_APP_INI /etc/gitea/app.ini
|
||||||
ENV HOME "/var/lib/gitea/git"
|
ENV HOME "/var/lib/gitea/git"
|
||||||
VOLUME ["/var/lib/gitea", "/etc/gitea"]
|
VOLUME ["/var/lib/gitea", "/etc/gitea"]
|
||||||
|
@ -73,4 +88,3 @@ WORKDIR /var/lib/gitea
|
||||||
|
|
||||||
ENTRYPOINT ["/usr/bin/dumb-init", "--", "/usr/local/bin/docker-entrypoint.sh"]
|
ENTRYPOINT ["/usr/bin/dumb-init", "--", "/usr/local/bin/docker-entrypoint.sh"]
|
||||||
CMD []
|
CMD []
|
||||||
|
|
||||||
|
|
|
@ -55,3 +55,9 @@ Philip Peterson <philip.c.peterson@gmail.com> (@philip-peterson)
|
||||||
Denys Konovalov <kontakt@denyskon.de> (@denyskon)
|
Denys Konovalov <kontakt@denyskon.de> (@denyskon)
|
||||||
Punit Inani <punitinani1@gmail.com> (@puni9869)
|
Punit Inani <punitinani1@gmail.com> (@puni9869)
|
||||||
CaiCandong <1290147055@qq.com> (@caicandong)
|
CaiCandong <1290147055@qq.com> (@caicandong)
|
||||||
|
Rui Chen <rui@chenrui.dev> (@chenrui333)
|
||||||
|
Nanguan Lin <nanguanlin6@gmail.com> (@lng2020)
|
||||||
|
kerwin612 <kerwin612@qq.com> (@kerwin612)
|
||||||
|
Gary Wang <git@blumia.net> (@BLumia)
|
||||||
|
Tim-Niclas Oelschläger <zokki.softwareschmiede@gmail.com> (@zokkis)
|
||||||
|
Yu Liu <1240335630@qq.com> (@HEREYUA)
|
||||||
|
|
194
Makefile
194
Makefile
|
@ -23,36 +23,37 @@ SHASUM ?= shasum -a 256
|
||||||
HAS_GO := $(shell hash $(GO) > /dev/null 2>&1 && echo yes)
|
HAS_GO := $(shell hash $(GO) > /dev/null 2>&1 && echo yes)
|
||||||
COMMA := ,
|
COMMA := ,
|
||||||
|
|
||||||
XGO_VERSION := go-1.21.x
|
XGO_VERSION := go-1.22.x
|
||||||
|
|
||||||
AIR_PACKAGE ?= github.com/cosmtrek/air@v1.44.0
|
AIR_PACKAGE ?= github.com/cosmtrek/air@v1.49.0
|
||||||
EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-checker/cmd/editorconfig-checker@2.7.0
|
EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-checker/cmd/editorconfig-checker@2.7.0
|
||||||
GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.5.0
|
GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.6.0
|
||||||
GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/cmd/golangci-lint@v1.54.1
|
GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/cmd/golangci-lint@v1.56.1
|
||||||
GXZ_PACKAGE ?= github.com/ulikunitz/xz/cmd/gxz@v0.5.11
|
GXZ_PACKAGE ?= github.com/ulikunitz/xz/cmd/gxz@v0.5.11
|
||||||
MISSPELL_PACKAGE ?= github.com/client9/misspell/cmd/misspell@v0.3.4
|
MISSPELL_PACKAGE ?= github.com/golangci/misspell/cmd/misspell@v0.4.1
|
||||||
SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.30.5
|
SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@db51e79a0e37c572d8b59ae0c58bf2bbbbe53285
|
||||||
XGO_PACKAGE ?= src.techknowlogick.com/xgo@latest
|
XGO_PACKAGE ?= src.techknowlogick.com/xgo@latest
|
||||||
GO_LICENSES_PACKAGE ?= github.com/google/go-licenses@v1.6.0
|
GO_LICENSES_PACKAGE ?= github.com/google/go-licenses@v1.6.0
|
||||||
GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@v1.0.1
|
GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@v1.0.3
|
||||||
ACTIONLINT_PACKAGE ?= github.com/rhysd/actionlint/cmd/actionlint@v1.6.25
|
ACTIONLINT_PACKAGE ?= github.com/rhysd/actionlint/cmd/actionlint@v1.6.26
|
||||||
|
|
||||||
DOCKER_IMAGE ?= gitea/gitea
|
DOCKER_IMAGE ?= gitea/gitea
|
||||||
DOCKER_TAG ?= latest
|
DOCKER_TAG ?= latest
|
||||||
DOCKER_REF := $(DOCKER_IMAGE):$(DOCKER_TAG)
|
DOCKER_REF := $(DOCKER_IMAGE):$(DOCKER_TAG)
|
||||||
|
|
||||||
ifeq ($(HAS_GO), yes)
|
ifeq ($(HAS_GO), yes)
|
||||||
GOPATH ?= $(shell $(GO) env GOPATH)
|
|
||||||
export PATH := $(GOPATH)/bin:$(PATH)
|
|
||||||
|
|
||||||
CGO_EXTRA_CFLAGS := -DSQLITE_MAX_VARIABLE_NUMBER=32766
|
CGO_EXTRA_CFLAGS := -DSQLITE_MAX_VARIABLE_NUMBER=32766
|
||||||
CGO_CFLAGS ?= $(shell $(GO) env CGO_CFLAGS) $(CGO_EXTRA_CFLAGS)
|
CGO_CFLAGS ?= $(shell $(GO) env CGO_CFLAGS) $(CGO_EXTRA_CFLAGS)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(OS), Windows_NT)
|
ifeq ($(GOOS),windows)
|
||||||
GOFLAGS := -v -buildmode=exe
|
IS_WINDOWS := yes
|
||||||
EXECUTABLE ?= gitea.exe
|
else ifeq ($(patsubst Windows%,Windows,$(OS)),Windows)
|
||||||
else ifeq ($(OS), Windows)
|
ifeq ($(GOOS),)
|
||||||
|
IS_WINDOWS := yes
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
ifeq ($(IS_WINDOWS),yes)
|
||||||
GOFLAGS := -v -buildmode=exe
|
GOFLAGS := -v -buildmode=exe
|
||||||
EXECUTABLE ?= gitea.exe
|
EXECUTABLE ?= gitea.exe
|
||||||
else
|
else
|
||||||
|
@ -111,13 +112,14 @@ LINUX_ARCHS ?= linux/amd64,linux/386,linux/arm-5,linux/arm-6,linux/arm64
|
||||||
|
|
||||||
GO_PACKAGES ?= $(filter-out code.gitea.io/gitea/tests/integration/migration-test code.gitea.io/gitea/tests code.gitea.io/gitea/tests/integration code.gitea.io/gitea/tests/e2e,$(shell $(GO) list ./... | grep -v /vendor/))
|
GO_PACKAGES ?= $(filter-out code.gitea.io/gitea/tests/integration/migration-test code.gitea.io/gitea/tests code.gitea.io/gitea/tests/integration code.gitea.io/gitea/tests/e2e,$(shell $(GO) list ./... | grep -v /vendor/))
|
||||||
GO_TEST_PACKAGES ?= $(filter-out $(shell $(GO) list code.gitea.io/gitea/models/migrations/...) code.gitea.io/gitea/tests/integration/migration-test code.gitea.io/gitea/tests code.gitea.io/gitea/tests/integration code.gitea.io/gitea/tests/e2e,$(shell $(GO) list ./... | grep -v /vendor/))
|
GO_TEST_PACKAGES ?= $(filter-out $(shell $(GO) list code.gitea.io/gitea/models/migrations/...) code.gitea.io/gitea/tests/integration/migration-test code.gitea.io/gitea/tests code.gitea.io/gitea/tests/integration code.gitea.io/gitea/tests/e2e,$(shell $(GO) list ./... | grep -v /vendor/))
|
||||||
|
MIGRATE_TEST_PACKAGES ?= $(shell $(GO) list code.gitea.io/gitea/models/migrations/...)
|
||||||
|
|
||||||
FOMANTIC_WORK_DIR := web_src/fomantic
|
FOMANTIC_WORK_DIR := web_src/fomantic
|
||||||
|
|
||||||
WEBPACK_SOURCES := $(shell find web_src/js web_src/css -type f)
|
WEBPACK_SOURCES := $(shell find web_src/js web_src/css -type f)
|
||||||
WEBPACK_CONFIGS := webpack.config.js
|
WEBPACK_CONFIGS := webpack.config.js tailwind.config.js
|
||||||
WEBPACK_DEST := public/assets/js/index.js public/assets/css/index.css
|
WEBPACK_DEST := public/assets/js/index.js public/assets/css/index.css
|
||||||
WEBPACK_DEST_ENTRIES := public/assets/js public/assets/css public/assets/fonts public/assets/img/webpack
|
WEBPACK_DEST_ENTRIES := public/assets/js public/assets/css public/assets/fonts
|
||||||
|
|
||||||
BINDATA_DEST := modules/public/bindata.go modules/options/bindata.go modules/templates/bindata.go
|
BINDATA_DEST := modules/public/bindata.go modules/options/bindata.go modules/templates/bindata.go
|
||||||
BINDATA_HASH := $(addsuffix .hash,$(BINDATA_DEST))
|
BINDATA_HASH := $(addsuffix .hash,$(BINDATA_DEST))
|
||||||
|
@ -142,6 +144,11 @@ TAR_EXCLUDES := .git data indexers queues log node_modules $(EXECUTABLE) $(FOMAN
|
||||||
GO_DIRS := build cmd models modules routers services tests
|
GO_DIRS := build cmd models modules routers services tests
|
||||||
WEB_DIRS := web_src/js web_src/css
|
WEB_DIRS := web_src/js web_src/css
|
||||||
|
|
||||||
|
ESLINT_FILES := web_src/js tools *.config.js tests/e2e
|
||||||
|
STYLELINT_FILES := web_src/css web_src/js/components/*.vue
|
||||||
|
SPELLCHECK_FILES := $(GO_DIRS) $(WEB_DIRS) docs/content templates options/locale/locale_en-US.ini .github
|
||||||
|
EDITORCONFIG_FILES := templates .github/workflows options/locale/locale_en-US.ini
|
||||||
|
|
||||||
GO_SOURCES := $(wildcard *.go)
|
GO_SOURCES := $(wildcard *.go)
|
||||||
GO_SOURCES += $(shell find $(GO_DIRS) -type f -name "*.go" ! -path modules/options/bindata.go ! -path modules/public/bindata.go ! -path modules/templates/bindata.go)
|
GO_SOURCES += $(shell find $(GO_DIRS) -type f -name "*.go" ! -path modules/options/bindata.go ! -path modules/public/bindata.go ! -path modules/templates/bindata.go)
|
||||||
GO_SOURCES += $(GENERATED_GO_DEST)
|
GO_SOURCES += $(GENERATED_GO_DEST)
|
||||||
|
@ -158,8 +165,8 @@ ifdef DEPS_PLAYWRIGHT
|
||||||
endif
|
endif
|
||||||
|
|
||||||
SWAGGER_SPEC := templates/swagger/v1_json.tmpl
|
SWAGGER_SPEC := templates/swagger/v1_json.tmpl
|
||||||
SWAGGER_SPEC_S_TMPL := s|"basePath": *"/api/v1"|"basePath": "{{AppSubUrl \| JSEscape \| Safe}}/api/v1"|g
|
SWAGGER_SPEC_S_TMPL := s|"basePath": *"/api/v1"|"basePath": "{{AppSubUrl \| JSEscape}}/api/v1"|g
|
||||||
SWAGGER_SPEC_S_JSON := s|"basePath": *"{{AppSubUrl \| JSEscape \| Safe}}/api/v1"|"basePath": "/api/v1"|g
|
SWAGGER_SPEC_S_JSON := s|"basePath": *"{{AppSubUrl \| JSEscape}}/api/v1"|"basePath": "/api/v1"|g
|
||||||
SWAGGER_EXCLUDE := code.gitea.io/sdk
|
SWAGGER_EXCLUDE := code.gitea.io/sdk
|
||||||
SWAGGER_NEWLINE_COMMAND := -e '$$a\'
|
SWAGGER_NEWLINE_COMMAND := -e '$$a\'
|
||||||
|
|
||||||
|
@ -167,10 +174,6 @@ TEST_MYSQL_HOST ?= mysql:3306
|
||||||
TEST_MYSQL_DBNAME ?= testgitea
|
TEST_MYSQL_DBNAME ?= testgitea
|
||||||
TEST_MYSQL_USERNAME ?= root
|
TEST_MYSQL_USERNAME ?= root
|
||||||
TEST_MYSQL_PASSWORD ?=
|
TEST_MYSQL_PASSWORD ?=
|
||||||
TEST_MYSQL8_HOST ?= mysql8:3306
|
|
||||||
TEST_MYSQL8_DBNAME ?= testgitea
|
|
||||||
TEST_MYSQL8_USERNAME ?= root
|
|
||||||
TEST_MYSQL8_PASSWORD ?=
|
|
||||||
TEST_PGSQL_HOST ?= pgsql:5432
|
TEST_PGSQL_HOST ?= pgsql:5432
|
||||||
TEST_PGSQL_DBNAME ?= testgitea
|
TEST_PGSQL_DBNAME ?= testgitea
|
||||||
TEST_PGSQL_USERNAME ?= postgres
|
TEST_PGSQL_USERNAME ?= postgres
|
||||||
|
@ -218,6 +221,9 @@ help:
|
||||||
@echo " - lint-md lint markdown files"
|
@echo " - lint-md lint markdown files"
|
||||||
@echo " - lint-swagger lint swagger files"
|
@echo " - lint-swagger lint swagger files"
|
||||||
@echo " - lint-templates lint template files"
|
@echo " - lint-templates lint template files"
|
||||||
|
@echo " - lint-yaml lint yaml files"
|
||||||
|
@echo " - lint-spell lint spelling"
|
||||||
|
@echo " - lint-spell-fix lint spelling and fix issues"
|
||||||
@echo " - checks run various consistency checks"
|
@echo " - checks run various consistency checks"
|
||||||
@echo " - checks-frontend check frontend files"
|
@echo " - checks-frontend check frontend files"
|
||||||
@echo " - checks-backend check backend files"
|
@echo " - checks-backend check backend files"
|
||||||
|
@ -225,6 +231,7 @@ help:
|
||||||
@echo " - test-frontend test frontend files"
|
@echo " - test-frontend test frontend files"
|
||||||
@echo " - test-backend test backend files"
|
@echo " - test-backend test backend files"
|
||||||
@echo " - test-e2e[\#TestSpecificName] test end to end using playwright"
|
@echo " - test-e2e[\#TestSpecificName] test end to end using playwright"
|
||||||
|
@echo " - update update js and py dependencies"
|
||||||
@echo " - update-js update js dependencies"
|
@echo " - update-js update js dependencies"
|
||||||
@echo " - update-py update py dependencies"
|
@echo " - update-py update py dependencies"
|
||||||
@echo " - webpack build webpack files"
|
@echo " - webpack build webpack files"
|
||||||
|
@ -276,16 +283,15 @@ clean-all: clean
|
||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
clean:
|
clean:
|
||||||
$(GO) clean -i ./...
|
|
||||||
rm -rf $(EXECUTABLE) $(DIST) $(BINDATA_DEST) $(BINDATA_HASH) \
|
rm -rf $(EXECUTABLE) $(DIST) $(BINDATA_DEST) $(BINDATA_HASH) \
|
||||||
integrations*.test \
|
integrations*.test \
|
||||||
e2e*.test \
|
e2e*.test \
|
||||||
tests/integration/gitea-integration-pgsql/ tests/integration/gitea-integration-mysql/ tests/integration/gitea-integration-mysql8/ tests/integration/gitea-integration-sqlite/ \
|
tests/integration/gitea-integration-* \
|
||||||
tests/integration/gitea-integration-mssql/ tests/integration/indexers-mysql/ tests/integration/indexers-mysql8/ tests/integration/indexers-pgsql tests/integration/indexers-sqlite \
|
tests/integration/indexers-* \
|
||||||
tests/integration/indexers-mssql tests/mysql.ini tests/mysql8.ini tests/pgsql.ini tests/mssql.ini man/ \
|
tests/mysql.ini tests/pgsql.ini tests/mssql.ini man/ \
|
||||||
tests/e2e/gitea-e2e-pgsql/ tests/e2e/gitea-e2e-mysql/ tests/e2e/gitea-e2e-mysql8/ tests/e2e/gitea-e2e-sqlite/ \
|
tests/e2e/gitea-e2e-*/ \
|
||||||
tests/e2e/gitea-e2e-mssql/ tests/e2e/indexers-mysql/ tests/e2e/indexers-mysql8/ tests/e2e/indexers-pgsql/ tests/e2e/indexers-sqlite/ \
|
tests/e2e/indexers-*/ \
|
||||||
tests/e2e/indexers-mssql/ tests/e2e/reports/ tests/e2e/test-artifacts/ tests/e2e/test-snapshots/
|
tests/e2e/reports/ tests/e2e/test-artifacts/ tests/e2e/test-snapshots/
|
||||||
|
|
||||||
.PHONY: fmt
|
.PHONY: fmt
|
||||||
fmt:
|
fmt:
|
||||||
|
@ -307,10 +313,6 @@ fmt-check: fmt
|
||||||
exit 1; \
|
exit 1; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
.PHONY: misspell-check
|
|
||||||
misspell-check:
|
|
||||||
go run $(MISSPELL_PACKAGE) -error $(GO_DIRS) $(WEB_DIRS)
|
|
||||||
|
|
||||||
.PHONY: $(TAGS_EVIDENCE)
|
.PHONY: $(TAGS_EVIDENCE)
|
||||||
$(TAGS_EVIDENCE):
|
$(TAGS_EVIDENCE):
|
||||||
@mkdir -p $(MAKE_EVIDENCE_DIR)
|
@mkdir -p $(MAKE_EVIDENCE_DIR)
|
||||||
|
@ -350,13 +352,13 @@ checks: checks-frontend checks-backend
|
||||||
checks-frontend: lockfile-check svg-check
|
checks-frontend: lockfile-check svg-check
|
||||||
|
|
||||||
.PHONY: checks-backend
|
.PHONY: checks-backend
|
||||||
checks-backend: tidy-check swagger-check fmt-check misspell-check swagger-validate security-check
|
checks-backend: tidy-check swagger-check fmt-check swagger-validate security-check
|
||||||
|
|
||||||
.PHONY: lint
|
.PHONY: lint
|
||||||
lint: lint-frontend lint-backend
|
lint: lint-frontend lint-backend lint-spell
|
||||||
|
|
||||||
.PHONY: lint-fix
|
.PHONY: lint-fix
|
||||||
lint-fix: lint-frontend-fix lint-backend-fix
|
lint-fix: lint-frontend-fix lint-backend-fix lint-spell-fix
|
||||||
|
|
||||||
.PHONY: lint-frontend
|
.PHONY: lint-frontend
|
||||||
lint-frontend: lint-js lint-css
|
lint-frontend: lint-js lint-css
|
||||||
|
@ -372,19 +374,19 @@ lint-backend-fix: lint-go-fix lint-go-vet lint-editorconfig
|
||||||
|
|
||||||
.PHONY: lint-js
|
.PHONY: lint-js
|
||||||
lint-js: node_modules
|
lint-js: node_modules
|
||||||
npx eslint --color --max-warnings=0 --ext js,vue web_src/js build *.config.js tests/e2e
|
npx eslint --color --max-warnings=0 --ext js,vue $(ESLINT_FILES)
|
||||||
|
|
||||||
.PHONY: lint-js-fix
|
.PHONY: lint-js-fix
|
||||||
lint-js-fix: node_modules
|
lint-js-fix: node_modules
|
||||||
npx eslint --color --max-warnings=0 --ext js,vue web_src/js build *.config.js tests/e2e --fix
|
npx eslint --color --max-warnings=0 --ext js,vue $(ESLINT_FILES) --fix
|
||||||
|
|
||||||
.PHONY: lint-css
|
.PHONY: lint-css
|
||||||
lint-css: node_modules
|
lint-css: node_modules
|
||||||
npx stylelint --color --max-warnings=0 web_src/css web_src/js/components/*.vue
|
npx stylelint --color --max-warnings=0 $(STYLELINT_FILES)
|
||||||
|
|
||||||
.PHONY: lint-css-fix
|
.PHONY: lint-css-fix
|
||||||
lint-css-fix: node_modules
|
lint-css-fix: node_modules
|
||||||
npx stylelint --color --max-warnings=0 web_src/css web_src/js/components/*.vue --fix
|
npx stylelint --color --max-warnings=0 $(STYLELINT_FILES) --fix
|
||||||
|
|
||||||
.PHONY: lint-swagger
|
.PHONY: lint-swagger
|
||||||
lint-swagger: node_modules
|
lint-swagger: node_modules
|
||||||
|
@ -394,6 +396,14 @@ lint-swagger: node_modules
|
||||||
lint-md: node_modules
|
lint-md: node_modules
|
||||||
npx markdownlint docs *.md
|
npx markdownlint docs *.md
|
||||||
|
|
||||||
|
.PHONY: lint-spell
|
||||||
|
lint-spell:
|
||||||
|
@go run $(MISSPELL_PACKAGE) -error $(SPELLCHECK_FILES)
|
||||||
|
|
||||||
|
.PHONY: lint-spell-fix
|
||||||
|
lint-spell-fix:
|
||||||
|
@go run $(MISSPELL_PACKAGE) -w $(SPELLCHECK_FILES)
|
||||||
|
|
||||||
.PHONY: lint-go
|
.PHONY: lint-go
|
||||||
lint-go:
|
lint-go:
|
||||||
$(GO) run $(GOLANGCI_LINT_PACKAGE) run
|
$(GO) run $(GOLANGCI_LINT_PACKAGE) run
|
||||||
|
@ -417,19 +427,24 @@ lint-go-vet:
|
||||||
|
|
||||||
.PHONY: lint-editorconfig
|
.PHONY: lint-editorconfig
|
||||||
lint-editorconfig:
|
lint-editorconfig:
|
||||||
$(GO) run $(EDITORCONFIG_CHECKER_PACKAGE) templates .github/workflows
|
@$(GO) run $(EDITORCONFIG_CHECKER_PACKAGE) $(EDITORCONFIG_FILES)
|
||||||
|
|
||||||
.PHONY: lint-actions
|
.PHONY: lint-actions
|
||||||
lint-actions:
|
lint-actions:
|
||||||
$(GO) run $(ACTIONLINT_PACKAGE)
|
$(GO) run $(ACTIONLINT_PACKAGE)
|
||||||
|
|
||||||
.PHONY: lint-templates
|
.PHONY: lint-templates
|
||||||
lint-templates: .venv
|
lint-templates: .venv node_modules
|
||||||
|
@node tools/lint-templates-svg.js
|
||||||
@poetry run djlint $(shell find templates -type f -iname '*.tmpl')
|
@poetry run djlint $(shell find templates -type f -iname '*.tmpl')
|
||||||
|
|
||||||
|
.PHONY: lint-yaml
|
||||||
|
lint-yaml: .venv
|
||||||
|
@poetry run yamllint .
|
||||||
|
|
||||||
.PHONY: watch
|
.PHONY: watch
|
||||||
watch:
|
watch:
|
||||||
@bash build/watch.sh
|
@bash tools/watch.sh
|
||||||
|
|
||||||
.PHONY: watch-frontend
|
.PHONY: watch-frontend
|
||||||
watch-frontend: node-check node_modules
|
watch-frontend: node-check node_modules
|
||||||
|
@ -545,27 +560,6 @@ test-mysql\#%: integrations.mysql.test generate-ini-mysql
|
||||||
.PHONY: test-mysql-migration
|
.PHONY: test-mysql-migration
|
||||||
test-mysql-migration: migrations.mysql.test migrations.individual.mysql.test
|
test-mysql-migration: migrations.mysql.test migrations.individual.mysql.test
|
||||||
|
|
||||||
generate-ini-mysql8:
|
|
||||||
sed -e 's|{{TEST_MYSQL8_HOST}}|${TEST_MYSQL8_HOST}|g' \
|
|
||||||
-e 's|{{TEST_MYSQL8_DBNAME}}|${TEST_MYSQL8_DBNAME}|g' \
|
|
||||||
-e 's|{{TEST_MYSQL8_USERNAME}}|${TEST_MYSQL8_USERNAME}|g' \
|
|
||||||
-e 's|{{TEST_MYSQL8_PASSWORD}}|${TEST_MYSQL8_PASSWORD}|g' \
|
|
||||||
-e 's|{{REPO_TEST_DIR}}|${REPO_TEST_DIR}|g' \
|
|
||||||
-e 's|{{TEST_LOGGER}}|$(or $(TEST_LOGGER),test$(COMMA)file)|g' \
|
|
||||||
-e 's|{{TEST_TYPE}}|$(or $(TEST_TYPE),integration)|g' \
|
|
||||||
tests/mysql8.ini.tmpl > tests/mysql8.ini
|
|
||||||
|
|
||||||
.PHONY: test-mysql8
|
|
||||||
test-mysql8: integrations.mysql8.test generate-ini-mysql8
|
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql8.ini ./integrations.mysql8.test
|
|
||||||
|
|
||||||
.PHONY: test-mysql8\#%
|
|
||||||
test-mysql8\#%: integrations.mysql8.test generate-ini-mysql8
|
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql8.ini ./integrations.mysql8.test -test.run $(subst .,/,$*)
|
|
||||||
|
|
||||||
.PHONY: test-mysql8-migration
|
|
||||||
test-mysql8-migration: migrations.mysql8.test migrations.individual.mysql8.test
|
|
||||||
|
|
||||||
generate-ini-pgsql:
|
generate-ini-pgsql:
|
||||||
sed -e 's|{{TEST_PGSQL_HOST}}|${TEST_PGSQL_HOST}|g' \
|
sed -e 's|{{TEST_PGSQL_HOST}}|${TEST_PGSQL_HOST}|g' \
|
||||||
-e 's|{{TEST_PGSQL_DBNAME}}|${TEST_PGSQL_DBNAME}|g' \
|
-e 's|{{TEST_PGSQL_DBNAME}}|${TEST_PGSQL_DBNAME}|g' \
|
||||||
|
@ -610,8 +604,7 @@ test-mssql\#%: integrations.mssql.test generate-ini-mssql
|
||||||
test-mssql-migration: migrations.mssql.test migrations.individual.mssql.test
|
test-mssql-migration: migrations.mssql.test migrations.individual.mssql.test
|
||||||
|
|
||||||
.PHONY: playwright
|
.PHONY: playwright
|
||||||
playwright: $(PLAYWRIGHT_DIR)
|
playwright: deps-frontend
|
||||||
npm install --no-save @playwright/test
|
|
||||||
npx playwright install $(PLAYWRIGHT_FLAGS)
|
npx playwright install $(PLAYWRIGHT_FLAGS)
|
||||||
|
|
||||||
.PHONY: test-e2e%
|
.PHONY: test-e2e%
|
||||||
|
@ -638,14 +631,6 @@ test-e2e-mysql: playwright e2e.mysql.test generate-ini-mysql
|
||||||
test-e2e-mysql\#%: playwright e2e.mysql.test generate-ini-mysql
|
test-e2e-mysql\#%: playwright e2e.mysql.test generate-ini-mysql
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini ./e2e.mysql.test -test.run TestE2e/$*
|
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini ./e2e.mysql.test -test.run TestE2e/$*
|
||||||
|
|
||||||
.PHONY: test-e2e-mysql8
|
|
||||||
test-e2e-mysql8: playwright e2e.mysql8.test generate-ini-mysql8
|
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql8.ini ./e2e.mysql8.test
|
|
||||||
|
|
||||||
.PHONY: test-e2e-mysql8\#%
|
|
||||||
test-e2e-mysql8\#%: playwright e2e.mysql8.test generate-ini-mysql8
|
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql8.ini ./e2e.mysql8.test -test.run TestE2e/$*
|
|
||||||
|
|
||||||
.PHONY: test-e2e-pgsql
|
.PHONY: test-e2e-pgsql
|
||||||
test-e2e-pgsql: playwright e2e.pgsql.test generate-ini-pgsql
|
test-e2e-pgsql: playwright e2e.pgsql.test generate-ini-pgsql
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini ./e2e.pgsql.test
|
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini ./e2e.pgsql.test
|
||||||
|
@ -689,9 +674,6 @@ integration-test-coverage-sqlite: integrations.cover.sqlite.test generate-ini-sq
|
||||||
integrations.mysql.test: git-check $(GO_SOURCES)
|
integrations.mysql.test: git-check $(GO_SOURCES)
|
||||||
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration -o integrations.mysql.test
|
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration -o integrations.mysql.test
|
||||||
|
|
||||||
integrations.mysql8.test: git-check $(GO_SOURCES)
|
|
||||||
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration -o integrations.mysql8.test
|
|
||||||
|
|
||||||
integrations.pgsql.test: git-check $(GO_SOURCES)
|
integrations.pgsql.test: git-check $(GO_SOURCES)
|
||||||
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration -o integrations.pgsql.test
|
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration -o integrations.pgsql.test
|
||||||
|
|
||||||
|
@ -712,11 +694,6 @@ migrations.mysql.test: $(GO_SOURCES) generate-ini-mysql
|
||||||
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration/migration-test -o migrations.mysql.test
|
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration/migration-test -o migrations.mysql.test
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini ./migrations.mysql.test
|
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini ./migrations.mysql.test
|
||||||
|
|
||||||
.PHONY: migrations.mysql8.test
|
|
||||||
migrations.mysql8.test: $(GO_SOURCES) generate-ini-mysql8
|
|
||||||
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration/migration-test -o migrations.mysql8.test
|
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql8.ini ./migrations.mysql8.test
|
|
||||||
|
|
||||||
.PHONY: migrations.pgsql.test
|
.PHONY: migrations.pgsql.test
|
||||||
migrations.pgsql.test: $(GO_SOURCES) generate-ini-pgsql
|
migrations.pgsql.test: $(GO_SOURCES) generate-ini-pgsql
|
||||||
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration/migration-test -o migrations.pgsql.test
|
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration/migration-test -o migrations.pgsql.test
|
||||||
|
@ -734,36 +711,23 @@ migrations.sqlite.test: $(GO_SOURCES) generate-ini-sqlite
|
||||||
|
|
||||||
.PHONY: migrations.individual.mysql.test
|
.PHONY: migrations.individual.mysql.test
|
||||||
migrations.individual.mysql.test: $(GO_SOURCES)
|
migrations.individual.mysql.test: $(GO_SOURCES)
|
||||||
for pkg in $(shell $(GO) list code.gitea.io/gitea/models/migrations/...); do \
|
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini $(GO) test $(GOTESTFLAGS) -tags='$(TEST_TAGS)' -p 1 $(MIGRATE_TEST_PACKAGES)
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' $$pkg; \
|
|
||||||
done
|
|
||||||
|
|
||||||
.PHONY: migrations.individual.mysql8.test
|
.PHONY: migrations.individual.sqlite.test\#%
|
||||||
migrations.individual.mysql8.test: $(GO_SOURCES)
|
|
||||||
for pkg in $(shell $(GO) list code.gitea.io/gitea/models/migrations/...); do \
|
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql8.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' $$pkg; \
|
|
||||||
done
|
|
||||||
|
|
||||||
.PHONY: migrations.individual.mysql8.test\#%
|
|
||||||
migrations.individual.sqlite.test\#%: $(GO_SOURCES) generate-ini-sqlite
|
migrations.individual.sqlite.test\#%: $(GO_SOURCES) generate-ini-sqlite
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' code.gitea.io/gitea/models/migrations/$*
|
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' code.gitea.io/gitea/models/migrations/$*
|
||||||
|
|
||||||
.PHONY: migrations.individual.pgsql.test
|
.PHONY: migrations.individual.pgsql.test
|
||||||
migrations.individual.pgsql.test: $(GO_SOURCES)
|
migrations.individual.pgsql.test: $(GO_SOURCES)
|
||||||
for pkg in $(shell $(GO) list code.gitea.io/gitea/models/migrations/...); do \
|
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini $(GO) test $(GOTESTFLAGS) -tags='$(TEST_TAGS)' -p 1 $(MIGRATE_TEST_PACKAGES)
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' $$pkg; \
|
|
||||||
done
|
|
||||||
|
|
||||||
.PHONY: migrations.individual.pgsql.test\#%
|
.PHONY: migrations.individual.pgsql.test\#%
|
||||||
migrations.individual.pgsql.test\#%: $(GO_SOURCES) generate-ini-pgsql
|
migrations.individual.pgsql.test\#%: $(GO_SOURCES) generate-ini-pgsql
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' code.gitea.io/gitea/models/migrations/$*
|
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' code.gitea.io/gitea/models/migrations/$*
|
||||||
|
|
||||||
|
|
||||||
.PHONY: migrations.individual.mssql.test
|
.PHONY: migrations.individual.mssql.test
|
||||||
migrations.individual.mssql.test: $(GO_SOURCES) generate-ini-mssql
|
migrations.individual.mssql.test: $(GO_SOURCES) generate-ini-mssql
|
||||||
for pkg in $(shell $(GO) list code.gitea.io/gitea/models/migrations/...); do \
|
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mssql.ini $(GO) test $(GOTESTFLAGS) -tags='$(TEST_TAGS)' -p 1 $(MIGRATE_TEST_PACKAGES)
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mssql.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' $$pkg -test.failfast; \
|
|
||||||
done
|
|
||||||
|
|
||||||
.PHONY: migrations.individual.mssql.test\#%
|
.PHONY: migrations.individual.mssql.test\#%
|
||||||
migrations.individual.mssql.test\#%: $(GO_SOURCES) generate-ini-mssql
|
migrations.individual.mssql.test\#%: $(GO_SOURCES) generate-ini-mssql
|
||||||
|
@ -771,9 +735,7 @@ migrations.individual.mssql.test\#%: $(GO_SOURCES) generate-ini-mssql
|
||||||
|
|
||||||
.PHONY: migrations.individual.sqlite.test
|
.PHONY: migrations.individual.sqlite.test
|
||||||
migrations.individual.sqlite.test: $(GO_SOURCES) generate-ini-sqlite
|
migrations.individual.sqlite.test: $(GO_SOURCES) generate-ini-sqlite
|
||||||
for pkg in $(shell $(GO) list code.gitea.io/gitea/models/migrations/...); do \
|
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini $(GO) test $(GOTESTFLAGS) -tags='$(TEST_TAGS)' -p 1 $(MIGRATE_TEST_PACKAGES)
|
||||||
GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' $$pkg; \
|
|
||||||
done
|
|
||||||
|
|
||||||
.PHONY: migrations.individual.sqlite.test\#%
|
.PHONY: migrations.individual.sqlite.test\#%
|
||||||
migrations.individual.sqlite.test\#%: $(GO_SOURCES) generate-ini-sqlite
|
migrations.individual.sqlite.test\#%: $(GO_SOURCES) generate-ini-sqlite
|
||||||
|
@ -782,9 +744,6 @@ migrations.individual.sqlite.test\#%: $(GO_SOURCES) generate-ini-sqlite
|
||||||
e2e.mysql.test: $(GO_SOURCES)
|
e2e.mysql.test: $(GO_SOURCES)
|
||||||
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/e2e -o e2e.mysql.test
|
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/e2e -o e2e.mysql.test
|
||||||
|
|
||||||
e2e.mysql8.test: $(GO_SOURCES)
|
|
||||||
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/e2e -o e2e.mysql8.test
|
|
||||||
|
|
||||||
e2e.pgsql.test: $(GO_SOURCES)
|
e2e.pgsql.test: $(GO_SOURCES)
|
||||||
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/e2e -o e2e.pgsql.test
|
$(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/e2e -o e2e.pgsql.test
|
||||||
|
|
||||||
|
@ -880,10 +839,6 @@ release-sources: | $(DIST_DIRS)
|
||||||
release-docs: | $(DIST_DIRS) docs
|
release-docs: | $(DIST_DIRS) docs
|
||||||
tar -czf $(DIST)/release/gitea-docs-$(VERSION).tar.gz -C ./docs .
|
tar -czf $(DIST)/release/gitea-docs-$(VERSION).tar.gz -C ./docs .
|
||||||
|
|
||||||
.PHONY: docs
|
|
||||||
docs:
|
|
||||||
cd docs; bash scripts/trans-copy.sh;
|
|
||||||
|
|
||||||
.PHONY: deps
|
.PHONY: deps
|
||||||
deps: deps-frontend deps-backend deps-tools deps-py
|
deps: deps-frontend deps-backend deps-tools deps-py
|
||||||
|
|
||||||
|
@ -916,9 +871,12 @@ node_modules: package-lock.json
|
||||||
@touch node_modules
|
@touch node_modules
|
||||||
|
|
||||||
.venv: poetry.lock
|
.venv: poetry.lock
|
||||||
poetry install
|
poetry install --no-root
|
||||||
@touch .venv
|
@touch .venv
|
||||||
|
|
||||||
|
.PHONY: update
|
||||||
|
update: update-js update-py
|
||||||
|
|
||||||
.PHONY: update-js
|
.PHONY: update-js
|
||||||
update-js: node-check | node_modules
|
update-js: node-check | node_modules
|
||||||
npx updates -u -f package.json
|
npx updates -u -f package.json
|
||||||
|
@ -930,7 +888,7 @@ update-js: node-check | node_modules
|
||||||
update-py: node-check | node_modules
|
update-py: node-check | node_modules
|
||||||
npx updates -u -f pyproject.toml
|
npx updates -u -f pyproject.toml
|
||||||
rm -rf .venv poetry.lock
|
rm -rf .venv poetry.lock
|
||||||
poetry install
|
poetry install --no-root
|
||||||
@touch .venv
|
@touch .venv
|
||||||
|
|
||||||
.PHONY: fomantic
|
.PHONY: fomantic
|
||||||
|
@ -939,6 +897,7 @@ fomantic:
|
||||||
cd $(FOMANTIC_WORK_DIR) && npm install --no-save
|
cd $(FOMANTIC_WORK_DIR) && npm install --no-save
|
||||||
cp -f $(FOMANTIC_WORK_DIR)/theme.config.less $(FOMANTIC_WORK_DIR)/node_modules/fomantic-ui/src/theme.config
|
cp -f $(FOMANTIC_WORK_DIR)/theme.config.less $(FOMANTIC_WORK_DIR)/node_modules/fomantic-ui/src/theme.config
|
||||||
cp -rf $(FOMANTIC_WORK_DIR)/_site $(FOMANTIC_WORK_DIR)/node_modules/fomantic-ui/src/
|
cp -rf $(FOMANTIC_WORK_DIR)/_site $(FOMANTIC_WORK_DIR)/node_modules/fomantic-ui/src/
|
||||||
|
$(SED_INPLACE) -e 's/ overrideBrowserslist\r/ overrideBrowserslist: ["defaults"]\r/g' $(FOMANTIC_WORK_DIR)/node_modules/fomantic-ui/tasks/config/tasks.js
|
||||||
cd $(FOMANTIC_WORK_DIR) && npx gulp -f node_modules/fomantic-ui/gulpfile.js build
|
cd $(FOMANTIC_WORK_DIR) && npx gulp -f node_modules/fomantic-ui/gulpfile.js build
|
||||||
# fomantic uses "touchstart" as click event for some browsers, it's not ideal, so we force fomantic to always use "click" as click event
|
# fomantic uses "touchstart" as click event for some browsers, it's not ideal, so we force fomantic to always use "click" as click event
|
||||||
$(SED_INPLACE) -e 's/clickEvent[ \t]*=/clickEvent = "click", unstableClickEvent =/g' $(FOMANTIC_WORK_DIR)/build/semantic.js
|
$(SED_INPLACE) -e 's/clickEvent[ \t]*=/clickEvent = "click", unstableClickEvent =/g' $(FOMANTIC_WORK_DIR)/build/semantic.js
|
||||||
|
@ -957,7 +916,7 @@ $(WEBPACK_DEST): $(WEBPACK_SOURCES) $(WEBPACK_CONFIGS) package-lock.json
|
||||||
.PHONY: svg
|
.PHONY: svg
|
||||||
svg: node-check | node_modules
|
svg: node-check | node_modules
|
||||||
rm -rf $(SVG_DEST_DIR)
|
rm -rf $(SVG_DEST_DIR)
|
||||||
node build/generate-svg.js
|
node tools/generate-svg.js
|
||||||
|
|
||||||
.PHONY: svg-check
|
.PHONY: svg-check
|
||||||
svg-check: svg
|
svg-check: svg
|
||||||
|
@ -1000,8 +959,8 @@ generate-gitignore:
|
||||||
|
|
||||||
.PHONY: generate-images
|
.PHONY: generate-images
|
||||||
generate-images: | node_modules
|
generate-images: | node_modules
|
||||||
npm install --no-save --no-package-lock fabric@5 imagemin-zopfli@7
|
npm install --no-save fabric@6.0.0-beta20 imagemin-zopfli@7
|
||||||
node build/generate-images.js $(TAGS)
|
node tools/generate-images.js $(TAGS)
|
||||||
|
|
||||||
.PHONY: generate-manpage
|
.PHONY: generate-manpage
|
||||||
generate-manpage:
|
generate-manpage:
|
||||||
|
@ -1018,3 +977,8 @@ docker:
|
||||||
|
|
||||||
# This endif closes the if at the top of the file
|
# This endif closes the if at the top of the file
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Disable parallel execution because it would break some targets that don't
|
||||||
|
# specify exact dependencies like 'backend' which does currently not depend
|
||||||
|
# on 'frontend' to enable Node.js-less builds from source tarballs.
|
||||||
|
.NOTPARALLEL:
|
||||||
|
|
93
README.md
93
README.md
|
@ -1,58 +1,18 @@
|
||||||
<p align="center">
|
# Gitea
|
||||||
<a href="https://gitea.io/">
|
|
||||||
<img alt="Gitea" src="https://raw.githubusercontent.com/go-gitea/gitea/main/public/assets/img/gitea.svg" width="220"/>
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
<h1 align="center">Gitea - Git with a cup of tea</h1>
|
|
||||||
|
|
||||||
<p align="center">
|
[![](https://github.com/go-gitea/gitea/actions/workflows/release-nightly.yml/badge.svg?branch=main)](https://github.com/go-gitea/gitea/actions/workflows/release-nightly.yml?query=branch%3Amain "Release Nightly")
|
||||||
<a href="https://drone.gitea.io/go-gitea/gitea" title="Build Status">
|
[![](https://img.shields.io/discord/322538954119184384.svg?logo=discord&logoColor=white&label=Discord&color=5865F2)](https://discord.gg/Gitea "Join the Discord chat at https://discord.gg/Gitea")
|
||||||
<img src="https://drone.gitea.io/api/badges/go-gitea/gitea/status.svg?ref=refs/heads/main">
|
[![](https://goreportcard.com/badge/code.gitea.io/gitea)](https://goreportcard.com/report/code.gitea.io/gitea "Go Report Card")
|
||||||
</a>
|
[![](https://pkg.go.dev/badge/code.gitea.io/gitea?status.svg)](https://pkg.go.dev/code.gitea.io/gitea "GoDoc")
|
||||||
<a href="https://discord.gg/Gitea" title="Join the Discord chat at https://discord.gg/Gitea">
|
[![](https://img.shields.io/github/release/go-gitea/gitea.svg)](https://github.com/go-gitea/gitea/releases/latest "GitHub release")
|
||||||
<img src="https://img.shields.io/discord/322538954119184384.svg">
|
[![](https://www.codetriage.com/go-gitea/gitea/badges/users.svg)](https://www.codetriage.com/go-gitea/gitea "Help Contribute to Open Source")
|
||||||
</a>
|
[![](https://opencollective.com/gitea/tiers/backers/badge.svg?label=backers&color=brightgreen)](https://opencollective.com/gitea "Become a backer/sponsor of gitea")
|
||||||
<a href="https://app.codecov.io/gh/go-gitea/gitea" title="Codecov">
|
[![](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT "License: MIT")
|
||||||
<img src="https://codecov.io/gh/go-gitea/gitea/branch/main/graph/badge.svg">
|
[![Contribute with Gitpod](https://img.shields.io/badge/Contribute%20with-Gitpod-908a85?logo=gitpod)](https://gitpod.io/#https://github.com/go-gitea/gitea)
|
||||||
</a>
|
[![](https://badges.crowdin.net/gitea/localized.svg)](https://crowdin.com/project/gitea "Crowdin")
|
||||||
<a href="https://goreportcard.com/report/code.gitea.io/gitea" title="Go Report Card">
|
[![](https://badgen.net/https/api.tickgit.com/badgen/github.com/go-gitea/gitea/main)](https://www.tickgit.com/browse?repo=github.com/go-gitea/gitea&branch=main "TODOs")
|
||||||
<img src="https://goreportcard.com/badge/code.gitea.io/gitea">
|
|
||||||
</a>
|
|
||||||
<a href="https://pkg.go.dev/code.gitea.io/gitea" title="GoDoc">
|
|
||||||
<img src="https://pkg.go.dev/badge/code.gitea.io/gitea?status.svg">
|
|
||||||
</a>
|
|
||||||
<a href="https://github.com/go-gitea/gitea/releases/latest" title="GitHub release">
|
|
||||||
<img src="https://img.shields.io/github/release/go-gitea/gitea.svg">
|
|
||||||
</a>
|
|
||||||
<a href="https://www.codetriage.com/go-gitea/gitea" title="Help Contribute to Open Source">
|
|
||||||
<img src="https://www.codetriage.com/go-gitea/gitea/badges/users.svg">
|
|
||||||
</a>
|
|
||||||
<a href="https://opencollective.com/gitea" title="Become a backer/sponsor of gitea">
|
|
||||||
<img src="https://opencollective.com/gitea/tiers/backers/badge.svg?label=backers&color=brightgreen">
|
|
||||||
</a>
|
|
||||||
<a href="https://opensource.org/licenses/MIT" title="License: MIT">
|
|
||||||
<img src="https://img.shields.io/badge/License-MIT-blue.svg">
|
|
||||||
</a>
|
|
||||||
<a href="https://gitpod.io/#https://github.com/go-gitea/gitea">
|
|
||||||
<img
|
|
||||||
src="https://img.shields.io/badge/Contribute%20with-Gitpod-908a85?logo=gitpod"
|
|
||||||
alt="Contribute with Gitpod"
|
|
||||||
/>
|
|
||||||
</a>
|
|
||||||
<a href="https://crowdin.com/project/gitea" title="Crowdin">
|
|
||||||
<img src="https://badges.crowdin.net/gitea/localized.svg">
|
|
||||||
</a>
|
|
||||||
<a href="https://www.tickgit.com/browse?repo=github.com/go-gitea/gitea&branch=main" title="TODOs">
|
|
||||||
<img src="https://badgen.net/https/api.tickgit.com/badgen/github.com/go-gitea/gitea/main">
|
|
||||||
</a>
|
|
||||||
<a href="https://app.bountysource.com/teams/gitea" title="Bountysource">
|
|
||||||
<img src="https://img.shields.io/bountysource/team/gitea/activity">
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
[View this document in Chinese](./README_ZH.md)
|
||||||
<a href="README_ZH.md">View this document in Chinese</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
## Purpose
|
## Purpose
|
||||||
|
|
||||||
|
@ -62,11 +22,16 @@ painless way of setting up a self-hosted Git service.
|
||||||
As Gitea is written in Go, it works across **all** the platforms and
|
As Gitea is written in Go, it works across **all** the platforms and
|
||||||
architectures that are supported by Go, including Linux, macOS, and
|
architectures that are supported by Go, including Linux, macOS, and
|
||||||
Windows on x86, amd64, ARM and PowerPC architectures.
|
Windows on x86, amd64, ARM and PowerPC architectures.
|
||||||
You can try it out using [the online demo](https://try.gitea.io/).
|
|
||||||
This project has been
|
This project has been
|
||||||
[forked](https://blog.gitea.com/welcome-to-gitea/) from
|
[forked](https://blog.gitea.com/welcome-to-gitea/) from
|
||||||
[Gogs](https://gogs.io) since November of 2016, but a lot has changed.
|
[Gogs](https://gogs.io) since November of 2016, but a lot has changed.
|
||||||
|
|
||||||
|
For online demonstrations, you can visit [try.gitea.io](https://try.gitea.io).
|
||||||
|
|
||||||
|
For accessing free Gitea service (with a limited number of repositories), you can visit [gitea.com](https://gitea.com/user/login).
|
||||||
|
|
||||||
|
To quickly deploy your own dedicated Gitea instance on Gitea Cloud, you can start a free trial at [cloud.gitea.com](https://cloud.gitea.com).
|
||||||
|
|
||||||
## Building
|
## Building
|
||||||
|
|
||||||
From the root of the source tree, run:
|
From the root of the source tree, run:
|
||||||
|
@ -84,25 +49,23 @@ The `build` target is split into two sub-targets:
|
||||||
|
|
||||||
Internet connectivity is required to download the go and npm modules. When building from the official source tarballs which include pre-built frontend files, the `frontend` target will not be triggered, making it possible to build without Node.js.
|
Internet connectivity is required to download the go and npm modules. When building from the official source tarballs which include pre-built frontend files, the `frontend` target will not be triggered, making it possible to build without Node.js.
|
||||||
|
|
||||||
Parallelism (`make -j <num>`) is not supported.
|
|
||||||
|
|
||||||
More info: https://docs.gitea.com/installation/install-from-source
|
More info: https://docs.gitea.com/installation/install-from-source
|
||||||
|
|
||||||
## Using
|
## Using
|
||||||
|
|
||||||
./gitea web
|
./gitea web
|
||||||
|
|
||||||
NOTE: If you're interested in using our APIs, we have experimental
|
> [!NOTE]
|
||||||
support with [documentation](https://try.gitea.io/api/swagger).
|
> If you're interested in using our APIs, we have experimental support with [documentation](https://try.gitea.io/api/swagger).
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
Expected workflow is: Fork -> Patch -> Push -> Pull Request
|
Expected workflow is: Fork -> Patch -> Push -> Pull Request
|
||||||
|
|
||||||
NOTES:
|
> [!NOTE]
|
||||||
|
>
|
||||||
1. **YOU MUST READ THE [CONTRIBUTORS GUIDE](CONTRIBUTING.md) BEFORE STARTING TO WORK ON A PULL REQUEST.**
|
> 1. **YOU MUST READ THE [CONTRIBUTORS GUIDE](CONTRIBUTING.md) BEFORE STARTING TO WORK ON A PULL REQUEST.**
|
||||||
2. If you have found a vulnerability in the project, please write privately to **security@gitea.io**. Thanks!
|
> 2. If you have found a vulnerability in the project, please write privately to **security@gitea.io**. Thanks!
|
||||||
|
|
||||||
## Translating
|
## Translating
|
||||||
|
|
||||||
|
@ -121,8 +84,6 @@ If you have questions that are not covered by the documentation, you can get in
|
||||||
|
|
||||||
We maintain a list of Gitea-related projects at [gitea/awesome-gitea](https://gitea.com/gitea/awesome-gitea).
|
We maintain a list of Gitea-related projects at [gitea/awesome-gitea](https://gitea.com/gitea/awesome-gitea).
|
||||||
|
|
||||||
The Hugo-based documentation theme is hosted at [gitea/theme](https://gitea.com/gitea/theme).
|
|
||||||
|
|
||||||
The official Gitea CLI is developed at [gitea/tea](https://gitea.com/gitea/tea).
|
The official Gitea CLI is developed at [gitea/tea](https://gitea.com/gitea/tea).
|
||||||
|
|
||||||
## Authors
|
## Authors
|
||||||
|
@ -175,5 +136,5 @@ Looking for an overview of the interface? Check it out!
|
||||||
|![Dashboard](https://dl.gitea.com/screenshots/home_timeline.png)|![User Profile](https://dl.gitea.com/screenshots/user_profile.png)|![Global Issues](https://dl.gitea.com/screenshots/global_issues.png)|
|
|![Dashboard](https://dl.gitea.com/screenshots/home_timeline.png)|![User Profile](https://dl.gitea.com/screenshots/user_profile.png)|![Global Issues](https://dl.gitea.com/screenshots/global_issues.png)|
|
||||||
|:---:|:---:|:---:|
|
|:---:|:---:|:---:|
|
||||||
|![Branches](https://dl.gitea.com/screenshots/branches.png)|![Web Editor](https://dl.gitea.com/screenshots/web_editor.png)|![Activity](https://dl.gitea.com/screenshots/activity.png)|
|
|![Branches](https://dl.gitea.com/screenshots/branches.png)|![Web Editor](https://dl.gitea.com/screenshots/web_editor.png)|![Activity](https://dl.gitea.com/screenshots/activity.png)|
|
||||||
|![New Migration](https://dl.gitea.com/screenshots/migration.png)|![Migrating](https://dl.gitea.com/screenshots/migration.gif)|![Pull Request View](https://image.ibb.co/e02dSb/6.png)
|
|![New Migration](https://dl.gitea.com/screenshots/migration.png)|![Migrating](https://dl.gitea.com/screenshots/migration.gif)|![Pull Request View](https://image.ibb.co/e02dSb/6.png)|
|
||||||
![Pull Request Dark](https://dl.gitea.com/screenshots/pull_requests_dark.png)|![Diff Review Dark](https://dl.gitea.com/screenshots/review_dark.png)|![Diff Dark](https://dl.gitea.com/screenshots/diff_dark.png)|
|
|![Pull Request Dark](https://dl.gitea.com/screenshots/pull_requests_dark.png)|![Diff Review Dark](https://dl.gitea.com/screenshots/review_dark.png)|![Diff Dark](https://dl.gitea.com/screenshots/diff_dark.png)|
|
||||||
|
|
76
README_ZH.md
76
README_ZH.md
|
@ -1,64 +1,28 @@
|
||||||
<p align="center">
|
# Gitea
|
||||||
<a href="https://gitea.io/">
|
|
||||||
<img alt="Gitea" src="https://raw.githubusercontent.com/go-gitea/gitea/main/public/assets/img/gitea.svg" width="220"/>
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
<h1 align="center">Gitea - Git with a cup of tea</h1>
|
|
||||||
|
|
||||||
<p align="center">
|
[![](https://github.com/go-gitea/gitea/actions/workflows/release-nightly.yml/badge.svg?branch=main)](https://github.com/go-gitea/gitea/actions/workflows/release-nightly.yml?query=branch%3Amain "Release Nightly")
|
||||||
<a href="https://drone.gitea.io/go-gitea/gitea" title="Build Status">
|
[![](https://img.shields.io/discord/322538954119184384.svg?logo=discord&logoColor=white&label=Discord&color=5865F2)](https://discord.gg/Gitea "Join the Discord chat at https://discord.gg/Gitea")
|
||||||
<img src="https://drone.gitea.io/api/badges/go-gitea/gitea/status.svg?ref=refs/heads/main">
|
[![](https://goreportcard.com/badge/code.gitea.io/gitea)](https://goreportcard.com/report/code.gitea.io/gitea "Go Report Card")
|
||||||
</a>
|
[![](https://pkg.go.dev/badge/code.gitea.io/gitea?status.svg)](https://pkg.go.dev/code.gitea.io/gitea "GoDoc")
|
||||||
<a href="https://discord.gg/Gitea" title="Join the Discord chat at https://discord.gg/Gitea">
|
[![](https://img.shields.io/github/release/go-gitea/gitea.svg)](https://github.com/go-gitea/gitea/releases/latest "GitHub release")
|
||||||
<img src="https://img.shields.io/discord/322538954119184384.svg">
|
[![](https://www.codetriage.com/go-gitea/gitea/badges/users.svg)](https://www.codetriage.com/go-gitea/gitea "Help Contribute to Open Source")
|
||||||
</a>
|
[![](https://opencollective.com/gitea/tiers/backers/badge.svg?label=backers&color=brightgreen)](https://opencollective.com/gitea "Become a backer/sponsor of gitea")
|
||||||
<a href="https://app.codecov.io/gh/go-gitea/gitea" title="Codecov">
|
[![](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT "License: MIT")
|
||||||
<img src="https://codecov.io/gh/go-gitea/gitea/branch/main/graph/badge.svg">
|
[![Contribute with Gitpod](https://img.shields.io/badge/Contribute%20with-Gitpod-908a85?logo=gitpod)](https://gitpod.io/#https://github.com/go-gitea/gitea)
|
||||||
</a>
|
[![](https://badges.crowdin.net/gitea/localized.svg)](https://crowdin.com/project/gitea "Crowdin")
|
||||||
<a href="https://goreportcard.com/report/code.gitea.io/gitea" title="Go Report Card">
|
[![](https://badgen.net/https/api.tickgit.com/badgen/github.com/go-gitea/gitea/main)](https://www.tickgit.com/browse?repo=github.com/go-gitea/gitea&branch=main "TODOs")
|
||||||
<img src="https://goreportcard.com/badge/code.gitea.io/gitea">
|
|
||||||
</a>
|
|
||||||
<a href="https://pkg.go.dev/code.gitea.io/gitea" title="GoDoc">
|
|
||||||
<img src="https://pkg.go.dev/badge/code.gitea.io/gitea?status.svg">
|
|
||||||
</a>
|
|
||||||
<a href="https://github.com/go-gitea/gitea/releases/latest" title="GitHub release">
|
|
||||||
<img src="https://img.shields.io/github/release/go-gitea/gitea.svg">
|
|
||||||
</a>
|
|
||||||
<a href="https://www.codetriage.com/go-gitea/gitea" title="Help Contribute to Open Source">
|
|
||||||
<img src="https://www.codetriage.com/go-gitea/gitea/badges/users.svg">
|
|
||||||
</a>
|
|
||||||
<a href="https://opencollective.com/gitea" title="Become a backer/sponsor of gitea">
|
|
||||||
<img src="https://opencollective.com/gitea/tiers/backers/badge.svg?label=backers&color=brightgreen">
|
|
||||||
</a>
|
|
||||||
<a href="https://opensource.org/licenses/MIT" title="License: MIT">
|
|
||||||
<img src="https://img.shields.io/badge/License-MIT-blue.svg">
|
|
||||||
</a>
|
|
||||||
<a href="https://gitpod.io/#https://github.com/go-gitea/gitea">
|
|
||||||
<img
|
|
||||||
src="https://img.shields.io/badge/Contribute%20with-Gitpod-908a85?logo=gitpod"
|
|
||||||
alt="Contribute with Gitpod"
|
|
||||||
/>
|
|
||||||
</a>
|
|
||||||
<a href="https://crowdin.com/project/gitea" title="Crowdin">
|
|
||||||
<img src="https://badges.crowdin.net/gitea/localized.svg">
|
|
||||||
</a>
|
|
||||||
<a href="https://www.tickgit.com/browse?repo=github.com/go-gitea/gitea&branch=main" title="TODOs">
|
|
||||||
<img src="https://badgen.net/https/api.tickgit.com/badgen/github.com/go-gitea/gitea/main">
|
|
||||||
</a>
|
|
||||||
<a href="https://app.bountysource.com/teams/gitea" title="Bountysource">
|
|
||||||
<img src="https://img.shields.io/bountysource/team/gitea/activity">
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
[View this document in English](./README.md)
|
||||||
<a href="README.md">View this document in English</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
## 目标
|
## 目标
|
||||||
|
|
||||||
Gitea 的首要目标是创建一个极易安装,运行非常快速,安装和使用体验良好的自建 Git 服务。我们采用 Go 作为后端语言,这使我们只要生成一个可执行程序即可。并且他还支持跨平台,支持 Linux, macOS 和 Windows 以及各种架构,除了 x86,amd64,还包括 ARM 和 PowerPC。
|
Gitea 的首要目标是创建一个极易安装,运行非常快速,安装和使用体验良好的自建 Git 服务。我们采用 Go 作为后端语言,这使我们只要生成一个可执行程序即可。并且他还支持跨平台,支持 Linux, macOS 和 Windows 以及各种架构,除了 x86,amd64,还包括 ARM 和 PowerPC。
|
||||||
|
|
||||||
如果您想试用一下,请访问 [在线Demo](https://try.gitea.io/)!
|
如果你想试用在线演示,请访问 [try.gitea.io](https://try.gitea.io/)。
|
||||||
|
|
||||||
|
如果你想使用免费的 Gitea 服务(有仓库数量限制),请访问 [gitea.com](https://gitea.com/user/login)。
|
||||||
|
|
||||||
|
如果你想在 Gitea Cloud 上快速部署你自己独享的 Gitea 实例,请访问 [cloud.gitea.com](https://cloud.gitea.com) 开始免费试用。
|
||||||
|
|
||||||
## 提示
|
## 提示
|
||||||
|
|
||||||
|
@ -94,5 +58,5 @@ Fork -> Patch -> Push -> Pull Request
|
||||||
|![Dashboard](https://dl.gitea.com/screenshots/home_timeline.png)|![User Profile](https://dl.gitea.com/screenshots/user_profile.png)|![Global Issues](https://dl.gitea.com/screenshots/global_issues.png)|
|
|![Dashboard](https://dl.gitea.com/screenshots/home_timeline.png)|![User Profile](https://dl.gitea.com/screenshots/user_profile.png)|![Global Issues](https://dl.gitea.com/screenshots/global_issues.png)|
|
||||||
|:---:|:---:|:---:|
|
|:---:|:---:|:---:|
|
||||||
|![Branches](https://dl.gitea.com/screenshots/branches.png)|![Web Editor](https://dl.gitea.com/screenshots/web_editor.png)|![Activity](https://dl.gitea.com/screenshots/activity.png)|
|
|![Branches](https://dl.gitea.com/screenshots/branches.png)|![Web Editor](https://dl.gitea.com/screenshots/web_editor.png)|![Activity](https://dl.gitea.com/screenshots/activity.png)|
|
||||||
|![New Migration](https://dl.gitea.com/screenshots/migration.png)|![Migrating](https://dl.gitea.com/screenshots/migration.gif)|![Pull Request View](https://image.ibb.co/e02dSb/6.png)
|
|![New Migration](https://dl.gitea.com/screenshots/migration.png)|![Migrating](https://dl.gitea.com/screenshots/migration.gif)|![Pull Request View](https://image.ibb.co/e02dSb/6.png)|
|
||||||
![Pull Request Dark](https://dl.gitea.com/screenshots/pull_requests_dark.png)|![Diff Review Dark](https://dl.gitea.com/screenshots/review_dark.png)|![Diff Dark](https://dl.gitea.com/screenshots/diff_dark.png)|
|
|![Pull Request Dark](https://dl.gitea.com/screenshots/pull_requests_dark.png)|![Diff Review Dark](https://dl.gitea.com/screenshots/review_dark.png)|![Diff Dark](https://dl.gitea.com/screenshots/diff_dark.png)|
|
||||||
|
|
|
@ -12,7 +12,7 @@ Please **DO NOT** file a public issue, instead send your report privately to `se
|
||||||
|
|
||||||
## Protecting Security Information
|
## Protecting Security Information
|
||||||
|
|
||||||
Due to the sensitive nature of security information, you can use below GPG public key encrypt your mail body.
|
Due to the sensitive nature of security information, you can use the below GPG public key to encrypt your mail body.
|
||||||
|
|
||||||
The PGP key is valid until June 24, 2024.
|
The PGP key is valid until June 24, 2024.
|
||||||
|
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -12,6 +12,7 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/modules/container"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -58,7 +59,7 @@ func main() {
|
||||||
|
|
||||||
// use old en-US as the base, and copy the new translations to the old locales
|
// use old en-US as the base, and copy the new translations to the old locales
|
||||||
enUsOld := inisOld["options/locale/locale_en-US.ini"]
|
enUsOld := inisOld["options/locale/locale_en-US.ini"]
|
||||||
brokenWarned := map[string]bool{}
|
brokenWarned := make(container.Set[string])
|
||||||
for path, iniOld := range inisOld {
|
for path, iniOld := range inisOld {
|
||||||
if iniOld == enUsOld {
|
if iniOld == enUsOld {
|
||||||
continue
|
continue
|
||||||
|
@ -77,7 +78,7 @@ func main() {
|
||||||
broken := oldStr != "" && strings.Count(oldStr, "%") != strings.Count(newStr, "%")
|
broken := oldStr != "" && strings.Count(oldStr, "%") != strings.Count(newStr, "%")
|
||||||
broken = broken || strings.Contains(oldStr, "\n") || strings.Contains(oldStr, "\n")
|
broken = broken || strings.Contains(oldStr, "\n") || strings.Contains(oldStr, "\n")
|
||||||
if broken {
|
if broken {
|
||||||
brokenWarned[secOld.Name()+"."+keyEnUs.Name()] = true
|
brokenWarned.Add(secOld.Name() + "." + keyEnUs.Name())
|
||||||
fmt.Println("----")
|
fmt.Println("----")
|
||||||
fmt.Printf("WARNING: skip broken locale: %s , [%s] %s\n", path, secEnUS.Name(), keyEnUs.Name())
|
fmt.Printf("WARNING: skip broken locale: %s , [%s] %s\n", path, secEnUS.Name(), keyEnUs.Name())
|
||||||
fmt.Printf("\told: %s\n", strings.ReplaceAll(oldStr, "\n", "\\n"))
|
fmt.Printf("\told: %s\n", strings.ReplaceAll(oldStr, "\n", "\\n"))
|
||||||
|
@ -103,7 +104,7 @@ func main() {
|
||||||
broken = broken || strings.HasPrefix(str, "`\"")
|
broken = broken || strings.HasPrefix(str, "`\"")
|
||||||
broken = broken || strings.Count(str, `"`)%2 == 1
|
broken = broken || strings.Count(str, `"`)%2 == 1
|
||||||
broken = broken || strings.Count(str, "`")%2 == 1
|
broken = broken || strings.Count(str, "`")%2 == 1
|
||||||
if broken && !brokenWarned[sec.Name()+"."+key.Name()] {
|
if broken && !brokenWarned.Contains(sec.Name()+"."+key.Name()) {
|
||||||
fmt.Printf("WARNING: found broken locale: %s , [%s] %s\n", path, sec.Name(), key.Name())
|
fmt.Printf("WARNING: found broken locale: %s , [%s] %s\n", path, sec.Name(), key.Name())
|
||||||
fmt.Printf("\tstr: %s\n", strings.ReplaceAll(str, "\n", "\\n"))
|
fmt.Printf("\tstr: %s\n", strings.ReplaceAll(str, "\n", "\\n"))
|
||||||
fmt.Println("----")
|
fmt.Println("----")
|
||||||
|
|
|
@ -15,6 +15,8 @@ import (
|
||||||
"regexp"
|
"regexp"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/modules/container"
|
||||||
)
|
)
|
||||||
|
|
||||||
// regexp is based on go-license, excluding README and NOTICE
|
// regexp is based on go-license, excluding README and NOTICE
|
||||||
|
@ -55,20 +57,14 @@ func main() {
|
||||||
// yml
|
// yml
|
||||||
//
|
//
|
||||||
// It could be removed once we have a better regex.
|
// It could be removed once we have a better regex.
|
||||||
excludedExt := map[string]bool{
|
excludedExt := container.SetOf(".gitignore", ".go", ".mod", ".sum", ".toml", ".yml")
|
||||||
".gitignore": true,
|
|
||||||
".go": true,
|
|
||||||
".mod": true,
|
|
||||||
".sum": true,
|
|
||||||
".toml": true,
|
|
||||||
".yml": true,
|
|
||||||
}
|
|
||||||
var paths []string
|
var paths []string
|
||||||
err := filepath.WalkDir(base, func(path string, entry fs.DirEntry, err error) error {
|
err := filepath.WalkDir(base, func(path string, entry fs.DirEntry, err error) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if entry.IsDir() || !licenseRe.MatchString(entry.Name()) || excludedExt[filepath.Ext(entry.Name())] {
|
if entry.IsDir() || !licenseRe.MatchString(entry.Name()) || excludedExt.Contains(filepath.Ext(entry.Name())) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
paths = append(paths, path)
|
paths = append(paths, path)
|
||||||
|
|
|
@ -15,9 +15,8 @@ import (
|
||||||
var (
|
var (
|
||||||
// CmdActions represents the available actions sub-commands.
|
// CmdActions represents the available actions sub-commands.
|
||||||
CmdActions = &cli.Command{
|
CmdActions = &cli.Command{
|
||||||
Name: "actions",
|
Name: "actions",
|
||||||
Usage: "",
|
Usage: "Manage Gitea Actions",
|
||||||
Description: "Commands for managing Gitea Actions",
|
|
||||||
Subcommands: []*cli.Command{
|
Subcommands: []*cli.Command{
|
||||||
subcmdActionsGenRunnerToken,
|
subcmdActionsGenRunnerToken,
|
||||||
},
|
},
|
||||||
|
@ -51,6 +50,6 @@ func runGenerateActionsRunnerToken(c *cli.Context) error {
|
||||||
if extra.HasError() {
|
if extra.HasError() {
|
||||||
return handleCliResponseExtra(extra)
|
return handleCliResponseExtra(extra)
|
||||||
}
|
}
|
||||||
_, _ = fmt.Printf("%s\n", respText)
|
_, _ = fmt.Printf("%s\n", respText.Text)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
628
cmd/admin.go
628
cmd/admin.go
|
@ -6,26 +6,14 @@ package cmd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/url"
|
|
||||||
"os"
|
|
||||||
"strings"
|
|
||||||
"text/tabwriter"
|
|
||||||
|
|
||||||
asymkey_model "code.gitea.io/gitea/models/asymkey"
|
|
||||||
auth_model "code.gitea.io/gitea/models/auth"
|
|
||||||
"code.gitea.io/gitea/models/db"
|
"code.gitea.io/gitea/models/db"
|
||||||
repo_model "code.gitea.io/gitea/models/repo"
|
repo_model "code.gitea.io/gitea/models/repo"
|
||||||
"code.gitea.io/gitea/modules/git"
|
"code.gitea.io/gitea/modules/git"
|
||||||
"code.gitea.io/gitea/modules/graceful"
|
"code.gitea.io/gitea/modules/gitrepo"
|
||||||
"code.gitea.io/gitea/modules/log"
|
"code.gitea.io/gitea/modules/log"
|
||||||
repo_module "code.gitea.io/gitea/modules/repository"
|
repo_module "code.gitea.io/gitea/modules/repository"
|
||||||
"code.gitea.io/gitea/modules/util"
|
|
||||||
auth_service "code.gitea.io/gitea/services/auth"
|
|
||||||
"code.gitea.io/gitea/services/auth/source/oauth2"
|
|
||||||
"code.gitea.io/gitea/services/auth/source/smtp"
|
|
||||||
repo_service "code.gitea.io/gitea/services/repository"
|
|
||||||
|
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
)
|
)
|
||||||
|
@ -34,7 +22,7 @@ var (
|
||||||
// CmdAdmin represents the available admin sub-command.
|
// CmdAdmin represents the available admin sub-command.
|
||||||
CmdAdmin = &cli.Command{
|
CmdAdmin = &cli.Command{
|
||||||
Name: "admin",
|
Name: "admin",
|
||||||
Usage: "Command line interface to perform common administrative operations",
|
Usage: "Perform common administrative operations",
|
||||||
Subcommands: []*cli.Command{
|
Subcommands: []*cli.Command{
|
||||||
subcmdUser,
|
subcmdUser,
|
||||||
subcmdRepoSyncReleases,
|
subcmdRepoSyncReleases,
|
||||||
|
@ -59,28 +47,16 @@ var (
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
microcmdRegenHooks = &cli.Command{
|
|
||||||
Name: "hooks",
|
|
||||||
Usage: "Regenerate git-hooks",
|
|
||||||
Action: runRegenerateHooks,
|
|
||||||
}
|
|
||||||
|
|
||||||
microcmdRegenKeys = &cli.Command{
|
|
||||||
Name: "keys",
|
|
||||||
Usage: "Regenerate authorized_keys file",
|
|
||||||
Action: runRegenerateKeys,
|
|
||||||
}
|
|
||||||
|
|
||||||
subcmdAuth = &cli.Command{
|
subcmdAuth = &cli.Command{
|
||||||
Name: "auth",
|
Name: "auth",
|
||||||
Usage: "Modify external auth providers",
|
Usage: "Modify external auth providers",
|
||||||
Subcommands: []*cli.Command{
|
Subcommands: []*cli.Command{
|
||||||
microcmdAuthAddOauth,
|
microcmdAuthAddOauth,
|
||||||
microcmdAuthUpdateOauth,
|
microcmdAuthUpdateOauth,
|
||||||
cmdAuthAddLdapBindDn,
|
microcmdAuthAddLdapBindDn,
|
||||||
cmdAuthUpdateLdapBindDn,
|
microcmdAuthUpdateLdapBindDn,
|
||||||
cmdAuthAddLdapSimpleAuth,
|
microcmdAuthAddLdapSimpleAuth,
|
||||||
cmdAuthUpdateLdapSimpleAuth,
|
microcmdAuthUpdateLdapSimpleAuth,
|
||||||
microcmdAuthAddSMTP,
|
microcmdAuthAddSMTP,
|
||||||
microcmdAuthUpdateSMTP,
|
microcmdAuthUpdateSMTP,
|
||||||
microcmdAuthList,
|
microcmdAuthList,
|
||||||
|
@ -88,170 +64,6 @@ var (
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
microcmdAuthList = &cli.Command{
|
|
||||||
Name: "list",
|
|
||||||
Usage: "List auth sources",
|
|
||||||
Action: runListAuth,
|
|
||||||
Flags: []cli.Flag{
|
|
||||||
&cli.IntFlag{
|
|
||||||
Name: "min-width",
|
|
||||||
Usage: "Minimal cell width including any padding for the formatted table",
|
|
||||||
Value: 0,
|
|
||||||
},
|
|
||||||
&cli.IntFlag{
|
|
||||||
Name: "tab-width",
|
|
||||||
Usage: "width of tab characters in formatted table (equivalent number of spaces)",
|
|
||||||
Value: 8,
|
|
||||||
},
|
|
||||||
&cli.IntFlag{
|
|
||||||
Name: "padding",
|
|
||||||
Usage: "padding added to a cell before computing its width",
|
|
||||||
Value: 1,
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "pad-char",
|
|
||||||
Usage: `ASCII char used for padding if padchar == '\\t', the Writer will assume that the width of a '\\t' in the formatted output is tabwidth, and cells are left-aligned independent of align_left (for correct-looking results, tabwidth must correspond to the tab width in the viewer displaying the result)`,
|
|
||||||
Value: "\t",
|
|
||||||
},
|
|
||||||
&cli.BoolFlag{
|
|
||||||
Name: "vertical-bars",
|
|
||||||
Usage: "Set to true to print vertical bars between columns",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
idFlag = &cli.Int64Flag{
|
|
||||||
Name: "id",
|
|
||||||
Usage: "ID of authentication source",
|
|
||||||
}
|
|
||||||
|
|
||||||
microcmdAuthDelete = &cli.Command{
|
|
||||||
Name: "delete",
|
|
||||||
Usage: "Delete specific auth source",
|
|
||||||
Flags: []cli.Flag{idFlag},
|
|
||||||
Action: runDeleteAuth,
|
|
||||||
}
|
|
||||||
|
|
||||||
oauthCLIFlags = []cli.Flag{
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "name",
|
|
||||||
Value: "",
|
|
||||||
Usage: "Application Name",
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "provider",
|
|
||||||
Value: "",
|
|
||||||
Usage: "OAuth2 Provider",
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "key",
|
|
||||||
Value: "",
|
|
||||||
Usage: "Client ID (Key)",
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "secret",
|
|
||||||
Value: "",
|
|
||||||
Usage: "Client Secret",
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "auto-discover-url",
|
|
||||||
Value: "",
|
|
||||||
Usage: "OpenID Connect Auto Discovery URL (only required when using OpenID Connect as provider)",
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "use-custom-urls",
|
|
||||||
Value: "false",
|
|
||||||
Usage: "Use custom URLs for GitLab/GitHub OAuth endpoints",
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "custom-tenant-id",
|
|
||||||
Value: "",
|
|
||||||
Usage: "Use custom Tenant ID for OAuth endpoints",
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "custom-auth-url",
|
|
||||||
Value: "",
|
|
||||||
Usage: "Use a custom Authorization URL (option for GitLab/GitHub)",
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "custom-token-url",
|
|
||||||
Value: "",
|
|
||||||
Usage: "Use a custom Token URL (option for GitLab/GitHub)",
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "custom-profile-url",
|
|
||||||
Value: "",
|
|
||||||
Usage: "Use a custom Profile URL (option for GitLab/GitHub)",
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "custom-email-url",
|
|
||||||
Value: "",
|
|
||||||
Usage: "Use a custom Email URL (option for GitHub)",
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "icon-url",
|
|
||||||
Value: "",
|
|
||||||
Usage: "Custom icon URL for OAuth2 login source",
|
|
||||||
},
|
|
||||||
&cli.BoolFlag{
|
|
||||||
Name: "skip-local-2fa",
|
|
||||||
Usage: "Set to true to skip local 2fa for users authenticated by this source",
|
|
||||||
},
|
|
||||||
&cli.StringSliceFlag{
|
|
||||||
Name: "scopes",
|
|
||||||
Value: nil,
|
|
||||||
Usage: "Scopes to request when to authenticate against this OAuth2 source",
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "required-claim-name",
|
|
||||||
Value: "",
|
|
||||||
Usage: "Claim name that has to be set to allow users to login with this source",
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "required-claim-value",
|
|
||||||
Value: "",
|
|
||||||
Usage: "Claim value that has to be set to allow users to login with this source",
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "group-claim-name",
|
|
||||||
Value: "",
|
|
||||||
Usage: "Claim name providing group names for this source",
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "admin-group",
|
|
||||||
Value: "",
|
|
||||||
Usage: "Group Claim value for administrator users",
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "restricted-group",
|
|
||||||
Value: "",
|
|
||||||
Usage: "Group Claim value for restricted users",
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "group-team-map",
|
|
||||||
Value: "",
|
|
||||||
Usage: "JSON mapping between groups and org teams",
|
|
||||||
},
|
|
||||||
&cli.BoolFlag{
|
|
||||||
Name: "group-team-map-removal",
|
|
||||||
Usage: "Activate automatic team membership removal depending on groups",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
microcmdAuthUpdateOauth = &cli.Command{
|
|
||||||
Name: "update-oauth",
|
|
||||||
Usage: "Update existing Oauth authentication source",
|
|
||||||
Action: runUpdateOauth,
|
|
||||||
Flags: append(oauthCLIFlags[:1], append([]cli.Flag{idFlag}, oauthCLIFlags[1:]...)...),
|
|
||||||
}
|
|
||||||
|
|
||||||
microcmdAuthAddOauth = &cli.Command{
|
|
||||||
Name: "add-oauth",
|
|
||||||
Usage: "Add new Oauth authentication source",
|
|
||||||
Action: runAddOauth,
|
|
||||||
Flags: oauthCLIFlags,
|
|
||||||
}
|
|
||||||
|
|
||||||
subcmdSendMail = &cli.Command{
|
subcmdSendMail = &cli.Command{
|
||||||
Name: "sendmail",
|
Name: "sendmail",
|
||||||
Usage: "Send a message to all users",
|
Usage: "Send a message to all users",
|
||||||
|
@ -275,75 +87,9 @@ var (
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
smtpCLIFlags = []cli.Flag{
|
idFlag = &cli.Int64Flag{
|
||||||
&cli.StringFlag{
|
Name: "id",
|
||||||
Name: "name",
|
Usage: "ID of authentication source",
|
||||||
Value: "",
|
|
||||||
Usage: "Application Name",
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "auth-type",
|
|
||||||
Value: "PLAIN",
|
|
||||||
Usage: "SMTP Authentication Type (PLAIN/LOGIN/CRAM-MD5) default PLAIN",
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "host",
|
|
||||||
Value: "",
|
|
||||||
Usage: "SMTP Host",
|
|
||||||
},
|
|
||||||
&cli.IntFlag{
|
|
||||||
Name: "port",
|
|
||||||
Usage: "SMTP Port",
|
|
||||||
},
|
|
||||||
&cli.BoolFlag{
|
|
||||||
Name: "force-smtps",
|
|
||||||
Usage: "SMTPS is always used on port 465. Set this to force SMTPS on other ports.",
|
|
||||||
Value: true,
|
|
||||||
},
|
|
||||||
&cli.BoolFlag{
|
|
||||||
Name: "skip-verify",
|
|
||||||
Usage: "Skip TLS verify.",
|
|
||||||
Value: true,
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "helo-hostname",
|
|
||||||
Value: "",
|
|
||||||
Usage: "Hostname sent with HELO. Leave blank to send current hostname",
|
|
||||||
},
|
|
||||||
&cli.BoolFlag{
|
|
||||||
Name: "disable-helo",
|
|
||||||
Usage: "Disable SMTP helo.",
|
|
||||||
Value: true,
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "allowed-domains",
|
|
||||||
Value: "",
|
|
||||||
Usage: "Leave empty to allow all domains. Separate multiple domains with a comma (',')",
|
|
||||||
},
|
|
||||||
&cli.BoolFlag{
|
|
||||||
Name: "skip-local-2fa",
|
|
||||||
Usage: "Skip 2FA to log on.",
|
|
||||||
Value: true,
|
|
||||||
},
|
|
||||||
&cli.BoolFlag{
|
|
||||||
Name: "active",
|
|
||||||
Usage: "This Authentication Source is Activated.",
|
|
||||||
Value: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
microcmdAuthAddSMTP = &cli.Command{
|
|
||||||
Name: "add-smtp",
|
|
||||||
Usage: "Add new SMTP authentication source",
|
|
||||||
Action: runAddSMTP,
|
|
||||||
Flags: smtpCLIFlags,
|
|
||||||
}
|
|
||||||
|
|
||||||
microcmdAuthUpdateSMTP = &cli.Command{
|
|
||||||
Name: "update-smtp",
|
|
||||||
Usage: "Update existing SMTP authentication source",
|
|
||||||
Action: runUpdateSMTP,
|
|
||||||
Flags: append(smtpCLIFlags[:1], append([]cli.Flag{idFlag}, smtpCLIFlags[1:]...)...),
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -377,7 +123,7 @@ func runRepoSyncReleases(_ *cli.Context) error {
|
||||||
log.Trace("Processing next %d repos of %d", len(repos), count)
|
log.Trace("Processing next %d repos of %d", len(repos), count)
|
||||||
for _, repo := range repos {
|
for _, repo := range repos {
|
||||||
log.Trace("Synchronizing repo %s with path %s", repo.FullName(), repo.RepoPath())
|
log.Trace("Synchronizing repo %s with path %s", repo.FullName(), repo.RepoPath())
|
||||||
gitRepo, err := git.OpenRepository(ctx, repo.RepoPath())
|
gitRepo, err := gitrepo.OpenRepository(ctx, repo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warn("OpenRepository: %v", err)
|
log.Warn("OpenRepository: %v", err)
|
||||||
continue
|
continue
|
||||||
|
@ -389,7 +135,7 @@ func runRepoSyncReleases(_ *cli.Context) error {
|
||||||
}
|
}
|
||||||
log.Trace(" currentNumReleases is %d, running SyncReleasesWithTags", oldnum)
|
log.Trace(" currentNumReleases is %d, running SyncReleasesWithTags", oldnum)
|
||||||
|
|
||||||
if err = repo_module.SyncReleasesWithTags(repo, gitRepo); err != nil {
|
if err = repo_module.SyncReleasesWithTags(ctx, repo, gitRepo); err != nil {
|
||||||
log.Warn(" SyncReleasesWithTags: %v", err)
|
log.Warn(" SyncReleasesWithTags: %v", err)
|
||||||
gitRepo.Close()
|
gitRepo.Close()
|
||||||
continue
|
continue
|
||||||
|
@ -412,359 +158,11 @@ func runRepoSyncReleases(_ *cli.Context) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func getReleaseCount(ctx context.Context, id int64) (int64, error) {
|
func getReleaseCount(ctx context.Context, id int64) (int64, error) {
|
||||||
return repo_model.GetReleaseCountByRepoID(
|
return db.Count[repo_model.Release](
|
||||||
ctx,
|
ctx,
|
||||||
id,
|
|
||||||
repo_model.FindReleasesOptions{
|
repo_model.FindReleasesOptions{
|
||||||
|
RepoID: id,
|
||||||
IncludeTags: true,
|
IncludeTags: true,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func runRegenerateHooks(_ *cli.Context) error {
|
|
||||||
ctx, cancel := installSignals()
|
|
||||||
defer cancel()
|
|
||||||
|
|
||||||
if err := initDB(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return repo_service.SyncRepositoryHooks(graceful.GetManager().ShutdownContext())
|
|
||||||
}
|
|
||||||
|
|
||||||
func runRegenerateKeys(_ *cli.Context) error {
|
|
||||||
ctx, cancel := installSignals()
|
|
||||||
defer cancel()
|
|
||||||
|
|
||||||
if err := initDB(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return asymkey_model.RewriteAllPublicKeys()
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseOAuth2Config(c *cli.Context) *oauth2.Source {
|
|
||||||
var customURLMapping *oauth2.CustomURLMapping
|
|
||||||
if c.IsSet("use-custom-urls") {
|
|
||||||
customURLMapping = &oauth2.CustomURLMapping{
|
|
||||||
TokenURL: c.String("custom-token-url"),
|
|
||||||
AuthURL: c.String("custom-auth-url"),
|
|
||||||
ProfileURL: c.String("custom-profile-url"),
|
|
||||||
EmailURL: c.String("custom-email-url"),
|
|
||||||
Tenant: c.String("custom-tenant-id"),
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
customURLMapping = nil
|
|
||||||
}
|
|
||||||
return &oauth2.Source{
|
|
||||||
Provider: c.String("provider"),
|
|
||||||
ClientID: c.String("key"),
|
|
||||||
ClientSecret: c.String("secret"),
|
|
||||||
OpenIDConnectAutoDiscoveryURL: c.String("auto-discover-url"),
|
|
||||||
CustomURLMapping: customURLMapping,
|
|
||||||
IconURL: c.String("icon-url"),
|
|
||||||
SkipLocalTwoFA: c.Bool("skip-local-2fa"),
|
|
||||||
Scopes: c.StringSlice("scopes"),
|
|
||||||
RequiredClaimName: c.String("required-claim-name"),
|
|
||||||
RequiredClaimValue: c.String("required-claim-value"),
|
|
||||||
GroupClaimName: c.String("group-claim-name"),
|
|
||||||
AdminGroup: c.String("admin-group"),
|
|
||||||
RestrictedGroup: c.String("restricted-group"),
|
|
||||||
GroupTeamMap: c.String("group-team-map"),
|
|
||||||
GroupTeamMapRemoval: c.Bool("group-team-map-removal"),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func runAddOauth(c *cli.Context) error {
|
|
||||||
ctx, cancel := installSignals()
|
|
||||||
defer cancel()
|
|
||||||
|
|
||||||
if err := initDB(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
config := parseOAuth2Config(c)
|
|
||||||
if config.Provider == "openidConnect" {
|
|
||||||
discoveryURL, err := url.Parse(config.OpenIDConnectAutoDiscoveryURL)
|
|
||||||
if err != nil || (discoveryURL.Scheme != "http" && discoveryURL.Scheme != "https") {
|
|
||||||
return fmt.Errorf("invalid Auto Discovery URL: %s (this must be a valid URL starting with http:// or https://)", config.OpenIDConnectAutoDiscoveryURL)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return auth_model.CreateSource(&auth_model.Source{
|
|
||||||
Type: auth_model.OAuth2,
|
|
||||||
Name: c.String("name"),
|
|
||||||
IsActive: true,
|
|
||||||
Cfg: config,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func runUpdateOauth(c *cli.Context) error {
|
|
||||||
if !c.IsSet("id") {
|
|
||||||
return fmt.Errorf("--id flag is missing")
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx, cancel := installSignals()
|
|
||||||
defer cancel()
|
|
||||||
|
|
||||||
if err := initDB(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
source, err := auth_model.GetSourceByID(c.Int64("id"))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
oAuth2Config := source.Cfg.(*oauth2.Source)
|
|
||||||
|
|
||||||
if c.IsSet("name") {
|
|
||||||
source.Name = c.String("name")
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.IsSet("provider") {
|
|
||||||
oAuth2Config.Provider = c.String("provider")
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.IsSet("key") {
|
|
||||||
oAuth2Config.ClientID = c.String("key")
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.IsSet("secret") {
|
|
||||||
oAuth2Config.ClientSecret = c.String("secret")
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.IsSet("auto-discover-url") {
|
|
||||||
oAuth2Config.OpenIDConnectAutoDiscoveryURL = c.String("auto-discover-url")
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.IsSet("icon-url") {
|
|
||||||
oAuth2Config.IconURL = c.String("icon-url")
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.IsSet("scopes") {
|
|
||||||
oAuth2Config.Scopes = c.StringSlice("scopes")
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.IsSet("required-claim-name") {
|
|
||||||
oAuth2Config.RequiredClaimName = c.String("required-claim-name")
|
|
||||||
}
|
|
||||||
if c.IsSet("required-claim-value") {
|
|
||||||
oAuth2Config.RequiredClaimValue = c.String("required-claim-value")
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.IsSet("group-claim-name") {
|
|
||||||
oAuth2Config.GroupClaimName = c.String("group-claim-name")
|
|
||||||
}
|
|
||||||
if c.IsSet("admin-group") {
|
|
||||||
oAuth2Config.AdminGroup = c.String("admin-group")
|
|
||||||
}
|
|
||||||
if c.IsSet("restricted-group") {
|
|
||||||
oAuth2Config.RestrictedGroup = c.String("restricted-group")
|
|
||||||
}
|
|
||||||
if c.IsSet("group-team-map") {
|
|
||||||
oAuth2Config.GroupTeamMap = c.String("group-team-map")
|
|
||||||
}
|
|
||||||
if c.IsSet("group-team-map-removal") {
|
|
||||||
oAuth2Config.GroupTeamMapRemoval = c.Bool("group-team-map-removal")
|
|
||||||
}
|
|
||||||
|
|
||||||
// update custom URL mapping
|
|
||||||
customURLMapping := &oauth2.CustomURLMapping{}
|
|
||||||
|
|
||||||
if oAuth2Config.CustomURLMapping != nil {
|
|
||||||
customURLMapping.TokenURL = oAuth2Config.CustomURLMapping.TokenURL
|
|
||||||
customURLMapping.AuthURL = oAuth2Config.CustomURLMapping.AuthURL
|
|
||||||
customURLMapping.ProfileURL = oAuth2Config.CustomURLMapping.ProfileURL
|
|
||||||
customURLMapping.EmailURL = oAuth2Config.CustomURLMapping.EmailURL
|
|
||||||
customURLMapping.Tenant = oAuth2Config.CustomURLMapping.Tenant
|
|
||||||
}
|
|
||||||
if c.IsSet("use-custom-urls") && c.IsSet("custom-token-url") {
|
|
||||||
customURLMapping.TokenURL = c.String("custom-token-url")
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.IsSet("use-custom-urls") && c.IsSet("custom-auth-url") {
|
|
||||||
customURLMapping.AuthURL = c.String("custom-auth-url")
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.IsSet("use-custom-urls") && c.IsSet("custom-profile-url") {
|
|
||||||
customURLMapping.ProfileURL = c.String("custom-profile-url")
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.IsSet("use-custom-urls") && c.IsSet("custom-email-url") {
|
|
||||||
customURLMapping.EmailURL = c.String("custom-email-url")
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.IsSet("use-custom-urls") && c.IsSet("custom-tenant-id") {
|
|
||||||
customURLMapping.Tenant = c.String("custom-tenant-id")
|
|
||||||
}
|
|
||||||
|
|
||||||
oAuth2Config.CustomURLMapping = customURLMapping
|
|
||||||
source.Cfg = oAuth2Config
|
|
||||||
|
|
||||||
return auth_model.UpdateSource(source)
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseSMTPConfig(c *cli.Context, conf *smtp.Source) error {
|
|
||||||
if c.IsSet("auth-type") {
|
|
||||||
conf.Auth = c.String("auth-type")
|
|
||||||
validAuthTypes := []string{"PLAIN", "LOGIN", "CRAM-MD5"}
|
|
||||||
if !util.SliceContainsString(validAuthTypes, strings.ToUpper(c.String("auth-type"))) {
|
|
||||||
return errors.New("Auth must be one of PLAIN/LOGIN/CRAM-MD5")
|
|
||||||
}
|
|
||||||
conf.Auth = c.String("auth-type")
|
|
||||||
}
|
|
||||||
if c.IsSet("host") {
|
|
||||||
conf.Host = c.String("host")
|
|
||||||
}
|
|
||||||
if c.IsSet("port") {
|
|
||||||
conf.Port = c.Int("port")
|
|
||||||
}
|
|
||||||
if c.IsSet("allowed-domains") {
|
|
||||||
conf.AllowedDomains = c.String("allowed-domains")
|
|
||||||
}
|
|
||||||
if c.IsSet("force-smtps") {
|
|
||||||
conf.ForceSMTPS = c.Bool("force-smtps")
|
|
||||||
}
|
|
||||||
if c.IsSet("skip-verify") {
|
|
||||||
conf.SkipVerify = c.Bool("skip-verify")
|
|
||||||
}
|
|
||||||
if c.IsSet("helo-hostname") {
|
|
||||||
conf.HeloHostname = c.String("helo-hostname")
|
|
||||||
}
|
|
||||||
if c.IsSet("disable-helo") {
|
|
||||||
conf.DisableHelo = c.Bool("disable-helo")
|
|
||||||
}
|
|
||||||
if c.IsSet("skip-local-2fa") {
|
|
||||||
conf.SkipLocalTwoFA = c.Bool("skip-local-2fa")
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func runAddSMTP(c *cli.Context) error {
|
|
||||||
ctx, cancel := installSignals()
|
|
||||||
defer cancel()
|
|
||||||
|
|
||||||
if err := initDB(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if !c.IsSet("name") || len(c.String("name")) == 0 {
|
|
||||||
return errors.New("name must be set")
|
|
||||||
}
|
|
||||||
if !c.IsSet("host") || len(c.String("host")) == 0 {
|
|
||||||
return errors.New("host must be set")
|
|
||||||
}
|
|
||||||
if !c.IsSet("port") {
|
|
||||||
return errors.New("port must be set")
|
|
||||||
}
|
|
||||||
active := true
|
|
||||||
if c.IsSet("active") {
|
|
||||||
active = c.Bool("active")
|
|
||||||
}
|
|
||||||
|
|
||||||
var smtpConfig smtp.Source
|
|
||||||
if err := parseSMTPConfig(c, &smtpConfig); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// If not set default to PLAIN
|
|
||||||
if len(smtpConfig.Auth) == 0 {
|
|
||||||
smtpConfig.Auth = "PLAIN"
|
|
||||||
}
|
|
||||||
|
|
||||||
return auth_model.CreateSource(&auth_model.Source{
|
|
||||||
Type: auth_model.SMTP,
|
|
||||||
Name: c.String("name"),
|
|
||||||
IsActive: active,
|
|
||||||
Cfg: &smtpConfig,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func runUpdateSMTP(c *cli.Context) error {
|
|
||||||
if !c.IsSet("id") {
|
|
||||||
return fmt.Errorf("--id flag is missing")
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx, cancel := installSignals()
|
|
||||||
defer cancel()
|
|
||||||
|
|
||||||
if err := initDB(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
source, err := auth_model.GetSourceByID(c.Int64("id"))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
smtpConfig := source.Cfg.(*smtp.Source)
|
|
||||||
|
|
||||||
if err := parseSMTPConfig(c, smtpConfig); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.IsSet("name") {
|
|
||||||
source.Name = c.String("name")
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.IsSet("active") {
|
|
||||||
source.IsActive = c.Bool("active")
|
|
||||||
}
|
|
||||||
|
|
||||||
source.Cfg = smtpConfig
|
|
||||||
|
|
||||||
return auth_model.UpdateSource(source)
|
|
||||||
}
|
|
||||||
|
|
||||||
func runListAuth(c *cli.Context) error {
|
|
||||||
ctx, cancel := installSignals()
|
|
||||||
defer cancel()
|
|
||||||
|
|
||||||
if err := initDB(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
authSources, err := auth_model.Sources()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
flags := tabwriter.AlignRight
|
|
||||||
if c.Bool("vertical-bars") {
|
|
||||||
flags |= tabwriter.Debug
|
|
||||||
}
|
|
||||||
|
|
||||||
padChar := byte('\t')
|
|
||||||
if len(c.String("pad-char")) > 0 {
|
|
||||||
padChar = c.String("pad-char")[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
// loop through each source and print
|
|
||||||
w := tabwriter.NewWriter(os.Stdout, c.Int("min-width"), c.Int("tab-width"), c.Int("padding"), padChar, flags)
|
|
||||||
fmt.Fprintf(w, "ID\tName\tType\tEnabled\n")
|
|
||||||
for _, source := range authSources {
|
|
||||||
fmt.Fprintf(w, "%d\t%s\t%s\t%t\n", source.ID, source.Name, source.Type.String(), source.IsActive)
|
|
||||||
}
|
|
||||||
w.Flush()
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func runDeleteAuth(c *cli.Context) error {
|
|
||||||
if !c.IsSet("id") {
|
|
||||||
return fmt.Errorf("--id flag is missing")
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx, cancel := installSignals()
|
|
||||||
defer cancel()
|
|
||||||
|
|
||||||
if err := initDB(ctx); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
source, err := auth_model.GetSourceByID(c.Int64("id"))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return auth_service.DeleteSource(source)
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,110 @@
|
||||||
|
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"text/tabwriter"
|
||||||
|
|
||||||
|
auth_model "code.gitea.io/gitea/models/auth"
|
||||||
|
"code.gitea.io/gitea/models/db"
|
||||||
|
auth_service "code.gitea.io/gitea/services/auth"
|
||||||
|
|
||||||
|
"github.com/urfave/cli/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
microcmdAuthDelete = &cli.Command{
|
||||||
|
Name: "delete",
|
||||||
|
Usage: "Delete specific auth source",
|
||||||
|
Flags: []cli.Flag{idFlag},
|
||||||
|
Action: runDeleteAuth,
|
||||||
|
}
|
||||||
|
microcmdAuthList = &cli.Command{
|
||||||
|
Name: "list",
|
||||||
|
Usage: "List auth sources",
|
||||||
|
Action: runListAuth,
|
||||||
|
Flags: []cli.Flag{
|
||||||
|
&cli.IntFlag{
|
||||||
|
Name: "min-width",
|
||||||
|
Usage: "Minimal cell width including any padding for the formatted table",
|
||||||
|
Value: 0,
|
||||||
|
},
|
||||||
|
&cli.IntFlag{
|
||||||
|
Name: "tab-width",
|
||||||
|
Usage: "width of tab characters in formatted table (equivalent number of spaces)",
|
||||||
|
Value: 8,
|
||||||
|
},
|
||||||
|
&cli.IntFlag{
|
||||||
|
Name: "padding",
|
||||||
|
Usage: "padding added to a cell before computing its width",
|
||||||
|
Value: 1,
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "pad-char",
|
||||||
|
Usage: `ASCII char used for padding if padchar == '\\t', the Writer will assume that the width of a '\\t' in the formatted output is tabwidth, and cells are left-aligned independent of align_left (for correct-looking results, tabwidth must correspond to the tab width in the viewer displaying the result)`,
|
||||||
|
Value: "\t",
|
||||||
|
},
|
||||||
|
&cli.BoolFlag{
|
||||||
|
Name: "vertical-bars",
|
||||||
|
Usage: "Set to true to print vertical bars between columns",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func runListAuth(c *cli.Context) error {
|
||||||
|
ctx, cancel := installSignals()
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
if err := initDB(ctx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
authSources, err := db.Find[auth_model.Source](ctx, auth_model.FindSourcesOptions{})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
flags := tabwriter.AlignRight
|
||||||
|
if c.Bool("vertical-bars") {
|
||||||
|
flags |= tabwriter.Debug
|
||||||
|
}
|
||||||
|
|
||||||
|
padChar := byte('\t')
|
||||||
|
if len(c.String("pad-char")) > 0 {
|
||||||
|
padChar = c.String("pad-char")[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
// loop through each source and print
|
||||||
|
w := tabwriter.NewWriter(os.Stdout, c.Int("min-width"), c.Int("tab-width"), c.Int("padding"), padChar, flags)
|
||||||
|
fmt.Fprintf(w, "ID\tName\tType\tEnabled\n")
|
||||||
|
for _, source := range authSources {
|
||||||
|
fmt.Fprintf(w, "%d\t%s\t%s\t%t\n", source.ID, source.Name, source.Type.String(), source.IsActive)
|
||||||
|
}
|
||||||
|
w.Flush()
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func runDeleteAuth(c *cli.Context) error {
|
||||||
|
if !c.IsSet("id") {
|
||||||
|
return fmt.Errorf("--id flag is missing")
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx, cancel := installSignals()
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
if err := initDB(ctx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
source, err := auth_model.GetSourceByID(ctx, c.Int64("id"))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return auth_service.DeleteSource(ctx, source)
|
||||||
|
}
|
|
@ -17,9 +17,9 @@ import (
|
||||||
type (
|
type (
|
||||||
authService struct {
|
authService struct {
|
||||||
initDB func(ctx context.Context) error
|
initDB func(ctx context.Context) error
|
||||||
createAuthSource func(*auth.Source) error
|
createAuthSource func(context.Context, *auth.Source) error
|
||||||
updateAuthSource func(*auth.Source) error
|
updateAuthSource func(context.Context, *auth.Source) error
|
||||||
getAuthSourceByID func(id int64) (*auth.Source, error)
|
getAuthSourceByID func(ctx context.Context, id int64) (*auth.Source, error)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -132,10 +132,10 @@ var (
|
||||||
ldapSimpleAuthCLIFlags = append(commonLdapCLIFlags,
|
ldapSimpleAuthCLIFlags = append(commonLdapCLIFlags,
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "user-dn",
|
Name: "user-dn",
|
||||||
Usage: "The user’s DN.",
|
Usage: "The user's DN.",
|
||||||
})
|
})
|
||||||
|
|
||||||
cmdAuthAddLdapBindDn = &cli.Command{
|
microcmdAuthAddLdapBindDn = &cli.Command{
|
||||||
Name: "add-ldap",
|
Name: "add-ldap",
|
||||||
Usage: "Add new LDAP (via Bind DN) authentication source",
|
Usage: "Add new LDAP (via Bind DN) authentication source",
|
||||||
Action: func(c *cli.Context) error {
|
Action: func(c *cli.Context) error {
|
||||||
|
@ -144,7 +144,7 @@ var (
|
||||||
Flags: ldapBindDnCLIFlags,
|
Flags: ldapBindDnCLIFlags,
|
||||||
}
|
}
|
||||||
|
|
||||||
cmdAuthUpdateLdapBindDn = &cli.Command{
|
microcmdAuthUpdateLdapBindDn = &cli.Command{
|
||||||
Name: "update-ldap",
|
Name: "update-ldap",
|
||||||
Usage: "Update existing LDAP (via Bind DN) authentication source",
|
Usage: "Update existing LDAP (via Bind DN) authentication source",
|
||||||
Action: func(c *cli.Context) error {
|
Action: func(c *cli.Context) error {
|
||||||
|
@ -153,7 +153,7 @@ var (
|
||||||
Flags: append([]cli.Flag{idFlag}, ldapBindDnCLIFlags...),
|
Flags: append([]cli.Flag{idFlag}, ldapBindDnCLIFlags...),
|
||||||
}
|
}
|
||||||
|
|
||||||
cmdAuthAddLdapSimpleAuth = &cli.Command{
|
microcmdAuthAddLdapSimpleAuth = &cli.Command{
|
||||||
Name: "add-ldap-simple",
|
Name: "add-ldap-simple",
|
||||||
Usage: "Add new LDAP (simple auth) authentication source",
|
Usage: "Add new LDAP (simple auth) authentication source",
|
||||||
Action: func(c *cli.Context) error {
|
Action: func(c *cli.Context) error {
|
||||||
|
@ -162,7 +162,7 @@ var (
|
||||||
Flags: ldapSimpleAuthCLIFlags,
|
Flags: ldapSimpleAuthCLIFlags,
|
||||||
}
|
}
|
||||||
|
|
||||||
cmdAuthUpdateLdapSimpleAuth = &cli.Command{
|
microcmdAuthUpdateLdapSimpleAuth = &cli.Command{
|
||||||
Name: "update-ldap-simple",
|
Name: "update-ldap-simple",
|
||||||
Usage: "Update existing LDAP (simple auth) authentication source",
|
Usage: "Update existing LDAP (simple auth) authentication source",
|
||||||
Action: func(c *cli.Context) error {
|
Action: func(c *cli.Context) error {
|
||||||
|
@ -289,12 +289,12 @@ func findLdapSecurityProtocolByName(name string) (ldap.SecurityProtocol, bool) {
|
||||||
|
|
||||||
// getAuthSource gets the login source by its id defined in the command line flags.
|
// getAuthSource gets the login source by its id defined in the command line flags.
|
||||||
// It returns an error if the id is not set, does not match any source or if the source is not of expected type.
|
// It returns an error if the id is not set, does not match any source or if the source is not of expected type.
|
||||||
func (a *authService) getAuthSource(c *cli.Context, authType auth.Type) (*auth.Source, error) {
|
func (a *authService) getAuthSource(ctx context.Context, c *cli.Context, authType auth.Type) (*auth.Source, error) {
|
||||||
if err := argsSet(c, "id"); err != nil {
|
if err := argsSet(c, "id"); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
authSource, err := a.getAuthSourceByID(c.Int64("id"))
|
authSource, err := a.getAuthSourceByID(ctx, c.Int64("id"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -332,7 +332,7 @@ func (a *authService) addLdapBindDn(c *cli.Context) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return a.createAuthSource(authSource)
|
return a.createAuthSource(ctx, authSource)
|
||||||
}
|
}
|
||||||
|
|
||||||
// updateLdapBindDn updates a new LDAP via Bind DN authentication source.
|
// updateLdapBindDn updates a new LDAP via Bind DN authentication source.
|
||||||
|
@ -344,7 +344,7 @@ func (a *authService) updateLdapBindDn(c *cli.Context) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
authSource, err := a.getAuthSource(c, auth.LDAP)
|
authSource, err := a.getAuthSource(ctx, c, auth.LDAP)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -354,7 +354,7 @@ func (a *authService) updateLdapBindDn(c *cli.Context) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return a.updateAuthSource(authSource)
|
return a.updateAuthSource(ctx, authSource)
|
||||||
}
|
}
|
||||||
|
|
||||||
// addLdapSimpleAuth adds a new LDAP (simple auth) authentication source.
|
// addLdapSimpleAuth adds a new LDAP (simple auth) authentication source.
|
||||||
|
@ -383,7 +383,7 @@ func (a *authService) addLdapSimpleAuth(c *cli.Context) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return a.createAuthSource(authSource)
|
return a.createAuthSource(ctx, authSource)
|
||||||
}
|
}
|
||||||
|
|
||||||
// updateLdapBindDn updates a new LDAP (simple auth) authentication source.
|
// updateLdapBindDn updates a new LDAP (simple auth) authentication source.
|
||||||
|
@ -395,7 +395,7 @@ func (a *authService) updateLdapSimpleAuth(c *cli.Context) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
authSource, err := a.getAuthSource(c, auth.DLDAP)
|
authSource, err := a.getAuthSource(ctx, c, auth.DLDAP)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -405,5 +405,5 @@ func (a *authService) updateLdapSimpleAuth(c *cli.Context) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return a.updateAuthSource(authSource)
|
return a.updateAuthSource(ctx, authSource)
|
||||||
}
|
}
|
||||||
|
|
|
@ -210,15 +210,15 @@ func TestAddLdapBindDn(t *testing.T) {
|
||||||
initDB: func(context.Context) error {
|
initDB: func(context.Context) error {
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
createAuthSource: func(authSource *auth.Source) error {
|
createAuthSource: func(ctx context.Context, authSource *auth.Source) error {
|
||||||
createdAuthSource = authSource
|
createdAuthSource = authSource
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
updateAuthSource: func(authSource *auth.Source) error {
|
updateAuthSource: func(ctx context.Context, authSource *auth.Source) error {
|
||||||
assert.FailNow(t, "case %d: should not call updateAuthSource", n)
|
assert.FailNow(t, "case %d: should not call updateAuthSource", n)
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
getAuthSourceByID: func(id int64) (*auth.Source, error) {
|
getAuthSourceByID: func(ctx context.Context, id int64) (*auth.Source, error) {
|
||||||
assert.FailNow(t, "case %d: should not call getAuthSourceByID", n)
|
assert.FailNow(t, "case %d: should not call getAuthSourceByID", n)
|
||||||
return nil, nil
|
return nil, nil
|
||||||
},
|
},
|
||||||
|
@ -226,7 +226,7 @@ func TestAddLdapBindDn(t *testing.T) {
|
||||||
|
|
||||||
// Create a copy of command to test
|
// Create a copy of command to test
|
||||||
app := cli.NewApp()
|
app := cli.NewApp()
|
||||||
app.Flags = cmdAuthAddLdapBindDn.Flags
|
app.Flags = microcmdAuthAddLdapBindDn.Flags
|
||||||
app.Action = service.addLdapBindDn
|
app.Action = service.addLdapBindDn
|
||||||
|
|
||||||
// Run it
|
// Run it
|
||||||
|
@ -441,15 +441,15 @@ func TestAddLdapSimpleAuth(t *testing.T) {
|
||||||
initDB: func(context.Context) error {
|
initDB: func(context.Context) error {
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
createAuthSource: func(authSource *auth.Source) error {
|
createAuthSource: func(ctx context.Context, authSource *auth.Source) error {
|
||||||
createdAuthSource = authSource
|
createdAuthSource = authSource
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
updateAuthSource: func(authSource *auth.Source) error {
|
updateAuthSource: func(ctx context.Context, authSource *auth.Source) error {
|
||||||
assert.FailNow(t, "case %d: should not call updateAuthSource", n)
|
assert.FailNow(t, "case %d: should not call updateAuthSource", n)
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
getAuthSourceByID: func(id int64) (*auth.Source, error) {
|
getAuthSourceByID: func(ctx context.Context, id int64) (*auth.Source, error) {
|
||||||
assert.FailNow(t, "case %d: should not call getAuthSourceByID", n)
|
assert.FailNow(t, "case %d: should not call getAuthSourceByID", n)
|
||||||
return nil, nil
|
return nil, nil
|
||||||
},
|
},
|
||||||
|
@ -457,7 +457,7 @@ func TestAddLdapSimpleAuth(t *testing.T) {
|
||||||
|
|
||||||
// Create a copy of command to test
|
// Create a copy of command to test
|
||||||
app := cli.NewApp()
|
app := cli.NewApp()
|
||||||
app.Flags = cmdAuthAddLdapSimpleAuth.Flags
|
app.Flags = microcmdAuthAddLdapSimpleAuth.Flags
|
||||||
app.Action = service.addLdapSimpleAuth
|
app.Action = service.addLdapSimpleAuth
|
||||||
|
|
||||||
// Run it
|
// Run it
|
||||||
|
@ -896,15 +896,15 @@ func TestUpdateLdapBindDn(t *testing.T) {
|
||||||
initDB: func(context.Context) error {
|
initDB: func(context.Context) error {
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
createAuthSource: func(authSource *auth.Source) error {
|
createAuthSource: func(ctx context.Context, authSource *auth.Source) error {
|
||||||
assert.FailNow(t, "case %d: should not call createAuthSource", n)
|
assert.FailNow(t, "case %d: should not call createAuthSource", n)
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
updateAuthSource: func(authSource *auth.Source) error {
|
updateAuthSource: func(ctx context.Context, authSource *auth.Source) error {
|
||||||
updatedAuthSource = authSource
|
updatedAuthSource = authSource
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
getAuthSourceByID: func(id int64) (*auth.Source, error) {
|
getAuthSourceByID: func(ctx context.Context, id int64) (*auth.Source, error) {
|
||||||
if c.id != 0 {
|
if c.id != 0 {
|
||||||
assert.Equal(t, c.id, id, "case %d: wrong id", n)
|
assert.Equal(t, c.id, id, "case %d: wrong id", n)
|
||||||
}
|
}
|
||||||
|
@ -920,7 +920,7 @@ func TestUpdateLdapBindDn(t *testing.T) {
|
||||||
|
|
||||||
// Create a copy of command to test
|
// Create a copy of command to test
|
||||||
app := cli.NewApp()
|
app := cli.NewApp()
|
||||||
app.Flags = cmdAuthUpdateLdapBindDn.Flags
|
app.Flags = microcmdAuthUpdateLdapBindDn.Flags
|
||||||
app.Action = service.updateLdapBindDn
|
app.Action = service.updateLdapBindDn
|
||||||
|
|
||||||
// Run it
|
// Run it
|
||||||
|
@ -1286,15 +1286,15 @@ func TestUpdateLdapSimpleAuth(t *testing.T) {
|
||||||
initDB: func(context.Context) error {
|
initDB: func(context.Context) error {
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
createAuthSource: func(authSource *auth.Source) error {
|
createAuthSource: func(ctx context.Context, authSource *auth.Source) error {
|
||||||
assert.FailNow(t, "case %d: should not call createAuthSource", n)
|
assert.FailNow(t, "case %d: should not call createAuthSource", n)
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
updateAuthSource: func(authSource *auth.Source) error {
|
updateAuthSource: func(ctx context.Context, authSource *auth.Source) error {
|
||||||
updatedAuthSource = authSource
|
updatedAuthSource = authSource
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
getAuthSourceByID: func(id int64) (*auth.Source, error) {
|
getAuthSourceByID: func(ctx context.Context, id int64) (*auth.Source, error) {
|
||||||
if c.id != 0 {
|
if c.id != 0 {
|
||||||
assert.Equal(t, c.id, id, "case %d: wrong id", n)
|
assert.Equal(t, c.id, id, "case %d: wrong id", n)
|
||||||
}
|
}
|
||||||
|
@ -1310,7 +1310,7 @@ func TestUpdateLdapSimpleAuth(t *testing.T) {
|
||||||
|
|
||||||
// Create a copy of command to test
|
// Create a copy of command to test
|
||||||
app := cli.NewApp()
|
app := cli.NewApp()
|
||||||
app.Flags = cmdAuthUpdateLdapSimpleAuth.Flags
|
app.Flags = microcmdAuthUpdateLdapSimpleAuth.Flags
|
||||||
app.Action = service.updateLdapSimpleAuth
|
app.Action = service.updateLdapSimpleAuth
|
||||||
|
|
||||||
// Run it
|
// Run it
|
||||||
|
|
|
@ -0,0 +1,298 @@
|
||||||
|
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/url"
|
||||||
|
|
||||||
|
auth_model "code.gitea.io/gitea/models/auth"
|
||||||
|
"code.gitea.io/gitea/services/auth/source/oauth2"
|
||||||
|
|
||||||
|
"github.com/urfave/cli/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
oauthCLIFlags = []cli.Flag{
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "name",
|
||||||
|
Value: "",
|
||||||
|
Usage: "Application Name",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "provider",
|
||||||
|
Value: "",
|
||||||
|
Usage: "OAuth2 Provider",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "key",
|
||||||
|
Value: "",
|
||||||
|
Usage: "Client ID (Key)",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "secret",
|
||||||
|
Value: "",
|
||||||
|
Usage: "Client Secret",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "auto-discover-url",
|
||||||
|
Value: "",
|
||||||
|
Usage: "OpenID Connect Auto Discovery URL (only required when using OpenID Connect as provider)",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "use-custom-urls",
|
||||||
|
Value: "false",
|
||||||
|
Usage: "Use custom URLs for GitLab/GitHub OAuth endpoints",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "custom-tenant-id",
|
||||||
|
Value: "",
|
||||||
|
Usage: "Use custom Tenant ID for OAuth endpoints",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "custom-auth-url",
|
||||||
|
Value: "",
|
||||||
|
Usage: "Use a custom Authorization URL (option for GitLab/GitHub)",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "custom-token-url",
|
||||||
|
Value: "",
|
||||||
|
Usage: "Use a custom Token URL (option for GitLab/GitHub)",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "custom-profile-url",
|
||||||
|
Value: "",
|
||||||
|
Usage: "Use a custom Profile URL (option for GitLab/GitHub)",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "custom-email-url",
|
||||||
|
Value: "",
|
||||||
|
Usage: "Use a custom Email URL (option for GitHub)",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "icon-url",
|
||||||
|
Value: "",
|
||||||
|
Usage: "Custom icon URL for OAuth2 login source",
|
||||||
|
},
|
||||||
|
&cli.BoolFlag{
|
||||||
|
Name: "skip-local-2fa",
|
||||||
|
Usage: "Set to true to skip local 2fa for users authenticated by this source",
|
||||||
|
},
|
||||||
|
&cli.StringSliceFlag{
|
||||||
|
Name: "scopes",
|
||||||
|
Value: nil,
|
||||||
|
Usage: "Scopes to request when to authenticate against this OAuth2 source",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "required-claim-name",
|
||||||
|
Value: "",
|
||||||
|
Usage: "Claim name that has to be set to allow users to login with this source",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "required-claim-value",
|
||||||
|
Value: "",
|
||||||
|
Usage: "Claim value that has to be set to allow users to login with this source",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "group-claim-name",
|
||||||
|
Value: "",
|
||||||
|
Usage: "Claim name providing group names for this source",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "admin-group",
|
||||||
|
Value: "",
|
||||||
|
Usage: "Group Claim value for administrator users",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "restricted-group",
|
||||||
|
Value: "",
|
||||||
|
Usage: "Group Claim value for restricted users",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "group-team-map",
|
||||||
|
Value: "",
|
||||||
|
Usage: "JSON mapping between groups and org teams",
|
||||||
|
},
|
||||||
|
&cli.BoolFlag{
|
||||||
|
Name: "group-team-map-removal",
|
||||||
|
Usage: "Activate automatic team membership removal depending on groups",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
microcmdAuthAddOauth = &cli.Command{
|
||||||
|
Name: "add-oauth",
|
||||||
|
Usage: "Add new Oauth authentication source",
|
||||||
|
Action: runAddOauth,
|
||||||
|
Flags: oauthCLIFlags,
|
||||||
|
}
|
||||||
|
|
||||||
|
microcmdAuthUpdateOauth = &cli.Command{
|
||||||
|
Name: "update-oauth",
|
||||||
|
Usage: "Update existing Oauth authentication source",
|
||||||
|
Action: runUpdateOauth,
|
||||||
|
Flags: append(oauthCLIFlags[:1], append([]cli.Flag{idFlag}, oauthCLIFlags[1:]...)...),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func parseOAuth2Config(c *cli.Context) *oauth2.Source {
|
||||||
|
var customURLMapping *oauth2.CustomURLMapping
|
||||||
|
if c.IsSet("use-custom-urls") {
|
||||||
|
customURLMapping = &oauth2.CustomURLMapping{
|
||||||
|
TokenURL: c.String("custom-token-url"),
|
||||||
|
AuthURL: c.String("custom-auth-url"),
|
||||||
|
ProfileURL: c.String("custom-profile-url"),
|
||||||
|
EmailURL: c.String("custom-email-url"),
|
||||||
|
Tenant: c.String("custom-tenant-id"),
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
customURLMapping = nil
|
||||||
|
}
|
||||||
|
return &oauth2.Source{
|
||||||
|
Provider: c.String("provider"),
|
||||||
|
ClientID: c.String("key"),
|
||||||
|
ClientSecret: c.String("secret"),
|
||||||
|
OpenIDConnectAutoDiscoveryURL: c.String("auto-discover-url"),
|
||||||
|
CustomURLMapping: customURLMapping,
|
||||||
|
IconURL: c.String("icon-url"),
|
||||||
|
SkipLocalTwoFA: c.Bool("skip-local-2fa"),
|
||||||
|
Scopes: c.StringSlice("scopes"),
|
||||||
|
RequiredClaimName: c.String("required-claim-name"),
|
||||||
|
RequiredClaimValue: c.String("required-claim-value"),
|
||||||
|
GroupClaimName: c.String("group-claim-name"),
|
||||||
|
AdminGroup: c.String("admin-group"),
|
||||||
|
RestrictedGroup: c.String("restricted-group"),
|
||||||
|
GroupTeamMap: c.String("group-team-map"),
|
||||||
|
GroupTeamMapRemoval: c.Bool("group-team-map-removal"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func runAddOauth(c *cli.Context) error {
|
||||||
|
ctx, cancel := installSignals()
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
if err := initDB(ctx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
config := parseOAuth2Config(c)
|
||||||
|
if config.Provider == "openidConnect" {
|
||||||
|
discoveryURL, err := url.Parse(config.OpenIDConnectAutoDiscoveryURL)
|
||||||
|
if err != nil || (discoveryURL.Scheme != "http" && discoveryURL.Scheme != "https") {
|
||||||
|
return fmt.Errorf("invalid Auto Discovery URL: %s (this must be a valid URL starting with http:// or https://)", config.OpenIDConnectAutoDiscoveryURL)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return auth_model.CreateSource(ctx, &auth_model.Source{
|
||||||
|
Type: auth_model.OAuth2,
|
||||||
|
Name: c.String("name"),
|
||||||
|
IsActive: true,
|
||||||
|
Cfg: config,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func runUpdateOauth(c *cli.Context) error {
|
||||||
|
if !c.IsSet("id") {
|
||||||
|
return fmt.Errorf("--id flag is missing")
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx, cancel := installSignals()
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
if err := initDB(ctx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
source, err := auth_model.GetSourceByID(ctx, c.Int64("id"))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
oAuth2Config := source.Cfg.(*oauth2.Source)
|
||||||
|
|
||||||
|
if c.IsSet("name") {
|
||||||
|
source.Name = c.String("name")
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.IsSet("provider") {
|
||||||
|
oAuth2Config.Provider = c.String("provider")
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.IsSet("key") {
|
||||||
|
oAuth2Config.ClientID = c.String("key")
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.IsSet("secret") {
|
||||||
|
oAuth2Config.ClientSecret = c.String("secret")
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.IsSet("auto-discover-url") {
|
||||||
|
oAuth2Config.OpenIDConnectAutoDiscoveryURL = c.String("auto-discover-url")
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.IsSet("icon-url") {
|
||||||
|
oAuth2Config.IconURL = c.String("icon-url")
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.IsSet("scopes") {
|
||||||
|
oAuth2Config.Scopes = c.StringSlice("scopes")
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.IsSet("required-claim-name") {
|
||||||
|
oAuth2Config.RequiredClaimName = c.String("required-claim-name")
|
||||||
|
}
|
||||||
|
if c.IsSet("required-claim-value") {
|
||||||
|
oAuth2Config.RequiredClaimValue = c.String("required-claim-value")
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.IsSet("group-claim-name") {
|
||||||
|
oAuth2Config.GroupClaimName = c.String("group-claim-name")
|
||||||
|
}
|
||||||
|
if c.IsSet("admin-group") {
|
||||||
|
oAuth2Config.AdminGroup = c.String("admin-group")
|
||||||
|
}
|
||||||
|
if c.IsSet("restricted-group") {
|
||||||
|
oAuth2Config.RestrictedGroup = c.String("restricted-group")
|
||||||
|
}
|
||||||
|
if c.IsSet("group-team-map") {
|
||||||
|
oAuth2Config.GroupTeamMap = c.String("group-team-map")
|
||||||
|
}
|
||||||
|
if c.IsSet("group-team-map-removal") {
|
||||||
|
oAuth2Config.GroupTeamMapRemoval = c.Bool("group-team-map-removal")
|
||||||
|
}
|
||||||
|
|
||||||
|
// update custom URL mapping
|
||||||
|
customURLMapping := &oauth2.CustomURLMapping{}
|
||||||
|
|
||||||
|
if oAuth2Config.CustomURLMapping != nil {
|
||||||
|
customURLMapping.TokenURL = oAuth2Config.CustomURLMapping.TokenURL
|
||||||
|
customURLMapping.AuthURL = oAuth2Config.CustomURLMapping.AuthURL
|
||||||
|
customURLMapping.ProfileURL = oAuth2Config.CustomURLMapping.ProfileURL
|
||||||
|
customURLMapping.EmailURL = oAuth2Config.CustomURLMapping.EmailURL
|
||||||
|
customURLMapping.Tenant = oAuth2Config.CustomURLMapping.Tenant
|
||||||
|
}
|
||||||
|
if c.IsSet("use-custom-urls") && c.IsSet("custom-token-url") {
|
||||||
|
customURLMapping.TokenURL = c.String("custom-token-url")
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.IsSet("use-custom-urls") && c.IsSet("custom-auth-url") {
|
||||||
|
customURLMapping.AuthURL = c.String("custom-auth-url")
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.IsSet("use-custom-urls") && c.IsSet("custom-profile-url") {
|
||||||
|
customURLMapping.ProfileURL = c.String("custom-profile-url")
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.IsSet("use-custom-urls") && c.IsSet("custom-email-url") {
|
||||||
|
customURLMapping.EmailURL = c.String("custom-email-url")
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.IsSet("use-custom-urls") && c.IsSet("custom-tenant-id") {
|
||||||
|
customURLMapping.Tenant = c.String("custom-tenant-id")
|
||||||
|
}
|
||||||
|
|
||||||
|
oAuth2Config.CustomURLMapping = customURLMapping
|
||||||
|
source.Cfg = oAuth2Config
|
||||||
|
|
||||||
|
return auth_model.UpdateSource(ctx, source)
|
||||||
|
}
|
|
@ -0,0 +1,201 @@
|
||||||
|
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
auth_model "code.gitea.io/gitea/models/auth"
|
||||||
|
"code.gitea.io/gitea/modules/util"
|
||||||
|
"code.gitea.io/gitea/services/auth/source/smtp"
|
||||||
|
|
||||||
|
"github.com/urfave/cli/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
smtpCLIFlags = []cli.Flag{
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "name",
|
||||||
|
Value: "",
|
||||||
|
Usage: "Application Name",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "auth-type",
|
||||||
|
Value: "PLAIN",
|
||||||
|
Usage: "SMTP Authentication Type (PLAIN/LOGIN/CRAM-MD5) default PLAIN",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "host",
|
||||||
|
Value: "",
|
||||||
|
Usage: "SMTP Host",
|
||||||
|
},
|
||||||
|
&cli.IntFlag{
|
||||||
|
Name: "port",
|
||||||
|
Usage: "SMTP Port",
|
||||||
|
},
|
||||||
|
&cli.BoolFlag{
|
||||||
|
Name: "force-smtps",
|
||||||
|
Usage: "SMTPS is always used on port 465. Set this to force SMTPS on other ports.",
|
||||||
|
Value: true,
|
||||||
|
},
|
||||||
|
&cli.BoolFlag{
|
||||||
|
Name: "skip-verify",
|
||||||
|
Usage: "Skip TLS verify.",
|
||||||
|
Value: true,
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "helo-hostname",
|
||||||
|
Value: "",
|
||||||
|
Usage: "Hostname sent with HELO. Leave blank to send current hostname",
|
||||||
|
},
|
||||||
|
&cli.BoolFlag{
|
||||||
|
Name: "disable-helo",
|
||||||
|
Usage: "Disable SMTP helo.",
|
||||||
|
Value: true,
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "allowed-domains",
|
||||||
|
Value: "",
|
||||||
|
Usage: "Leave empty to allow all domains. Separate multiple domains with a comma (',')",
|
||||||
|
},
|
||||||
|
&cli.BoolFlag{
|
||||||
|
Name: "skip-local-2fa",
|
||||||
|
Usage: "Skip 2FA to log on.",
|
||||||
|
Value: true,
|
||||||
|
},
|
||||||
|
&cli.BoolFlag{
|
||||||
|
Name: "active",
|
||||||
|
Usage: "This Authentication Source is Activated.",
|
||||||
|
Value: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
microcmdAuthAddSMTP = &cli.Command{
|
||||||
|
Name: "add-smtp",
|
||||||
|
Usage: "Add new SMTP authentication source",
|
||||||
|
Action: runAddSMTP,
|
||||||
|
Flags: smtpCLIFlags,
|
||||||
|
}
|
||||||
|
|
||||||
|
microcmdAuthUpdateSMTP = &cli.Command{
|
||||||
|
Name: "update-smtp",
|
||||||
|
Usage: "Update existing SMTP authentication source",
|
||||||
|
Action: runUpdateSMTP,
|
||||||
|
Flags: append(smtpCLIFlags[:1], append([]cli.Flag{idFlag}, smtpCLIFlags[1:]...)...),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func parseSMTPConfig(c *cli.Context, conf *smtp.Source) error {
|
||||||
|
if c.IsSet("auth-type") {
|
||||||
|
conf.Auth = c.String("auth-type")
|
||||||
|
validAuthTypes := []string{"PLAIN", "LOGIN", "CRAM-MD5"}
|
||||||
|
if !util.SliceContainsString(validAuthTypes, strings.ToUpper(c.String("auth-type"))) {
|
||||||
|
return errors.New("Auth must be one of PLAIN/LOGIN/CRAM-MD5")
|
||||||
|
}
|
||||||
|
conf.Auth = c.String("auth-type")
|
||||||
|
}
|
||||||
|
if c.IsSet("host") {
|
||||||
|
conf.Host = c.String("host")
|
||||||
|
}
|
||||||
|
if c.IsSet("port") {
|
||||||
|
conf.Port = c.Int("port")
|
||||||
|
}
|
||||||
|
if c.IsSet("allowed-domains") {
|
||||||
|
conf.AllowedDomains = c.String("allowed-domains")
|
||||||
|
}
|
||||||
|
if c.IsSet("force-smtps") {
|
||||||
|
conf.ForceSMTPS = c.Bool("force-smtps")
|
||||||
|
}
|
||||||
|
if c.IsSet("skip-verify") {
|
||||||
|
conf.SkipVerify = c.Bool("skip-verify")
|
||||||
|
}
|
||||||
|
if c.IsSet("helo-hostname") {
|
||||||
|
conf.HeloHostname = c.String("helo-hostname")
|
||||||
|
}
|
||||||
|
if c.IsSet("disable-helo") {
|
||||||
|
conf.DisableHelo = c.Bool("disable-helo")
|
||||||
|
}
|
||||||
|
if c.IsSet("skip-local-2fa") {
|
||||||
|
conf.SkipLocalTwoFA = c.Bool("skip-local-2fa")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func runAddSMTP(c *cli.Context) error {
|
||||||
|
ctx, cancel := installSignals()
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
if err := initDB(ctx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !c.IsSet("name") || len(c.String("name")) == 0 {
|
||||||
|
return errors.New("name must be set")
|
||||||
|
}
|
||||||
|
if !c.IsSet("host") || len(c.String("host")) == 0 {
|
||||||
|
return errors.New("host must be set")
|
||||||
|
}
|
||||||
|
if !c.IsSet("port") {
|
||||||
|
return errors.New("port must be set")
|
||||||
|
}
|
||||||
|
active := true
|
||||||
|
if c.IsSet("active") {
|
||||||
|
active = c.Bool("active")
|
||||||
|
}
|
||||||
|
|
||||||
|
var smtpConfig smtp.Source
|
||||||
|
if err := parseSMTPConfig(c, &smtpConfig); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// If not set default to PLAIN
|
||||||
|
if len(smtpConfig.Auth) == 0 {
|
||||||
|
smtpConfig.Auth = "PLAIN"
|
||||||
|
}
|
||||||
|
|
||||||
|
return auth_model.CreateSource(ctx, &auth_model.Source{
|
||||||
|
Type: auth_model.SMTP,
|
||||||
|
Name: c.String("name"),
|
||||||
|
IsActive: active,
|
||||||
|
Cfg: &smtpConfig,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func runUpdateSMTP(c *cli.Context) error {
|
||||||
|
if !c.IsSet("id") {
|
||||||
|
return fmt.Errorf("--id flag is missing")
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx, cancel := installSignals()
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
if err := initDB(ctx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
source, err := auth_model.GetSourceByID(ctx, c.Int64("id"))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
smtpConfig := source.Cfg.(*smtp.Source)
|
||||||
|
|
||||||
|
if err := parseSMTPConfig(c, smtpConfig); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.IsSet("name") {
|
||||||
|
source.Name = c.String("name")
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.IsSet("active") {
|
||||||
|
source.IsActive = c.Bool("active")
|
||||||
|
}
|
||||||
|
|
||||||
|
source.Cfg = smtpConfig
|
||||||
|
|
||||||
|
return auth_model.UpdateSource(ctx, source)
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"code.gitea.io/gitea/modules/graceful"
|
||||||
|
asymkey_service "code.gitea.io/gitea/services/asymkey"
|
||||||
|
repo_service "code.gitea.io/gitea/services/repository"
|
||||||
|
|
||||||
|
"github.com/urfave/cli/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
microcmdRegenHooks = &cli.Command{
|
||||||
|
Name: "hooks",
|
||||||
|
Usage: "Regenerate git-hooks",
|
||||||
|
Action: runRegenerateHooks,
|
||||||
|
}
|
||||||
|
|
||||||
|
microcmdRegenKeys = &cli.Command{
|
||||||
|
Name: "keys",
|
||||||
|
Usage: "Regenerate authorized_keys file",
|
||||||
|
Action: runRegenerateKeys,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func runRegenerateHooks(_ *cli.Context) error {
|
||||||
|
ctx, cancel := installSignals()
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
if err := initDB(ctx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return repo_service.SyncRepositoryHooks(graceful.GetManager().ShutdownContext())
|
||||||
|
}
|
||||||
|
|
||||||
|
func runRegenerateKeys(_ *cli.Context) error {
|
||||||
|
ctx, cancel := installSignals()
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
if err := initDB(ctx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return asymkey_service.RewriteAllPublicKeys(ctx)
|
||||||
|
}
|
|
@ -4,13 +4,14 @@
|
||||||
package cmd
|
package cmd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
user_model "code.gitea.io/gitea/models/user"
|
user_model "code.gitea.io/gitea/models/user"
|
||||||
pwd "code.gitea.io/gitea/modules/auth/password"
|
"code.gitea.io/gitea/modules/auth/password"
|
||||||
|
"code.gitea.io/gitea/modules/optional"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
|
user_service "code.gitea.io/gitea/services/user"
|
||||||
|
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
)
|
)
|
||||||
|
@ -32,6 +33,10 @@ var microcmdUserChangePassword = &cli.Command{
|
||||||
Value: "",
|
Value: "",
|
||||||
Usage: "New password to set for user",
|
Usage: "New password to set for user",
|
||||||
},
|
},
|
||||||
|
&cli.BoolFlag{
|
||||||
|
Name: "must-change-password",
|
||||||
|
Usage: "User must change password",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,31 +51,32 @@ func runChangePassword(c *cli.Context) error {
|
||||||
if err := initDB(ctx); err != nil {
|
if err := initDB(ctx); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if len(c.String("password")) < setting.MinPasswordLength {
|
|
||||||
return fmt.Errorf("Password is not long enough. Needs to be at least %d", setting.MinPasswordLength)
|
|
||||||
}
|
|
||||||
|
|
||||||
if !pwd.IsComplexEnough(c.String("password")) {
|
user, err := user_model.GetUserByName(ctx, c.String("username"))
|
||||||
return errors.New("Password does not meet complexity requirements")
|
|
||||||
}
|
|
||||||
pwned, err := pwd.IsPwned(context.Background(), c.String("password"))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if pwned {
|
|
||||||
return errors.New("The password you chose is on a list of stolen passwords previously exposed in public data breaches. Please try again with a different password.\nFor more details, see https://haveibeenpwned.com/Passwords")
|
var mustChangePassword optional.Option[bool]
|
||||||
}
|
if c.IsSet("must-change-password") {
|
||||||
uname := c.String("username")
|
mustChangePassword = optional.Some(c.Bool("must-change-password"))
|
||||||
user, err := user_model.GetUserByName(ctx, uname)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err = user.SetPassword(c.String("password")); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = user_model.UpdateUserCols(ctx, user, "passwd", "passwd_hash_algo", "salt"); err != nil {
|
opts := &user_service.UpdateAuthOptions{
|
||||||
return err
|
Password: optional.Some(c.String("password")),
|
||||||
|
MustChangePassword: mustChangePassword,
|
||||||
|
}
|
||||||
|
if err := user_service.UpdateAuth(ctx, user, opts); err != nil {
|
||||||
|
switch {
|
||||||
|
case errors.Is(err, password.ErrMinLength):
|
||||||
|
return fmt.Errorf("Password is not long enough. Needs to be at least %d", setting.MinPasswordLength)
|
||||||
|
case errors.Is(err, password.ErrComplexity):
|
||||||
|
return errors.New("Password does not meet complexity requirements")
|
||||||
|
case errors.Is(err, password.ErrIsPwned):
|
||||||
|
return errors.New("The password you chose is on a list of stolen passwords previously exposed in public data breaches. Please try again with a different password.\nFor more details, see https://haveibeenpwned.com/Passwords")
|
||||||
|
default:
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("%s's password has been successfully updated!\n", user.Name)
|
fmt.Printf("%s's password has been successfully updated!\n", user.Name)
|
||||||
|
|
|
@ -10,8 +10,8 @@ import (
|
||||||
auth_model "code.gitea.io/gitea/models/auth"
|
auth_model "code.gitea.io/gitea/models/auth"
|
||||||
user_model "code.gitea.io/gitea/models/user"
|
user_model "code.gitea.io/gitea/models/user"
|
||||||
pwd "code.gitea.io/gitea/modules/auth/password"
|
pwd "code.gitea.io/gitea/modules/auth/password"
|
||||||
|
"code.gitea.io/gitea/modules/optional"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
"code.gitea.io/gitea/modules/util"
|
|
||||||
|
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
)
|
)
|
||||||
|
@ -115,7 +115,7 @@ func runCreateUser(c *cli.Context) error {
|
||||||
|
|
||||||
// If this is the first user being created.
|
// If this is the first user being created.
|
||||||
// Take it as the admin and don't force a password update.
|
// Take it as the admin and don't force a password update.
|
||||||
if n := user_model.CountUsers(nil); n == 0 {
|
if n := user_model.CountUsers(ctx, nil); n == 0 {
|
||||||
changePassword = false
|
changePassword = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,10 +123,10 @@ func runCreateUser(c *cli.Context) error {
|
||||||
changePassword = c.Bool("must-change-password")
|
changePassword = c.Bool("must-change-password")
|
||||||
}
|
}
|
||||||
|
|
||||||
restricted := util.OptionalBoolNone
|
restricted := optional.None[bool]()
|
||||||
|
|
||||||
if c.IsSet("restricted") {
|
if c.IsSet("restricted") {
|
||||||
restricted = util.OptionalBoolOf(c.Bool("restricted"))
|
restricted = optional.Some(c.Bool("restricted"))
|
||||||
}
|
}
|
||||||
|
|
||||||
// default user visibility in app.ini
|
// default user visibility in app.ini
|
||||||
|
@ -142,11 +142,11 @@ func runCreateUser(c *cli.Context) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
overwriteDefault := &user_model.CreateUserOverwriteOptions{
|
overwriteDefault := &user_model.CreateUserOverwriteOptions{
|
||||||
IsActive: util.OptionalBoolTrue,
|
IsActive: optional.Some(true),
|
||||||
IsRestricted: restricted,
|
IsRestricted: restricted,
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := user_model.CreateUser(u, overwriteDefault); err != nil {
|
if err := user_model.CreateUser(ctx, u, overwriteDefault); err != nil {
|
||||||
return fmt.Errorf("CreateUser: %w", err)
|
return fmt.Errorf("CreateUser: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -156,7 +156,7 @@ func runCreateUser(c *cli.Context) error {
|
||||||
UID: u.ID,
|
UID: u.ID,
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := auth_model.NewAccessToken(t); err != nil {
|
if err := auth_model.NewAccessToken(ctx, t); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ func runGenerateAccessToken(c *cli.Context) error {
|
||||||
UID: user.ID,
|
UID: user.ID,
|
||||||
}
|
}
|
||||||
|
|
||||||
exist, err := auth_model.AccessTokenByNameExists(t)
|
exist, err := auth_model.AccessTokenByNameExists(ctx, t)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -79,7 +79,7 @@ func runGenerateAccessToken(c *cli.Context) error {
|
||||||
t.Scope = accessTokenScope
|
t.Scope = accessTokenScope
|
||||||
|
|
||||||
// create the token
|
// create the token
|
||||||
if err := auth_model.NewAccessToken(t); err != nil {
|
if err := auth_model.NewAccessToken(ctx, t); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@ func runListUsers(c *cli.Context) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
users, err := user_model.GetAllUsers()
|
users, err := user_model.GetAllUsers(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,7 @@ func runListUsers(c *cli.Context) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
twofa := user_model.UserList(users).GetTwoFaStatus()
|
twofa := user_model.UserList(users).GetTwoFaStatus(ctx)
|
||||||
fmt.Fprintf(w, "ID\tUsername\tEmail\tIsActive\tIsAdmin\t2FA\n")
|
fmt.Fprintf(w, "ID\tUsername\tEmail\tIsActive\tIsAdmin\t2FA\n")
|
||||||
for _, u := range users {
|
for _, u := range users {
|
||||||
fmt.Fprintf(w, "%d\t%s\t%s\t%t\t%t\t%t\n", u.ID, u.Name, u.Email, u.IsActive, u.IsAdmin, twofa[u.ID])
|
fmt.Fprintf(w, "%d\t%s\t%s\t%t\t%t\t%t\n", u.ID, u.Name, u.Email, u.IsActive, u.IsAdmin, twofa[u.ID])
|
||||||
|
|
|
@ -14,14 +14,28 @@ import (
|
||||||
"code.gitea.io/gitea/models/db"
|
"code.gitea.io/gitea/models/db"
|
||||||
"code.gitea.io/gitea/models/migrations"
|
"code.gitea.io/gitea/models/migrations"
|
||||||
migrate_base "code.gitea.io/gitea/models/migrations/base"
|
migrate_base "code.gitea.io/gitea/models/migrations/base"
|
||||||
"code.gitea.io/gitea/modules/doctor"
|
"code.gitea.io/gitea/modules/container"
|
||||||
"code.gitea.io/gitea/modules/log"
|
"code.gitea.io/gitea/modules/log"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
|
"code.gitea.io/gitea/services/doctor"
|
||||||
|
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
"xorm.io/xorm"
|
"xorm.io/xorm"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// CmdDoctor represents the available doctor sub-command.
|
||||||
|
var CmdDoctor = &cli.Command{
|
||||||
|
Name: "doctor",
|
||||||
|
Usage: "Diagnose and optionally fix problems, convert or re-create database tables",
|
||||||
|
Description: "A command to diagnose problems with the current Gitea instance according to the given configuration. Some problems can optionally be fixed by modifying the database or data storage.",
|
||||||
|
|
||||||
|
Subcommands: []*cli.Command{
|
||||||
|
cmdDoctorCheck,
|
||||||
|
cmdRecreateTable,
|
||||||
|
cmdDoctorConvert,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
var cmdDoctorCheck = &cli.Command{
|
var cmdDoctorCheck = &cli.Command{
|
||||||
Name: "check",
|
Name: "check",
|
||||||
Usage: "Diagnose and optionally fix problems",
|
Usage: "Diagnose and optionally fix problems",
|
||||||
|
@ -60,19 +74,6 @@ var cmdDoctorCheck = &cli.Command{
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// CmdDoctor represents the available doctor sub-command.
|
|
||||||
var CmdDoctor = &cli.Command{
|
|
||||||
Name: "doctor",
|
|
||||||
Usage: "Diagnose and optionally fix problems",
|
|
||||||
Description: "A command to diagnose problems with the current Gitea instance according to the given configuration. Some problems can optionally be fixed by modifying the database or data storage.",
|
|
||||||
|
|
||||||
Subcommands: []*cli.Command{
|
|
||||||
cmdDoctorCheck,
|
|
||||||
cmdRecreateTable,
|
|
||||||
cmdDoctorConvert,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
var cmdRecreateTable = &cli.Command{
|
var cmdRecreateTable = &cli.Command{
|
||||||
Name: "recreate-table",
|
Name: "recreate-table",
|
||||||
Usage: "Recreate tables from XORM definitions and copy the data.",
|
Usage: "Recreate tables from XORM definitions and copy the data.",
|
||||||
|
@ -177,6 +178,7 @@ func runDoctorCheck(ctx *cli.Context) error {
|
||||||
if ctx.IsSet("list") {
|
if ctx.IsSet("list") {
|
||||||
w := tabwriter.NewWriter(os.Stdout, 0, 8, 1, '\t', 0)
|
w := tabwriter.NewWriter(os.Stdout, 0, 8, 1, '\t', 0)
|
||||||
_, _ = w.Write([]byte("Default\tName\tTitle\n"))
|
_, _ = w.Write([]byte("Default\tName\tTitle\n"))
|
||||||
|
doctor.SortChecks(doctor.Checks)
|
||||||
for _, check := range doctor.Checks {
|
for _, check := range doctor.Checks {
|
||||||
if check.IsDefault {
|
if check.IsDefault {
|
||||||
_, _ = w.Write([]byte{'*'})
|
_, _ = w.Write([]byte{'*'})
|
||||||
|
@ -192,26 +194,20 @@ func runDoctorCheck(ctx *cli.Context) error {
|
||||||
|
|
||||||
var checks []*doctor.Check
|
var checks []*doctor.Check
|
||||||
if ctx.Bool("all") {
|
if ctx.Bool("all") {
|
||||||
checks = doctor.Checks
|
checks = make([]*doctor.Check, len(doctor.Checks))
|
||||||
|
copy(checks, doctor.Checks)
|
||||||
} else if ctx.IsSet("run") {
|
} else if ctx.IsSet("run") {
|
||||||
addDefault := ctx.Bool("default")
|
addDefault := ctx.Bool("default")
|
||||||
names := ctx.StringSlice("run")
|
runNamesSet := container.SetOf(ctx.StringSlice("run")...)
|
||||||
for i, name := range names {
|
|
||||||
names[i] = strings.ToLower(strings.TrimSpace(name))
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, check := range doctor.Checks {
|
for _, check := range doctor.Checks {
|
||||||
if addDefault && check.IsDefault {
|
if (addDefault && check.IsDefault) || runNamesSet.Contains(check.Name) {
|
||||||
checks = append(checks, check)
|
checks = append(checks, check)
|
||||||
continue
|
runNamesSet.Remove(check.Name)
|
||||||
}
|
|
||||||
for _, name := range names {
|
|
||||||
if name == check.Name {
|
|
||||||
checks = append(checks, check)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if len(runNamesSet) > 0 {
|
||||||
|
return fmt.Errorf("unknown checks: %q", strings.Join(runNamesSet.Values(), ","))
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
for _, check := range doctor.Checks {
|
for _, check := range doctor.Checks {
|
||||||
if check.IsDefault {
|
if check.IsDefault {
|
||||||
|
@ -219,6 +215,5 @@ func runDoctorCheck(ctx *cli.Context) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return doctor.RunChecks(stdCtx, colorize, ctx.Bool("fix"), checks)
|
return doctor.RunChecks(stdCtx, colorize, ctx.Bool("fix"), checks)
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,8 +37,8 @@ func runDoctorConvert(ctx *cli.Context) error {
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case setting.Database.Type.IsMySQL():
|
case setting.Database.Type.IsMySQL():
|
||||||
if err := db.ConvertUtf8ToUtf8mb4(); err != nil {
|
if err := db.ConvertDatabaseTable(); err != nil {
|
||||||
log.Fatal("Failed to convert database from utf8 to utf8mb4: %v", err)
|
log.Fatal("Failed to convert database & table: %v", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
fmt.Println("Converted successfully, please confirm your database's character set is now utf8mb4")
|
fmt.Println("Converted successfully, please confirm your database's character set is now utf8mb4")
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/modules/log"
|
||||||
|
"code.gitea.io/gitea/services/doctor"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/urfave/cli/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestDoctorRun(t *testing.T) {
|
||||||
|
doctor.Register(&doctor.Check{
|
||||||
|
Title: "Test Check",
|
||||||
|
Name: "test-check",
|
||||||
|
Run: func(ctx context.Context, logger log.Logger, autofix bool) error { return nil },
|
||||||
|
|
||||||
|
SkipDatabaseInitialization: true,
|
||||||
|
})
|
||||||
|
app := cli.NewApp()
|
||||||
|
app.Commands = []*cli.Command{cmdDoctorCheck}
|
||||||
|
err := app.Run([]string{"./gitea", "check", "--run", "test-check"})
|
||||||
|
assert.NoError(t, err)
|
||||||
|
err = app.Run([]string{"./gitea", "check", "--run", "no-such"})
|
||||||
|
assert.ErrorContains(t, err, `unknown checks: "no-such"`)
|
||||||
|
err = app.Run([]string{"./gitea", "check", "--run", "test-check,no-such"})
|
||||||
|
assert.ErrorContains(t, err, `unknown checks: "no-such"`)
|
||||||
|
}
|
|
@ -128,7 +128,7 @@ It can be used for backup and capture Gitea server image to send to maintainer`,
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "database",
|
Name: "database",
|
||||||
Aliases: []string{"d"},
|
Aliases: []string{"d"},
|
||||||
Usage: "Specify the database SQL syntax",
|
Usage: "Specify the database SQL syntax: sqlite3, mysql, mssql, postgres",
|
||||||
},
|
},
|
||||||
&cli.BoolFlag{
|
&cli.BoolFlag{
|
||||||
Name: "skip-repository",
|
Name: "skip-repository",
|
||||||
|
@ -452,7 +452,7 @@ func addRecursiveExclude(w archiver.Writer, insidePath, absPath string, excludeA
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
for _, file := range files {
|
for _, file := range files {
|
||||||
currentAbsPath := path.Join(absPath, file.Name())
|
currentAbsPath := filepath.Join(absPath, file.Name())
|
||||||
currentInsidePath := path.Join(insidePath, file.Name())
|
currentInsidePath := path.Join(insidePath, file.Name())
|
||||||
if file.IsDir() {
|
if file.IsDir() {
|
||||||
if !util.SliceContainsString(excludeAbsPath, currentAbsPath) {
|
if !util.SliceContainsString(excludeAbsPath, currentAbsPath) {
|
||||||
|
|
|
@ -18,7 +18,7 @@ var (
|
||||||
// CmdGenerate represents the available generate sub-command.
|
// CmdGenerate represents the available generate sub-command.
|
||||||
CmdGenerate = &cli.Command{
|
CmdGenerate = &cli.Command{
|
||||||
Name: "generate",
|
Name: "generate",
|
||||||
Usage: "Command line interface for running generators",
|
Usage: "Generate Gitea's secrets/keys/tokens",
|
||||||
Subcommands: []*cli.Command{
|
Subcommands: []*cli.Command{
|
||||||
subcmdSecret,
|
subcmdSecret,
|
||||||
},
|
},
|
||||||
|
@ -70,7 +70,7 @@ func runGenerateInternalToken(c *cli.Context) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func runGenerateLfsJwtSecret(c *cli.Context) error {
|
func runGenerateLfsJwtSecret(c *cli.Context) error {
|
||||||
_, jwtSecretBase64, err := generate.NewJwtSecretBase64()
|
_, jwtSecretBase64, err := generate.NewJwtSecretWithBase64()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
11
cmd/hook.go
11
cmd/hook.go
|
@ -31,8 +31,8 @@ var (
|
||||||
// CmdHook represents the available hooks sub-command.
|
// CmdHook represents the available hooks sub-command.
|
||||||
CmdHook = &cli.Command{
|
CmdHook = &cli.Command{
|
||||||
Name: "hook",
|
Name: "hook",
|
||||||
Usage: "Delegate commands to corresponding Git hooks",
|
Usage: "(internal) Should only be called by Git",
|
||||||
Description: "This should only be called by Git",
|
Description: "Delegate commands to corresponding Git hooks",
|
||||||
Before: PrepareConsoleLoggerLevel(log.FATAL),
|
Before: PrepareConsoleLoggerLevel(log.FATAL),
|
||||||
Subcommands: []*cli.Command{
|
Subcommands: []*cli.Command{
|
||||||
subcmdHookPreReceive,
|
subcmdHookPreReceive,
|
||||||
|
@ -376,7 +376,9 @@ Gitea or set your environment appropriately.`, "")
|
||||||
oldCommitIDs[count] = string(fields[0])
|
oldCommitIDs[count] = string(fields[0])
|
||||||
newCommitIDs[count] = string(fields[1])
|
newCommitIDs[count] = string(fields[1])
|
||||||
refFullNames[count] = git.RefName(fields[2])
|
refFullNames[count] = git.RefName(fields[2])
|
||||||
if refFullNames[count] == git.BranchPrefix+"master" && newCommitIDs[count] != git.EmptySHA && count == total {
|
|
||||||
|
commitID, _ := git.NewIDFromString(newCommitIDs[count])
|
||||||
|
if refFullNames[count] == git.BranchPrefix+"master" && !commitID.IsZero() && count == total {
|
||||||
masterPushed = true
|
masterPushed = true
|
||||||
}
|
}
|
||||||
count++
|
count++
|
||||||
|
@ -669,7 +671,8 @@ Gitea or set your environment appropriately.`, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if rs.OldOID != git.EmptySHA {
|
commitID, _ := git.NewIDFromString(rs.OldOID)
|
||||||
|
if !commitID.IsZero() {
|
||||||
err = writeDataPktLine(ctx, os.Stdout, []byte("option old-oid "+rs.OldOID))
|
err = writeDataPktLine(ctx, os.Stdout, []byte("option old-oid "+rs.OldOID))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
13
cmd/keys.go
13
cmd/keys.go
|
@ -16,10 +16,11 @@ import (
|
||||||
|
|
||||||
// CmdKeys represents the available keys sub-command
|
// CmdKeys represents the available keys sub-command
|
||||||
var CmdKeys = &cli.Command{
|
var CmdKeys = &cli.Command{
|
||||||
Name: "keys",
|
Name: "keys",
|
||||||
Usage: "This command queries the Gitea database to get the authorized command for a given ssh key fingerprint",
|
Usage: "(internal) Should only be called by SSH server",
|
||||||
Before: PrepareConsoleLoggerLevel(log.FATAL),
|
Description: "Queries the Gitea database to get the authorized command for a given ssh key fingerprint",
|
||||||
Action: runKeys,
|
Before: PrepareConsoleLoggerLevel(log.FATAL),
|
||||||
|
Action: runKeys,
|
||||||
Flags: []cli.Flag{
|
Flags: []cli.Flag{
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "expected",
|
Name: "expected",
|
||||||
|
@ -70,13 +71,13 @@ func runKeys(c *cli.Context) error {
|
||||||
ctx, cancel := installSignals()
|
ctx, cancel := installSignals()
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
setup(ctx, false)
|
setup(ctx, c.Bool("debug"))
|
||||||
|
|
||||||
authorizedString, extra := private.AuthorizedPublicKeyByContent(ctx, content)
|
authorizedString, extra := private.AuthorizedPublicKeyByContent(ctx, content)
|
||||||
// do not use handleCliResponseExtra or cli.NewExitError, if it exists immediately, it breaks some tests like Test_CmdKeys
|
// do not use handleCliResponseExtra or cli.NewExitError, if it exists immediately, it breaks some tests like Test_CmdKeys
|
||||||
if extra.Error != nil {
|
if extra.Error != nil {
|
||||||
return extra.Error
|
return extra.Error
|
||||||
}
|
}
|
||||||
_, _ = fmt.Fprintln(c.App.Writer, strings.TrimSpace(authorizedString))
|
_, _ = fmt.Fprintln(c.App.Writer, strings.TrimSpace(authorizedString.Text))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,6 +45,6 @@ func runSendMail(c *cli.Context) error {
|
||||||
if extra.HasError() {
|
if extra.HasError() {
|
||||||
return handleCliResponseExtra(extra)
|
return handleCliResponseExtra(extra)
|
||||||
}
|
}
|
||||||
_, _ = fmt.Printf("Sent %s email(s) to all users\n", respText)
|
_, _ = fmt.Printf("Sent %s email(s) to all users\n", respText.Text)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
21
cmd/main.go
21
cmd/main.go
|
@ -10,12 +10,12 @@ import (
|
||||||
|
|
||||||
"code.gitea.io/gitea/modules/log"
|
"code.gitea.io/gitea/modules/log"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
"code.gitea.io/gitea/modules/util"
|
|
||||||
|
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
// cmdHelp is our own help subcommand with more information
|
// cmdHelp is our own help subcommand with more information
|
||||||
|
// Keep in mind that the "./gitea help"(subcommand) is different from "./gitea --help"(flag), the flag doesn't parse the config or output "DEFAULT CONFIGURATION:" information
|
||||||
func cmdHelp() *cli.Command {
|
func cmdHelp() *cli.Command {
|
||||||
c := &cli.Command{
|
c := &cli.Command{
|
||||||
Name: "help",
|
Name: "help",
|
||||||
|
@ -47,16 +47,10 @@ DEFAULT CONFIGURATION:
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
var helpFlag = cli.HelpFlag
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
// cli.HelpFlag = nil TODO: after https://github.com/urfave/cli/issues/1794 we can use this
|
|
||||||
}
|
|
||||||
|
|
||||||
func appGlobalFlags() []cli.Flag {
|
func appGlobalFlags() []cli.Flag {
|
||||||
return []cli.Flag{
|
return []cli.Flag{
|
||||||
// make the builtin flags at the top
|
// make the builtin flags at the top
|
||||||
helpFlag,
|
cli.HelpFlag,
|
||||||
|
|
||||||
// shared configuration flags, they are for global and for each sub-command at the same time
|
// shared configuration flags, they are for global and for each sub-command at the same time
|
||||||
// eg: such command is valid: "./gitea --config /tmp/app.ini web --config /tmp/app.ini", while it's discouraged indeed
|
// eg: such command is valid: "./gitea --config /tmp/app.ini web --config /tmp/app.ini", while it's discouraged indeed
|
||||||
|
@ -121,20 +115,22 @@ func prepareWorkPathAndCustomConf(action cli.ActionFunc) func(ctx *cli.Context)
|
||||||
func NewMainApp(version, versionExtra string) *cli.App {
|
func NewMainApp(version, versionExtra string) *cli.App {
|
||||||
app := cli.NewApp()
|
app := cli.NewApp()
|
||||||
app.Name = "Gitea"
|
app.Name = "Gitea"
|
||||||
|
app.HelpName = "gitea"
|
||||||
app.Usage = "A painless self-hosted Git service"
|
app.Usage = "A painless self-hosted Git service"
|
||||||
app.Description = `By default, Gitea will start serving using the web-server with no argument, which can alternatively be run by running the subcommand "web".`
|
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.Version = version + versionExtra
|
app.Version = version + versionExtra
|
||||||
app.EnableBashCompletion = true
|
app.EnableBashCompletion = true
|
||||||
|
|
||||||
// these sub-commands need to use config file
|
// these sub-commands need to use config file
|
||||||
subCmdWithConfig := []*cli.Command{
|
subCmdWithConfig := []*cli.Command{
|
||||||
|
cmdHelp(), // the "help" sub-command was used to show the more information for "work path" and "custom config"
|
||||||
CmdWeb,
|
CmdWeb,
|
||||||
CmdServ,
|
CmdServ,
|
||||||
CmdHook,
|
CmdHook,
|
||||||
|
CmdKeys,
|
||||||
CmdDump,
|
CmdDump,
|
||||||
CmdAdmin,
|
CmdAdmin,
|
||||||
CmdMigrate,
|
CmdMigrate,
|
||||||
CmdKeys,
|
|
||||||
CmdDoctor,
|
CmdDoctor,
|
||||||
CmdManager,
|
CmdManager,
|
||||||
CmdEmbedded,
|
CmdEmbedded,
|
||||||
|
@ -142,13 +138,8 @@ func NewMainApp(version, versionExtra string) *cli.App {
|
||||||
CmdDumpRepository,
|
CmdDumpRepository,
|
||||||
CmdRestoreRepository,
|
CmdRestoreRepository,
|
||||||
CmdActions,
|
CmdActions,
|
||||||
cmdHelp(), // the "help" sub-command was used to show the more information for "work path" and "custom config"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cmdConvert := util.ToPointer(*cmdDoctorConvert)
|
|
||||||
cmdConvert.Hidden = true // still support the legacy "./gitea doctor" by the hidden sub-command, remove it in next release
|
|
||||||
subCmdWithConfig = append(subCmdWithConfig, cmdConvert)
|
|
||||||
|
|
||||||
// these sub-commands do not need the config file, and they do not depend on any path or environment variable.
|
// these sub-commands do not need the config file, and they do not depend on any path or environment variable.
|
||||||
subCmdStandalone := []*cli.Command{
|
subCmdStandalone := []*cli.Command{
|
||||||
CmdCert,
|
CmdCert,
|
||||||
|
|
|
@ -20,9 +20,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestMain(m *testing.M) {
|
func TestMain(m *testing.M) {
|
||||||
unittest.MainTest(m, &unittest.TestOptions{
|
unittest.MainTest(m)
|
||||||
GiteaRootPath: "..",
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func makePathOutput(workPath, customPath, customConf string) string {
|
func makePathOutput(workPath, customPath, customConf string) string {
|
||||||
|
|
|
@ -110,6 +110,9 @@ func migrateLFS(ctx context.Context, dstStorage storage.ObjectStorage) error {
|
||||||
|
|
||||||
func migrateAvatars(ctx context.Context, dstStorage storage.ObjectStorage) error {
|
func migrateAvatars(ctx context.Context, dstStorage storage.ObjectStorage) error {
|
||||||
return db.Iterate(ctx, nil, func(ctx context.Context, user *user_model.User) error {
|
return db.Iterate(ctx, nil, func(ctx context.Context, user *user_model.User) error {
|
||||||
|
if user.CustomAvatarRelativePath() == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
_, err := storage.Copy(dstStorage, user.CustomAvatarRelativePath(), storage.Avatars, user.CustomAvatarRelativePath())
|
_, err := storage.Copy(dstStorage, user.CustomAvatarRelativePath(), storage.Avatars, user.CustomAvatarRelativePath())
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
|
@ -117,6 +120,9 @@ func migrateAvatars(ctx context.Context, dstStorage storage.ObjectStorage) error
|
||||||
|
|
||||||
func migrateRepoAvatars(ctx context.Context, dstStorage storage.ObjectStorage) error {
|
func migrateRepoAvatars(ctx context.Context, dstStorage storage.ObjectStorage) error {
|
||||||
return db.Iterate(ctx, nil, func(ctx context.Context, repo *repo_model.Repository) error {
|
return db.Iterate(ctx, nil, func(ctx context.Context, repo *repo_model.Repository) error {
|
||||||
|
if repo.CustomAvatarRelativePath() == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
_, err := storage.Copy(dstStorage, repo.CustomAvatarRelativePath(), storage.RepoAvatars, repo.CustomAvatarRelativePath())
|
_, err := storage.Copy(dstStorage, repo.CustomAvatarRelativePath(), storage.RepoAvatars, repo.CustomAvatarRelativePath())
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
|
@ -185,7 +191,7 @@ func runMigrateStorage(ctx *cli.Context) error {
|
||||||
case string(setting.LocalStorageType):
|
case string(setting.LocalStorageType):
|
||||||
p := ctx.String("path")
|
p := ctx.String("path")
|
||||||
if p == "" {
|
if p == "" {
|
||||||
log.Fatal("Path must be given when storage is loal")
|
log.Fatal("Path must be given when storage is local")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
dstStorage, err = storage.NewLocalStorage(
|
dstStorage, err = storage.NewLocalStorage(
|
||||||
|
|
|
@ -9,6 +9,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/models/db"
|
||||||
"code.gitea.io/gitea/models/packages"
|
"code.gitea.io/gitea/models/packages"
|
||||||
"code.gitea.io/gitea/models/unittest"
|
"code.gitea.io/gitea/models/unittest"
|
||||||
user_model "code.gitea.io/gitea/models/user"
|
user_model "code.gitea.io/gitea/models/user"
|
||||||
|
@ -30,7 +31,7 @@ func TestMigratePackages(t *testing.T) {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
defer buf.Close()
|
defer buf.Close()
|
||||||
|
|
||||||
v, f, err := packages_service.CreatePackageAndAddFile(&packages_service.PackageCreationInfo{
|
v, f, err := packages_service.CreatePackageAndAddFile(db.DefaultContext, &packages_service.PackageCreationInfo{
|
||||||
PackageInfo: packages_service.PackageInfo{
|
PackageInfo: packages_service.PackageInfo{
|
||||||
Owner: creator,
|
Owner: creator,
|
||||||
PackageType: packages.TypeGeneric,
|
PackageType: packages.TypeGeneric,
|
||||||
|
|
27
cmd/serv.go
27
cmd/serv.go
|
@ -42,7 +42,7 @@ const (
|
||||||
// CmdServ represents the available serv sub-command.
|
// CmdServ represents the available serv sub-command.
|
||||||
var CmdServ = &cli.Command{
|
var CmdServ = &cli.Command{
|
||||||
Name: "serv",
|
Name: "serv",
|
||||||
Usage: "This command should only be called by SSH shell",
|
Usage: "(internal) Should only be called by SSH shell",
|
||||||
Description: "Serv provides access auth for repositories",
|
Description: "Serv provides access auth for repositories",
|
||||||
Before: PrepareConsoleLoggerLevel(log.FATAL),
|
Before: PrepareConsoleLoggerLevel(log.FATAL),
|
||||||
Action: runServ,
|
Action: runServ,
|
||||||
|
@ -63,21 +63,10 @@ func setup(ctx context.Context, debug bool) {
|
||||||
setupConsoleLogger(log.FATAL, false, os.Stderr)
|
setupConsoleLogger(log.FATAL, false, os.Stderr)
|
||||||
}
|
}
|
||||||
setting.MustInstalled()
|
setting.MustInstalled()
|
||||||
if debug {
|
|
||||||
setting.RunMode = "dev"
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if setting.RepoRootPath exists. It could be the case that it doesn't exist, this can happen when
|
|
||||||
// `[repository]` `ROOT` is a relative path and $GITEA_WORK_DIR isn't passed to the SSH connection.
|
|
||||||
if _, err := os.Stat(setting.RepoRootPath); err != nil {
|
if _, err := os.Stat(setting.RepoRootPath); err != nil {
|
||||||
if os.IsNotExist(err) {
|
_ = fail(ctx, "Unable to access repository path", "Unable to access repository path %q, err: %v", setting.RepoRootPath, err)
|
||||||
_ = fail(ctx, "Incorrect configuration, no repository directory.", "Directory `[repository].ROOT` %q was not found, please check if $GITEA_WORK_DIR is passed to the SSH connection or make `[repository].ROOT` an absolute value.", setting.RepoRootPath)
|
|
||||||
} else {
|
|
||||||
_ = fail(ctx, "Incorrect configuration, repository directory is inaccessible", "Directory `[repository].ROOT` %q is inaccessible. err: %v", setting.RepoRootPath, err)
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := git.InitSimple(context.Background()); err != nil {
|
if err := git.InitSimple(context.Background()); err != nil {
|
||||||
_ = fail(ctx, "Failed to init git", "Failed to init git, err: %v", err)
|
_ = fail(ctx, "Failed to init git", "Failed to init git, err: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -216,16 +205,18 @@ func runServ(c *cli.Context) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// LowerCase and trim the repoPath as that's how they are stored.
|
|
||||||
repoPath = strings.ToLower(strings.TrimSpace(repoPath))
|
|
||||||
|
|
||||||
rr := strings.SplitN(repoPath, "/", 2)
|
rr := strings.SplitN(repoPath, "/", 2)
|
||||||
if len(rr) != 2 {
|
if len(rr) != 2 {
|
||||||
return fail(ctx, "Invalid repository path", "Invalid repository path: %v", repoPath)
|
return fail(ctx, "Invalid repository path", "Invalid repository path: %v", repoPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
username := strings.ToLower(rr[0])
|
username := rr[0]
|
||||||
reponame := strings.ToLower(strings.TrimSuffix(rr[1], ".git"))
|
reponame := strings.TrimSuffix(rr[1], ".git")
|
||||||
|
|
||||||
|
// LowerCase and trim the repoPath as that's how they are stored.
|
||||||
|
// This should be done after splitting the repoPath into username and reponame
|
||||||
|
// so that username and reponame are not affected.
|
||||||
|
repoPath = strings.ToLower(strings.TrimSpace(repoPath))
|
||||||
|
|
||||||
if alphaDashDotPattern.MatchString(reponame) {
|
if alphaDashDotPattern.MatchString(reponame) {
|
||||||
return fail(ctx, "Invalid repo name", "Invalid repo name: %s", reponame)
|
return fail(ctx, "Invalid repo name", "Invalid repo name: %s", reponame)
|
||||||
|
|
|
@ -17,7 +17,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
"github.com/google/go-github/v53/github"
|
"github.com/google/go-github/v57/github"
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
)
|
)
|
||||||
|
|
|
@ -47,24 +47,28 @@ func main() {
|
||||||
on the configuration cheat sheet.`
|
on the configuration cheat sheet.`
|
||||||
app.Flags = []cli.Flag{
|
app.Flags = []cli.Flag{
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "custom-path, C",
|
Name: "custom-path",
|
||||||
Value: setting.CustomPath,
|
Aliases: []string{"C"},
|
||||||
Usage: "Custom path file path",
|
Value: setting.CustomPath,
|
||||||
|
Usage: "Custom path file path",
|
||||||
},
|
},
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "config, c",
|
Name: "config",
|
||||||
Value: setting.CustomConf,
|
Aliases: []string{"c"},
|
||||||
Usage: "Custom configuration file path",
|
Value: setting.CustomConf,
|
||||||
|
Usage: "Custom configuration file path",
|
||||||
},
|
},
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "work-path, w",
|
Name: "work-path",
|
||||||
Value: setting.AppWorkPath,
|
Aliases: []string{"w"},
|
||||||
Usage: "Set the gitea working path",
|
Value: setting.AppWorkPath,
|
||||||
|
Usage: "Set the gitea working path",
|
||||||
},
|
},
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "out, o",
|
Name: "out",
|
||||||
Value: "",
|
Aliases: []string{"o"},
|
||||||
Usage: "Destination file to write to",
|
Value: "",
|
||||||
|
Usage: "Destination file to write to",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
app.Action = runEnvironmentToIni
|
app.Action = runEnvironmentToIni
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
@ -18,7 +19,7 @@ import (
|
||||||
|
|
||||||
var (
|
var (
|
||||||
generators = []struct {
|
generators = []struct {
|
||||||
gen func() (string, error)
|
gen func(ctx context.Context) (string, error)
|
||||||
name string
|
name string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
|
@ -41,16 +42,17 @@ func main() {
|
||||||
fmt.Printf("PrepareTestDatabase: %+v\n", err)
|
fmt.Printf("PrepareTestDatabase: %+v\n", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
ctx := context.Background()
|
||||||
if len(os.Args) == 0 {
|
if len(os.Args) == 0 {
|
||||||
for _, r := range os.Args {
|
for _, r := range os.Args {
|
||||||
if err := generate(r); err != nil {
|
if err := generate(ctx, r); err != nil {
|
||||||
fmt.Printf("generate '%s': %+v\n", r, err)
|
fmt.Printf("generate '%s': %+v\n", r, err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for _, g := range generators {
|
for _, g := range generators {
|
||||||
if err := generate(g.name); err != nil {
|
if err := generate(ctx, g.name); err != nil {
|
||||||
fmt.Printf("generate '%s': %+v\n", g.name, err)
|
fmt.Printf("generate '%s': %+v\n", g.name, err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
@ -58,10 +60,10 @@ func main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func generate(name string) error {
|
func generate(ctx context.Context, name string) error {
|
||||||
for _, g := range generators {
|
for _, g := range generators {
|
||||||
if g.name == name {
|
if g.name == name {
|
||||||
data, err := g.gen()
|
data, err := g.gen(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Gitea (Git with a cup of tea)
|
Description=Gitea (Git with a cup of tea)
|
||||||
After=syslog.target
|
|
||||||
After=network.target
|
After=network.target
|
||||||
###
|
###
|
||||||
# Don't forget to add the database service dependencies
|
# Don't forget to add the database service dependencies
|
||||||
|
@ -52,7 +51,7 @@ After=network.target
|
||||||
# Uncomment the next line if you have repos with lots of files and get a HTTP 500 error because of that
|
# Uncomment the next line if you have repos with lots of files and get a HTTP 500 error because of that
|
||||||
# LimitNOFILE=524288:524288
|
# LimitNOFILE=524288:524288
|
||||||
RestartSec=2s
|
RestartSec=2s
|
||||||
Type=notify
|
Type=simple
|
||||||
User=git
|
User=git
|
||||||
Group=git
|
Group=git
|
||||||
WorkingDirectory=/var/lib/gitea/
|
WorkingDirectory=/var/lib/gitea/
|
||||||
|
@ -62,7 +61,6 @@ WorkingDirectory=/var/lib/gitea/
|
||||||
ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
|
ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
|
||||||
Restart=always
|
Restart=always
|
||||||
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea
|
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea
|
||||||
WatchdogSec=30s
|
|
||||||
# If you install Git to directory prefix other than default PATH (which happens
|
# If you install Git to directory prefix other than default PATH (which happens
|
||||||
# for example if you install other versions of Git side-to-side with
|
# for example if you install other versions of Git side-to-side with
|
||||||
# distribution version), uncomment below line and add that prefix to PATH
|
# distribution version), uncomment below line and add that prefix to PATH
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
project_id_env: CROWDIN_PROJECT_ID
|
||||||
|
api_token_env: CROWDIN_KEY
|
||||||
|
base_path: "."
|
||||||
|
base_url: "https://api.crowdin.com"
|
||||||
|
preserve_hierarchy: true
|
||||||
|
files:
|
||||||
|
- source: "/options/locale/locale_en-US.ini"
|
||||||
|
translation: "/options/locale/locale_%locale%.ini"
|
||||||
|
type: "ini"
|
||||||
|
skip_untranslated_strings: true
|
||||||
|
export_only_approved: true
|
||||||
|
update_option: "update_as_unapproved"
|
|
@ -60,6 +60,7 @@ RUN_USER = ; git
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;
|
;;
|
||||||
;; The protocol the server listens on. One of 'http', 'https', 'http+unix', 'fcgi' or 'fcgi+unix'. Defaults to 'http'
|
;; The protocol the server listens on. One of 'http', 'https', 'http+unix', 'fcgi' or 'fcgi+unix'. Defaults to 'http'
|
||||||
|
;; Note: Value must be lowercase.
|
||||||
;PROTOCOL = http
|
;PROTOCOL = http
|
||||||
;;
|
;;
|
||||||
;; Expect PROXY protocol headers on connections
|
;; Expect PROXY protocol headers on connections
|
||||||
|
@ -233,7 +234,7 @@ RUN_USER = ; git
|
||||||
;MINIMUM_KEY_SIZE_CHECK = false
|
;MINIMUM_KEY_SIZE_CHECK = false
|
||||||
;;
|
;;
|
||||||
;; Disable CDN even in "prod" mode
|
;; Disable CDN even in "prod" mode
|
||||||
;OFFLINE_MODE = false
|
;OFFLINE_MODE = true
|
||||||
;;
|
;;
|
||||||
;; TLS Settings: Either ACME or manual
|
;; TLS Settings: Either ACME or manual
|
||||||
;; (Other common TLS configuration are found before)
|
;; (Other common TLS configuration are found before)
|
||||||
|
@ -350,6 +351,7 @@ NAME = gitea
|
||||||
USER = root
|
USER = root
|
||||||
;PASSWD = ;Use PASSWD = `your password` for quoting if you use special characters in the password.
|
;PASSWD = ;Use PASSWD = `your password` for quoting if you use special characters in the password.
|
||||||
;SSL_MODE = false ; either "false" (default), "true", or "skip-verify"
|
;SSL_MODE = false ; either "false" (default), "true", or "skip-verify"
|
||||||
|
;CHARSET_COLLATION = ; Empty as default, Gitea will try to find a case-sensitive collation. Don't change it unless you clearly know what you need.
|
||||||
;;
|
;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;
|
;;
|
||||||
|
@ -381,6 +383,7 @@ USER = root
|
||||||
;NAME = gitea
|
;NAME = gitea
|
||||||
;USER = SA
|
;USER = SA
|
||||||
;PASSWD = MwantsaSecurePassword1
|
;PASSWD = MwantsaSecurePassword1
|
||||||
|
;CHARSET_COLLATION = ; Empty as default, Gitea will try to find a case-sensitive collation. Don't change it unless you clearly know what you need.
|
||||||
;;
|
;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;
|
;;
|
||||||
|
@ -409,6 +412,10 @@ USER = root
|
||||||
;;
|
;;
|
||||||
;; Whether execute database models migrations automatically
|
;; Whether execute database models migrations automatically
|
||||||
;AUTO_MIGRATION = true
|
;AUTO_MIGRATION = true
|
||||||
|
;;
|
||||||
|
;; Threshold value (in seconds) beyond which query execution time is logged as a warning in the xorm logger
|
||||||
|
;;
|
||||||
|
;SLOW_QUERY_THRESHOLD = 5s
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
@ -428,13 +435,13 @@ SECRET_KEY =
|
||||||
;SECRET_KEY_URI = file:/etc/gitea/secret_key
|
;SECRET_KEY_URI = file:/etc/gitea/secret_key
|
||||||
;;
|
;;
|
||||||
;; Secret used to validate communication within Gitea binary.
|
;; Secret used to validate communication within Gitea binary.
|
||||||
INTERNAL_TOKEN=
|
INTERNAL_TOKEN =
|
||||||
;;
|
;;
|
||||||
;; Alternative location to specify internal token, instead of this file; you cannot specify both this and INTERNAL_TOKEN, and must pick one
|
;; Alternative location to specify internal token, instead of this file; you cannot specify both this and INTERNAL_TOKEN, and must pick one
|
||||||
;INTERNAL_TOKEN_URI = file:/etc/gitea/internal_token
|
;INTERNAL_TOKEN_URI = file:/etc/gitea/internal_token
|
||||||
;;
|
;;
|
||||||
;; How long to remember that a user is logged in before requiring relogin (in days)
|
;; How long to remember that a user is logged in before requiring relogin (in days)
|
||||||
;LOGIN_REMEMBER_DAYS = 7
|
;LOGIN_REMEMBER_DAYS = 31
|
||||||
;;
|
;;
|
||||||
;; Name of the cookie used to store the current username.
|
;; Name of the cookie used to store the current username.
|
||||||
;COOKIE_USERNAME = gitea_awesome
|
;COOKIE_USERNAME = gitea_awesome
|
||||||
|
@ -491,6 +498,11 @@ INTERNAL_TOKEN=
|
||||||
;; Cache successful token hashes. API tokens are stored in the DB as pbkdf2 hashes however, this means that there is a potentially significant hashing load when there are multiple API operations.
|
;; Cache successful token hashes. API tokens are stored in the DB as pbkdf2 hashes however, this means that there is a potentially significant hashing load when there are multiple API operations.
|
||||||
;; This cache will store the successfully hashed tokens in a LRU cache as a balance between performance and security.
|
;; This cache will store the successfully hashed tokens in a LRU cache as a balance between performance and security.
|
||||||
;SUCCESSFUL_TOKENS_CACHE_SIZE = 20
|
;SUCCESSFUL_TOKENS_CACHE_SIZE = 20
|
||||||
|
;;
|
||||||
|
;; Reject API tokens sent in URL query string (Accept Header-based API tokens only). This avoids security vulnerabilities
|
||||||
|
;; stemming from cached/logged plain-text API tokens.
|
||||||
|
;; In future releases, this will become the default behavior
|
||||||
|
;DISABLE_QUERY_AUTH_TOKEN = false
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
@ -516,7 +528,7 @@ INTERNAL_TOKEN=
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;
|
;;
|
||||||
;; Enables OAuth2 provider
|
;; Enables OAuth2 provider
|
||||||
ENABLE = true
|
ENABLED = true
|
||||||
;;
|
;;
|
||||||
;; Algorithm used to sign OAuth2 tokens. Valid values: HS256, HS384, HS512, RS256, RS384, RS512, ES256, ES384, ES512, EdDSA
|
;; Algorithm used to sign OAuth2 tokens. Valid values: HS256, HS384, HS512, RS256, RS384, RS512, ES256, ES384, ES512, EdDSA
|
||||||
;JWT_SIGNING_ALGORITHM = RS256
|
;JWT_SIGNING_ALGORITHM = RS256
|
||||||
|
@ -548,7 +560,8 @@ ENABLE = true
|
||||||
;; Pre-register OAuth2 applications for some universally useful services
|
;; Pre-register OAuth2 applications for some universally useful services
|
||||||
;; * https://github.com/hickford/git-credential-oauth
|
;; * https://github.com/hickford/git-credential-oauth
|
||||||
;; * https://github.com/git-ecosystem/git-credential-manager
|
;; * https://github.com/git-ecosystem/git-credential-manager
|
||||||
;DEFAULT_APPLICATIONS = git-credential-oauth, git-credential-manager
|
;; * https://gitea.com/gitea/tea
|
||||||
|
;DEFAULT_APPLICATIONS = git-credential-oauth, git-credential-manager, tea
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
@ -759,6 +772,8 @@ LEVEL = Info
|
||||||
;;
|
;;
|
||||||
;; More detail: https://github.com/gogits/gogs/issues/165
|
;; More detail: https://github.com/gogits/gogs/issues/165
|
||||||
;ENABLE_REVERSE_PROXY_AUTHENTICATION = false
|
;ENABLE_REVERSE_PROXY_AUTHENTICATION = false
|
||||||
|
; Enable this to allow reverse proxy authentication for API requests, the reverse proxy is responsible for ensuring that no CSRF is possible.
|
||||||
|
;ENABLE_REVERSE_PROXY_AUTHENTICATION_API = false
|
||||||
;ENABLE_REVERSE_PROXY_AUTO_REGISTRATION = false
|
;ENABLE_REVERSE_PROXY_AUTO_REGISTRATION = false
|
||||||
;ENABLE_REVERSE_PROXY_EMAIL = false
|
;ENABLE_REVERSE_PROXY_EMAIL = false
|
||||||
;ENABLE_REVERSE_PROXY_FULL_NAME = false
|
;ENABLE_REVERSE_PROXY_FULL_NAME = false
|
||||||
|
@ -941,6 +956,12 @@ LEVEL = Info
|
||||||
;GO_GET_CLONE_URL_PROTOCOL = https
|
;GO_GET_CLONE_URL_PROTOCOL = https
|
||||||
;;
|
;;
|
||||||
;; Close issues as long as a commit on any branch marks it as fixed
|
;; Close issues as long as a commit on any branch marks it as fixed
|
||||||
|
;DEFAULT_CLOSE_ISSUES_VIA_COMMITS_IN_ANY_BRANCH = false
|
||||||
|
;;
|
||||||
|
;; Allow users to push local repositories to Gitea and have them automatically created for a user or an org
|
||||||
|
;ENABLE_PUSH_CREATE_USER = false
|
||||||
|
;ENABLE_PUSH_CREATE_ORG = false
|
||||||
|
;;
|
||||||
;; Comma separated list of globally disabled repo units. Allowed values: repo.issues, repo.ext_issues, repo.pulls, repo.wiki, repo.ext_wiki, repo.projects, repo.packages, repo.actions.
|
;; Comma separated list of globally disabled repo units. Allowed values: repo.issues, repo.ext_issues, repo.pulls, repo.wiki, repo.ext_wiki, repo.projects, repo.packages, repo.actions.
|
||||||
;DISABLED_REPO_UNITS =
|
;DISABLED_REPO_UNITS =
|
||||||
;;
|
;;
|
||||||
|
@ -948,7 +969,7 @@ LEVEL = Info
|
||||||
;; Note: Code and Releases can currently not be deactivated. If you specify default repo units you should still list them for future compatibility.
|
;; Note: Code and Releases can currently not be deactivated. If you specify default repo units you should still list them for future compatibility.
|
||||||
;; External wiki and issue tracker can't be enabled by default as it requires additional settings.
|
;; External wiki and issue tracker can't be enabled by default as it requires additional settings.
|
||||||
;; Disabled repo units will not be added to new repositories regardless if it is in the default list.
|
;; Disabled repo units will not be added to new repositories regardless if it is in the default list.
|
||||||
;DEFAULT_REPO_UNITS = repo.code,repo.releases,repo.issues,repo.pulls,repo.wiki,repo.projects,repo.packages
|
;DEFAULT_REPO_UNITS = repo.code,repo.releases,repo.issues,repo.pulls,repo.wiki,repo.projects,repo.packages,repo.actions
|
||||||
;;
|
;;
|
||||||
;; Comma separated list of default forked repo units.
|
;; Comma separated list of default forked repo units.
|
||||||
;; The set of allowed values and rules are the same as DEFAULT_REPO_UNITS.
|
;; The set of allowed values and rules are the same as DEFAULT_REPO_UNITS.
|
||||||
|
@ -1012,8 +1033,8 @@ LEVEL = Info
|
||||||
;; Comma-separated list of allowed file extensions (`.zip`), mime types (`text/plain`) or wildcard type (`image/*`, `audio/*`, `video/*`). Empty value or `*/*` allows all types.
|
;; Comma-separated list of allowed file extensions (`.zip`), mime types (`text/plain`) or wildcard type (`image/*`, `audio/*`, `video/*`). Empty value or `*/*` allows all types.
|
||||||
;ALLOWED_TYPES =
|
;ALLOWED_TYPES =
|
||||||
;;
|
;;
|
||||||
;; Max size of each file in megabytes. Defaults to 3MB
|
;; Max size of each file in megabytes. Defaults to 50MB
|
||||||
;FILE_MAX_SIZE = 3
|
;FILE_MAX_SIZE = 50
|
||||||
;;
|
;;
|
||||||
;; Max number of files per upload. Defaults to 5
|
;; Max number of files per upload. Defaults to 5
|
||||||
;MAX_FILES = 5
|
;MAX_FILES = 5
|
||||||
|
@ -1033,7 +1054,7 @@ LEVEL = Info
|
||||||
;; List of keywords used in Pull Request comments to automatically reopen a related issue
|
;; List of keywords used in Pull Request comments to automatically reopen a related issue
|
||||||
;REOPEN_KEYWORDS = reopen,reopens,reopened
|
;REOPEN_KEYWORDS = reopen,reopens,reopened
|
||||||
;;
|
;;
|
||||||
;; Set default merge style for repository creating, valid options: merge, rebase, rebase-merge, squash
|
;; Set default merge style for repository creating, valid options: merge, rebase, rebase-merge, squash, fast-forward-only
|
||||||
;DEFAULT_MERGE_STYLE = merge
|
;DEFAULT_MERGE_STYLE = merge
|
||||||
;;
|
;;
|
||||||
;; In the default merge message for squash commits include at most this many commits
|
;; In the default merge message for squash commits include at most this many commits
|
||||||
|
@ -1056,6 +1077,9 @@ LEVEL = Info
|
||||||
;;
|
;;
|
||||||
;; In addition to testing patches using the three-way merge method, re-test conflicting patches with git apply
|
;; In addition to testing patches using the three-way merge method, re-test conflicting patches with git apply
|
||||||
;TEST_CONFLICTING_PATCHES_WITH_GIT_APPLY = false
|
;TEST_CONFLICTING_PATCHES_WITH_GIT_APPLY = false
|
||||||
|
;;
|
||||||
|
;; Retarget child pull requests to the parent pull request branch target on merge of parent pull request. It only works on merged PRs where the head and base branch target the same repo.
|
||||||
|
;RETARGET_CHILDREN_ON_MERGE = true
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
@ -1149,15 +1173,9 @@ LEVEL = Info
|
||||||
;; enable cors headers (disabled by default)
|
;; enable cors headers (disabled by default)
|
||||||
;ENABLED = false
|
;ENABLED = false
|
||||||
;;
|
;;
|
||||||
;; scheme of allowed requests
|
;; list of requesting origins that are allowed, eg: "https://*.example.com"
|
||||||
;SCHEME = http
|
|
||||||
;;
|
|
||||||
;; list of requesting domains that are allowed
|
|
||||||
;ALLOW_DOMAIN = *
|
;ALLOW_DOMAIN = *
|
||||||
;;
|
;;
|
||||||
;; allow subdomains of headers listed above to request
|
|
||||||
;ALLOW_SUBDOMAIN = false
|
|
||||||
;;
|
|
||||||
;; list of methods allowed to request
|
;; list of methods allowed to request
|
||||||
;METHODS = GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS
|
;METHODS = GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS
|
||||||
;;
|
;;
|
||||||
|
@ -1203,20 +1221,26 @@ LEVEL = Info
|
||||||
;; Max size of files to be displayed (default is 8MiB)
|
;; Max size of files to be displayed (default is 8MiB)
|
||||||
;MAX_DISPLAY_FILE_SIZE = 8388608
|
;MAX_DISPLAY_FILE_SIZE = 8388608
|
||||||
;;
|
;;
|
||||||
|
;; Detect ambiguous unicode characters in file contents and show warnings on the UI
|
||||||
|
;AMBIGUOUS_UNICODE_DETECTION = true
|
||||||
|
;;
|
||||||
;; Whether the email of the user should be shown in the Explore Users page
|
;; Whether the email of the user should be shown in the Explore Users page
|
||||||
;SHOW_USER_EMAIL = true
|
;SHOW_USER_EMAIL = true
|
||||||
;;
|
;;
|
||||||
;; Set the default theme for the Gitea install
|
;; Set the default theme for the Gitea install
|
||||||
;DEFAULT_THEME = auto
|
;DEFAULT_THEME = gitea-auto
|
||||||
;;
|
;;
|
||||||
;; All available themes. Allow users select personalized themes regardless of the value of `DEFAULT_THEME`.
|
;; All available themes. Allow users select personalized themes regardless of the value of `DEFAULT_THEME`.
|
||||||
;THEMES = auto,gitea,arc-green
|
;THEMES = gitea-auto,gitea-light,gitea-dark
|
||||||
;;
|
;;
|
||||||
;; All available reactions users can choose on issues/prs and comments.
|
;; All available reactions users can choose on issues/prs and comments.
|
||||||
;; Values can be emoji alias (:smile:) or a unicode emoji.
|
;; Values can be emoji alias (:smile:) or a unicode emoji.
|
||||||
;; For custom reactions, add a tightly cropped square image to public/assets/img/emoji/reaction_name.png
|
;; For custom reactions, add a tightly cropped square image to public/assets/img/emoji/reaction_name.png
|
||||||
;REACTIONS = +1, -1, laugh, hooray, confused, heart, rocket, eyes
|
;REACTIONS = +1, -1, laugh, hooray, confused, heart, rocket, eyes
|
||||||
;;
|
;;
|
||||||
|
;; Change the number of users that are displayed in reactions tooltip (triggered by mouse hover).
|
||||||
|
;REACTION_MAX_USER_NUM = 10
|
||||||
|
;;
|
||||||
;; Additional Emojis not defined in the utf8 standard
|
;; Additional Emojis not defined in the utf8 standard
|
||||||
;; By default we support gitea (:gitea:), to add more copy them to public/assets/img/emoji/emoji_name.png and add it to this config.
|
;; By default we support gitea (:gitea:), to add more copy them to public/assets/img/emoji/emoji_name.png and add it to this config.
|
||||||
;; Dont mistake it for Reactions.
|
;; Dont mistake it for Reactions.
|
||||||
|
@ -1231,6 +1255,14 @@ LEVEL = Info
|
||||||
;; Whether to only show relevant repos on the explore page when no keyword is specified and default sorting is used.
|
;; Whether to only show relevant repos on the explore page when no keyword is specified and default sorting is used.
|
||||||
;; A repo is considered irrelevant if it's a fork or if it has no metadata (no description, no icon, no topic).
|
;; A repo is considered irrelevant if it's a fork or if it has no metadata (no description, no icon, no topic).
|
||||||
;ONLY_SHOW_RELEVANT_REPOS = false
|
;ONLY_SHOW_RELEVANT_REPOS = false
|
||||||
|
;;
|
||||||
|
;; Change the sort type of the explore pages.
|
||||||
|
;; Default is "recentupdate", but you also have "alphabetically", "reverselastlogin", "newest", "oldest".
|
||||||
|
;EXPLORE_PAGING_DEFAULT_SORT = recentupdate
|
||||||
|
;;
|
||||||
|
;; The tense all timestamps should be rendered in. Possible values are `absolute` time (i.e. 1970-01-01, 11:59) and `mixed`.
|
||||||
|
;; `mixed` means most timestamps are rendered in relative time (i.e. 2 days ago).
|
||||||
|
;PREFERRED_TIMESTAMP_TENSE = mixed
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
@ -1418,7 +1450,7 @@ LEVEL = Info
|
||||||
;DATADIR = queues/ ; Relative paths will be made absolute against `%(APP_DATA_PATH)s`.
|
;DATADIR = queues/ ; Relative paths will be made absolute against `%(APP_DATA_PATH)s`.
|
||||||
;;
|
;;
|
||||||
;; Default queue length before a channel queue will block
|
;; Default queue length before a channel queue will block
|
||||||
;LENGTH = 100
|
;LENGTH = 100000
|
||||||
;;
|
;;
|
||||||
;; Batch size to send for batched queues
|
;; Batch size to send for batched queues
|
||||||
;BATCH_LENGTH = 20
|
;BATCH_LENGTH = 20
|
||||||
|
@ -1448,6 +1480,16 @@ LEVEL = Info
|
||||||
;;
|
;;
|
||||||
;; Default configuration for email notifications for users (user configurable). Options: enabled, onmention, disabled
|
;; Default configuration for email notifications for users (user configurable). Options: enabled, onmention, disabled
|
||||||
;DEFAULT_EMAIL_NOTIFICATIONS = enabled
|
;DEFAULT_EMAIL_NOTIFICATIONS = enabled
|
||||||
|
;; Disabled features for users, could be "deletion", "manage_ssh_keys","manage_gpg_keys" more features can be disabled in future
|
||||||
|
;; - deletion: a user cannot delete their own account
|
||||||
|
;; - manage_ssh_keys: a user cannot configure ssh keys
|
||||||
|
;; - manage_gpg_keys: a user cannot configure gpg keys
|
||||||
|
;USER_DISABLED_FEATURES =
|
||||||
|
;; Comma separated list of disabled features ONLY if the user has an external login type (eg. LDAP, Oauth, etc.), could be `deletion`, `manage_ssh_keys`, `manage_gpg_keys`. This setting is independent from `USER_DISABLED_FEATURES` and supplements its behavior.
|
||||||
|
;; - deletion: a user cannot delete their own account
|
||||||
|
;; - manage_ssh_keys: a user cannot configure ssh keys
|
||||||
|
;; - manage_gpg_keys: a user cannot configure gpg keys
|
||||||
|
;;EXTERNAL_USER_DISABLE_FEATURES =
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
@ -1512,6 +1554,10 @@ LEVEL = Info
|
||||||
;; userid = use the userid / sub attribute
|
;; userid = use the userid / sub attribute
|
||||||
;; nickname = use the nickname attribute
|
;; nickname = use the nickname attribute
|
||||||
;; email = use the username part of the email attribute
|
;; email = use the username part of the email attribute
|
||||||
|
;; Note: `nickname` and `email` options will normalize input strings using the following criteria:
|
||||||
|
;; - diacritics are removed
|
||||||
|
;; - the characters in the set `['´\x60]` are removed
|
||||||
|
;; - the characters in the set `[\s~+]` are replaced with `-`
|
||||||
;USERNAME = nickname
|
;USERNAME = nickname
|
||||||
;;
|
;;
|
||||||
;; Update avatar if available from oauth2 provider.
|
;; Update avatar if available from oauth2 provider.
|
||||||
|
@ -1686,9 +1732,6 @@ LEVEL = Info
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;
|
;;
|
||||||
;; if the cache enabled
|
|
||||||
;ENABLED = true
|
|
||||||
;;
|
|
||||||
;; Either "memory", "redis", "memcache", or "twoqueue". default is "memory"
|
;; Either "memory", "redis", "memcache", or "twoqueue". default is "memory"
|
||||||
;ADAPTER = memory
|
;ADAPTER = memory
|
||||||
;;
|
;;
|
||||||
|
@ -1713,8 +1756,6 @@ LEVEL = Info
|
||||||
;[cache.last_commit]
|
;[cache.last_commit]
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; if the cache enabled
|
|
||||||
;ENABLED = true
|
|
||||||
;;
|
;;
|
||||||
;; Time to keep items in cache if not used, default is 8760 hours.
|
;; Time to keep items in cache if not used, default is 8760 hours.
|
||||||
;; Setting it to -1 disables caching
|
;; Setting it to -1 disables caching
|
||||||
|
@ -1744,8 +1785,8 @@ LEVEL = Info
|
||||||
;; Session cookie name
|
;; Session cookie name
|
||||||
;COOKIE_NAME = i_like_gitea
|
;COOKIE_NAME = i_like_gitea
|
||||||
;;
|
;;
|
||||||
;; If you use session in https only, default is false
|
;; If you use session in https only: true or false. If not set, it defaults to `true` if the ROOT_URL is an HTTPS URL.
|
||||||
;COOKIE_SECURE = false
|
;COOKIE_SECURE =
|
||||||
;;
|
;;
|
||||||
;; Session GC time interval in seconds, default is 86400 (1 day)
|
;; Session GC time interval in seconds, default is 86400 (1 day)
|
||||||
;GC_INTERVAL_TIME = 86400
|
;GC_INTERVAL_TIME = 86400
|
||||||
|
@ -1810,8 +1851,8 @@ LEVEL = Info
|
||||||
;; Comma-separated list of allowed file extensions (`.zip`), mime types (`text/plain`) or wildcard type (`image/*`, `audio/*`, `video/*`). Empty value or `*/*` allows all types.
|
;; Comma-separated list of allowed file extensions (`.zip`), mime types (`text/plain`) or wildcard type (`image/*`, `audio/*`, `video/*`). Empty value or `*/*` allows all types.
|
||||||
;ALLOWED_TYPES = .csv,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.xls,.xlsx,.zip
|
;ALLOWED_TYPES = .csv,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.xls,.xlsx,.zip
|
||||||
;;
|
;;
|
||||||
;; Max size of each file. Defaults to 4MB
|
;; Max size of each file. Defaults to 2048MB
|
||||||
;MAX_SIZE = 4
|
;MAX_SIZE = 2048
|
||||||
;;
|
;;
|
||||||
;; Max number of files per upload. Defaults to 5
|
;; Max number of files per upload. Defaults to 5
|
||||||
;MAX_FILES = 5
|
;MAX_FILES = 5
|
||||||
|
@ -1824,8 +1865,9 @@ LEVEL = Info
|
||||||
;; Currently, only `minio` is supported.
|
;; Currently, only `minio` is supported.
|
||||||
;SERVE_DIRECT = false
|
;SERVE_DIRECT = false
|
||||||
;;
|
;;
|
||||||
;; Path for attachments. Defaults to `data/attachments` only available when STORAGE_TYPE is `local`
|
;; Path for attachments. Defaults to `attachments`. Only available when STORAGE_TYPE is `local`
|
||||||
;PATH = data/attachments
|
;; Relative paths will be resolved to `${AppDataPath}/${attachment.PATH}`
|
||||||
|
;PATH = attachments
|
||||||
;;
|
;;
|
||||||
;; Minio endpoint to connect only available when STORAGE_TYPE is `minio`
|
;; Minio endpoint to connect only available when STORAGE_TYPE is `minio`
|
||||||
;MINIO_ENDPOINT = localhost:9000
|
;MINIO_ENDPOINT = localhost:9000
|
||||||
|
@ -2559,10 +2601,20 @@ LEVEL = Info
|
||||||
|
|
||||||
; [actions]
|
; [actions]
|
||||||
;; Enable/Disable actions capabilities
|
;; Enable/Disable actions capabilities
|
||||||
;ENABLED = false
|
;ENABLED = true
|
||||||
;;
|
;;
|
||||||
;; Default platform to get action plugins, `github` for `https://github.com`, `self` for the current Gitea instance.
|
;; Default platform to get action plugins, `github` for `https://github.com`, `self` for the current Gitea instance.
|
||||||
;DEFAULT_ACTIONS_URL = github
|
;DEFAULT_ACTIONS_URL = github
|
||||||
|
;; Default artifact retention time in days. Artifacts could have their own retention periods by setting the `retention-days` option in `actions/upload-artifact` step.
|
||||||
|
;ARTIFACT_RETENTION_DAYS = 90
|
||||||
|
;; Timeout to stop the task which have running status, but haven't been updated for a long time
|
||||||
|
;ZOMBIE_TASK_TIMEOUT = 10m
|
||||||
|
;; Timeout to stop the tasks which have running status and continuous updates, but don't end for a long time
|
||||||
|
;ENDLESS_TASK_TIMEOUT = 3h
|
||||||
|
;; Timeout to cancel the jobs which have waiting status, but haven't been picked by a runner for a long time
|
||||||
|
;ABANDONED_JOB_TIMEOUT = 24h
|
||||||
|
;; Strings committers can place inside a commit message or PR title to skip executing the corresponding actions workflow
|
||||||
|
;SKIP_WORKFLOW_STRINGS = [skip ci],[ci skip],[no ci],[skip actions],[actions skip]
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
|
@ -7,7 +7,7 @@ if [ ! -x /bin/sh ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "${USER}" != "git" ]; then
|
if [ "${USER}" != "git" ]; then
|
||||||
# rename user
|
# Rename user
|
||||||
sed -i -e "s/^git\:/${USER}\:/g" /etc/passwd
|
sed -i -e "s/^git\:/${USER}\:/g" /etc/passwd
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -19,13 +19,13 @@ if [ -z "${USER_UID}" ]; then
|
||||||
USER_UID="`id -u ${USER}`"
|
USER_UID="`id -u ${USER}`"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
## Change GID for USER?
|
# Change GID for USER?
|
||||||
if [ -n "${USER_GID}" ] && [ "${USER_GID}" != "`id -g ${USER}`" ]; then
|
if [ -n "${USER_GID}" ] && [ "${USER_GID}" != "`id -g ${USER}`" ]; then
|
||||||
sed -i -e "s/^${USER}:\([^:]*\):[0-9]*/${USER}:\1:${USER_GID}/" /etc/group
|
sed -i -e "s/^${USER}:\([^:]*\):[0-9]*/${USER}:\1:${USER_GID}/" /etc/group
|
||||||
sed -i -e "s/^${USER}:\([^:]*\):\([0-9]*\):[0-9]*/${USER}:\1:\2:${USER_GID}/" /etc/passwd
|
sed -i -e "s/^${USER}:\([^:]*\):\([0-9]*\):[0-9]*/${USER}:\1:\2:${USER_GID}/" /etc/passwd
|
||||||
fi
|
fi
|
||||||
|
|
||||||
## Change UID for USER?
|
# Change UID for USER?
|
||||||
if [ -n "${USER_UID}" ] && [ "${USER_UID}" != "`id -u ${USER}`" ]; then
|
if [ -n "${USER_UID}" ] && [ "${USER_UID}" != "`id -u ${USER}`" ]; then
|
||||||
sed -i -e "s/^${USER}:\([^:]*\):[0-9]*:\([0-9]*\)/${USER}:\1:${USER_UID}:\2/" /etc/passwd
|
sed -i -e "s/^${USER}:\([^:]*\):[0-9]*:\([0-9]*\)/${USER}:\1:${USER_UID}:\2/" /etc/passwd
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
---
|
|
||||||
date: "2017-08-23T09:00:00+02:00"
|
|
||||||
title: "Avancé"
|
|
||||||
slug: "administration"
|
|
||||||
sidebar_position: 30
|
|
||||||
toc: false
|
|
||||||
draft: false
|
|
||||||
menu:
|
|
||||||
sidebar:
|
|
||||||
name: "Avancé"
|
|
||||||
sidebar_position: 20
|
|
||||||
identifier: "administration"
|
|
||||||
---
|
|
|
@ -1,13 +0,0 @@
|
||||||
---
|
|
||||||
date: "2016-12-01T16:00:00+02:00"
|
|
||||||
title: "運維"
|
|
||||||
slug: "administration"
|
|
||||||
sidebar_position: 30
|
|
||||||
toc: false
|
|
||||||
draft: false
|
|
||||||
menu:
|
|
||||||
sidebar:
|
|
||||||
name: "運維"
|
|
||||||
sidebar_position: 20
|
|
||||||
identifier: "administration"
|
|
||||||
---
|
|
|
@ -19,10 +19,10 @@ Some jurisdictions (such as EU), requires certain legal pages (e.g. Privacy Poli
|
||||||
|
|
||||||
## Getting Pages
|
## Getting Pages
|
||||||
|
|
||||||
Gitea source code ships with sample pages, available in `contrib/legal` directory. Copy them to `custom/public/`. For example, to add Privacy Policy:
|
Gitea source code ships with sample pages, available in `contrib/legal` directory. Copy them to `custom/public/assets/`. For example, to add Privacy Policy:
|
||||||
|
|
||||||
```
|
```
|
||||||
wget -O /path/to/custom/public/privacy.html https://raw.githubusercontent.com/go-gitea/gitea/main/contrib/legal/privacy.html.sample
|
wget -O /path/to/custom/public/assets/privacy.html https://raw.githubusercontent.com/go-gitea/gitea/main/contrib/legal/privacy.html.sample
|
||||||
```
|
```
|
||||||
|
|
||||||
Now you need to edit the page to meet your requirements. In particular you must change the email addresses, web addresses and references to "Your Gitea Instance" to match your situation.
|
Now you need to edit the page to meet your requirements. In particular you must change the email addresses, web addresses and references to "Your Gitea Instance" to match your situation.
|
||||||
|
|
|
@ -19,10 +19,10 @@ menu:
|
||||||
|
|
||||||
## 获取页面
|
## 获取页面
|
||||||
|
|
||||||
Gitea 源代码附带了示例页面,位于 `contrib/legal` 目录中。将它们复制到 `custom/public/` 目录下。例如,如果要添加隐私政策:
|
Gitea 源代码附带了示例页面,位于 `contrib/legal` 目录中。将它们复制到 `custom/public/assets/` 目录下。例如,如果要添加隐私政策:
|
||||||
|
|
||||||
```
|
```
|
||||||
wget -O /path/to/custom/public/privacy.html https://raw.githubusercontent.com/go-gitea/gitea/main/contrib/legal/privacy.html.sample
|
wget -O /path/to/custom/public/assets/privacy.html https://raw.githubusercontent.com/go-gitea/gitea/main/contrib/legal/privacy.html.sample
|
||||||
```
|
```
|
||||||
|
|
||||||
现在,你需要编辑该页面以满足你的需求。特别是,你必须更改电子邮件地址、网址以及与 "Your Gitea Instance" 相关的引用,以匹配你的情况。
|
现在,你需要编辑该页面以满足你的需求。特别是,你必须更改电子邮件地址、网址以及与 "Your Gitea Instance" 相关的引用,以匹配你的情况。
|
||||||
|
|
|
@ -43,10 +43,10 @@ directory. There should be some output similar to the following:
|
||||||
Inside the `gitea-dump-1482906742.zip` file, will be the following:
|
Inside the `gitea-dump-1482906742.zip` file, will be the following:
|
||||||
|
|
||||||
- `app.ini` - Optional copy of configuration file if originally stored outside the default `custom/` directory
|
- `app.ini` - Optional copy of configuration file if originally stored outside the default `custom/` directory
|
||||||
- `custom` - All config or customization files in `custom/`.
|
- `custom/` - All config or customization files in `custom/`.
|
||||||
- `data` - Data directory (APP_DATA_PATH), except sessions if you are using file session. This directory includes `attachments`, `avatars`, `lfs`, `indexers`, SQLite file if you are using SQLite.
|
- `data/` - Data directory (APP_DATA_PATH), except sessions if you are using file session. This directory includes `attachments`, `avatars`, `lfs`, `indexers`, SQLite file if you are using SQLite.
|
||||||
|
- `repos/` - Complete copy of the repository directory.
|
||||||
- `gitea-db.sql` - SQL dump of database
|
- `gitea-db.sql` - SQL dump of database
|
||||||
- `gitea-repo.zip` - Complete copy of the repository directory.
|
|
||||||
- `log/` - Various logs. They are not needed for a recovery or migration.
|
- `log/` - Various logs. They are not needed for a recovery or migration.
|
||||||
|
|
||||||
Intermediate backup files are created in a temporary directory specified either with the
|
Intermediate backup files are created in a temporary directory specified either with the
|
||||||
|
@ -89,10 +89,10 @@ Example:
|
||||||
```sh
|
```sh
|
||||||
unzip gitea-dump-1610949662.zip
|
unzip gitea-dump-1610949662.zip
|
||||||
cd gitea-dump-1610949662
|
cd gitea-dump-1610949662
|
||||||
mv data/conf/app.ini /etc/gitea/conf/app.ini
|
mv app.ini /etc/gitea/conf/app.ini
|
||||||
mv data/* /var/lib/gitea/data/
|
mv data/* /var/lib/gitea/data/
|
||||||
mv log/* /var/lib/gitea/log/
|
mv log/* /var/lib/gitea/log/
|
||||||
mv repos/* /var/lib/gitea/repositories/
|
mv repos/* /var/lib/gitea/data/gitea-repositories/
|
||||||
chown -R gitea:gitea /etc/gitea/conf/app.ini /var/lib/gitea
|
chown -R gitea:gitea /etc/gitea/conf/app.ini /var/lib/gitea
|
||||||
|
|
||||||
# mysql
|
# mysql
|
||||||
|
@ -111,6 +111,8 @@ With Gitea running, and from the directory Gitea's binary is located, execute: `
|
||||||
|
|
||||||
This ensures that application and configuration file paths in repository Git Hooks are consistent and applicable to the current installation. If these paths are not updated, repository `push` actions will fail.
|
This ensures that application and configuration file paths in repository Git Hooks are consistent and applicable to the current installation. If these paths are not updated, repository `push` actions will fail.
|
||||||
|
|
||||||
|
If you still have issues, consider running `./gitea doctor check` to inspect possible errors (or run with `--fix`).
|
||||||
|
|
||||||
### Using Docker (`restore`)
|
### Using Docker (`restore`)
|
||||||
|
|
||||||
There is also no support for a recovery command in a Docker-based gitea instance. The restore process contains the same steps as described in the previous section but with different paths.
|
There is also no support for a recovery command in a Docker-based gitea instance. The restore process contains the same steps as described in the previous section but with different paths.
|
||||||
|
@ -126,7 +128,7 @@ cd gitea-dump-1610949662
|
||||||
# restore the gitea data
|
# restore the gitea data
|
||||||
mv data/* /data/gitea
|
mv data/* /data/gitea
|
||||||
# restore the repositories itself
|
# restore the repositories itself
|
||||||
mv repos/* /data/git/repositories/
|
mv repos/* /data/git/gitea-repositories/
|
||||||
# adjust file permissions
|
# adjust file permissions
|
||||||
chown -R git:git /data
|
chown -R git:git /data
|
||||||
# Regenerate Git Hooks
|
# Regenerate Git Hooks
|
||||||
|
@ -150,7 +152,7 @@ mv data/conf/app.ini /etc/gitea/app.ini
|
||||||
# restore the gitea data
|
# restore the gitea data
|
||||||
mv data/* /var/lib/gitea
|
mv data/* /var/lib/gitea
|
||||||
# restore the repositories itself
|
# restore the repositories itself
|
||||||
mv repos/* /var/lib/gitea/git/repositories
|
mv repos/* /var/lib/gitea/git/gitea-repositories
|
||||||
# adjust file permissions
|
# adjust file permissions
|
||||||
chown -R git:git /etc/gitea/app.ini /var/lib/gitea
|
chown -R git:git /etc/gitea/app.ini /var/lib/gitea
|
||||||
# Regenerate Git Hooks
|
# Regenerate Git Hooks
|
||||||
|
|
|
@ -19,6 +19,12 @@ menu:
|
||||||
|
|
||||||
Gitea 已经实现了 `dump` 命令可以用来备份所有需要的文件到一个zip压缩文件。该压缩文件可以被用来进行数据恢复。
|
Gitea 已经实现了 `dump` 命令可以用来备份所有需要的文件到一个zip压缩文件。该压缩文件可以被用来进行数据恢复。
|
||||||
|
|
||||||
|
## 备份一致性
|
||||||
|
|
||||||
|
为了确保 Gitea 实例的一致性,在备份期间必须关闭它。
|
||||||
|
|
||||||
|
Gitea 包括数据库、文件和 Git 仓库,当它被使用时所有这些都会发生变化。例如,当迁移正在进行时,在数据库中创建一个事务,而 Git 仓库正在被复制。如果备份发生在迁移的中间,Git 仓库可能是不完整的,尽管数据库声称它是完整的,因为它是在之后被转储的。避免这种竞争条件的唯一方法是在备份期间停止 Gitea 实例。
|
||||||
|
|
||||||
## 备份命令 (`dump`)
|
## 备份命令 (`dump`)
|
||||||
|
|
||||||
先转到git用户的权限: `su git`. 再Gitea目录运行 `./gitea dump`。一般会显示类似如下的输出:
|
先转到git用户的权限: `su git`. 再Gitea目录运行 `./gitea dump`。一般会显示类似如下的输出:
|
||||||
|
@ -34,15 +40,43 @@ Gitea 已经实现了 `dump` 命令可以用来备份所有需要的文件到一
|
||||||
|
|
||||||
最后生成的 `gitea-dump-1482906742.zip` 文件将会包含如下内容:
|
最后生成的 `gitea-dump-1482906742.zip` 文件将会包含如下内容:
|
||||||
|
|
||||||
* `custom` - 所有保存在 `custom/` 目录下的配置和自定义的文件。
|
* `app.ini` - 如果原先存储在默认的 custom/ 目录之外,则是配置文件的可选副本
|
||||||
* `data` - 数据目录下的所有内容不包含使用文件session的文件。该目录包含 `attachments`, `avatars`, `lfs`, `indexers`, 如果使用sqlite 还会包含 sqlite 数据库文件。
|
* `custom/` - 所有保存在 `custom/` 目录下的配置和自定义的文件。
|
||||||
|
* `data/` - 数据目录(APP_DATA_PATH),如果使用文件会话,则不包括会话。该目录包括 `attachments`、`avatars`、`lfs`、`indexers`、如果使用 SQLite 则包括 SQLite 文件。
|
||||||
|
* `repos/` - 仓库目录的完整副本。
|
||||||
* `gitea-db.sql` - 数据库dump出来的 SQL。
|
* `gitea-db.sql` - 数据库dump出来的 SQL。
|
||||||
* `gitea-repo.zip` - Git仓库压缩文件。
|
|
||||||
* `log/` - Logs文件,如果用作迁移不是必须的。
|
* `log/` - Logs文件,如果用作迁移不是必须的。
|
||||||
|
|
||||||
中间备份文件将会在临时目录进行创建,如果您要重新指定临时目录,可以用 `--tempdir` 参数,或者用 `TMPDIR` 环境变量。
|
中间备份文件将会在临时目录进行创建,如果您要重新指定临时目录,可以用 `--tempdir` 参数,或者用 `TMPDIR` 环境变量。
|
||||||
|
|
||||||
## Restore Command (`restore`)
|
## 备份数据库
|
||||||
|
|
||||||
|
`gitea dump` 创建的 SQL 转储使用 XORM,Gitea 管理员可能更喜欢使用本地的 MySQL 和 PostgreSQL 转储工具。使用 XORM 转储数据库时仍然存在一些问题,可能会导致在尝试恢复时出现问题。
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# mysql
|
||||||
|
mysqldump -u$USER -p$PASS --database $DATABASE > gitea-db.sql
|
||||||
|
# postgres
|
||||||
|
pg_dump -U $USER $DATABASE > gitea-db.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
### 使用Docker (`dump`)
|
||||||
|
|
||||||
|
在使用 Docker 时,使用 `dump` 命令有一些注意事项。
|
||||||
|
|
||||||
|
必须以 `gitea/conf/app.ini` 中指定的 `RUN_USER = <OS_USERNAME>` 执行该命令;并且,为了让备份文件夹的压缩过程能够顺利执行,`docker exec` 命令必须在 `--tempdir` 内部执行。
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```none
|
||||||
|
docker exec -u <OS_USERNAME> -it -w <--tempdir> $(docker ps -qf 'name=^<NAME_OF_DOCKER_CONTAINER>$') bash -c '/usr/local/bin/gitea dump -c </path/to/app.ini>'
|
||||||
|
```
|
||||||
|
|
||||||
|
\*注意:`--tempdir` 指的是 Gitea 使用的 Docker 环境的临时目录;如果您没有指定自定义的 `--tempdir`,那么 Gitea 将使用 `/tmp` 或 Docker 容器的 `TMPDIR` 环境变量。对于 `--tempdir`,请相应调整您的 `docker exec` 命令选项。
|
||||||
|
|
||||||
|
结果应该是一个文件,存储在指定的 `--tempdir` 中,类似于:`gitea-dump-1482906742.zip`
|
||||||
|
|
||||||
|
## 恢复命令 (`restore`)
|
||||||
|
|
||||||
当前还没有恢复命令,恢复需要人工进行。主要是把文件和数据库进行恢复。
|
当前还没有恢复命令,恢复需要人工进行。主要是把文件和数据库进行恢复。
|
||||||
|
|
||||||
|
@ -51,10 +85,10 @@ Gitea 已经实现了 `dump` 命令可以用来备份所有需要的文件到一
|
||||||
```sh
|
```sh
|
||||||
unzip gitea-dump-1610949662.zip
|
unzip gitea-dump-1610949662.zip
|
||||||
cd gitea-dump-1610949662
|
cd gitea-dump-1610949662
|
||||||
mv data/conf/app.ini /etc/gitea/conf/app.ini
|
mv app.ini /etc/gitea/conf/app.ini
|
||||||
mv data/* /var/lib/gitea/data/
|
mv data/* /var/lib/gitea/data/
|
||||||
mv log/* /var/lib/gitea/log/
|
mv log/* /var/lib/gitea/log/
|
||||||
mv repos/* /var/lib/gitea/repositories/
|
mv repos/* /var/lib/gitea/gitea-repositories/
|
||||||
chown -R gitea:gitea /etc/gitea/conf/app.ini /var/lib/gitea
|
chown -R gitea:gitea /etc/gitea/conf/app.ini /var/lib/gitea
|
||||||
|
|
||||||
# mysql
|
# mysql
|
||||||
|
@ -66,3 +100,55 @@ psql -U $USER -d $DATABASE < gitea-db.sql
|
||||||
|
|
||||||
service gitea restart
|
service gitea restart
|
||||||
```
|
```
|
||||||
|
|
||||||
|
如果安装方式发生了变化(例如 二进制 -> Docker),或者 Gitea 安装到了与之前安装不同的目录,则需要重新生成仓库 Git 钩子。
|
||||||
|
|
||||||
|
在 Gitea 运行时,并从 Gitea 二进制文件所在的目录执行:`./gitea admin regenerate hooks`
|
||||||
|
|
||||||
|
这样可以确保仓库 Git 钩子中的应用程序和配置文件路径与当前安装一致。如果这些路径没有更新,仓库的 `push` 操作将失败。
|
||||||
|
|
||||||
|
### 使用 Docker (`restore`)
|
||||||
|
|
||||||
|
在基于 Docker 的 Gitea 实例中,也没有恢复命令的支持。恢复过程与前面描述的步骤相同,但路径不同。
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# 在容器中打开 bash 会话
|
||||||
|
docker exec --user git -it 2a83b293548e bash
|
||||||
|
# 在容器内解压您的备份文件
|
||||||
|
unzip gitea-dump-1610949662.zip
|
||||||
|
cd gitea-dump-1610949662
|
||||||
|
# 恢复 Gitea 数据
|
||||||
|
mv data/* /data/gitea
|
||||||
|
# 恢复仓库本身
|
||||||
|
mv repos/* /data/git/gitea-repositories/
|
||||||
|
# 调整文件权限
|
||||||
|
chown -R git:git /data
|
||||||
|
# 重新生成 Git 钩子
|
||||||
|
/usr/local/bin/gitea -c '/data/gitea/conf/app.ini' admin regenerate hooks
|
||||||
|
```
|
||||||
|
|
||||||
|
Gitea 容器中的默认用户是 `git`(1000:1000)。请用您的 Gitea 容器 ID 或名称替换 `2a83b293548e`。
|
||||||
|
|
||||||
|
### 使用 Docker-rootless (`restore`)
|
||||||
|
|
||||||
|
在 Docker-rootless 容器中的恢复工作流程只是要使用的目录不同:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# 在容器中打开 bash 会话
|
||||||
|
docker exec --user git -it 2a83b293548e bash
|
||||||
|
# 在容器内解压您的备份文件
|
||||||
|
unzip gitea-dump-1610949662.zip
|
||||||
|
cd gitea-dump-1610949662
|
||||||
|
# 恢复 app.ini
|
||||||
|
mv data/conf/app.ini /etc/gitea/app.ini
|
||||||
|
# 恢复 Gitea 数据
|
||||||
|
mv data/* /var/lib/gitea
|
||||||
|
# 恢复仓库本身
|
||||||
|
mv repos/* /var/lib/gitea/git/gitea-repositories
|
||||||
|
# 调整文件权限
|
||||||
|
chown -R git:git /etc/gitea/app.ini /var/lib/gitea
|
||||||
|
# 重新生成 Git 钩子
|
||||||
|
/usr/local/bin/gitea -c '/etc/gitea/app.ini' admin regenerate hooks
|
||||||
|
```
|
||||||
|
|
|
@ -1,68 +0,0 @@
|
||||||
---
|
|
||||||
date: "2017-01-01T16:00:00+02:00"
|
|
||||||
title: "用法: 備份與還原"
|
|
||||||
slug: "backup-and-restore"
|
|
||||||
sidebar_position: 11
|
|
||||||
toc: false
|
|
||||||
draft: false
|
|
||||||
aliases:
|
|
||||||
- /zh-tw/backup-and-restore
|
|
||||||
menu:
|
|
||||||
sidebar:
|
|
||||||
parent: "administration"
|
|
||||||
name: "備份與還原"
|
|
||||||
sidebar_position: 11
|
|
||||||
identifier: "backup-and-restore"
|
|
||||||
---
|
|
||||||
|
|
||||||
# 備份與還原
|
|
||||||
|
|
||||||
Gitea 目前支援 `dump` 指令,用來將資料備份成 zip 檔案,後續會提供還原指令,讓你可以輕易的將備份資料及還原到另外一台機器。
|
|
||||||
|
|
||||||
## 備份指令 (`dump`)
|
|
||||||
|
|
||||||
首先,切換到執行 Gitea 的使用者: `su git` (請修改成您指定的使用者),並在安裝目錄內執行 `./gitea dump` 指令,你可以看到 console 畫面如下:
|
|
||||||
|
|
||||||
```
|
|
||||||
2016/12/27 22:32:09 Creating tmp work dir: /tmp/gitea-dump-417443001
|
|
||||||
2016/12/27 22:32:09 Dumping local repositories.../home/git/gitea-repositories
|
|
||||||
2016/12/27 22:32:22 Dumping database...
|
|
||||||
2016/12/27 22:32:22 Packing dump files...
|
|
||||||
2016/12/27 22:32:34 Removing tmp work dir: /tmp/gitea-dump-417443001
|
|
||||||
2016/12/27 22:32:34 Finish dumping in file gitea-dump-1482906742.zip
|
|
||||||
```
|
|
||||||
|
|
||||||
備份出來的 `gitea-dump-1482906742.zip` 檔案,檔案內會包含底下內容:
|
|
||||||
|
|
||||||
* `custom/conf/app.ini` - 伺服器設定檔。
|
|
||||||
* `gitea-db.sql` - SQL 備份檔案。
|
|
||||||
* `gitea-repo.zip` - 此 zip 檔案為全部的 repo 目錄。
|
|
||||||
請參考 Config -> repository -> `ROOT` 所設定的路徑。
|
|
||||||
* `log/` - 全部 logs 檔案,如果你要 migrate 到其他伺服器,此目錄不用保留。
|
|
||||||
|
|
||||||
你可以透過設定 `--tempdir` 指令參數來指定備份檔案目錄,或者是設定 `TMPDIR` 環境變數來達到此功能。
|
|
||||||
|
|
||||||
## 還原指令 (`restore`)
|
|
||||||
|
|
||||||
持續更新中: 此文件尚未完成.
|
|
||||||
|
|
||||||
例:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
unzip gitea-dump-1610949662.zip
|
|
||||||
cd gitea-dump-1610949662
|
|
||||||
mv data/conf/app.ini /etc/gitea/conf/app.ini
|
|
||||||
mv data/* /var/lib/gitea/data/
|
|
||||||
mv log/* /var/lib/gitea/log/
|
|
||||||
mv repos/* /var/lib/gitea/repositories/
|
|
||||||
chown -R gitea:gitea /etc/gitea/conf/app.ini /var/lib/gitea
|
|
||||||
|
|
||||||
# mysql
|
|
||||||
mysql --default-character-set=utf8mb4 -u$USER -p$PASS $DATABASE <gitea-db.sql
|
|
||||||
# sqlite3
|
|
||||||
sqlite3 $DATABASE_PATH <gitea-db.sql
|
|
||||||
# postgres
|
|
||||||
psql -U $USER -d $DATABASE < gitea-db.sql
|
|
||||||
|
|
||||||
service gitea restart
|
|
||||||
```
|
|
|
@ -50,7 +50,7 @@ a special meaning for your command shell.
|
||||||
|
|
||||||
If no pattern is provided, all files are listed.
|
If no pattern is provided, all files are listed.
|
||||||
|
|
||||||
### Example
|
### Example: Listing all embedded files
|
||||||
|
|
||||||
Listing all embedded files with `openid` in their path:
|
Listing all embedded files with `openid` in their path:
|
||||||
|
|
||||||
|
@ -101,7 +101,7 @@ When Gitea is upgraded to a new version (by replacing the executable), many of t
|
||||||
embedded files will suffer changes. Gitea will honor and use any files found
|
embedded files will suffer changes. Gitea will honor and use any files found
|
||||||
in the `custom` directory, even if they are old and incompatible.
|
in the `custom` directory, even if they are old and incompatible.
|
||||||
|
|
||||||
### Example
|
### Example: Extracting mail templates
|
||||||
|
|
||||||
Extracting mail templates to a temporary directory:
|
Extracting mail templates to a temporary directory:
|
||||||
|
|
||||||
|
|
|
@ -37,20 +37,20 @@ gitea embedded list [--include-vendored] [patterns...]
|
||||||
|
|
||||||
- 列出所有模板文件,无论在哪个虚拟目录下:`**.tmpl`
|
- 列出所有模板文件,无论在哪个虚拟目录下:`**.tmpl`
|
||||||
- 列出所有邮件模板文件:`templates/mail/**.tmpl`
|
- 列出所有邮件模板文件:`templates/mail/**.tmpl`
|
||||||
- 列出 `public/img` 目录下的所有文件:`public/img/**`
|
列出 `public/assets/img` 目录下的所有文件:`public/assets/img/**`
|
||||||
|
|
||||||
不要忘记为模式使用引号,因为空格、`*` 和其他字符可能对命令行解释器有特殊含义。
|
不要忘记为模式使用引号,因为空格、`*` 和其他字符可能对命令行解释器有特殊含义。
|
||||||
|
|
||||||
如果未提供模式,则列出所有文件。
|
如果未提供模式,则列出所有文件。
|
||||||
|
|
||||||
### 示例
|
### 示例:列出所有嵌入文件
|
||||||
|
|
||||||
列出所有路径中包含 `openid` 的嵌入文件:
|
列出所有路径中包含 `openid` 的嵌入文件:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ gitea embedded list '**openid**'
|
$ gitea embedded list '**openid**'
|
||||||
public/img/auth/openid_connect.svg
|
public/assets/img/auth/openid_connect.svg
|
||||||
public/img/openid-16x16.png
|
public/assets/img/openid-16x16.png
|
||||||
templates/user/auth/finalize_openid.tmpl
|
templates/user/auth/finalize_openid.tmpl
|
||||||
templates/user/auth/signin_openid.tmpl
|
templates/user/auth/signin_openid.tmpl
|
||||||
templates/user/auth/signup_openid_connect.tmpl
|
templates/user/auth/signup_openid_connect.tmpl
|
||||||
|
@ -83,7 +83,7 @@ gitea [--config {file}] embedded extract [--destination {dir}|--custom] [--overw
|
||||||
|
|
||||||
请确保**只提取需要自定义的文件**。位于 `custom` 目录中的文件不会受到 Gitea 的升级过程的影响。当 Gitea 升级到新版本(通过替换可执行文件)时,许多嵌入文件将发生变化。Gitea 将尊重并使用在 `custom` 目录中找到的任何文件,即使这些文件是旧的和不兼容的。
|
请确保**只提取需要自定义的文件**。位于 `custom` 目录中的文件不会受到 Gitea 的升级过程的影响。当 Gitea 升级到新版本(通过替换可执行文件)时,许多嵌入文件将发生变化。Gitea 将尊重并使用在 `custom` 目录中找到的任何文件,即使这些文件是旧的和不兼容的。
|
||||||
|
|
||||||
### 示例
|
### 示例:提取邮件模板
|
||||||
|
|
||||||
将邮件模板提取到临时目录:
|
将邮件模板提取到临时目录:
|
||||||
|
|
||||||
|
|
|
@ -95,6 +95,7 @@ Admin operations:
|
||||||
- Options:
|
- Options:
|
||||||
- `--username value`, `-u value`: Username. Required.
|
- `--username value`, `-u value`: Username. Required.
|
||||||
- `--password value`, `-p value`: New password. Required.
|
- `--password value`, `-p value`: New password. Required.
|
||||||
|
- `--must-change-password`: If provided, the user is required to choose a new password after the login. Optional.
|
||||||
- Examples:
|
- Examples:
|
||||||
- `gitea admin user change-password --username myname --password asecurepassword`
|
- `gitea admin user change-password --username myname --password asecurepassword`
|
||||||
- `must-change-password`:
|
- `must-change-password`:
|
||||||
|
@ -334,9 +335,9 @@ in the current directory.
|
||||||
- `--skip-attachment-data`: Skip dumping of attachment data. Optional.
|
- `--skip-attachment-data`: Skip dumping of attachment data. Optional.
|
||||||
- `--skip-package-data`: Skip dumping of package data. Optional.
|
- `--skip-package-data`: Skip dumping of package data. Optional.
|
||||||
- `--skip-log`: Skip dumping of log data. Optional.
|
- `--skip-log`: Skip dumping of log data. Optional.
|
||||||
- `--database`, `-d`: Specify the database SQL syntax. Optional.
|
- `--database`, `-d`: Specify the database SQL syntax. Optional (supported arguments: sqlite3, mysql, mssql, postgres).
|
||||||
- `--verbose`, `-V`: If provided, shows additional details. Optional.
|
- `--verbose`, `-V`: If provided, shows additional details. Optional.
|
||||||
- `--type`: Set the dump output format. Optional. (default: zip)
|
- `--type`: Set the dump output format. Optional. (formats: zip, tar, tar.sz, tar.gz, tar.xz, tar.bz2, tar.br, tar.lz4, tar.zst default: zip).
|
||||||
- Examples:
|
- Examples:
|
||||||
- `gitea dump`
|
- `gitea dump`
|
||||||
- `gitea dump --verbose`
|
- `gitea dump --verbose`
|
||||||
|
|
|
@ -102,7 +102,7 @@ In addition, there is _`StaticRootPath`_ which can be set as a built-in at build
|
||||||
- `ENABLE_PUSH_CREATE_USER`: **false**: Allow users to push local repositories to Gitea and have them automatically created for a user.
|
- `ENABLE_PUSH_CREATE_USER`: **false**: Allow users to push local repositories to Gitea and have them automatically created for a user.
|
||||||
- `ENABLE_PUSH_CREATE_ORG`: **false**: Allow users to push local repositories to Gitea and have them automatically created for an org.
|
- `ENABLE_PUSH_CREATE_ORG`: **false**: Allow users to push local repositories to Gitea and have them automatically created for an org.
|
||||||
- `DISABLED_REPO_UNITS`: **_empty_**: Comma separated list of globally disabled repo units. Allowed values: \[repo.issues, repo.ext_issues, repo.pulls, repo.wiki, repo.ext_wiki, repo.projects, repo.packages, repo.actions\]
|
- `DISABLED_REPO_UNITS`: **_empty_**: Comma separated list of globally disabled repo units. Allowed values: \[repo.issues, repo.ext_issues, repo.pulls, repo.wiki, repo.ext_wiki, repo.projects, repo.packages, repo.actions\]
|
||||||
- `DEFAULT_REPO_UNITS`: **repo.code,repo.releases,repo.issues,repo.pulls,repo.wiki,repo.projects,repo.packages**: Comma separated list of default new repo units. Allowed values: \[repo.code, repo.releases, repo.issues, repo.pulls, repo.wiki, repo.projects, repo.packages, repo.actions\]. Note: Code and Releases can currently not be deactivated. If you specify default repo units you should still list them for future compatibility. External wiki and issue tracker can't be enabled by default as it requires additional settings. Disabled repo units will not be added to new repositories regardless if it is in the default list.
|
- `DEFAULT_REPO_UNITS`: **repo.code,repo.releases,repo.issues,repo.pulls,repo.wiki,repo.projects,repo.packages,repo.actions**: Comma separated list of default new repo units. Allowed values: \[repo.code, repo.releases, repo.issues, repo.pulls, repo.wiki, repo.projects, repo.packages, repo.actions\]. Note: Code and Releases can currently not be deactivated. If you specify default repo units you should still list them for future compatibility. External wiki and issue tracker can't be enabled by default as it requires additional settings. Disabled repo units will not be added to new repositories regardless if it is in the default list.
|
||||||
- `DEFAULT_FORK_REPO_UNITS`: **repo.code,repo.pulls**: Comma separated list of default forked repo units. The set of allowed values and rules is the same as `DEFAULT_REPO_UNITS`.
|
- `DEFAULT_FORK_REPO_UNITS`: **repo.code,repo.pulls**: Comma separated list of default forked repo units. The set of allowed values and rules is the same as `DEFAULT_REPO_UNITS`.
|
||||||
- `PREFIX_ARCHIVE_FILES`: **true**: Prefix archive files by placing them in a directory named after the repository.
|
- `PREFIX_ARCHIVE_FILES`: **true**: Prefix archive files by placing them in a directory named after the repository.
|
||||||
- `DISABLE_MIGRATIONS`: **false**: Disable migrating feature.
|
- `DISABLE_MIGRATIONS`: **false**: Disable migrating feature.
|
||||||
|
@ -126,7 +126,7 @@ In addition, there is _`StaticRootPath`_ which can be set as a built-in at build
|
||||||
keywords used in Pull Request comments to automatically close a related issue
|
keywords used in Pull Request comments to automatically close a related issue
|
||||||
- `REOPEN_KEYWORDS`: **reopen**, **reopens**, **reopened**: List of keywords used in Pull Request comments to automatically reopen
|
- `REOPEN_KEYWORDS`: **reopen**, **reopens**, **reopened**: List of keywords used in Pull Request comments to automatically reopen
|
||||||
a related issue
|
a related issue
|
||||||
- `DEFAULT_MERGE_STYLE`: **merge**: Set default merge style for repository creating, valid options: `merge`, `rebase`, `rebase-merge`, `squash`
|
- `DEFAULT_MERGE_STYLE`: **merge**: Set default merge style for repository creating, valid options: `merge`, `rebase`, `rebase-merge`, `squash`, `fast-forward-only`
|
||||||
- `DEFAULT_MERGE_MESSAGE_COMMITS_LIMIT`: **50**: In the default merge message for squash commits include at most this many commits. Set to `-1` to include all commits
|
- `DEFAULT_MERGE_MESSAGE_COMMITS_LIMIT`: **50**: In the default merge message for squash commits include at most this many commits. Set to `-1` to include all commits
|
||||||
- `DEFAULT_MERGE_MESSAGE_SIZE`: **5120**: In the default merge message for squash commits limit the size of the commit messages. Set to `-1` to have no limit. Only used if `POPULATE_SQUASH_COMMENT_WITH_COMMIT_MESSAGES` is `true`.
|
- `DEFAULT_MERGE_MESSAGE_SIZE`: **5120**: In the default merge message for squash commits limit the size of the commit messages. Set to `-1` to have no limit. Only used if `POPULATE_SQUASH_COMMENT_WITH_COMMIT_MESSAGES` is `true`.
|
||||||
- `DEFAULT_MERGE_MESSAGE_ALL_AUTHORS`: **false**: In the default merge message for squash commits walk all commits to include all authors in the Co-authored-by otherwise just use those in the limited list
|
- `DEFAULT_MERGE_MESSAGE_ALL_AUTHORS`: **false**: In the default merge message for squash commits walk all commits to include all authors in the Co-authored-by otherwise just use those in the limited list
|
||||||
|
@ -135,6 +135,7 @@ In addition, there is _`StaticRootPath`_ which can be set as a built-in at build
|
||||||
- `POPULATE_SQUASH_COMMENT_WITH_COMMIT_MESSAGES`: **false**: In default squash-merge messages include the commit message of all commits comprising the pull request.
|
- `POPULATE_SQUASH_COMMENT_WITH_COMMIT_MESSAGES`: **false**: In default squash-merge messages include the commit message of all commits comprising the pull request.
|
||||||
- `ADD_CO_COMMITTER_TRAILERS`: **true**: Add co-authored-by and co-committed-by trailers to merge commit messages if committer does not match author.
|
- `ADD_CO_COMMITTER_TRAILERS`: **true**: Add co-authored-by and co-committed-by trailers to merge commit messages if committer does not match author.
|
||||||
- `TEST_CONFLICTING_PATCHES_WITH_GIT_APPLY`: **false**: PR patches are tested using a three-way merge method to discover if there are conflicts. If this setting is set to **true**, conflicting patches will be retested using `git apply` - This was the previous behaviour in 1.18 (and earlier) but is somewhat inefficient. Please report if you find that this setting is required.
|
- `TEST_CONFLICTING_PATCHES_WITH_GIT_APPLY`: **false**: PR patches are tested using a three-way merge method to discover if there are conflicts. If this setting is set to **true**, conflicting patches will be retested using `git apply` - This was the previous behaviour in 1.18 (and earlier) but is somewhat inefficient. Please report if you find that this setting is required.
|
||||||
|
- `RETARGET_CHILDREN_ON_MERGE`: **true**: Retarget child pull requests to the parent pull request branch target on merge of parent pull request. It only works on merged PRs where the head and base branch target the same repo.
|
||||||
|
|
||||||
### Repository - Issue (`repository.issue`)
|
### Repository - Issue (`repository.issue`)
|
||||||
|
|
||||||
|
@ -146,7 +147,7 @@ In addition, there is _`StaticRootPath`_ which can be set as a built-in at build
|
||||||
- `ENABLED`: **true**: Whether repository file uploads are enabled
|
- `ENABLED`: **true**: Whether repository file uploads are enabled
|
||||||
- `TEMP_PATH`: **data/tmp/uploads**: Path for uploads (content gets deleted on Gitea restart)
|
- `TEMP_PATH`: **data/tmp/uploads**: Path for uploads (content gets deleted on Gitea restart)
|
||||||
- `ALLOWED_TYPES`: **_empty_**: Comma-separated list of allowed file extensions (`.zip`), mime types (`text/plain`) or wildcard type (`image/*`, `audio/*`, `video/*`). Empty value or `*/*` allows all types.
|
- `ALLOWED_TYPES`: **_empty_**: Comma-separated list of allowed file extensions (`.zip`), mime types (`text/plain`) or wildcard type (`image/*`, `audio/*`, `video/*`). Empty value or `*/*` allows all types.
|
||||||
- `FILE_MAX_SIZE`: **3**: Max size of each file in megabytes.
|
- `FILE_MAX_SIZE`: **50**: Max size of each file in megabytes.
|
||||||
- `MAX_FILES`: **5**: Max number of files per upload
|
- `MAX_FILES`: **5**: Max number of files per upload
|
||||||
|
|
||||||
### Repository - Release (`repository.release`)
|
### Repository - Release (`repository.release`)
|
||||||
|
@ -196,9 +197,7 @@ The following configuration set `Content-Type: application/vnd.android.package-a
|
||||||
## CORS (`cors`)
|
## CORS (`cors`)
|
||||||
|
|
||||||
- `ENABLED`: **false**: enable cors headers (disabled by default)
|
- `ENABLED`: **false**: enable cors headers (disabled by default)
|
||||||
- `SCHEME`: **http**: scheme of allowed requests
|
- `ALLOW_DOMAIN`: **\***: list of requesting origins that are allowed, eg: "https://*.example.com"
|
||||||
- `ALLOW_DOMAIN`: **\***: list of requesting domains that are allowed
|
|
||||||
- `ALLOW_SUBDOMAIN`: **false**: allow subdomains of headers listed above to request
|
|
||||||
- `METHODS`: **GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS**: list of methods allowed to request
|
- `METHODS`: **GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS**: list of methods allowed to request
|
||||||
- `MAX_AGE`: **10m**: max time to cache response
|
- `MAX_AGE`: **10m**: max time to cache response
|
||||||
- `ALLOW_CREDENTIALS`: **false**: allow request with credentials
|
- `ALLOW_CREDENTIALS`: **false**: allow request with credentials
|
||||||
|
@ -215,21 +214,25 @@ The following configuration set `Content-Type: application/vnd.android.package-a
|
||||||
- `SITEMAP_PAGING_NUM`: **20**: Number of items that are displayed in a single subsitemap.
|
- `SITEMAP_PAGING_NUM`: **20**: Number of items that are displayed in a single subsitemap.
|
||||||
- `GRAPH_MAX_COMMIT_NUM`: **100**: Number of maximum commits shown in the commit graph.
|
- `GRAPH_MAX_COMMIT_NUM`: **100**: Number of maximum commits shown in the commit graph.
|
||||||
- `CODE_COMMENT_LINES`: **4**: Number of line of codes shown for a code comment.
|
- `CODE_COMMENT_LINES`: **4**: Number of line of codes shown for a code comment.
|
||||||
- `DEFAULT_THEME`: **auto**: \[auto, gitea, arc-green\]: Set the default theme for the Gitea install.
|
- `DEFAULT_THEME`: **gitea-auto**: \[gitea-auto, gitea-light, gitea-dark\]: Set the default theme for the Gitea installation.
|
||||||
- `SHOW_USER_EMAIL`: **true**: Whether the email of the user should be shown in the Explore Users page.
|
- `SHOW_USER_EMAIL`: **true**: Whether the email of the user should be shown in the Explore Users page.
|
||||||
- `THEMES`: **auto,gitea,arc-green**: All available themes. Allow users select personalized themes.
|
- `THEMES`: **gitea-auto,gitea-light,gitea-dark**: All available themes. Allow users select personalized themes.
|
||||||
regardless of the value of `DEFAULT_THEME`.
|
regardless of the value of `DEFAULT_THEME`.
|
||||||
- `MAX_DISPLAY_FILE_SIZE`: **8388608**: Max size of files to be displayed (default is 8MiB)
|
- `MAX_DISPLAY_FILE_SIZE`: **8388608**: Max size of files to be displayed (default is 8MiB)
|
||||||
|
- `AMBIGUOUS_UNICODE_DETECTION`: **true**: Detect ambiguous unicode characters in file contents and show warnings on the UI
|
||||||
- `REACTIONS`: All available reactions users can choose on issues/prs and comments
|
- `REACTIONS`: All available reactions users can choose on issues/prs and comments
|
||||||
Values can be emoji alias (:smile:) or a unicode emoji.
|
Values can be emoji alias (:smile:) or a unicode emoji.
|
||||||
For custom reactions, add a tightly cropped square image to public/assets/img/emoji/reaction_name.png
|
For custom reactions, add a tightly cropped square image to public/assets/img/emoji/reaction_name.png
|
||||||
|
- `REACTION_MAX_USER_NUM`: **10**: Change the number of users that are displayed in reactions tooltip (triggered by mouse hover).
|
||||||
- `CUSTOM_EMOJIS`: **gitea, codeberg, gitlab, git, github, gogs**: Additional Emojis not defined in the utf8 standard.
|
- `CUSTOM_EMOJIS`: **gitea, codeberg, gitlab, git, github, gogs**: Additional Emojis not defined in the utf8 standard.
|
||||||
By default, we support Gitea (:gitea:), to add more copy them to public/assets/img/emoji/emoji_name.png and
|
By default, we support Gitea (:gitea:), to add more copy them to public/assets/img/emoji/emoji_name.png and
|
||||||
add it to this config.
|
add it to this config.
|
||||||
- `DEFAULT_SHOW_FULL_NAME`: **false**: Whether the full name of the users should be shown where possible. If the full name isn't set, the username will be used.
|
- `DEFAULT_SHOW_FULL_NAME`: **false**: Whether the full name of the users should be shown where possible. If the full name isn't set, the username will be used.
|
||||||
- `SEARCH_REPO_DESCRIPTION`: **true**: Whether to search within description at repository search on explore page.
|
- `SEARCH_REPO_DESCRIPTION`: **true**: Whether to search within description at repository search on explore page.
|
||||||
- `ONLY_SHOW_RELEVANT_REPOS`: **false** Whether to only show relevant repos on the explore page when no keyword is specified and default sorting is used.
|
- `ONLY_SHOW_RELEVANT_REPOS`: **false**: Whether to only show relevant repos on the explore page when no keyword is specified and default sorting is used.
|
||||||
A repo is considered irrelevant if it's a fork or if it has no metadata (no description, no icon, no topic).
|
A repo is considered irrelevant if it's a fork or if it has no metadata (no description, no icon, no topic).
|
||||||
|
- `EXPLORE_PAGING_DEFAULT_SORT`: **recentupdate**: Change the sort type of the explore pages. Valid values are "recentupdate", "alphabetically", "reverselastlogin", "newest" and "oldest"
|
||||||
|
- `PREFERRED_TIMESTAMP_TENSE`: **mixed**: The tense all timestamps should be rendered in. Possible values are `absolute` time (i.e. 1970-01-01, 11:59) and `mixed`. `mixed` means most timestamps are rendered in relative time (i.e. 2 days ago).
|
||||||
|
|
||||||
### UI - Admin (`ui.admin`)
|
### UI - Admin (`ui.admin`)
|
||||||
|
|
||||||
|
@ -281,6 +284,7 @@ The following configuration set `Content-Type: application/vnd.android.package-a
|
||||||
|
|
||||||
- `APP_DATA_PATH`: **_`AppWorkPath`_/data**: This is the default root path for storing data.
|
- `APP_DATA_PATH`: **_`AppWorkPath`_/data**: This is the default root path for storing data.
|
||||||
- `PROTOCOL`: **http**: \[http, https, fcgi, http+unix, fcgi+unix\]
|
- `PROTOCOL`: **http**: \[http, https, fcgi, http+unix, fcgi+unix\]
|
||||||
|
- Note: Value must be lowercase.
|
||||||
- `USE_PROXY_PROTOCOL`: **false**: Expect PROXY protocol headers on connections
|
- `USE_PROXY_PROTOCOL`: **false**: Expect PROXY protocol headers on connections
|
||||||
- `PROXY_PROTOCOL_TLS_BRIDGING`: **false**: When protocol is https, expect PROXY protocol headers after TLS negotiation.
|
- `PROXY_PROTOCOL_TLS_BRIDGING`: **false**: When protocol is https, expect PROXY protocol headers after TLS negotiation.
|
||||||
- `PROXY_PROTOCOL_HEADER_TIMEOUT`: **5s**: Timeout to wait for PROXY protocol header (set to 0 to have no timeout)
|
- `PROXY_PROTOCOL_HEADER_TIMEOUT`: **5s**: Timeout to wait for PROXY protocol header (set to 0 to have no timeout)
|
||||||
|
@ -340,7 +344,7 @@ The following configuration set `Content-Type: application/vnd.android.package-a
|
||||||
- `SSH_AUTHORIZED_PRINCIPALS_ALLOW`: **off** or **username, email**: \[off, username, email, anything\]: Specify the principals values that users are allowed to use as principal. When set to `anything` no checks are done on the principal string. When set to `off` authorized principal are not allowed to be set.
|
- `SSH_AUTHORIZED_PRINCIPALS_ALLOW`: **off** or **username, email**: \[off, username, email, anything\]: Specify the principals values that users are allowed to use as principal. When set to `anything` no checks are done on the principal string. When set to `off` authorized principal are not allowed to be set.
|
||||||
- `SSH_CREATE_AUTHORIZED_PRINCIPALS_FILE`: **false/true**: Gitea will create a authorized_principals file by default when it is not using the internal ssh server and `SSH_AUTHORIZED_PRINCIPALS_ALLOW` is not `off`.
|
- `SSH_CREATE_AUTHORIZED_PRINCIPALS_FILE`: **false/true**: Gitea will create a authorized_principals file by default when it is not using the internal ssh server and `SSH_AUTHORIZED_PRINCIPALS_ALLOW` is not `off`.
|
||||||
- `SSH_AUTHORIZED_PRINCIPALS_BACKUP`: **false/true**: Enable SSH Authorized Principals Backup when rewriting all keys, default is true if `SSH_AUTHORIZED_PRINCIPALS_ALLOW` is not `off`.
|
- `SSH_AUTHORIZED_PRINCIPALS_BACKUP`: **false/true**: Enable SSH Authorized Principals Backup when rewriting all keys, default is true if `SSH_AUTHORIZED_PRINCIPALS_ALLOW` is not `off`.
|
||||||
- `SSH_AUTHORIZED_KEYS_COMMAND_TEMPLATE`: **{{.AppPath}} --config={{.CustomConf}} serv key-{{.Key.ID}}**: Set the template for the command to passed on authorized keys. Possible keys are: AppPath, AppWorkPath, CustomConf, CustomPath, Key - where Key is a `models/asymkey.PublicKey` and the others are strings which are shellquoted.
|
- `SSH_AUTHORIZED_KEYS_COMMAND_TEMPLATE`: **`{{.AppPath}} --config={{.CustomConf}} serv key-{{.Key.ID}}`**: Set the template for the command to passed on authorized keys. Possible keys are: AppPath, AppWorkPath, CustomConf, CustomPath, Key - where Key is a `models/asymkey.PublicKey` and the others are strings which are shellquoted.
|
||||||
- `SSH_SERVER_CIPHERS`: **chacha20-poly1305@openssh.com, aes128-ctr, aes192-ctr, aes256-ctr, aes128-gcm@openssh.com, aes256-gcm@openssh.com**: For the built-in SSH server, choose the ciphers to support for SSH connections, for system SSH this setting has no effect.
|
- `SSH_SERVER_CIPHERS`: **chacha20-poly1305@openssh.com, aes128-ctr, aes192-ctr, aes256-ctr, aes128-gcm@openssh.com, aes256-gcm@openssh.com**: For the built-in SSH server, choose the ciphers to support for SSH connections, for system SSH this setting has no effect.
|
||||||
- `SSH_SERVER_KEY_EXCHANGES`: **curve25519-sha256, ecdh-sha2-nistp256, ecdh-sha2-nistp384, ecdh-sha2-nistp521, diffie-hellman-group14-sha256, diffie-hellman-group14-sha1**: For the built-in SSH server, choose the key exchange algorithms to support for SSH connections, for system SSH this setting has no effect.
|
- `SSH_SERVER_KEY_EXCHANGES`: **curve25519-sha256, ecdh-sha2-nistp256, ecdh-sha2-nistp384, ecdh-sha2-nistp521, diffie-hellman-group14-sha256, diffie-hellman-group14-sha1**: For the built-in SSH server, choose the key exchange algorithms to support for SSH connections, for system SSH this setting has no effect.
|
||||||
- `SSH_SERVER_MACS`: **hmac-sha2-256-etm@openssh.com, hmac-sha2-256, hmac-sha1**: For the built-in SSH server, choose the MACs to support for SSH connections, for system SSH this setting has no effect
|
- `SSH_SERVER_MACS`: **hmac-sha2-256-etm@openssh.com, hmac-sha2-256, hmac-sha1**: For the built-in SSH server, choose the MACs to support for SSH connections, for system SSH this setting has no effect
|
||||||
|
@ -353,7 +357,7 @@ The following configuration set `Content-Type: application/vnd.android.package-a
|
||||||
- `SSH_PER_WRITE_PER_KB_TIMEOUT`: **10s**: Timeout per Kb written to SSH connections.
|
- `SSH_PER_WRITE_PER_KB_TIMEOUT`: **10s**: Timeout per Kb written to SSH connections.
|
||||||
- `MINIMUM_KEY_SIZE_CHECK`: **true**: Indicate whether to check minimum key size with corresponding type.
|
- `MINIMUM_KEY_SIZE_CHECK`: **true**: Indicate whether to check minimum key size with corresponding type.
|
||||||
|
|
||||||
- `OFFLINE_MODE`: **false**: Disables use of CDN for static files and Gravatar for profile pictures.
|
- `OFFLINE_MODE`: **true**: Disables use of CDN for static files and Gravatar for profile pictures.
|
||||||
- `CERT_FILE`: **https/cert.pem**: Cert file path used for HTTPS. When chaining, the server certificate must come first, then intermediate CA certificates (if any). This is ignored if `ENABLE_ACME=true`. Paths are relative to `CUSTOM_PATH`.
|
- `CERT_FILE`: **https/cert.pem**: Cert file path used for HTTPS. When chaining, the server certificate must come first, then intermediate CA certificates (if any). This is ignored if `ENABLE_ACME=true`. Paths are relative to `CUSTOM_PATH`.
|
||||||
- `KEY_FILE`: **https/key.pem**: Key file path used for HTTPS. This is ignored if `ENABLE_ACME=true`. Paths are relative to `CUSTOM_PATH`.
|
- `KEY_FILE`: **https/key.pem**: Key file path used for HTTPS. This is ignored if `ENABLE_ACME=true`. Paths are relative to `CUSTOM_PATH`.
|
||||||
- `STATIC_ROOT_PATH`: **_`StaticRootPath`_**: Upper level of template and static files path.
|
- `STATIC_ROOT_PATH`: **_`StaticRootPath`_**: Upper level of template and static files path.
|
||||||
|
@ -423,10 +427,11 @@ The following configuration set `Content-Type: application/vnd.android.package-a
|
||||||
## Database (`database`)
|
## Database (`database`)
|
||||||
|
|
||||||
- `DB_TYPE`: **mysql**: The database type in use \[mysql, postgres, mssql, sqlite3\].
|
- `DB_TYPE`: **mysql**: The database type in use \[mysql, postgres, mssql, sqlite3\].
|
||||||
- `HOST`: **127.0.0.1:3306**: Database host address and port or absolute path for unix socket \[mysql, postgres\] (ex: /var/run/mysqld/mysqld.sock).
|
- `HOST`: **127.0.0.1:3306**: Database host address and port or absolute path for unix socket \[mysql, postgres[^1]\] (ex: /var/run/mysqld/mysqld.sock).
|
||||||
- `NAME`: **gitea**: Database name.
|
- `NAME`: **gitea**: Database name.
|
||||||
- `USER`: **root**: Database username.
|
- `USER`: **root**: Database username.
|
||||||
- `PASSWD`: **_empty_**: Database user password. Use \`your password\` or """your password""" for quoting if you use special characters in the password.
|
- `PASSWD`: **_empty_**: Database user password. Use \`your password\` or """your password""" for quoting if you use special characters in the password.
|
||||||
|
- `CHARSET_COLLATION`: **_empty_**: (MySQL/MSSQL only) Gitea expects to use a case-sensitive collation for database. Leave it empty to use the default collation decided by the Gitea. Don't change it unless you clearly know what you need.
|
||||||
- `SCHEMA`: **_empty_**: For PostgreSQL only, schema to use if different from "public". The schema must exist beforehand,
|
- `SCHEMA`: **_empty_**: For PostgreSQL only, schema to use if different from "public". The schema must exist beforehand,
|
||||||
the user must have creation privileges on it, and the user search path must be set to the look into the schema first
|
the user must have creation privileges on it, and the user search path must be set to the look into the schema first
|
||||||
(e.g. `ALTER USER user SET SEARCH_PATH = schema_name,"$user",public;`).
|
(e.g. `ALTER USER user SET SEARCH_PATH = schema_name,"$user",public;`).
|
||||||
|
@ -446,13 +451,16 @@ The following configuration set `Content-Type: application/vnd.android.package-a
|
||||||
- `SQLITE_JOURNAL_MODE`: **""**: Change journal mode for SQlite3. Can be used to enable [WAL mode](https://www.sqlite.org/wal.html) when high load causes write congestion. See [SQlite3 docs](https://www.sqlite.org/pragma.html#pragma_journal_mode) for possible values. Defaults to the default for the database file, often DELETE.
|
- `SQLITE_JOURNAL_MODE`: **""**: Change journal mode for SQlite3. Can be used to enable [WAL mode](https://www.sqlite.org/wal.html) when high load causes write congestion. See [SQlite3 docs](https://www.sqlite.org/pragma.html#pragma_journal_mode) for possible values. Defaults to the default for the database file, often DELETE.
|
||||||
- `ITERATE_BUFFER_SIZE`: **50**: Internal buffer size for iterating.
|
- `ITERATE_BUFFER_SIZE`: **50**: Internal buffer size for iterating.
|
||||||
- `PATH`: **data/gitea.db**: For SQLite3 only, the database file path.
|
- `PATH`: **data/gitea.db**: For SQLite3 only, the database file path.
|
||||||
- `LOG_SQL`: **true**: Log the executed SQL.
|
- `LOG_SQL`: **false**: Log the executed SQL.
|
||||||
- `DB_RETRIES`: **10**: How many ORM init / DB connect attempts allowed.
|
- `DB_RETRIES`: **10**: How many ORM init / DB connect attempts allowed.
|
||||||
- `DB_RETRY_BACKOFF`: **3s**: time.Duration to wait before trying another ORM init / DB connect attempt, if failure occurred.
|
- `DB_RETRY_BACKOFF`: **3s**: time.Duration to wait before trying another ORM init / DB connect attempt, if failure occurred.
|
||||||
- `MAX_OPEN_CONNS` **0**: Database maximum open connections - default is 0, meaning there is no limit.
|
- `MAX_OPEN_CONNS` **0**: Database maximum open connections - default is 0, meaning there is no limit.
|
||||||
- `MAX_IDLE_CONNS` **2**: Max idle database connections on connection pool, default is 2 - this will be capped to `MAX_OPEN_CONNS`.
|
- `MAX_IDLE_CONNS` **2**: Max idle database connections on connection pool, default is 2 - this will be capped to `MAX_OPEN_CONNS`.
|
||||||
- `CONN_MAX_LIFETIME` **0 or 3s**: Sets the maximum amount of time a DB connection may be reused - default is 0, meaning there is no limit (except on MySQL where it is 3s - see #6804 & #7071).
|
- `CONN_MAX_LIFETIME` **0 or 3s**: Sets the maximum amount of time a DB connection may be reused - default is 0, meaning there is no limit (except on MySQL where it is 3s - see #6804 & #7071).
|
||||||
- `AUTO_MIGRATION` **true**: Whether execute database models migrations automatically.
|
- `AUTO_MIGRATION` **true**: Whether execute database models migrations automatically.
|
||||||
|
- `SLOW_QUERY_THRESHOLD` **5s**: Threshold value in seconds beyond which query execution time is logged as a warning in the xorm logger.
|
||||||
|
|
||||||
|
[^1]: It may be necessary to specify a hostport even when listening on a unix socket, as the port is part of the socket name. see [#24552](https://github.com/go-gitea/gitea/issues/24552#issuecomment-1681649367) for additional details.
|
||||||
|
|
||||||
Please see #8540 & #8273 for further discussion of the appropriate values for `MAX_OPEN_CONNS`, `MAX_IDLE_CONNS` & `CONN_MAX_LIFETIME` and their
|
Please see #8540 & #8273 for further discussion of the appropriate values for `MAX_OPEN_CONNS`, `MAX_IDLE_CONNS` & `CONN_MAX_LIFETIME` and their
|
||||||
relation to port exhaustion.
|
relation to port exhaustion.
|
||||||
|
@ -483,7 +491,7 @@ Configuration at `[queue]` will set defaults for queues with overrides for indiv
|
||||||
|
|
||||||
- `TYPE`: **level**: General queue type, currently support: `level` (uses a LevelDB internally), `channel`, `redis`, `dummy`. Invalid types are treated as `level`.
|
- `TYPE`: **level**: General queue type, currently support: `level` (uses a LevelDB internally), `channel`, `redis`, `dummy`. Invalid types are treated as `level`.
|
||||||
- `DATADIR`: **queues/common**: Base DataDir for storing level queues. `DATADIR` for individual queues can be set in `queue.name` sections. Relative paths will be made absolute against `%(APP_DATA_PATH)s`.
|
- `DATADIR`: **queues/common**: Base DataDir for storing level queues. `DATADIR` for individual queues can be set in `queue.name` sections. Relative paths will be made absolute against `%(APP_DATA_PATH)s`.
|
||||||
- `LENGTH`: **100**: Maximal queue size before channel queues block
|
- `LENGTH`: **100000**: Maximal queue size before channel queues block
|
||||||
- `BATCH_LENGTH`: **20**: Batch data before passing to the handler
|
- `BATCH_LENGTH`: **20**: Batch data before passing to the handler
|
||||||
- `CONN_STR`: **redis://127.0.0.1:6379/0**: Connection string for the redis queue type. For `redis-cluster` use `redis+cluster://127.0.0.1:6379/0`. Options can be set using query params. Similarly, LevelDB options can also be set using: **leveldb://relative/path?option=value** or **leveldb:///absolute/path?option=value**, and will override `DATADIR`
|
- `CONN_STR`: **redis://127.0.0.1:6379/0**: Connection string for the redis queue type. For `redis-cluster` use `redis+cluster://127.0.0.1:6379/0`. Options can be set using query params. Similarly, LevelDB options can also be set using: **leveldb://relative/path?option=value** or **leveldb:///absolute/path?option=value**, and will override `DATADIR`
|
||||||
- `QUEUE_NAME`: **_queue**: The suffix for default redis and disk queue name. Individual queues will default to **`name`**`QUEUE_NAME` but can be overridden in the specific `queue.name` section.
|
- `QUEUE_NAME`: **_queue**: The suffix for default redis and disk queue name. Individual queues will default to **`name`**`QUEUE_NAME` but can be overridden in the specific `queue.name` section.
|
||||||
|
@ -510,14 +518,21 @@ And the following unique queues:
|
||||||
|
|
||||||
- `DEFAULT_EMAIL_NOTIFICATIONS`: **enabled**: Default configuration for email notifications for users (user configurable). Options: enabled, onmention, disabled
|
- `DEFAULT_EMAIL_NOTIFICATIONS`: **enabled**: Default configuration for email notifications for users (user configurable). Options: enabled, onmention, disabled
|
||||||
- `DISABLE_REGULAR_ORG_CREATION`: **false**: Disallow regular (non-admin) users from creating organizations.
|
- `DISABLE_REGULAR_ORG_CREATION`: **false**: Disallow regular (non-admin) users from creating organizations.
|
||||||
|
- `USER_DISABLED_FEATURES`: **_empty_** Disabled features for users, could be `deletion`, `manage_ssh_keys`, `manage_gpg_keys` and more features can be added in future.
|
||||||
|
- `deletion`: User cannot delete their own account.
|
||||||
|
- `manage_ssh_keys`: User cannot configure ssh keys.
|
||||||
|
- `manage_gpg_keys`: User cannot configure gpg keys.
|
||||||
|
- `EXTERNAL_USER_DISABLE_FEATURES`: **_empty_**: Comma separated list of disabled features ONLY if the user has an external login type (eg. LDAP, Oauth, etc.), could be `deletion`, `manage_ssh_keys`, `manage_gpg_keys`. This setting is independent from `USER_DISABLED_FEATURES` and supplements its behavior.
|
||||||
|
- `deletion`: User cannot delete their own account.
|
||||||
|
- `manage_ssh_keys`: User cannot configure ssh keys.
|
||||||
|
- `manage_gpg_keys`: User cannot configure gpg keys.
|
||||||
|
|
||||||
## Security (`security`)
|
## Security (`security`)
|
||||||
|
|
||||||
- `INSTALL_LOCK`: **false**: Controls access to the installation page. When set to "true", the installation page is not accessible.
|
- `INSTALL_LOCK`: **false**: Controls access to the installation page. When set to "true", the installation page is not accessible.
|
||||||
- `SECRET_KEY`: **\<random at every install\>**: Global secret key. This key is VERY IMPORTANT, if you lost it, the data encrypted by it (like 2FA secret) can't be decrypted anymore.
|
- `SECRET_KEY`: **\<random at every install\>**: Global secret key. This key is VERY IMPORTANT, if you lost it, the data encrypted by it (like 2FA secret) can't be decrypted anymore.
|
||||||
- `SECRET_KEY_URI`: **_empty_**: Instead of defining SECRET_KEY, this option can be used to use the key stored in a file (example value: `file:/etc/gitea/secret_key`). It shouldn't be lost like SECRET_KEY.
|
- `SECRET_KEY_URI`: **_empty_**: Instead of defining SECRET_KEY, this option can be used to use the key stored in a file (example value: `file:/etc/gitea/secret_key`). It shouldn't be lost like SECRET_KEY.
|
||||||
- `LOGIN_REMEMBER_DAYS`: **7**: Cookie lifetime, in days.
|
- `LOGIN_REMEMBER_DAYS`: **31**: How long to remember that a user is logged in before requiring relogin (in days).
|
||||||
- `COOKIE_USERNAME`: **gitea\_awesome**: Name of the cookie used to store the current username.
|
|
||||||
- `COOKIE_REMEMBER_NAME`: **gitea\_incredible**: Name of cookie used to store authentication
|
- `COOKIE_REMEMBER_NAME`: **gitea\_incredible**: Name of cookie used to store authentication
|
||||||
information.
|
information.
|
||||||
- `REVERSE_PROXY_AUTHENTICATION_USER`: **X-WEBAUTH-USER**: Header name for reverse proxy
|
- `REVERSE_PROXY_AUTHENTICATION_USER`: **X-WEBAUTH-USER**: Header name for reverse proxy
|
||||||
|
@ -568,6 +583,7 @@ And the following unique queues:
|
||||||
- off - do not check password complexity
|
- off - do not check password complexity
|
||||||
- `PASSWORD_CHECK_PWN`: **false**: Check [HaveIBeenPwned](https://haveibeenpwned.com/Passwords) to see if a password has been exposed.
|
- `PASSWORD_CHECK_PWN`: **false**: Check [HaveIBeenPwned](https://haveibeenpwned.com/Passwords) to see if a password has been exposed.
|
||||||
- `SUCCESSFUL_TOKENS_CACHE_SIZE`: **20**: Cache successful token hashes. API tokens are stored in the DB as pbkdf2 hashes however, this means that there is a potentially significant hashing load when there are multiple API operations. This cache will store the successfully hashed tokens in a LRU cache as a balance between performance and security.
|
- `SUCCESSFUL_TOKENS_CACHE_SIZE`: **20**: Cache successful token hashes. API tokens are stored in the DB as pbkdf2 hashes however, this means that there is a potentially significant hashing load when there are multiple API operations. This cache will store the successfully hashed tokens in a LRU cache as a balance between performance and security.
|
||||||
|
- `DISABLE_QUERY_AUTH_TOKEN`: **false**: Reject API tokens sent in URL query string (Accept Header-based API tokens only). This setting will default to `true` in Gitea 1.23 and be deprecated in Gitea 1.24.
|
||||||
|
|
||||||
## Camo (`camo`)
|
## Camo (`camo`)
|
||||||
|
|
||||||
|
@ -578,7 +594,7 @@ And the following unique queues:
|
||||||
|
|
||||||
## OpenID (`openid`)
|
## OpenID (`openid`)
|
||||||
|
|
||||||
- `ENABLE_OPENID_SIGNIN`: **false**: Allow authentication in via OpenID.
|
- `ENABLE_OPENID_SIGNIN`: **true**: Allow authentication in via OpenID.
|
||||||
- `ENABLE_OPENID_SIGNUP`: **! DISABLE\_REGISTRATION**: Allow registering via OpenID.
|
- `ENABLE_OPENID_SIGNUP`: **! DISABLE\_REGISTRATION**: Allow registering via OpenID.
|
||||||
- `WHITELISTED_URIS`: **_empty_**: If non-empty, list of POSIX regex patterns matching
|
- `WHITELISTED_URIS`: **_empty_**: If non-empty, list of POSIX regex patterns matching
|
||||||
OpenID URI's to permit.
|
OpenID URI's to permit.
|
||||||
|
@ -591,9 +607,13 @@ And the following unique queues:
|
||||||
- `OPENID_CONNECT_SCOPES`: **_empty_**: List of additional openid connect scopes. (`openid` is implicitly added)
|
- `OPENID_CONNECT_SCOPES`: **_empty_**: List of additional openid connect scopes. (`openid` is implicitly added)
|
||||||
- `ENABLE_AUTO_REGISTRATION`: **false**: Automatically create user accounts for new oauth2 users.
|
- `ENABLE_AUTO_REGISTRATION`: **false**: Automatically create user accounts for new oauth2 users.
|
||||||
- `USERNAME`: **nickname**: The source of the username for new oauth2 accounts:
|
- `USERNAME`: **nickname**: The source of the username for new oauth2 accounts:
|
||||||
- userid - use the userid / sub attribute
|
- `userid` - use the userid / sub attribute
|
||||||
- nickname - use the nickname attribute
|
- `nickname` - use the nickname attribute
|
||||||
- email - use the username part of the email attribute
|
- `email` - use the username part of the email attribute
|
||||||
|
- Note: `nickname` and `email` options will normalize input strings using the following criteria:
|
||||||
|
- diacritics are removed
|
||||||
|
- the characters in the set `['´\x60]` are removed
|
||||||
|
- the characters in the set `[\s~+]` are replaced with `-`
|
||||||
- `UPDATE_AVATAR`: **false**: Update avatar if available from oauth2 provider. Update will be performed on each login.
|
- `UPDATE_AVATAR`: **false**: Update avatar if available from oauth2 provider. Update will be performed on each login.
|
||||||
- `ACCOUNT_LINKING`: **login**: How to handle if an account / email already exists:
|
- `ACCOUNT_LINKING`: **login**: How to handle if an account / email already exists:
|
||||||
- disabled - show an error
|
- disabled - show an error
|
||||||
|
@ -617,11 +637,12 @@ And the following unique queues:
|
||||||
- `REQUIRE_SIGNIN_VIEW`: **false**: Enable this to force users to log in to view any page or to use API.
|
- `REQUIRE_SIGNIN_VIEW`: **false**: Enable this to force users to log in to view any page or to use API.
|
||||||
- `ENABLE_NOTIFY_MAIL`: **false**: Enable this to send e-mail to watchers of a repository when
|
- `ENABLE_NOTIFY_MAIL`: **false**: Enable this to send e-mail to watchers of a repository when
|
||||||
something happens, like creating issues. Requires `Mailer` to be enabled.
|
something happens, like creating issues. Requires `Mailer` to be enabled.
|
||||||
- `ENABLE_BASIC_AUTHENTICATION`: **true**: Disable this to disallow authenticaton using HTTP
|
- `ENABLE_BASIC_AUTHENTICATION`: **true**: Disable this to disallow authentication using HTTP
|
||||||
BASIC and the user's password. Please note if you disable this you will not be able to access the
|
BASIC and the user's password. Please note if you disable this you will not be able to access the
|
||||||
tokens API endpoints using a password. Further, this only disables BASIC authentication using the
|
tokens API endpoints using a password. Further, this only disables BASIC authentication using the
|
||||||
password - not tokens or OAuth Basic.
|
password - not tokens or OAuth Basic.
|
||||||
- `ENABLE_REVERSE_PROXY_AUTHENTICATION`: **false**: Enable this to allow reverse proxy authentication.
|
- `ENABLE_REVERSE_PROXY_AUTHENTICATION`: **false**: Enable this to allow reverse proxy authentication for web requests
|
||||||
|
- `ENABLE_REVERSE_PROXY_AUTHENTICATION_API`: **false**: Enable this to allow reverse proxy authentication for API requests, the reverse proxy is responsible for ensuring that no CSRF is possible.
|
||||||
- `ENABLE_REVERSE_PROXY_AUTO_REGISTRATION`: **false**: Enable this to allow auto-registration
|
- `ENABLE_REVERSE_PROXY_AUTO_REGISTRATION`: **false**: Enable this to allow auto-registration
|
||||||
for reverse authentication.
|
for reverse authentication.
|
||||||
- `ENABLE_REVERSE_PROXY_EMAIL`: **false**: Enable this to allow to auto-registration with a
|
- `ENABLE_REVERSE_PROXY_EMAIL`: **false**: Enable this to allow to auto-registration with a
|
||||||
|
@ -756,7 +777,6 @@ and
|
||||||
|
|
||||||
## Cache (`cache`)
|
## Cache (`cache`)
|
||||||
|
|
||||||
- `ENABLED`: **true**: Enable the cache.
|
|
||||||
- `ADAPTER`: **memory**: Cache engine adapter, either `memory`, `redis`, `redis-cluster`, `twoqueue` or `memcache`. (`twoqueue` represents a size limited LRU cache.)
|
- `ADAPTER`: **memory**: Cache engine adapter, either `memory`, `redis`, `redis-cluster`, `twoqueue` or `memcache`. (`twoqueue` represents a size limited LRU cache.)
|
||||||
- `INTERVAL`: **60**: Garbage Collection interval (sec), for memory and twoqueue cache only.
|
- `INTERVAL`: **60**: Garbage Collection interval (sec), for memory and twoqueue cache only.
|
||||||
- `HOST`: **_empty_**: Connection string for `redis`, `redis-cluster` and `memcache`. For `twoqueue` sets configuration for the queue.
|
- `HOST`: **_empty_**: Connection string for `redis`, `redis-cluster` and `memcache`. For `twoqueue` sets configuration for the queue.
|
||||||
|
@ -768,7 +788,6 @@ and
|
||||||
|
|
||||||
## Cache - LastCommitCache settings (`cache.last_commit`)
|
## Cache - LastCommitCache settings (`cache.last_commit`)
|
||||||
|
|
||||||
- `ENABLED`: **true**: Enable the cache.
|
|
||||||
- `ITEM_TTL`: **8760h**: Time to keep items in cache if not used, Setting it to -1 disables caching.
|
- `ITEM_TTL`: **8760h**: Time to keep items in cache if not used, Setting it to -1 disables caching.
|
||||||
- `COMMITS_COUNT`: **1000**: Only enable the cache when repository's commits count great than.
|
- `COMMITS_COUNT`: **1000**: Only enable the cache when repository's commits count great than.
|
||||||
|
|
||||||
|
@ -776,7 +795,7 @@ and
|
||||||
|
|
||||||
- `PROVIDER`: **memory**: Session engine provider \[memory, file, redis, redis-cluster, db, mysql, couchbase, memcache, postgres\]. Setting `db` will reuse the configuration in `[database]`
|
- `PROVIDER`: **memory**: Session engine provider \[memory, file, redis, redis-cluster, db, mysql, couchbase, memcache, postgres\]. Setting `db` will reuse the configuration in `[database]`
|
||||||
- `PROVIDER_CONFIG`: **data/sessions**: For file, the root path; for db, empty (database config will be used); for others, the connection string. Relative paths will be made absolute against _`AppWorkPath`_.
|
- `PROVIDER_CONFIG`: **data/sessions**: For file, the root path; for db, empty (database config will be used); for others, the connection string. Relative paths will be made absolute against _`AppWorkPath`_.
|
||||||
- `COOKIE_SECURE`: **false**: Enable this to force using HTTPS for all session access.
|
- `COOKIE_SECURE`:**_empty_**: `true` or `false`. Enable this to force using HTTPS for all session access. If not set, it defaults to `true` if the ROOT_URL is an HTTPS URL.
|
||||||
- `COOKIE_NAME`: **i\_like\_gitea**: The name of the cookie used for the session ID.
|
- `COOKIE_NAME`: **i\_like\_gitea**: The name of the cookie used for the session ID.
|
||||||
- `GC_INTERVAL_TIME`: **86400**: GC interval in seconds.
|
- `GC_INTERVAL_TIME`: **86400**: GC interval in seconds.
|
||||||
- `SESSION_LIFE_TIME`: **86400**: Session life time in seconds, default is 86400 (1 day)
|
- `SESSION_LIFE_TIME`: **86400**: Session life time in seconds, default is 86400 (1 day)
|
||||||
|
@ -817,12 +836,12 @@ Default templates for project boards:
|
||||||
## Issue and pull request attachments (`attachment`)
|
## Issue and pull request attachments (`attachment`)
|
||||||
|
|
||||||
- `ENABLED`: **true**: Whether issue and pull request attachments are enabled.
|
- `ENABLED`: **true**: Whether issue and pull request attachments are enabled.
|
||||||
- `ALLOWED_TYPES`: **.csv,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.xls,.xlsx,.zip**: Comma-separated list of allowed file extensions (`.zip`), mime types (`text/plain`) or wildcard type (`image/*`, `audio/*`, `video/*`). Empty value or `*/*` allows all types.
|
- `ALLOWED_TYPES`: **.cpuprofile,.csv,.dmp,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.json,.jsonc,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.xls,.xlsx,.zip**: Comma-separated list of allowed file extensions (`.zip`), mime types (`text/plain`) or wildcard type (`image/*`, `audio/*`, `video/*`). Empty value or `*/*` allows all types.
|
||||||
- `MAX_SIZE`: **4**: Maximum size (MB).
|
- `MAX_SIZE`: **2048**: Maximum size (MB).
|
||||||
- `MAX_FILES`: **5**: Maximum number of attachments that can be uploaded at once.
|
- `MAX_FILES`: **5**: Maximum number of attachments that can be uploaded at once.
|
||||||
- `STORAGE_TYPE`: **local**: Storage type for attachments, `local` for local disk or `minio` for s3 compatible object storage service, default is `local` or other name defined with `[storage.xxx]`
|
- `STORAGE_TYPE`: **local**: Storage type for attachments, `local` for local disk or `minio` for s3 compatible object storage service, default is `local` or other name defined with `[storage.xxx]`
|
||||||
- `SERVE_DIRECT`: **false**: Allows the storage driver to redirect to authenticated URLs to serve files directly. Currently, only Minio/S3 is supported via signed URLs, local does nothing.
|
- `SERVE_DIRECT`: **false**: Allows the storage driver to redirect to authenticated URLs to serve files directly. Currently, only Minio/S3 is supported via signed URLs, local does nothing.
|
||||||
- `PATH`: **data/attachments**: Path to store attachments only available when STORAGE_TYPE is `local`
|
- `PATH`: **attachments**: Path to store attachments only available when STORAGE_TYPE is `local`, relative paths will be resolved to `${AppDataPath}/${attachment.PATH}`.
|
||||||
- `MINIO_ENDPOINT`: **localhost:9000**: Minio endpoint to connect only available when STORAGE_TYPE is `minio`
|
- `MINIO_ENDPOINT`: **localhost:9000**: Minio endpoint to connect only available when STORAGE_TYPE is `minio`
|
||||||
- `MINIO_ACCESS_KEY_ID`: Minio accessKeyID to connect only available when STORAGE_TYPE is `minio`
|
- `MINIO_ACCESS_KEY_ID`: Minio accessKeyID to connect only available when STORAGE_TYPE is `minio`
|
||||||
- `MINIO_SECRET_ACCESS_KEY`: Minio secretAccessKey to connect only available when STORAGE_TYPE is `minio`
|
- `MINIO_SECRET_ACCESS_KEY`: Minio secretAccessKey to connect only available when STORAGE_TYPE is `minio`
|
||||||
|
@ -955,6 +974,12 @@ Default templates for project boards:
|
||||||
- `SCHEDULE`: **@midnight** : Interval as a duration between each synchronization, it will always attempt synchronization when the instance starts.
|
- `SCHEDULE`: **@midnight** : Interval as a duration between each synchronization, it will always attempt synchronization when the instance starts.
|
||||||
- `UPDATE_EXISTING`: **true**: Create new users, update existing user data and disable users that are not in external source anymore (default) or only create new users if UPDATE_EXISTING is set to false.
|
- `UPDATE_EXISTING`: **true**: Create new users, update existing user data and disable users that are not in external source anymore (default) or only create new users if UPDATE_EXISTING is set to false.
|
||||||
|
|
||||||
|
## Cron - Cleanup Expired Actions Assets (`cron.cleanup_actions`)
|
||||||
|
|
||||||
|
- `ENABLED`: **true**: Enable cleanup expired actions assets job.
|
||||||
|
- `RUN_AT_START`: **true**: Run job at start time (if ENABLED).
|
||||||
|
- `SCHEDULE`: **@midnight** : Cron syntax for the job.
|
||||||
|
|
||||||
### Extended cron tasks (not enabled by default)
|
### Extended cron tasks (not enabled by default)
|
||||||
|
|
||||||
#### Cron - Garbage collect all repositories (`cron.git_gc_repos`)
|
#### Cron - Garbage collect all repositories (`cron.git_gc_repos`)
|
||||||
|
@ -1091,7 +1116,7 @@ This section only does "set" config, a removed config key from this section won'
|
||||||
|
|
||||||
## OAuth2 (`oauth2`)
|
## OAuth2 (`oauth2`)
|
||||||
|
|
||||||
- `ENABLE`: **true**: Enables OAuth2 provider.
|
- `ENABLED`: **true**: Enables OAuth2 provider.
|
||||||
- `ACCESS_TOKEN_EXPIRATION_TIME`: **3600**: Lifetime of an OAuth2 access token in seconds
|
- `ACCESS_TOKEN_EXPIRATION_TIME`: **3600**: Lifetime of an OAuth2 access token in seconds
|
||||||
- `REFRESH_TOKEN_EXPIRATION_TIME`: **730**: Lifetime of an OAuth2 refresh token in hours
|
- `REFRESH_TOKEN_EXPIRATION_TIME`: **730**: Lifetime of an OAuth2 refresh token in hours
|
||||||
- `INVALIDATE_REFRESH_TOKENS`: **false**: Check if refresh token has already been used
|
- `INVALIDATE_REFRESH_TOKENS`: **false**: Check if refresh token has already been used
|
||||||
|
@ -1100,7 +1125,7 @@ This section only does "set" config, a removed config key from this section won'
|
||||||
- `JWT_SECRET_URI`: **_empty_**: Instead of defining JWT_SECRET in the configuration, this configuration option can be used to give Gitea a path to a file that contains the secret (example value: `file:/etc/gitea/oauth2_jwt_secret`)
|
- `JWT_SECRET_URI`: **_empty_**: Instead of defining JWT_SECRET in the configuration, this configuration option can be used to give Gitea a path to a file that contains the secret (example value: `file:/etc/gitea/oauth2_jwt_secret`)
|
||||||
- `JWT_SIGNING_PRIVATE_KEY_FILE`: **jwt/private.pem**: Private key file path used to sign OAuth2 tokens. The path is relative to `APP_DATA_PATH`. This setting is only needed if `JWT_SIGNING_ALGORITHM` is set to `RS256`, `RS384`, `RS512`, `ES256`, `ES384` or `ES512`. The file must contain a RSA or ECDSA private key in the PKCS8 format. If no key exists a 4096 bit key will be created for you.
|
- `JWT_SIGNING_PRIVATE_KEY_FILE`: **jwt/private.pem**: Private key file path used to sign OAuth2 tokens. The path is relative to `APP_DATA_PATH`. This setting is only needed if `JWT_SIGNING_ALGORITHM` is set to `RS256`, `RS384`, `RS512`, `ES256`, `ES384` or `ES512`. The file must contain a RSA or ECDSA private key in the PKCS8 format. If no key exists a 4096 bit key will be created for you.
|
||||||
- `MAX_TOKEN_LENGTH`: **32767**: Maximum length of token/cookie to accept from OAuth2 provider
|
- `MAX_TOKEN_LENGTH`: **32767**: Maximum length of token/cookie to accept from OAuth2 provider
|
||||||
- `DEFAULT_APPLICATIONS`: **git-credential-oauth, git-credential-manager**: Pre-register OAuth applications for some services on startup. See the [OAuth2 documentation](/development/oauth2-provider.md) for the list of available options.
|
- `DEFAULT_APPLICATIONS`: **git-credential-oauth, git-credential-manager, tea**: Pre-register OAuth applications for some services on startup. See the [OAuth2 documentation](/development/oauth2-provider.md) for the list of available options.
|
||||||
|
|
||||||
## i18n (`i18n`)
|
## i18n (`i18n`)
|
||||||
|
|
||||||
|
@ -1270,7 +1295,7 @@ Default storage configuration for attachments, lfs, avatars, repo-avatars, repo-
|
||||||
- `MINIO_USE_SSL`: **false**: Minio enabled ssl only available when `STORAGE_TYPE` is `minio`
|
- `MINIO_USE_SSL`: **false**: Minio enabled ssl only available when `STORAGE_TYPE` is `minio`
|
||||||
- `MINIO_INSECURE_SKIP_VERIFY`: **false**: Minio skip SSL verification available when STORAGE_TYPE is `minio`
|
- `MINIO_INSECURE_SKIP_VERIFY`: **false**: Minio skip SSL verification available when STORAGE_TYPE is `minio`
|
||||||
|
|
||||||
The recommanded storage configuration for minio like below:
|
The recommended storage configuration for minio like below:
|
||||||
|
|
||||||
```ini
|
```ini
|
||||||
[storage]
|
[storage]
|
||||||
|
@ -1377,23 +1402,28 @@ PROXY_HOSTS = *.github.com
|
||||||
|
|
||||||
## Actions (`actions`)
|
## Actions (`actions`)
|
||||||
|
|
||||||
- `ENABLED`: **false**: Enable/Disable actions capabilities
|
- `ENABLED`: **true**: Enable/Disable actions capabilities
|
||||||
- `DEFAULT_ACTIONS_URL`: **github**: Default platform to get action plugins, `github` for `https://github.com`, `self` for the current Gitea instance.
|
- `DEFAULT_ACTIONS_URL`: **github**: Default platform to get action plugins, `github` for `https://github.com`, `self` for the current Gitea instance.
|
||||||
- `STORAGE_TYPE`: **local**: Storage type for actions logs, `local` for local disk or `minio` for s3 compatible object storage service, default is `local` or other name defined with `[storage.xxx]`
|
- `STORAGE_TYPE`: **local**: Storage type for actions logs, `local` for local disk or `minio` for s3 compatible object storage service, default is `local` or other name defined with `[storage.xxx]`
|
||||||
- `MINIO_BASE_PATH`: **actions_log/**: Minio base path on the bucket only available when STORAGE_TYPE is `minio`
|
- `MINIO_BASE_PATH`: **actions_log/**: Minio base path on the bucket only available when STORAGE_TYPE is `minio`
|
||||||
|
- `ARTIFACT_RETENTION_DAYS`: **90**: Default number of days to keep artifacts. Artifacts could have their own retention periods by setting the `retention-days` option in `actions/upload-artifact` step.
|
||||||
|
- `ZOMBIE_TASK_TIMEOUT`: **10m**: Timeout to stop the task which have running status, but haven't been updated for a long time
|
||||||
|
- `ENDLESS_TASK_TIMEOUT`: **3h**: Timeout to stop the tasks which have running status and continuous updates, but don't end for a long time
|
||||||
|
- `ABANDONED_JOB_TIMEOUT`: **24h**: Timeout to cancel the jobs which have waiting status, but haven't been picked by a runner for a long time
|
||||||
|
- `SKIP_WORKFLOW_STRINGS`: **[skip ci],[ci skip],[no ci],[skip actions],[actions skip]**: Strings committers can place inside a commit message or PR title to skip executing the corresponding actions workflow
|
||||||
|
|
||||||
`DEFAULT_ACTIONS_URL` indicates where the Gitea Actions runners should find the actions with relative path.
|
`DEFAULT_ACTIONS_URL` indicates where the Gitea Actions runners should find the actions with relative path.
|
||||||
For example, `uses: actions/checkout@v3` means `https://github.com/actions/checkout@v3` since the value of `DEFAULT_ACTIONS_URL` is `github`.
|
For example, `uses: actions/checkout@v4` means `https://github.com/actions/checkout@v4` since the value of `DEFAULT_ACTIONS_URL` is `github`.
|
||||||
And it can be changed to `self` to make it `root_url_of_your_gitea/actions/checkout@v3`.
|
And it can be changed to `self` to make it `root_url_of_your_gitea/actions/checkout@v4`.
|
||||||
|
|
||||||
Please note that using `self` is not recommended for most cases, as it could make names globally ambiguous.
|
Please note that using `self` is not recommended for most cases, as it could make names globally ambiguous.
|
||||||
Additionally, it requires you to mirror all the actions you need to your Gitea instance, which may not be worth it.
|
Additionally, it requires you to mirror all the actions you need to your Gitea instance, which may not be worth it.
|
||||||
Therefore, please use `self` only if you understand what you are doing.
|
Therefore, please use `self` only if you understand what you are doing.
|
||||||
|
|
||||||
In earlier versions (<= 1.19), `DEFAULT_ACTIONS_URL` cound be set to any custom URLs like `https://gitea.com` or `http://your-git-server,https://gitea.com`, and the default value was `https://gitea.com`.
|
In earlier versions (`<= 1.19`), `DEFAULT_ACTIONS_URL` could be set to any custom URLs like `https://gitea.com` or `http://your-git-server,https://gitea.com`, and the default value was `https://gitea.com`.
|
||||||
However, later updates removed those options, and now the only options are `github` and `self`, with the default value being `github`.
|
However, later updates removed those options, and now the only options are `github` and `self`, with the default value being `github`.
|
||||||
However, if you want to use actions from other git server, you can use a complete URL in `uses` field, it's supported by Gitea (but not GitHub).
|
However, if you want to use actions from other git server, you can use a complete URL in `uses` field, it's supported by Gitea (but not GitHub).
|
||||||
Like `uses: https://gitea.com/actions/checkout@v3` or `uses: http://your-git-server/actions/checkout@v3`.
|
Like `uses: https://gitea.com/actions/checkout@v4` or `uses: http://your-git-server/actions/checkout@v4`.
|
||||||
|
|
||||||
## Other (`other`)
|
## Other (`other`)
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ menu:
|
||||||
[ini](https://github.com/go-ini/ini/#recursive-values) 这里的说明。
|
[ini](https://github.com/go-ini/ini/#recursive-values) 这里的说明。
|
||||||
标注了 :exclamation: 的配置项表明除非你真的理解这个配置项的意义,否则最好使用默认值。
|
标注了 :exclamation: 的配置项表明除非你真的理解这个配置项的意义,否则最好使用默认值。
|
||||||
|
|
||||||
在下面的默认值中,`$XYZ`代表环境变量`XYZ`的值(详见:`enviroment-to-ini`)。 _`XxYyZz`_是指默认配置的一部分列出的值。这些在 app.ini 文件中不起作用,仅在此处列出作为文档说明。
|
在下面的默认值中,`$XYZ`代表环境变量`XYZ`的值(详见:`environment-to-ini`)。 _`XxYyZz`_是指默认配置的一部分列出的值。这些在 app.ini 文件中不起作用,仅在此处列出作为文档说明。
|
||||||
|
|
||||||
包含`#`或者`;`的变量必须使用引号(`` ` ``或者`""""`)包裹,否则会被解析为注释。
|
包含`#`或者`;`的变量必须使用引号(`` ` ``或者`""""`)包裹,否则会被解析为注释。
|
||||||
|
|
||||||
|
@ -102,7 +102,7 @@ menu:
|
||||||
- `ENABLE_PUSH_CREATE_USER`: **false**: 允许用户将本地存储库推送到Gitea,并为用户自动创建它们。
|
- `ENABLE_PUSH_CREATE_USER`: **false**: 允许用户将本地存储库推送到Gitea,并为用户自动创建它们。
|
||||||
- `ENABLE_PUSH_CREATE_ORG`: **false**: 允许用户将本地存储库推送到Gitea,并为组织自动创建它们。
|
- `ENABLE_PUSH_CREATE_ORG`: **false**: 允许用户将本地存储库推送到Gitea,并为组织自动创建它们。
|
||||||
- `DISABLED_REPO_UNITS`: **_empty_**: 逗号分隔的全局禁用的仓库单元列表。允许的值是:: \[repo.issues, repo.ext_issues, repo.pulls, repo.wiki, repo.ext_wiki, repo.projects, repo.packages, repo.actions\]
|
- `DISABLED_REPO_UNITS`: **_empty_**: 逗号分隔的全局禁用的仓库单元列表。允许的值是:: \[repo.issues, repo.ext_issues, repo.pulls, repo.wiki, repo.ext_wiki, repo.projects, repo.packages, repo.actions\]
|
||||||
- `DEFAULT_REPO_UNITS`: **repo.code,repo.releases,repo.issues,repo.pulls,repo.wiki,repo.projects,repo.packages**: 逗号分隔的默认新仓库单元列表。允许的值是:: \[repo.code, repo.releases, repo.issues, repo.pulls, repo.wiki, repo.projects, repo.packages, repo.actions\]. 注意:目前无法停用代码和发布。如果您指定了默认的仓库单元,您仍应将它们列出以保持未来的兼容性。外部wiki和问题跟踪器不能默认启用,因为它需要额外的设置。禁用的仓库单元将不会添加到新的仓库中,无论它是否在默认列表中。
|
- `DEFAULT_REPO_UNITS`: **repo.code,repo.releases,repo.issues,repo.pulls,repo.wiki,repo.projects,repo.packages,repo.actions**: 逗号分隔的默认新仓库单元列表。允许的值是:: \[repo.code, repo.releases, repo.issues, repo.pulls, repo.wiki, repo.projects, repo.packages, repo.actions\]. 注意:目前无法停用代码和发布。如果您指定了默认的仓库单元,您仍应将它们列出以保持未来的兼容性。外部wiki和问题跟踪器不能默认启用,因为它需要额外的设置。禁用的仓库单元将不会添加到新的仓库中,无论它是否在默认列表中。
|
||||||
- `DEFAULT_FORK_REPO_UNITS`: **repo.code,repo.pulls**: 逗号分隔的默认分叉仓库单元列表。允许的值和规则与`DEFAULT_REPO_UNITS`相同。
|
- `DEFAULT_FORK_REPO_UNITS`: **repo.code,repo.pulls**: 逗号分隔的默认分叉仓库单元列表。允许的值和规则与`DEFAULT_REPO_UNITS`相同。
|
||||||
- `PREFIX_ARCHIVE_FILES`: **true**: 通过将存档文件放置在以仓库命名的目录中来添加前缀。
|
- `PREFIX_ARCHIVE_FILES`: **true**: 通过将存档文件放置在以仓库命名的目录中来添加前缀。
|
||||||
- `DISABLE_MIGRATIONS`: **false**: 禁用迁移功能。
|
- `DISABLE_MIGRATIONS`: **false**: 禁用迁移功能。
|
||||||
|
@ -125,7 +125,7 @@ menu:
|
||||||
- `CLOSE_KEYWORDS`: **close**, **closes**, **closed**, **fix**, **fixes**, **fixed**, **resolve**, **resolves**, **resolved**: 在拉取请求评论中用于自动关闭相关问题的关键词列表。
|
- `CLOSE_KEYWORDS`: **close**, **closes**, **closed**, **fix**, **fixes**, **fixed**, **resolve**, **resolves**, **resolved**: 在拉取请求评论中用于自动关闭相关问题的关键词列表。
|
||||||
- `REOPEN_KEYWORDS`: **reopen**, **reopens**, **reopened**: 在拉取请求评论中用于自动重新打开相关问题的
|
- `REOPEN_KEYWORDS`: **reopen**, **reopens**, **reopened**: 在拉取请求评论中用于自动重新打开相关问题的
|
||||||
关键词列表。
|
关键词列表。
|
||||||
- `DEFAULT_MERGE_STYLE`: **merge**: 设置创建仓库的默认合并方式,可选: `merge`, `rebase`, `rebase-merge`, `squash`
|
- `DEFAULT_MERGE_STYLE`: **merge**: 设置创建仓库的默认合并方式,可选: `merge`, `rebase`, `rebase-merge`, `squash`, `fast-forward-only`
|
||||||
- `DEFAULT_MERGE_MESSAGE_COMMITS_LIMIT`: **50**: 在默认合并消息中,对于`squash`提交,最多包括此数量的提交。设置为 -1 以包括所有提交。
|
- `DEFAULT_MERGE_MESSAGE_COMMITS_LIMIT`: **50**: 在默认合并消息中,对于`squash`提交,最多包括此数量的提交。设置为 -1 以包括所有提交。
|
||||||
- `DEFAULT_MERGE_MESSAGE_SIZE`: **5120**: 在默认的合并消息中,对于`squash`提交,限制提交消息的大小。设置为 `-1`以取消限制。仅在`POPULATE_SQUASH_COMMENT_WITH_COMMIT_MESSAGES`为`true`时使用。
|
- `DEFAULT_MERGE_MESSAGE_SIZE`: **5120**: 在默认的合并消息中,对于`squash`提交,限制提交消息的大小。设置为 `-1`以取消限制。仅在`POPULATE_SQUASH_COMMENT_WITH_COMMIT_MESSAGES`为`true`时使用。
|
||||||
- `DEFAULT_MERGE_MESSAGE_ALL_AUTHORS`: **false**: 在默认合并消息中,对于`squash`提交,遍历所有提交以包括所有作者的`Co-authored-by`,否则仅使用限定列表中的作者。
|
- `DEFAULT_MERGE_MESSAGE_ALL_AUTHORS`: **false**: 在默认合并消息中,对于`squash`提交,遍历所有提交以包括所有作者的`Co-authored-by`,否则仅使用限定列表中的作者。
|
||||||
|
@ -145,7 +145,7 @@ menu:
|
||||||
- `ENABLED`: **true**: 是否启用仓库文件上传。
|
- `ENABLED`: **true**: 是否启用仓库文件上传。
|
||||||
- `TEMP_PATH`: **data/tmp/uploads**: 文件上传的临时保存路径(在Gitea重启的时候该目录会被清空)。
|
- `TEMP_PATH`: **data/tmp/uploads**: 文件上传的临时保存路径(在Gitea重启的时候该目录会被清空)。
|
||||||
- `ALLOWED_TYPES`: **_empty_**: 以逗号分割的列表,代表支持上传的文件类型。(`.zip`), mime类型 (`text/plain`) or 通配符类型 (`image/*`, `audio/*`, `video/*`). 为空或者 `*/*`代表允许所有类型文件。
|
- `ALLOWED_TYPES`: **_empty_**: 以逗号分割的列表,代表支持上传的文件类型。(`.zip`), mime类型 (`text/plain`) or 通配符类型 (`image/*`, `audio/*`, `video/*`). 为空或者 `*/*`代表允许所有类型文件。
|
||||||
- `FILE_MAX_SIZE`: **3**: 每个文件的最大大小(MB)。
|
- `FILE_MAX_SIZE`: **50**: 每个文件的最大大小(MB)。
|
||||||
- `MAX_FILES`: **5**: 每次上传的最大文件数。
|
- `MAX_FILES`: **5**: 每次上传的最大文件数。
|
||||||
|
|
||||||
### 仓库 - 版本发布 (`repository.release`)
|
### 仓库 - 版本发布 (`repository.release`)
|
||||||
|
@ -195,9 +195,7 @@ menu:
|
||||||
## 跨域 (`cors`)
|
## 跨域 (`cors`)
|
||||||
|
|
||||||
- `ENABLED`: **false**: 启用 CORS 头部(默认禁用)
|
- `ENABLED`: **false**: 启用 CORS 头部(默认禁用)
|
||||||
- `SCHEME`: **http**: 允许请求的协议
|
|
||||||
- `ALLOW_DOMAIN`: **\***: 允许请求的域名列表
|
- `ALLOW_DOMAIN`: **\***: 允许请求的域名列表
|
||||||
- `ALLOW_SUBDOMAIN`: **false**: 允许上述列出的头部的子域名发出请求。
|
|
||||||
- `METHODS`: **GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS**: 允许发起的请求方式列表
|
- `METHODS`: **GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS**: 允许发起的请求方式列表
|
||||||
- `MAX_AGE`: **10m**: 缓存响应的最大时间
|
- `MAX_AGE`: **10m**: 缓存响应的最大时间
|
||||||
- `ALLOW_CREDENTIALS`: **false**: 允许带有凭据的请求
|
- `ALLOW_CREDENTIALS`: **false**: 允许带有凭据的请求
|
||||||
|
@ -214,9 +212,9 @@ menu:
|
||||||
- `SITEMAP_PAGING_NUM`: **20**: 在单个子SiteMap中显示的项数。
|
- `SITEMAP_PAGING_NUM`: **20**: 在单个子SiteMap中显示的项数。
|
||||||
- `GRAPH_MAX_COMMIT_NUM`: **100**: 提交图中显示的最大commit数量。
|
- `GRAPH_MAX_COMMIT_NUM`: **100**: 提交图中显示的最大commit数量。
|
||||||
- `CODE_COMMENT_LINES`: **4**: 在代码评论中能够显示的最大代码行数。
|
- `CODE_COMMENT_LINES`: **4**: 在代码评论中能够显示的最大代码行数。
|
||||||
- `DEFAULT_THEME`: **auto**: \[auto, gitea, arc-green\]: 在Gitea安装时候设置的默认主题。
|
- `DEFAULT_THEME`: **gitea-auto**: \[gitea-auto, gitea-light, gitea-dark\]: 在Gitea安装时候设置的默认主题。
|
||||||
- `SHOW_USER_EMAIL`: **true**: 用户的电子邮件是否应该显示在`Explore Users`页面中。
|
- `SHOW_USER_EMAIL`: **true**: 用户的电子邮件是否应该显示在`Explore Users`页面中。
|
||||||
- `THEMES`: **auto,gitea,arc-green**: 所有可用的主题。允许用户选择个性化的主题,
|
- `THEMES`: **gitea-auto,gitea-light,gitea-dark**: 所有可用的主题。允许用户选择个性化的主题,
|
||||||
而不受DEFAULT_THEME 值的影响。
|
而不受DEFAULT_THEME 值的影响。
|
||||||
- `MAX_DISPLAY_FILE_SIZE`: **8388608**: 能够显示文件的最大大小(默认为8MiB)。
|
- `MAX_DISPLAY_FILE_SIZE`: **8388608**: 能够显示文件的最大大小(默认为8MiB)。
|
||||||
- `REACTIONS`: 用户可以在问题(Issue)、Pull Request(PR)以及评论中选择的所有可选的反应。
|
- `REACTIONS`: 用户可以在问题(Issue)、Pull Request(PR)以及评论中选择的所有可选的反应。
|
||||||
|
@ -335,7 +333,7 @@ menu:
|
||||||
- `SSH_AUTHORIZED_PRINCIPALS_ALLOW`: **off** 或 **username, email**:\[off, username, email, anything\]:指定允许用户用作 principal 的值。当设置为 `anything` 时,对 principal 字符串不执行任何检查。当设置为 `off` 时,不允许设置授权的 principal。
|
- `SSH_AUTHORIZED_PRINCIPALS_ALLOW`: **off** 或 **username, email**:\[off, username, email, anything\]:指定允许用户用作 principal 的值。当设置为 `anything` 时,对 principal 字符串不执行任何检查。当设置为 `off` 时,不允许设置授权的 principal。
|
||||||
- `SSH_CREATE_AUTHORIZED_PRINCIPALS_FILE`: **false/true**:当 Gitea 不使用内置 SSH 服务器且 `SSH_AUTHORIZED_PRINCIPALS_ALLOW` 不为 `off` 时,默认情况下 Gitea 会创建一个 authorized_principals 文件。
|
- `SSH_CREATE_AUTHORIZED_PRINCIPALS_FILE`: **false/true**:当 Gitea 不使用内置 SSH 服务器且 `SSH_AUTHORIZED_PRINCIPALS_ALLOW` 不为 `off` 时,默认情况下 Gitea 会创建一个 authorized_principals 文件。
|
||||||
- `SSH_AUTHORIZED_PRINCIPALS_BACKUP`: **false/true**:在重写所有密钥时启用 SSH 授权 principal 备份,默认值为 true(如果 `SSH_AUTHORIZED_PRINCIPALS_ALLOW` 不为 `off`)。
|
- `SSH_AUTHORIZED_PRINCIPALS_BACKUP`: **false/true**:在重写所有密钥时启用 SSH 授权 principal 备份,默认值为 true(如果 `SSH_AUTHORIZED_PRINCIPALS_ALLOW` 不为 `off`)。
|
||||||
- `SSH_AUTHORIZED_KEYS_COMMAND_TEMPLATE`: **{{.AppPath}} --config={{.CustomConf}} serv key-{{.Key.ID}}**:设置用于传递授权密钥的命令模板。可能的密钥是:AppPath、AppWorkPath、CustomConf、CustomPath、Key,其中 Key 是 `models/asymkey.PublicKey`,其他是 shellquoted 字符串。
|
- `SSH_AUTHORIZED_KEYS_COMMAND_TEMPLATE`: **`{{.AppPath}} --config={{.CustomConf}} serv key-{{.Key.ID}}`**:设置用于传递授权密钥的命令模板。可能的密钥是:AppPath、AppWorkPath、CustomConf、CustomPath、Key,其中 Key 是 `models/asymkey.PublicKey`,其他是 shellquoted 字符串。
|
||||||
- `SSH_SERVER_CIPHERS`: **chacha20-poly1305@openssh.com, aes128-ctr, aes192-ctr, aes256-ctr, aes128-gcm@openssh.com, aes256-gcm@openssh.com**:对于内置的 SSH 服务器,选择支持的 SSH 连接的加密方法,对于系统 SSH,此设置无效。
|
- `SSH_SERVER_CIPHERS`: **chacha20-poly1305@openssh.com, aes128-ctr, aes192-ctr, aes256-ctr, aes128-gcm@openssh.com, aes256-gcm@openssh.com**:对于内置的 SSH 服务器,选择支持的 SSH 连接的加密方法,对于系统 SSH,此设置无效。
|
||||||
- `SSH_SERVER_KEY_EXCHANGES`: **curve25519-sha256, ecdh-sha2-nistp256, ecdh-sha2-nistp384, ecdh-sha2-nistp521, diffie-hellman-group14-sha256, diffie-hellman-group14-sha1**:对于内置 SSH 服务器,选择支持的 SSH 连接的密钥交换算法,对于系统 SSH,此设置无效。
|
- `SSH_SERVER_KEY_EXCHANGES`: **curve25519-sha256, ecdh-sha2-nistp256, ecdh-sha2-nistp384, ecdh-sha2-nistp521, diffie-hellman-group14-sha256, diffie-hellman-group14-sha1**:对于内置 SSH 服务器,选择支持的 SSH 连接的密钥交换算法,对于系统 SSH,此设置无效。
|
||||||
- `SSH_SERVER_MACS`: **hmac-sha2-256-etm@openssh.com, hmac-sha2-256, hmac-sha1**:对于内置 SSH 服务器,选择支持的 SSH 连接的 MAC 算法,对于系统 SSH,此设置无效。
|
- `SSH_SERVER_MACS`: **hmac-sha2-256-etm@openssh.com, hmac-sha2-256, hmac-sha1**:对于内置 SSH 服务器,选择支持的 SSH 连接的 MAC 算法,对于系统 SSH,此设置无效。
|
||||||
|
@ -346,7 +344,7 @@ menu:
|
||||||
- `SSH_PER_WRITE_TIMEOUT`: **30s**:对 SSH 连接的任何写入设置超时。(将其设置为 -1 可以禁用所有超时。)
|
- `SSH_PER_WRITE_TIMEOUT`: **30s**:对 SSH 连接的任何写入设置超时。(将其设置为 -1 可以禁用所有超时。)
|
||||||
- `SSH_PER_WRITE_PER_KB_TIMEOUT`: **10s**:对写入 SSH 连接的每 KB 设置超时。
|
- `SSH_PER_WRITE_PER_KB_TIMEOUT`: **10s**:对写入 SSH 连接的每 KB 设置超时。
|
||||||
- `MINIMUM_KEY_SIZE_CHECK`: **true**:指示是否检查最小密钥大小与相应类型。
|
- `MINIMUM_KEY_SIZE_CHECK`: **true**:指示是否检查最小密钥大小与相应类型。
|
||||||
- `OFFLINE_MODE`: **false**:禁用 CDN 用于静态文件和 Gravatar 用于个人资料图片。
|
- `OFFLINE_MODE`: **true**:禁用 CDN 用于静态文件和 Gravatar 用于个人资料图片。
|
||||||
- `CERT_FILE`: **https/cert.pem**:用于 HTTPS 的证书文件路径。在链接时,服务器证书必须首先出现,然后是中间 CA 证书(如果有)。如果 `ENABLE_ACME=true`,则此设置会被忽略。路径相对于 `CUSTOM_PATH`。
|
- `CERT_FILE`: **https/cert.pem**:用于 HTTPS 的证书文件路径。在链接时,服务器证书必须首先出现,然后是中间 CA 证书(如果有)。如果 `ENABLE_ACME=true`,则此设置会被忽略。路径相对于 `CUSTOM_PATH`。
|
||||||
- `KEY_FILE`: **https/key.pem**:用于 HTTPS 的密钥文件路径。如果 `ENABLE_ACME=true`,则此设置会被忽略。路径相对于 `CUSTOM_PATH`。
|
- `KEY_FILE`: **https/key.pem**:用于 HTTPS 的密钥文件路径。如果 `ENABLE_ACME=true`,则此设置会被忽略。路径相对于 `CUSTOM_PATH`。
|
||||||
- `STATIC_ROOT_PATH`: **_`StaticRootPath`_**:模板和静态文件路径的上一级。
|
- `STATIC_ROOT_PATH`: **_`StaticRootPath`_**:模板和静态文件路径的上一级。
|
||||||
|
@ -436,7 +434,7 @@ menu:
|
||||||
- `SQLITE_JOURNAL_MODE`:**""**:更改 SQlite3 的日志模式。可以用于在高负载导致写入拥塞时启用 [WAL 模式](https://www.sqlite.org/wal.html)。有关可能的值,请参阅 [SQlite3 文档](https://www.sqlite.org/pragma.html#pragma_journal_mode)。默认为数据库文件的默认值,通常为 DELETE。
|
- `SQLITE_JOURNAL_MODE`:**""**:更改 SQlite3 的日志模式。可以用于在高负载导致写入拥塞时启用 [WAL 模式](https://www.sqlite.org/wal.html)。有关可能的值,请参阅 [SQlite3 文档](https://www.sqlite.org/pragma.html#pragma_journal_mode)。默认为数据库文件的默认值,通常为 DELETE。
|
||||||
- `ITERATE_BUFFER_SIZE`:**50**:用于迭代的内部缓冲区大小。
|
- `ITERATE_BUFFER_SIZE`:**50**:用于迭代的内部缓冲区大小。
|
||||||
- `PATH`:**data/gitea.db**:仅适用于 SQLite3 的数据库文件路径。
|
- `PATH`:**data/gitea.db**:仅适用于 SQLite3 的数据库文件路径。
|
||||||
- `LOG_SQL`:**true**:记录已执行的 SQL。
|
- `LOG_SQL`:**false**:记录已执行的 SQL。
|
||||||
- `DB_RETRIES`:**10**:允许多少次 ORM 初始化 / DB 连接尝试。
|
- `DB_RETRIES`:**10**:允许多少次 ORM 初始化 / DB 连接尝试。
|
||||||
- `DB_RETRY_BACKOFF`:**3s**:如果发生故障,等待另一个 ORM 初始化 / DB 连接尝试的 time.Duration。
|
- `DB_RETRY_BACKOFF`:**3s**:如果发生故障,等待另一个 ORM 初始化 / DB 连接尝试的 time.Duration。
|
||||||
- `MAX_OPEN_CONNS`:**0**:数据库最大打开连接数 - 默认为 0,表示没有限制。
|
- `MAX_OPEN_CONNS`:**0**:数据库最大打开连接数 - 默认为 0,表示没有限制。
|
||||||
|
@ -472,7 +470,7 @@ menu:
|
||||||
|
|
||||||
- `TYPE`:**level**:通用队列类型,当前支持:`level`(在内部使用 LevelDB)、`channel`、`redis`、`dummy`。无效的类型将视为 `level`。
|
- `TYPE`:**level**:通用队列类型,当前支持:`level`(在内部使用 LevelDB)、`channel`、`redis`、`dummy`。无效的类型将视为 `level`。
|
||||||
- `DATADIR`:**queues/common**:用于存储 level 队列的基本 DataDir。单独的队列的 `DATADIR` 可以在 `queue.name` 部分进行设置。相对路径将根据 `%(APP_DATA_PATH)s` 变为绝对路径。
|
- `DATADIR`:**queues/common**:用于存储 level 队列的基本 DataDir。单独的队列的 `DATADIR` 可以在 `queue.name` 部分进行设置。相对路径将根据 `%(APP_DATA_PATH)s` 变为绝对路径。
|
||||||
- `LENGTH`:**100**:通道队列阻塞之前的最大队列大小
|
- `LENGTH`:**100000**:通道队列阻塞之前的最大队列大小
|
||||||
- `BATCH_LENGTH`:**20**:在传递给处理程序之前批处理数据
|
- `BATCH_LENGTH`:**20**:在传递给处理程序之前批处理数据
|
||||||
- `CONN_STR`:**redis://127.0.0.1:6379/0**:redis 队列类型的连接字符串。对于 `redis-cluster`,使用 `redis+cluster://127.0.0.1:6379/0`。可以使用查询参数来设置选项。类似地,LevelDB 选项也可以使用:**leveldb://relative/path?option=value** 或 **leveldb:///absolute/path?option=value** 进行设置,并将覆盖 `DATADIR`。
|
- `CONN_STR`:**redis://127.0.0.1:6379/0**:redis 队列类型的连接字符串。对于 `redis-cluster`,使用 `redis+cluster://127.0.0.1:6379/0`。可以使用查询参数来设置选项。类似地,LevelDB 选项也可以使用:**leveldb://relative/path?option=value** 或 **leveldb:///absolute/path?option=value** 进行设置,并将覆盖 `DATADIR`。
|
||||||
- `QUEUE_NAME`:**_queue**:默认的 redis 和磁盘队列名称的后缀。单独的队列将默认为 **`name`**`QUEUE_NAME`,但可以在特定的 `queue.name` 部分中进行覆盖。
|
- `QUEUE_NAME`:**_queue**:默认的 redis 和磁盘队列名称的后缀。单独的队列将默认为 **`name`**`QUEUE_NAME`,但可以在特定的 `queue.name` 部分中进行覆盖。
|
||||||
|
@ -499,14 +497,17 @@ Gitea 创建以下非唯一队列:
|
||||||
|
|
||||||
- `DEFAULT_EMAIL_NOTIFICATIONS`: **enabled**:用户电子邮件通知的默认配置(用户可配置)。选项:enabled、onmention、disabled
|
- `DEFAULT_EMAIL_NOTIFICATIONS`: **enabled**:用户电子邮件通知的默认配置(用户可配置)。选项:enabled、onmention、disabled
|
||||||
- `DISABLE_REGULAR_ORG_CREATION`: **false**:禁止普通(非管理员)用户创建组织。
|
- `DISABLE_REGULAR_ORG_CREATION`: **false**:禁止普通(非管理员)用户创建组织。
|
||||||
|
- `USER_DISABLED_FEATURES`:**_empty_** 禁用的用户特性,当前允许为空或者 `deletion`,`manage_ssh_keys`, `manage_gpg_keys` 未来可以增加更多设置。
|
||||||
|
- `deletion`: 用户不能通过界面或者API删除他自己。
|
||||||
|
- `manage_ssh_keys`: 用户不能通过界面或者API配置SSH Keys。
|
||||||
|
- `manage_gpg_keys`: 用户不能配置 GPG 密钥。
|
||||||
|
|
||||||
## 安全性 (`security`)
|
## 安全性 (`security`)
|
||||||
|
|
||||||
- `INSTALL_LOCK`: **false**:控制是否能够访问安装向导页面,设置为 `true` 则禁止访问安装向导页面。
|
- `INSTALL_LOCK`: **false**:控制是否能够访问安装向导页面,设置为 `true` 则禁止访问安装向导页面。
|
||||||
- `SECRET_KEY`: **\<每次安装时随机生成\>**:全局服务器安全密钥。这个密钥非常重要,如果丢失将无法解密加密的数据(例如 2FA)。
|
- `SECRET_KEY`: **\<每次安装时随机生成\>**:全局服务器安全密钥。这个密钥非常重要,如果丢失将无法解密加密的数据(例如 2FA)。
|
||||||
- `SECRET_KEY_URI`: **_empty_**:与定义 `SECRET_KEY` 不同,此选项可用于使用存储在文件中的密钥(示例值:`file:/etc/gitea/secret_key`)。它不应该像 `SECRET_KEY` 一样容易丢失。
|
- `SECRET_KEY_URI`: **_empty_**:与定义 `SECRET_KEY` 不同,此选项可用于使用存储在文件中的密钥(示例值:`file:/etc/gitea/secret_key`)。它不应该像 `SECRET_KEY` 一样容易丢失。
|
||||||
- `LOGIN_REMEMBER_DAYS`: **7**:Cookie 保存时间,单位为天。
|
- `LOGIN_REMEMBER_DAYS`: **31**:在要求重新登录之前,记住用户的登录状态多长时间(以天为单位)。
|
||||||
- `COOKIE_USERNAME`: **gitea\_awesome**:保存用户名的 Cookie 名称。
|
|
||||||
- `COOKIE_REMEMBER_NAME`: **gitea\_incredible**:保存自动登录信息的 Cookie 名称。
|
- `COOKIE_REMEMBER_NAME`: **gitea\_incredible**:保存自动登录信息的 Cookie 名称。
|
||||||
- `REVERSE_PROXY_AUTHENTICATION_USER`: **X-WEBAUTH-USER**:反向代理认证的 HTTP 头部名称,用于提供用户信息。
|
- `REVERSE_PROXY_AUTHENTICATION_USER`: **X-WEBAUTH-USER**:反向代理认证的 HTTP 头部名称,用于提供用户信息。
|
||||||
- `REVERSE_PROXY_AUTHENTICATION_EMAIL`: **X-WEBAUTH-EMAIL**:反向代理认证的 HTTP 头部名称,用于提供邮箱信息。
|
- `REVERSE_PROXY_AUTHENTICATION_EMAIL`: **X-WEBAUTH-EMAIL**:反向代理认证的 HTTP 头部名称,用于提供邮箱信息。
|
||||||
|
@ -561,7 +562,7 @@ Gitea 创建以下非唯一队列:
|
||||||
|
|
||||||
## OpenID (`openid`)
|
## OpenID (`openid`)
|
||||||
|
|
||||||
- `ENABLE_OPENID_SIGNIN`: **false**:允许通过OpenID进行身份验证。
|
- `ENABLE_OPENID_SIGNIN`: **true**:允许通过OpenID进行身份验证。
|
||||||
- `ENABLE_OPENID_SIGNUP`: **! DISABLE\_REGISTRATION**:允许通过OpenID进行注册。
|
- `ENABLE_OPENID_SIGNUP`: **! DISABLE\_REGISTRATION**:允许通过OpenID进行注册。
|
||||||
- `WHITELISTED_URIS`: **_empty_**:如果非空,是一组匹配OpenID URI的POSIX正则表达式模式,用于允许访问。
|
- `WHITELISTED_URIS`: **_empty_**:如果非空,是一组匹配OpenID URI的POSIX正则表达式模式,用于允许访问。
|
||||||
- `BLACKLISTED_URIS`: **_empty_**:如果非空,是一组匹配OpenID URI的POSIX正则表达式模式,用于阻止访问。
|
- `BLACKLISTED_URIS`: **_empty_**:如果非空,是一组匹配OpenID URI的POSIX正则表达式模式,用于阻止访问。
|
||||||
|
@ -722,7 +723,6 @@ Gitea 创建以下非唯一队列:
|
||||||
|
|
||||||
## 缓存 (`cache`)
|
## 缓存 (`cache`)
|
||||||
|
|
||||||
- `ENABLED`: **true**: 是否启用缓存。
|
|
||||||
- `ADAPTER`: **memory**: 缓存引擎,可以为 `memory`, `redis`, `redis-cluster`, `twoqueue` 和 `memcache`. (`twoqueue` 代表缓冲区固定的LRU缓存)
|
- `ADAPTER`: **memory**: 缓存引擎,可以为 `memory`, `redis`, `redis-cluster`, `twoqueue` 和 `memcache`. (`twoqueue` 代表缓冲区固定的LRU缓存)
|
||||||
- `INTERVAL`: **60**: 垃圾回收间隔(秒),只对`memory`和`towqueue`有效。
|
- `INTERVAL`: **60**: 垃圾回收间隔(秒),只对`memory`和`towqueue`有效。
|
||||||
- `HOST`: **_empty_**: 缓存配置。`redis`, `redis-cluster`,`memcache`配置连接字符串;`twoqueue` 设置队列参数
|
- `HOST`: **_empty_**: 缓存配置。`redis`, `redis-cluster`,`memcache`配置连接字符串;`twoqueue` 设置队列参数
|
||||||
|
@ -734,7 +734,6 @@ Gitea 创建以下非唯一队列:
|
||||||
|
|
||||||
### 缓存 - 最后提交缓存设置 (`cache.last_commit`)
|
### 缓存 - 最后提交缓存设置 (`cache.last_commit`)
|
||||||
|
|
||||||
- `ENABLED`: **true**:是否启用缓存。
|
|
||||||
- `ITEM_TTL`: **8760h**:如果未使用,保持缓存中的项目的时间,将其设置为 -1 会禁用缓存。
|
- `ITEM_TTL`: **8760h**:如果未使用,保持缓存中的项目的时间,将其设置为 -1 会禁用缓存。
|
||||||
- `COMMITS_COUNT`: **1000**:仅在存储库的提交计数大于时启用缓存。
|
- `COMMITS_COUNT`: **1000**:仅在存储库的提交计数大于时启用缓存。
|
||||||
|
|
||||||
|
@ -742,7 +741,7 @@ Gitea 创建以下非唯一队列:
|
||||||
|
|
||||||
- `PROVIDER`: **memory**:会话存储引擎 \[memory, file, redis, redis-cluster, db, mysql, couchbase, memcache, postgres\]。设置为 `db` 将会重用 `[database]` 的配置信息。
|
- `PROVIDER`: **memory**:会话存储引擎 \[memory, file, redis, redis-cluster, db, mysql, couchbase, memcache, postgres\]。设置为 `db` 将会重用 `[database]` 的配置信息。
|
||||||
- `PROVIDER_CONFIG`: **data/sessions**:对于文件,为根路径;对于 db,为空(将使用数据库配置);对于其他引擎,为连接字符串。相对路径将根据 _`AppWorkPath`_ 绝对化。
|
- `PROVIDER_CONFIG`: **data/sessions**:对于文件,为根路径;对于 db,为空(将使用数据库配置);对于其他引擎,为连接字符串。相对路径将根据 _`AppWorkPath`_ 绝对化。
|
||||||
- `COOKIE_SECURE`: **false**:启用此选项以强制在所有会话访问中使用 HTTPS。
|
- `COOKIE_SECURE`: **_empty_**:`true` 或 `false`。启用此选项以强制在所有会话访问中使用 HTTPS。如果没有设置,当 ROOT_URL 是 https 链接的时候默认设置为 true。
|
||||||
- `COOKIE_NAME`: **i\_like\_gitea**:用于会话 ID 的 cookie 名称。
|
- `COOKIE_NAME`: **i\_like\_gitea**:用于会话 ID 的 cookie 名称。
|
||||||
- `GC_INTERVAL_TIME`: **86400**:GC 间隔时间,以秒为单位。
|
- `GC_INTERVAL_TIME`: **86400**:GC 间隔时间,以秒为单位。
|
||||||
- `SESSION_LIFE_TIME`: **86400**:会话生命周期,以秒为单位,默认为 86400(1 天)。
|
- `SESSION_LIFE_TIME`: **86400**:会话生命周期,以秒为单位,默认为 86400(1 天)。
|
||||||
|
@ -783,12 +782,12 @@ Gitea 创建以下非唯一队列:
|
||||||
## 工单和合并请求的附件 (`attachment`)
|
## 工单和合并请求的附件 (`attachment`)
|
||||||
|
|
||||||
- `ENABLED`: **true**: 是否允许用户上传附件。
|
- `ENABLED`: **true**: 是否允许用户上传附件。
|
||||||
- `ALLOWED_TYPES`: **.csv,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.xls,.xlsx,.zip**: 允许的文件扩展名(`.zip`)、mime 类型(`text/plain`)或通配符类型(`image/*`、`audio/*`、`video/*`)的逗号分隔列表。空值或 `*/*` 允许所有类型。
|
- `ALLOWED_TYPES`: **.cpuprofile,.csv,.dmp,.docx,.fodg,.fodp,.fods,.fodt,.gif,.gz,.jpeg,.jpg,.json,.jsonc,.log,.md,.mov,.mp4,.odf,.odg,.odp,.ods,.odt,.patch,.pdf,.png,.pptx,.svg,.tgz,.txt,.webm,.xls,.xlsx,.zip**: 允许的文件扩展名(`.zip`)、mime 类型(`text/plain`)或通配符类型(`image/*`、`audio/*`、`video/*`)的逗号分隔列表。空值或 `*/*` 允许所有类型。
|
||||||
- `MAX_SIZE`: **4**: 附件的最大限制(MB)。
|
- `MAX_SIZE`: **2048**: 附件的最大限制(MB)。
|
||||||
- `MAX_FILES`: **5**: 一次最多上传的附件数量。
|
- `MAX_FILES`: **5**: 一次最多上传的附件数量。
|
||||||
- `STORAGE_TYPE`: **local**: 附件的存储类型,`local` 表示本地磁盘,`minio` 表示兼容 S3 的对象存储服务,如果未设置将使用默认值 `local` 或其他在 `[storage.xxx]` 中定义的名称。
|
- `STORAGE_TYPE`: **local**: 附件的存储类型,`local` 表示本地磁盘,`minio` 表示兼容 S3 的对象存储服务,如果未设置将使用默认值 `local` 或其他在 `[storage.xxx]` 中定义的名称。
|
||||||
- `SERVE_DIRECT`: **false**: 允许存储驱动器重定向到经过身份验证的 URL 以直接提供文件。目前,只支持 Minio/S3 通过签名 URL 提供支持,local 不会执行任何操作。
|
- `SERVE_DIRECT`: **false**: 允许存储驱动器重定向到经过身份验证的 URL 以直接提供文件。目前,只支持 Minio/S3 通过签名 URL 提供支持,local 不会执行任何操作。
|
||||||
- `PATH`: **data/attachments**: 存储附件的路径,仅当 STORAGE_TYPE 为 `local` 时可用。
|
- `PATH`: **attachments**: 存储附件的路径,仅当 STORAGE_TYPE 为 `local` 时可用。如果是相对路径,将会被解析为 `${AppDataPath}/${attachment.PATH}`.
|
||||||
- `MINIO_ENDPOINT`: **localhost:9000**: Minio 端点以连接,仅当 STORAGE_TYPE 为 `minio` 时可用。
|
- `MINIO_ENDPOINT`: **localhost:9000**: Minio 端点以连接,仅当 STORAGE_TYPE 为 `minio` 时可用。
|
||||||
- `MINIO_ACCESS_KEY_ID`: Minio accessKeyID 以连接,仅当 STORAGE_TYPE 为 `minio` 时可用。
|
- `MINIO_ACCESS_KEY_ID`: Minio accessKeyID 以连接,仅当 STORAGE_TYPE 为 `minio` 时可用。
|
||||||
- `MINIO_SECRET_ACCESS_KEY`: Minio secretAccessKey 以连接,仅当 STORAGE_TYPE 为 `minio` 时可用。
|
- `MINIO_SECRET_ACCESS_KEY`: Minio secretAccessKey 以连接,仅当 STORAGE_TYPE 为 `minio` 时可用。
|
||||||
|
@ -992,7 +991,7 @@ Gitea 创建以下非唯一队列:
|
||||||
- `LAST_UPDATED_MORE_THAN_AGO`: **72h**: 只会尝试回收超过此时间(默认3天)没有尝试过回收的 LFSMetaObject。
|
- `LAST_UPDATED_MORE_THAN_AGO`: **72h**: 只会尝试回收超过此时间(默认3天)没有尝试过回收的 LFSMetaObject。
|
||||||
- `NUMBER_TO_CHECK_PER_REPO`: **100**: 每个仓库要检查的过期 LFSMetaObject 的最小数量。设置为 `0` 以始终检查所有。
|
- `NUMBER_TO_CHECK_PER_REPO`: **100**: 每个仓库要检查的过期 LFSMetaObject 的最小数量。设置为 `0` 以始终检查所有。
|
||||||
|
|
||||||
# Git (`git`)
|
## Git (`git`)
|
||||||
|
|
||||||
- `PATH`: **""**: Git可执行文件的路径。如果为空,Gitea将在PATH环境中搜索。
|
- `PATH`: **""**: Git可执行文件的路径。如果为空,Gitea将在PATH环境中搜索。
|
||||||
- `HOME_PATH`: **%(APP_DATA_PATH)s/home**: Git的HOME目录。
|
- `HOME_PATH`: **%(APP_DATA_PATH)s/home**: Git的HOME目录。
|
||||||
|
@ -1040,14 +1039,15 @@ Gitea 创建以下非唯一队列:
|
||||||
|
|
||||||
## API (`api`)
|
## API (`api`)
|
||||||
|
|
||||||
- `ENABLE_SWAGGER`: **true**: 是否启用swagger路由 (`/api/swagger`, `/api/v1/swagger`, …)。
|
- `ENABLE_SWAGGER`: **true**: 启用API文档接口 (`/api/swagger`, `/api/v1/swagger`, …). True or false。
|
||||||
- `MAX_RESPONSE_ITEMS`: **50**: 单个页面的最大 Feed.
|
- `MAX_RESPONSE_ITEMS`: **50**: API分页的最大单页项目数。
|
||||||
- `ENABLE_OPENID_SIGNIN`: **false**: 允许使用OpenID登录,当设置为`true`时可以通过 `/user/login` 页面进行OpenID登录。
|
- `DEFAULT_PAGING_NUM`: **30**: API分页的默认分页数。
|
||||||
- `DISABLE_REGISTRATION`: **false**: 关闭用户注册。
|
- `DEFAULT_GIT_TREES_PER_PAGE`: **1000**: Git trees API的默认单页项目数。
|
||||||
|
- `DEFAULT_MAX_BLOB_SIZE`: **10485760** (10MiB): blobs API的默认最大文件大小。
|
||||||
|
|
||||||
## OAuth2 (`oauth2`)
|
## OAuth2 (`oauth2`)
|
||||||
|
|
||||||
- `ENABLE`: **true**:启用OAuth2提供者。
|
- `ENABLED`: **true**:启用OAuth2提供者。
|
||||||
- `ACCESS_TOKEN_EXPIRATION_TIME`:**3600**:OAuth2访问令牌的生命周期,以秒为单位。
|
- `ACCESS_TOKEN_EXPIRATION_TIME`:**3600**:OAuth2访问令牌的生命周期,以秒为单位。
|
||||||
- `REFRESH_TOKEN_EXPIRATION_TIME`:**730**:OAuth2刷新令牌的生命周期,以小时为单位。
|
- `REFRESH_TOKEN_EXPIRATION_TIME`:**730**:OAuth2刷新令牌的生命周期,以小时为单位。
|
||||||
- `INVALIDATE_REFRESH_TOKENS`:**false**:检查刷新令牌是否已被使用。
|
- `INVALIDATE_REFRESH_TOKENS`:**false**:检查刷新令牌是否已被使用。
|
||||||
|
@ -1056,7 +1056,7 @@ Gitea 创建以下非唯一队列:
|
||||||
- `JWT_SECRET_URI`:**_empty_**:可以使用此配置选项,而不是在配置中定义`JWT_SECRET`,以向Gitea提供包含密钥的文件的路径(示例值:`file:/etc/gitea/oauth2_jwt_secret`)。
|
- `JWT_SECRET_URI`:**_empty_**:可以使用此配置选项,而不是在配置中定义`JWT_SECRET`,以向Gitea提供包含密钥的文件的路径(示例值:`file:/etc/gitea/oauth2_jwt_secret`)。
|
||||||
- `JWT_SIGNING_PRIVATE_KEY_FILE`:**jwt/private.pem**:用于签署OAuth2令牌的私钥文件路径。路径相对于`APP_DATA_PATH`。仅当`JWT_SIGNING_ALGORITHM`设置为`RS256`,`RS384`,`RS512`,`ES256`,`ES384`或`ES512`时才需要此设置。文件必须包含PKCS8格式的RSA或ECDSA私钥。如果不存在密钥,则将为您创建一个4096位密钥。
|
- `JWT_SIGNING_PRIVATE_KEY_FILE`:**jwt/private.pem**:用于签署OAuth2令牌的私钥文件路径。路径相对于`APP_DATA_PATH`。仅当`JWT_SIGNING_ALGORITHM`设置为`RS256`,`RS384`,`RS512`,`ES256`,`ES384`或`ES512`时才需要此设置。文件必须包含PKCS8格式的RSA或ECDSA私钥。如果不存在密钥,则将为您创建一个4096位密钥。
|
||||||
- `MAX_TOKEN_LENGTH`:**32767**:从OAuth2提供者接受的令牌/cookie的最大长度。
|
- `MAX_TOKEN_LENGTH`:**32767**:从OAuth2提供者接受的令牌/cookie的最大长度。
|
||||||
- `DEFAULT_APPLICATIONS`:**git-credential-oauth,git-credential-manager**:在启动时预注册用于某些服务的OAuth应用程序。有关可用选项列表,请参阅[OAuth2文档](/development/oauth2-provider.md)。
|
- `DEFAULT_APPLICATIONS`:**git-credential-oauth,git-credential-manager, tea**:在启动时预注册用于某些服务的OAuth应用程序。有关可用选项列表,请参阅[OAuth2文档](/development/oauth2-provider.md)。
|
||||||
|
|
||||||
## i18n (`i18n`)
|
## i18n (`i18n`)
|
||||||
|
|
||||||
|
@ -1331,23 +1331,23 @@ PROXY_HOSTS = *.github.com
|
||||||
|
|
||||||
## Actions (`actions`)
|
## Actions (`actions`)
|
||||||
|
|
||||||
- `ENABLED`: **false**:启用/禁用操作功能
|
- `ENABLED`: **true**:启用/禁用操作功能
|
||||||
- `DEFAULT_ACTIONS_URL`: **github**:获取操作插件的默认平台,`github`表示`https://github.com`,`self`表示当前的 Gitea 实例。
|
- `DEFAULT_ACTIONS_URL`: **github**:获取操作插件的默认平台,`github`表示`https://github.com`,`self`表示当前的 Gitea 实例。
|
||||||
- `STORAGE_TYPE`: **local**:用于操作日志的存储类型,`local`表示本地磁盘,`minio`表示与S3兼容的对象存储服务,默认为`local`,或者使用定义为`[storage.xxx]`的其他名称。
|
- `STORAGE_TYPE`: **local**:用于操作日志的存储类型,`local`表示本地磁盘,`minio`表示与S3兼容的对象存储服务,默认为`local`,或者使用定义为`[storage.xxx]`的其他名称。
|
||||||
- `MINIO_BASE_PATH`: **actions_log/**:Minio存储桶上的基本路径,仅在`STORAGE_TYPE`为`minio`时可用。
|
- `MINIO_BASE_PATH`: **actions_log/**:Minio存储桶上的基本路径,仅在`STORAGE_TYPE`为`minio`时可用。
|
||||||
|
|
||||||
`DEFAULT_ACTIONS_URL` 指示 Gitea 操作运行程序应该在哪里找到带有相对路径的操作。
|
`DEFAULT_ACTIONS_URL` 指示 Gitea 操作运行程序应该在哪里找到带有相对路径的操作。
|
||||||
例如,`uses: actions/checkout@v3` 表示 `https://github.com/actions/checkout@v3`,因为 `DEFAULT_ACTIONS_URL` 的值为 `github`。
|
例如,`uses: actions/checkout@v4` 表示 `https://github.com/actions/checkout@v4`,因为 `DEFAULT_ACTIONS_URL` 的值为 `github`。
|
||||||
它可以更改为 `self`,以使其成为 `root_url_of_your_gitea/actions/checkout@v3`。
|
它可以更改为 `self`,以使其成为 `root_url_of_your_gitea/actions/checkout@v4`。
|
||||||
|
|
||||||
请注意,对于大多数情况,不建议使用 `self`,因为它可能使名称在全局范围内产生歧义。
|
请注意,对于大多数情况,不建议使用 `self`,因为它可能使名称在全局范围内产生歧义。
|
||||||
此外,它要求您将所有所需的操作镜像到您的 Gitea 实例,这可能不值得。
|
此外,它要求您将所有所需的操作镜像到您的 Gitea 实例,这可能不值得。
|
||||||
因此,请仅在您了解自己在做什么的情况下使用 `self`。
|
因此,请仅在您了解自己在做什么的情况下使用 `self`。
|
||||||
|
|
||||||
在早期版本(<= 1.19)中,`DEFAULT_ACTIONS_URL` 可以设置为任何自定义 URL,例如 `https://gitea.com` 或 `http://your-git-server,https://gitea.com`,默认值为 `https://gitea.com`。
|
在早期版本(`<= 1.19`)中,`DEFAULT_ACTIONS_URL` 可以设置为任何自定义 URL,例如 `https://gitea.com` 或 `http://your-git-server,https://gitea.com`,默认值为 `https://gitea.com`。
|
||||||
然而,后来的更新删除了这些选项,现在唯一的选项是 `github` 和 `self`,默认值为 `github`。
|
然而,后来的更新删除了这些选项,现在唯一的选项是 `github` 和 `self`,默认值为 `github`。
|
||||||
但是,如果您想要使用其他 Git 服务器中的操作,您可以在 `uses` 字段中使用完整的 URL,Gitea 支持此功能(GitHub 不支持)。
|
但是,如果您想要使用其他 Git 服务器中的操作,您可以在 `uses` 字段中使用完整的 URL,Gitea 支持此功能(GitHub 不支持)。
|
||||||
例如 `uses: https://gitea.com/actions/checkout@v3` 或 `uses: http://your-git-server/actions/checkout@v3`。
|
例如 `uses: https://gitea.com/actions/checkout@v4` 或 `uses: http://your-git-server/actions/checkout@v4`。
|
||||||
|
|
||||||
## 其他 (`other`)
|
## 其他 (`other`)
|
||||||
|
|
||||||
|
|
|
@ -284,7 +284,7 @@ syntax and shouldn't be touched without fully understanding these components.
|
||||||
|
|
||||||
Google Analytics, Matomo (previously Piwik), and other analytics services can be added to Gitea. To add the tracking code, refer to the `Other additions to the page` section of this document, and add the JavaScript to the `$GITEA_CUSTOM/templates/custom/header.tmpl` file.
|
Google Analytics, Matomo (previously Piwik), and other analytics services can be added to Gitea. To add the tracking code, refer to the `Other additions to the page` section of this document, and add the JavaScript to the `$GITEA_CUSTOM/templates/custom/header.tmpl` file.
|
||||||
|
|
||||||
## Customizing gitignores, labels, licenses, locales, and readmes.
|
## Customizing gitignores, labels, licenses, locales, and readmes
|
||||||
|
|
||||||
Place custom files in corresponding sub-folder under `custom/options`.
|
Place custom files in corresponding sub-folder under `custom/options`.
|
||||||
|
|
||||||
|
@ -370,7 +370,8 @@ A full list of supported emoji's is at [emoji list](https://gitea.com/gitea/gite
|
||||||
|
|
||||||
## Customizing the look of Gitea
|
## Customizing the look of Gitea
|
||||||
|
|
||||||
The default built-in themes are `gitea` (light), `arc-green` (dark), and `auto` (chooses light or dark depending on operating system settings).
|
The built-in themes are `gitea-light`, `gitea-dark`, and `gitea-auto` (which automatically adapts to OS settings).
|
||||||
|
|
||||||
The default theme can be changed via `DEFAULT_THEME` in the [ui](administration/config-cheat-sheet.md#ui-ui) section of `app.ini`.
|
The default theme can be changed via `DEFAULT_THEME` in the [ui](administration/config-cheat-sheet.md#ui-ui) section of `app.ini`.
|
||||||
|
|
||||||
Gitea also has support for user themes, which means every user can select which theme should be used.
|
Gitea also has support for user themes, which means every user can select which theme should be used.
|
||||||
|
@ -384,7 +385,7 @@ To make a custom theme available to all users:
|
||||||
|
|
||||||
Community themes are listed in [gitea/awesome-gitea#themes](https://gitea.com/gitea/awesome-gitea#themes).
|
Community themes are listed in [gitea/awesome-gitea#themes](https://gitea.com/gitea/awesome-gitea#themes).
|
||||||
|
|
||||||
The `arc-green` theme source can be found [here](https://github.com/go-gitea/gitea/blob/main/web_src/css/themes/theme-arc-green.css).
|
The default theme sources can be found [here](https://github.com/go-gitea/gitea/blob/main/web_src/css/themes).
|
||||||
|
|
||||||
If your custom theme is considered a dark theme, set the global css variable `--is-dark-theme` to `true`.
|
If your custom theme is considered a dark theme, set the global css variable `--is-dark-theme` to `true`.
|
||||||
This allows Gitea to adjust the Monaco code editor's theme accordingly.
|
This allows Gitea to adjust the Monaco code editor's theme accordingly.
|
||||||
|
|
|
@ -42,11 +42,11 @@ Gitea 引用 `custom` 目录中的自定义配置文件来覆盖配置、模板
|
||||||
|
|
||||||
将自定义的公共文件(比如页面和图片)作为 webroot 放在 `custom/public/` 中来让 Gitea 提供这些自定义内容(符号链接将被追踪)。
|
将自定义的公共文件(比如页面和图片)作为 webroot 放在 `custom/public/` 中来让 Gitea 提供这些自定义内容(符号链接将被追踪)。
|
||||||
|
|
||||||
举例说明:`image.png` 存放在 `custom/public/`中,那么它可以通过链接 http://gitea.domain.tld/assets/image.png 访问。
|
举例说明:`image.png` 存放在 `custom/public/assets/`中,那么它可以通过链接 http://gitea.domain.tld/assets/image.png 访问。
|
||||||
|
|
||||||
## 修改默认头像
|
## 修改默认头像
|
||||||
|
|
||||||
替换以下目录中的 png 图片: `custom/public/img/avatar\_default.png`
|
替换以下目录中的 png 图片: `custom/public/assets/img/avatar\_default.png`
|
||||||
|
|
||||||
## 自定义 Gitea 页面
|
## 自定义 Gitea 页面
|
||||||
|
|
||||||
|
@ -86,5 +86,6 @@ Gitea 引用 `custom` 目录中的自定义配置文件来覆盖配置、模板
|
||||||
|
|
||||||
## 更改 Gitea 外观
|
## 更改 Gitea 外观
|
||||||
|
|
||||||
Gitea 目前由两种内置主题,分别为默认 `gitea` 主题和深色主题 `arc-green`,您可以通过修改
|
内置主题是“gitea-light”、“gitea-dark”和“gitea-auto”(自动适应操作系统设置)。
|
||||||
`app.ini` [ui](administration/config-cheat-sheet.md#ui-ui) 部分的 `DEFAULT_THEME` 的值来变更至一个可用的 Gitea 外观。
|
|
||||||
|
默认主题可以通过 `app.ini` 的 [ui](administration/config-cheat-sheet.md#ui-ui) 部分中的 `DEFAULT_THEME` 进行更改。
|
||||||
|
|
|
@ -61,7 +61,7 @@ Please note: authentication is only supported when the SMTP server communication
|
||||||
|
|
||||||
- STARTTLS (also known as Opportunistic TLS) via port 587. Initial connection is done over cleartext, but then be upgraded over TLS if the server supports it.
|
- STARTTLS (also known as Opportunistic TLS) via port 587. Initial connection is done over cleartext, but then be upgraded over TLS if the server supports it.
|
||||||
- SMTPS connection (SMTP over TLS) via the default port 465. Connection to the server use TLS from the beginning.
|
- SMTPS connection (SMTP over TLS) via the default port 465. Connection to the server use TLS from the beginning.
|
||||||
- Forced SMTPS connection with `IS_TLS_ENABLED=true`. (These are both known as Implicit TLS.)
|
- Forced SMTPS connection with `PROTOCOL=smtps`. (These are both known as Implicit TLS.)
|
||||||
This is due to protections imposed by the Go internal libraries against STRIPTLS attacks.
|
This is due to protections imposed by the Go internal libraries against STRIPTLS attacks.
|
||||||
|
|
||||||
Note that Implicit TLS is recommended by [RFC8314](https://tools.ietf.org/html/rfc8314#section-3) since 2018.
|
Note that Implicit TLS is recommended by [RFC8314](https://tools.ietf.org/html/rfc8314#section-3) since 2018.
|
||||||
|
|
|
@ -55,13 +55,13 @@ PASSWD = `password`
|
||||||
|
|
||||||
要发送测试邮件以验证设置,请转到 Gitea > 站点管理 > 配置 > SMTP 邮件配置。
|
要发送测试邮件以验证设置,请转到 Gitea > 站点管理 > 配置 > SMTP 邮件配置。
|
||||||
|
|
||||||
有关所有选项的完整列表,请查看[配置速查表](doc/administration/config-cheat-sheet.zh-cn.md)。
|
有关所有选项的完整列表,请查看[配置速查表](administration/config-cheat-sheet.md)。
|
||||||
|
|
||||||
请注意:只有在使用 TLS 或 `HOST=localhost` 加密 SMTP 服务器通信时才支持身份验证。TLS 加密可以通过以下方式进行:
|
请注意:只有在使用 TLS 或 `HOST=localhost` 加密 SMTP 服务器通信时才支持身份验证。TLS 加密可以通过以下方式进行:
|
||||||
|
|
||||||
- 通过端口 587 的 STARTTLS(也称为 Opportunistic TLS)。初始连接是明文的,但如果服务器支持,则可以升级为 TLS。
|
- 通过端口 587 的 STARTTLS(也称为 Opportunistic TLS)。初始连接是明文的,但如果服务器支持,则可以升级为 TLS。
|
||||||
- 通过默认端口 465 的 SMTPS 连接。连接到服务器从一开始就使用 TLS。
|
- 通过默认端口 465 的 SMTPS 连接。连接到服务器从一开始就使用 TLS。
|
||||||
- 使用 `IS_TLS_ENABLED=true` 进行强制的 SMTPS 连接。(这两种方式都被称为 Implicit TLS)
|
- 使用 `PROTOCOL=smtps` 进行强制的 SMTPS 连接。(这两种方式都被称为 Implicit TLS)
|
||||||
这是由于 Go 内部库对 STRIPTLS 攻击的保护机制。
|
这是由于 Go 内部库对 STRIPTLS 攻击的保护机制。
|
||||||
|
|
||||||
请注意,自2018年起,[RFC8314](https://tools.ietf.org/html/rfc8314#section-3) 推荐使用 Implicit TLS。
|
请注意,自2018年起,[RFC8314](https://tools.ietf.org/html/rfc8314#section-3) 推荐使用 Implicit TLS。
|
||||||
|
|
|
@ -27,14 +27,15 @@ GITEA_CUSTOM=/home/gitea/custom ./gitea web
|
||||||
|
|
||||||
## From Go language
|
## From Go language
|
||||||
|
|
||||||
As Gitea is written in Go, it uses some Go variables, such as:
|
As Gitea is written in Go, it uses some variables that influence the behaviour of Go's runtime, such as:
|
||||||
|
|
||||||
- `GOOS`
|
- `GOMEMLIMIT`
|
||||||
- `GOARCH`
|
- `GOGC`
|
||||||
- [`GOPATH`](https://golang.org/cmd/go/#hdr-GOPATH_environment_variable)
|
- `GOMAXPROCS`
|
||||||
|
- `GODEBUG`
|
||||||
|
|
||||||
For documentation about each of the variables available, refer to the
|
For documentation about each of the variables available, refer to the
|
||||||
[official Go documentation](https://golang.org/cmd/go/#hdr-Environment_variables).
|
[official Go documentation on runtime environment variables](https://pkg.go.dev/runtime#hdr-Environment_Variables).
|
||||||
|
|
||||||
## Gitea files
|
## Gitea files
|
||||||
|
|
||||||
|
|
|
@ -29,9 +29,9 @@ GITEA_CUSTOM=/home/gitea/custom ./gitea web
|
||||||
|
|
||||||
* `GOOS`
|
* `GOOS`
|
||||||
* `GOARCH`
|
* `GOARCH`
|
||||||
* [`GOPATH`](https://golang.org/cmd/go/#hdr-GOPATH_environment_variable)
|
* [`GOPATH`](https://go.dev/cmd/go/#hdr-GOPATH_environment_variable)
|
||||||
|
|
||||||
您可以在[官方文档](https://golang.org/cmd/go/#hdr-Environment_variables)中查阅这些配置参数的详细信息。
|
您可以在[官方文档](https://go.dev/cmd/go/#hdr-Environment_variables)中查阅这些配置参数的详细信息。
|
||||||
|
|
||||||
## Gitea 的文件目录
|
## Gitea 的文件目录
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ it is just a matter of:
|
||||||
- add some configuration to your `app.ini` file
|
- add some configuration to your `app.ini` file
|
||||||
- restart your Gitea instance
|
- restart your Gitea instance
|
||||||
|
|
||||||
This supports rendering of whole files. If you want to render code blocks in markdown you would need to do something with javascript. See some examples on the [Customizing Gitea](../customizing-gitea) page.
|
This supports rendering of whole files. If you want to render code blocks in markdown you would need to do something with javascript. See some examples on the [Customizing Gitea](administration/customizing-gitea.md) page.
|
||||||
|
|
||||||
## Installing external binaries
|
## Installing external binaries
|
||||||
|
|
||||||
|
|
|
@ -194,7 +194,7 @@ ALLOW_DATA_URI_IMAGES = true
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
将您的样式表添加到自定义目录中,例如 `custom/public/css/my-style-XXXXX.css`,并使用自定义的头文件 `custom/templates/custom/header.tmpl` 进行导入:
|
将您的样式表添加到自定义目录中,例如 `custom/public/assets/css/my-style-XXXXX.css`,并使用自定义的头文件 `custom/templates/custom/header.tmpl` 进行导入:
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<link rel="stylesheet" href="{{AppSubUrl}}/assets/css/my-style-XXXXX.css" />
|
<link rel="stylesheet" href="{{AppSubUrl}}/assets/css/my-style-XXXXX.css" />
|
||||||
|
|
|
@ -35,8 +35,8 @@ CERT_FILE = cert.pem
|
||||||
KEY_FILE = key.pem
|
KEY_FILE = key.pem
|
||||||
```
|
```
|
||||||
|
|
||||||
Note that if your certificate is signed by a third party certificate authority (i.e. not self-signed), then cert.pem should contain the certificate chain. The server certificate must be the first entry in cert.pem, followed by the intermediaries in order (if any). The root certificate does not have to be included because the connecting client must already have it in order to estalbish the trust relationship.
|
Note that if your certificate is signed by a third party certificate authority (i.e. not self-signed), then cert.pem should contain the certificate chain. The server certificate must be the first entry in cert.pem, followed by the intermediaries in order (if any). The root certificate does not have to be included because the connecting client must already have it in order to establish the trust relationship.
|
||||||
To learn more about the config values, please checkout the [Config Cheat Sheet](../config-cheat-sheet#server-server).
|
To learn more about the config values, please checkout the [Config Cheat Sheet](administration/config-cheat-sheet.md#server-server).
|
||||||
|
|
||||||
For the `CERT_FILE` or `KEY_FILE` field, the file path is relative to the `GITEA_CUSTOM` environment variable when it is a relative path. It can be an absolute path as well.
|
For the `CERT_FILE` or `KEY_FILE` field, the file path is relative to the `GITEA_CUSTOM` environment variable when it is a relative path. It can be an absolute path as well.
|
||||||
|
|
||||||
|
@ -85,11 +85,11 @@ ACME_DIRECTORY=https
|
||||||
ACME_EMAIL=email@example.com
|
ACME_EMAIL=email@example.com
|
||||||
```
|
```
|
||||||
|
|
||||||
To learn more about the config values, please checkout the [Config Cheat Sheet](../config-cheat-sheet#server-server).
|
To learn more about the config values, please checkout the [Config Cheat Sheet](administration/config-cheat-sheet.md#server-server).
|
||||||
|
|
||||||
## Using a reverse proxy
|
## Using a reverse proxy
|
||||||
|
|
||||||
Setup up your reverse proxy as shown in the [reverse proxy guide](../reverse-proxies).
|
Setup up your reverse proxy as shown in the [reverse proxy guide](administration/reverse-proxies.md).
|
||||||
|
|
||||||
After that, enable HTTPS by following one of these guides:
|
After that, enable HTTPS by following one of these guides:
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue