Compare commits
91 Commits
federation
...
forgejo
Author | SHA1 | Date |
---|---|---|
Aravinth Manivannan | 66f735c281 | |
Earl Warren | 60a01255e7 | |
Michael Kriese | 477832f4a2 | |
Earl Warren | 9e77bf310c | |
Michael Kriese | 8f1c26aa54 | |
Earl Warren | 674a711127 | |
Michael Kriese | 0023f78a17 | |
Michael Kriese | a32772e695 | |
Earl Warren | eb3ea82ee6 | |
Michael Kriese | 102531cba1 | |
Earl Warren | 7288fb5dff | |
Earl Warren | 9397bfd276 | |
Earl Warren | 1e16f3d7d1 | |
Michael Kriese | 8ce7de5677 | |
Earl Warren | 84f28f36b0 | |
Gusted | 9f088464ea | |
Gusted | efc79dd41e | |
Gusted | 142459bbe0 | |
Earl Warren | 5a18b74632 | |
Earl Warren | 7e8e27b8ef | |
Earl Warren | f326f14da7 | |
oliverpool | 2d209f1130 | |
oliverpool | c0fb62cb5a | |
oliverpool | 25daa267bb | |
oliverpool | 639ac7a131 | |
oliverpool | fb6bcf1029 | |
oliverpool | dda88488ca | |
oliverpool | 7b576d0a5d | |
oliverpool | e7abda6a0d | |
oliverpool | a0d1cfdf7d | |
oliverpool | b990e07af0 | |
oliverpool | 3b7b899afa | |
oliverpool | 2536c2db89 | |
oliverpool | 8750a5a42b | |
oliverpool | 036b98884c | |
oliverpool | ca209a04b1 | |
oliverpool | e43c6cd9df | |
Earl Warren | 0bfd4ca532 | |
Earl Warren | 2b656a2bea | |
Earl Warren | b7c535dba8 | |
Earl Warren | 33ede09135 | |
oliverpool | 33a3ee1955 | |
Earl Warren | af0bb6e68a | |
Gergely Nagy | eb97e721d1 | |
Earl Warren | a28e289d06 | |
Earl Warren | 99c4b0930d | |
Gergely Nagy | 3c57a62050 | |
HEREYUA | 729849a2fd | |
Gergely Nagy | d571a2c202 | |
Earl Warren | f42f044bc4 | |
Earl Warren | d66474c801 | |
Earl Warren | a6c620dfeb | |
Earl Warren | ee269b2bb8 | |
Earl Warren | b5775f6d6e | |
Earl Warren | 155d79473d | |
Gergely Nagy | 50fb2ac47f | |
Earl Warren | 5f73b2bd5b | |
Gergely Nagy | 87cd08539e | |
Gergely Nagy | 58d4af8fdb | |
wxiaoguang | ec2201a3da | |
wxiaoguang | 1d4bf7e211 | |
Earl Warren | 012ed7019a | |
Gergely Nagy | 8af8682f7d | |
Earl Warren | a631e5c249 | |
Earl Warren | 1a1e1604d5 | |
Gergely Nagy | f99cf911e8 | |
Rafael Heard | 3acea02eb6 | |
Gergely Nagy | 1386d3faf7 | |
Yarden Shoham | 20446ac6b3 | |
Gergely Nagy | 6c330a85ec | |
wxiaoguang | eb4061baba | |
wxiaoguang | 44221a3cd7 | |
Gergely Nagy | 3123725ff3 | |
Earl Warren | 549720bbef | |
Earl Warren | b7ee0b6ad2 | |
0ko | 404101931a | |
Earl Warren | f68100ceea | |
oliverpool | fec49269c6 | |
oliverpool | 8ac4538a00 | |
Earl Warren | 1d530ba022 | |
oliverpool | 5c248adcf1 | |
Earl Warren | 0aa77d0b9e | |
0ko | 60a9df1908 | |
0ko | debeedfe42 | |
Codeberg Translate | 489805c322 | |
0ko | 8e1b6a4090 | |
Gergely Nagy | 36147f580c | |
Shiny Nematoda | 4a061ca26c | |
Shiny Nematoda | ed15c92668 | |
Denys Konovalov | 847f03b6a6 | |
0ko | 008706a438 |
|
@ -222,7 +222,6 @@ package "code.gitea.io/gitea/modules/markup/markdown"
|
|||
func IsSummary
|
||||
func IsTaskCheckBoxListItem
|
||||
func IsIcon
|
||||
func IsColorPreview
|
||||
func RenderRawString
|
||||
|
||||
package "code.gitea.io/gitea/modules/markup/markdown/math"
|
||||
|
@ -272,13 +271,19 @@ package "code.gitea.io/gitea/modules/sync"
|
|||
|
||||
package "code.gitea.io/gitea/modules/testlogger"
|
||||
func (*testLoggerWriterCloser).pushT
|
||||
func (*testLoggerWriterCloser).Write
|
||||
func (*testLoggerWriterCloser).Log
|
||||
func (*testLoggerWriterCloser).recordError
|
||||
func (*testLoggerWriterCloser).printMsg
|
||||
func (*testLoggerWriterCloser).popT
|
||||
func (*testLoggerWriterCloser).Close
|
||||
func (*testLoggerWriterCloser).Reset
|
||||
func PrintCurrentTest
|
||||
func Printf
|
||||
func NewTestLoggerWriter
|
||||
func (*TestLogEventWriter).Base
|
||||
func (*TestLogEventWriter).GetLevel
|
||||
func (*TestLogEventWriter).GetWriterName
|
||||
func (*TestLogEventWriter).GetWriterType
|
||||
func (*TestLogEventWriter).Run
|
||||
|
||||
package "code.gitea.io/gitea/modules/timeutil"
|
||||
func GetExecutableModTime
|
||||
|
@ -292,9 +297,6 @@ package "code.gitea.io/gitea/modules/translation"
|
|||
func (MockLocale).TrN
|
||||
func (MockLocale).PrettyNumber
|
||||
|
||||
package "code.gitea.io/gitea/modules/util"
|
||||
func UnsafeStringToBytes
|
||||
|
||||
package "code.gitea.io/gitea/modules/util/filebuffer"
|
||||
func CreateFromReader
|
||||
|
||||
|
|
|
@ -0,0 +1,85 @@
|
|||
# Copyright 2024 The Forgejo Authors
|
||||
# SPDX-License-Identifier: MIT
|
||||
#
|
||||
# To modify this workflow:
|
||||
#
|
||||
# - change pull_request_target: to pull_request:
|
||||
# so that it runs from a pull request instead of the default branch
|
||||
#
|
||||
# - push it to the wip-ci-backport branch on the forgejo repository
|
||||
# otherwise it will not have access to the secrets required to push
|
||||
# the PR
|
||||
#
|
||||
# - open a pull request targetting wip-ci-backport that includes a change
|
||||
# that can be backported without conflict in v1.21 and set the
|
||||
# `backport/v1.21` label.
|
||||
#
|
||||
# - once it works, open a pull request for the sake of keeping track
|
||||
# of the change even if the PR won't run it because it will use
|
||||
# whatever is in the default branch instead
|
||||
#
|
||||
# - after it is merged, double check it works by setting a
|
||||
# `backport/v1.21` label on a merged pull request that can be backported
|
||||
# without conflict.
|
||||
#
|
||||
on:
|
||||
pull_request_target:
|
||||
types:
|
||||
- closed
|
||||
- labeled
|
||||
|
||||
jobs:
|
||||
backporting:
|
||||
if: >
|
||||
!startsWith(vars.ROLE, 'forgejo-') && (
|
||||
github.event.pull_request.merged
|
||||
&& (
|
||||
(
|
||||
github.event.action == 'closed' &&
|
||||
contains(toJSON(github.event.pull_request.labels), 'backport/v')
|
||||
)
|
||||
||
|
||||
(
|
||||
github.event.action == 'labeled' &&
|
||||
contains(github.event.label.name, 'backport/v')
|
||||
)
|
||||
)
|
||||
)
|
||||
runs-on: docker
|
||||
container:
|
||||
image: 'docker.io/node:20-bookworm'
|
||||
steps:
|
||||
- name: Fetch labels
|
||||
id: fetch-labels
|
||||
shell: bash
|
||||
run: |
|
||||
set -x
|
||||
echo "Labels retrieved below"
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
apt-get update -qq
|
||||
apt-get -q install -qq -y jq
|
||||
filtered_labels=$(echo "$LABELS" | jq -c 'map(select(.name | startswith("backport/v")))')
|
||||
echo "FILTERED_LABELS=${filtered_labels}" >> $GITHUB_ENV
|
||||
env:
|
||||
LABELS: ${{ toJSON(github.event.pull_request.labels) }}
|
||||
- name: Extract targets
|
||||
id: extract-targets
|
||||
shell: bash
|
||||
run: |
|
||||
set -x
|
||||
targets="$(echo $FILTERED_LABELS | jq -c '[.[] | .name | sub("backport/"; "")]')"
|
||||
echo "targets=$(echo $targets)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Printing info
|
||||
shell: bash
|
||||
run: |
|
||||
echo "targets: ${{ steps.extract-targets.outputs.targets }}"
|
||||
echo "target-branch: ${{ fromJSON(steps.extract-targets.outputs.targets)[0] }}"
|
||||
echo "pull-request: ${{ github.event.pull_request.url }}"
|
||||
|
||||
- uses: https://code.forgejo.org/actions/git-backporting@v4.5.2
|
||||
with:
|
||||
target-branch: ${{ fromJSON(steps.extract-targets.outputs.targets)[0] }}/forgejo
|
||||
no-squash: true
|
||||
auth: ${{ secrets.BACKPORT_TOKEN }}
|
||||
pull-request: ${{ github.event.pull_request.url }}
|
|
@ -9,6 +9,8 @@ on:
|
|||
- docker/**
|
||||
- .forgejo/workflows/build-release.yml
|
||||
- .forgejo/workflows/build-release-integration.yml
|
||||
branches-ignore:
|
||||
- renovate/**
|
||||
pull_request:
|
||||
paths:
|
||||
- Makefile
|
||||
|
|
|
@ -43,7 +43,7 @@ jobs:
|
|||
|
||||
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||
with:
|
||||
go-version: "1.21"
|
||||
go-version: "1.22"
|
||||
check-latest: true
|
||||
|
||||
- name: version from ref
|
||||
|
|
|
@ -17,7 +17,7 @@ jobs:
|
|||
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||
with:
|
||||
go-version: "~1.21"
|
||||
go-version: "1.22"
|
||||
check-latest: true
|
||||
- run: |
|
||||
apt-get -qq update
|
||||
|
|
|
@ -64,7 +64,7 @@ jobs:
|
|||
if: vars.ROLE == 'forgejo-experimental' && secrets.OVH_APP_KEY != ''
|
||||
uses: https://code.forgejo.org/actions/setup-go@v4
|
||||
with:
|
||||
go-version: "1.21"
|
||||
go-version: "1.22"
|
||||
check-latest: true
|
||||
- name: update the _release.experimental DNS record
|
||||
if: vars.ROLE == 'forgejo-experimental' && secrets.OVH_APP_KEY != ''
|
||||
|
|
|
@ -0,0 +1,53 @@
|
|||
name: renovate
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'renovate/**' # self-test updates
|
||||
schedule:
|
||||
- cron: '*/30 * * * *'
|
||||
|
||||
env:
|
||||
RENOVATE_DRY_RUN: ${{ (github.event_name != 'schedule' && github.ref_name != github.event.repository.default_branch) && 'full' || '' }}
|
||||
RENOVATE_REPOSITORIES: ${{ github.repository }}
|
||||
|
||||
jobs:
|
||||
renovate:
|
||||
if: ${{ secrets.RENOVATE_TOKEN != '' }}
|
||||
|
||||
runs-on: docker
|
||||
container:
|
||||
image: 'ghcr.io/visualon/renovate:37.269.3@sha256:4fb1684ec9e10592b6c4726906d353f88097fbb584748150043949a5aa5ca085'
|
||||
|
||||
steps:
|
||||
- uses: https://code.forgejo.org/actions/cache/restore@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
|
||||
with:
|
||||
path: |
|
||||
.tmp/cache/renovate/repository
|
||||
key: repo-cache-${{ github.run_id }}
|
||||
restore-keys: |
|
||||
repo-cache-
|
||||
|
||||
- run: renovate
|
||||
env:
|
||||
GITHUB_COM_TOKEN: ${{ secrets.RENOVATE_GITHUB_COM_TOKEN }}
|
||||
LOG_LEVEL: debug
|
||||
RENOVATE_BASE_DIR: ${{ github.workspace }}/.tmp
|
||||
RENOVATE_ENDPOINT: ${{ github.server_url }}
|
||||
RENOVATE_PLATFORM: gitea
|
||||
RENOVATE_REPOSITORY_CACHE: 'enabled'
|
||||
RENOVATE_TOKEN: ${{ secrets.RENOVATE_TOKEN }}
|
||||
RENOVATE_GIT_AUTHOR: 'Renovate Bot <forgejo-renovate-action@forgejo.org>'
|
||||
|
||||
GIT_AUTHOR_NAME: 'Renovate Bot'
|
||||
GIT_AUTHOR_EMAIL: 'forgejo-renovate-action@forgejo.org'
|
||||
GIT_COMMITTER_NAME: 'Renovate Bot'
|
||||
GIT_COMMITTER_EMAIL: 'forgejo-renovate-action@forgejo.org'
|
||||
|
||||
- name: Save renovate repo cache
|
||||
if: always() && env.RENOVATE_DRY_RUN == 'true'
|
||||
uses: https://code.forgejo.org/actions/cache/save@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
|
||||
with:
|
||||
path: |
|
||||
.tmp/cache/renovate/repository
|
||||
key: repo-cache-${{ github.run_id }}
|
|
@ -17,7 +17,7 @@ jobs:
|
|||
- uses: https://code.forgejo.org/actions/checkout@v3
|
||||
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||
with:
|
||||
go-version: "1.21"
|
||||
go-version: "1.22"
|
||||
check-latest: true
|
||||
- run: make deps-backend deps-tools
|
||||
- run: make --always-make -j$(nproc) lint-backend checks-backend # ensure the "go-licenses" make target runs
|
||||
|
@ -52,7 +52,7 @@ jobs:
|
|||
- uses: https://code.forgejo.org/actions/checkout@v3
|
||||
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||
with:
|
||||
go-version: "1.21"
|
||||
go-version: "1.22"
|
||||
- run: |
|
||||
git config --add safe.directory '*'
|
||||
adduser --quiet --comment forgejo --disabled-password forgejo
|
||||
|
@ -97,7 +97,7 @@ jobs:
|
|||
- uses: https://code.forgejo.org/actions/checkout@v3
|
||||
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||
with:
|
||||
go-version: "1.21"
|
||||
go-version: "1.22"
|
||||
- name: install dependencies & git >= 2.42
|
||||
run: |
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
|
@ -144,7 +144,7 @@ jobs:
|
|||
- uses: https://code.forgejo.org/actions/checkout@v3
|
||||
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||
with:
|
||||
go-version: "1.21"
|
||||
go-version: "1.22"
|
||||
- name: install dependencies & git >= 2.42
|
||||
run: |
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
|
@ -181,7 +181,7 @@ jobs:
|
|||
- uses: https://code.forgejo.org/actions/checkout@v3
|
||||
- uses: https://code.forgejo.org/actions/setup-go@v4
|
||||
with:
|
||||
go-version: "1.21"
|
||||
go-version: "1.22"
|
||||
- name: install dependencies & git >= 2.42
|
||||
run: |
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
name: 🦋 Bug Report (web interface / frontend)
|
||||
description: Something doesn't look quite as it should? Report it here!
|
||||
title: "[BUG] "
|
||||
labels: ["bug", "forgejo/ui"]
|
||||
labels: ["bug/new-report", "forgejo/ui"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
name: 🐛 Bug Report (server / backend)
|
||||
description: Found something you weren't expecting? Report it here!
|
||||
title: "[BUG] "
|
||||
labels: bug
|
||||
labels: bug/new-report
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
|
|
|
@ -1,3 +1,12 @@
|
|||
---
|
||||
|
||||
name: "Pull Request Template"
|
||||
about: "Template for all Pull Requests"
|
||||
labels:
|
||||
|
||||
- test/needed
|
||||
|
||||
---
|
||||
<!--
|
||||
Before submitting a PR, please read the contributing guidelines:
|
||||
https://codeberg.org/forgejo/forgejo/src/branch/forgejo/CONTRIBUTING.md
|
||||
|
|
32
CODEOWNERS
32
CODEOWNERS
|
@ -1,32 +0,0 @@
|
|||
# This file describes the expected reviewers for a PR based on the changed
|
||||
# files. Unlike what the name of the file suggests they don't own the code, but
|
||||
# merely have a good understanding of that area of the codebase and therefore
|
||||
# are usually suited as a reviewer.
|
||||
|
||||
|
||||
# Please mind the alphabetic order of reviewers.
|
||||
|
||||
# Files related to the CI of the Forgejo project.
|
||||
.forgejo/.* @dachary @earl-warren
|
||||
|
||||
# Files related to frontend development.
|
||||
|
||||
# Javascript and CSS code.
|
||||
web_src/.* @caesar @crystal @gusted
|
||||
|
||||
# HTML templates used by the backend.
|
||||
templates/.* @caesar @crystal @gusted
|
||||
|
||||
# Files related to Go development.
|
||||
|
||||
# The modules usually don't require much knowledge about Forgejo and could
|
||||
# be reviewed by Go developers.
|
||||
modules/.* @dachary @earl-warren @gusted
|
||||
|
||||
# Models has code related to SQL queries, general database knowledge and XORM.
|
||||
models/.* @dachary @earl-warren @gusted
|
||||
|
||||
# The routers directory contains the most amount code that requires a good grasp
|
||||
# of how Forgejo comes together. It's tedious to write good integration testing
|
||||
# for code that lives in here.
|
||||
routers/.* @dachary @earl-warren @gusted
|
|
@ -4,6 +4,40 @@ A Forgejo release is published shortly after a Gitea release is published and th
|
|||
|
||||
The Forgejo admin should carefully read the required manual actions before upgrading. A point release (e.g. v1.21.1-0 or v1.21.2-0) does not require manual actions but others might (e.g. v1.20, v1.21).
|
||||
|
||||
## 1.21.8-0
|
||||
|
||||
The [complete list of commits](https://codeberg.org/forgejo/forgejo/commits/branch/v1.21/forgejo) included in the `Forgejo v1.21.8-0` release can be reviewed from the command line with:
|
||||
|
||||
```shell
|
||||
$ git clone https://codeberg.org/forgejo/forgejo/
|
||||
$ git -C forgejo log --oneline --no-merges v1.21.7-0..v1.21.8-0
|
||||
```
|
||||
|
||||
This stable release contains bug fixes.
|
||||
|
||||
* Recommended Action
|
||||
|
||||
We recommend that all Forgejo installations are [upgraded](https://forgejo.org/docs/v1.21/admin/upgrade/) to the latest version.
|
||||
|
||||
* [Forgejo Semantic Version](https://forgejo.org/docs/v1.21/user/semver/)
|
||||
|
||||
The semantic version was updated to `6.0.8+0-gitea-1.21.8`
|
||||
|
||||
* Bug fixes
|
||||
|
||||
The most prominent ones are described here, others can be found in the list of commits included in the release as described above.
|
||||
|
||||
* [Fix `/api/v1/{owner}/{repo}/issue_templates`](https://codeberg.org/forgejo/forgejo/commit/969d3f44101402afd9dd848e79dd5823d547a00d) which was always failing with a 500 error.
|
||||
* [Prevent error 500 on /user/settings/security when SignedUser has a linked account from a deactivated authentication source](https://codeberg.org/forgejo/forgejo/commit/d9418651af8c8a3276ebc40a516109c0f33139b0).
|
||||
* [Fix error 500 when pushing release to an empty repo](https://codeberg.org/forgejo/forgejo/commit/b76f370a3f8993638cad91547491b46631776f59).
|
||||
* [Fix incorrect rendering csv file when file size is larger than UI.CSV.MaxFileSize](https://codeberg.org/forgejo/forgejo/commit/e151e0467341bd25a2465ca15e81ebc0c8fa3fc4).
|
||||
* [Fix error 500 when deleting account with incorrect password or unsupported login type](https://codeberg.org/forgejo/forgejo/commit/66061d28286ee3adf69747c284d40121e2e4b280).
|
||||
* [handle user-defined `name` anchors like `[Link](#link)` linking to `<a name="link"></a>Link`](https://codeberg.org/forgejo/forgejo/commit/03caefbb02854d5c98a26d889e0e30c910651395).
|
||||
* [Use correct head commit for CODEOWNER](https://codeberg.org/forgejo/forgejo/commit/d1cebb0e884a88941e27e2280e117cc04d2665fe).
|
||||
* [Fix manual merge button](https://codeberg.org/forgejo/forgejo/commit/c70719c59c410e5378c04926c66461d7b9f72884).
|
||||
* [Make meilisearch do exact search for issues](https://codeberg.org/forgejo/forgejo/commit/a876ac2c7934fa0f8a66424e178b501e4a341e0f).
|
||||
* [Fix PR creation via api between branches of same repo with head field namespaced](https://codeberg.org/forgejo/forgejo/commit/120a173e24fd359b0b57f2bd1021168645fab5a8).
|
||||
|
||||
## 1.21.7-0
|
||||
|
||||
The [complete list of commits](https://codeberg.org/forgejo/forgejo/commits/branch/v1.21/forgejo) included in the `Forgejo v1.21.7-0` release can be reviewed from the command line with:
|
||||
|
|
2
go.mod
2
go.mod
|
@ -1,6 +1,6 @@
|
|||
module code.gitea.io/gitea
|
||||
|
||||
go 1.21
|
||||
go 1.22
|
||||
|
||||
require (
|
||||
code.gitea.io/actions-proto-go v0.4.0
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
repo_id: 2 # private
|
||||
is_private: true
|
||||
created_unix: 1603228283
|
||||
content: '1|' # issueId 4
|
||||
|
||||
-
|
||||
id: 2
|
||||
|
|
|
@ -17,6 +17,195 @@
|
|||
updated: 1683636626
|
||||
need_approval: 0
|
||||
approved_by: 0
|
||||
event_payload: |
|
||||
{
|
||||
"after": "7a3858dc7f059543a8807a8b551304b7e362a7ef",
|
||||
"before": "0000000000000000000000000000000000000000",
|
||||
"commits": [
|
||||
{
|
||||
"added": [
|
||||
".forgejo/workflows/test.yml"
|
||||
],
|
||||
"author": {
|
||||
"email": "root@example.com",
|
||||
"name": "username",
|
||||
"username": "root"
|
||||
},
|
||||
"committer": {
|
||||
"email": "root@example.com",
|
||||
"name": "username",
|
||||
"username": "root"
|
||||
},
|
||||
"id": "7a3858dc7f059543a8807a8b551304b7e362a7ef",
|
||||
"message": "initial commit\n",
|
||||
"modified": [],
|
||||
"removed": [],
|
||||
"timestamp": "2024-01-24T18:59:25Z",
|
||||
"url": "http://10.201.14.40:3000/root/example-push/commit/7a3858dc7f059543a8807a8b551304b7e362a7ef",
|
||||
"verification": null
|
||||
}
|
||||
],
|
||||
"compare_url": "http://10.201.14.40:3000/",
|
||||
"head_commit": {
|
||||
"added": [
|
||||
".forgejo/workflows/test.yml"
|
||||
],
|
||||
"author": {
|
||||
"email": "root@example.com",
|
||||
"name": "username",
|
||||
"username": "root"
|
||||
},
|
||||
"committer": {
|
||||
"email": "root@example.com",
|
||||
"name": "username",
|
||||
"username": "root"
|
||||
},
|
||||
"id": "7a3858dc7f059543a8807a8b551304b7e362a7ef",
|
||||
"message": "initial commit\n",
|
||||
"modified": [],
|
||||
"removed": [],
|
||||
"timestamp": "2024-01-24T18:59:25Z",
|
||||
"url": "http://10.201.14.40:3000/root/example-push/commit/7a3858dc7f059543a8807a8b551304b7e362a7ef",
|
||||
"verification": null
|
||||
},
|
||||
"pusher": {
|
||||
"active": false,
|
||||
"avatar_url": "http://10.201.14.40:3000/avatars/04edfc0ef6c6cf6d6b88fbc69f9f9071",
|
||||
"created": "2024-01-24T18:57:32Z",
|
||||
"description": "",
|
||||
"email": "root@noreply.10.201.14.40",
|
||||
"followers_count": 0,
|
||||
"following_count": 0,
|
||||
"full_name": "",
|
||||
"id": 1,
|
||||
"is_admin": false,
|
||||
"language": "",
|
||||
"last_login": "0001-01-01T00:00:00Z",
|
||||
"location": "",
|
||||
"login": "root",
|
||||
"login_name": "",
|
||||
"prohibit_login": false,
|
||||
"restricted": false,
|
||||
"starred_repos_count": 0,
|
||||
"username": "root",
|
||||
"visibility": "public",
|
||||
"website": ""
|
||||
},
|
||||
"ref": "refs/heads/main",
|
||||
"repository": {
|
||||
"allow_merge_commits": true,
|
||||
"allow_rebase": true,
|
||||
"allow_rebase_explicit": true,
|
||||
"allow_rebase_update": true,
|
||||
"allow_squash_merge": true,
|
||||
"archived": false,
|
||||
"archived_at": "1970-01-01T00:00:00Z",
|
||||
"avatar_url": "",
|
||||
"clone_url": "http://10.201.14.40:3000/root/example-push.git",
|
||||
"created_at": "2024-01-24T18:59:25Z",
|
||||
"default_allow_maintainer_edit": false,
|
||||
"default_branch": "main",
|
||||
"default_delete_branch_after_merge": false,
|
||||
"default_merge_style": "merge",
|
||||
"description": "",
|
||||
"empty": false,
|
||||
"fork": false,
|
||||
"forks_count": 0,
|
||||
"full_name": "root/example-push",
|
||||
"has_actions": true,
|
||||
"has_issues": true,
|
||||
"has_packages": true,
|
||||
"has_projects": true,
|
||||
"has_pull_requests": true,
|
||||
"has_releases": true,
|
||||
"has_wiki": true,
|
||||
"html_url": "http://10.201.14.40:3000/root/example-push",
|
||||
"id": 2,
|
||||
"ignore_whitespace_conflicts": false,
|
||||
"internal": false,
|
||||
"internal_tracker": {
|
||||
"allow_only_contributors_to_track_time": true,
|
||||
"enable_issue_dependencies": true,
|
||||
"enable_time_tracker": true
|
||||
},
|
||||
"language": "",
|
||||
"languages_url": "http://10.201.14.40:3000/api/v1/repos/root/example-push/languages",
|
||||
"link": "",
|
||||
"mirror": false,
|
||||
"mirror_interval": "",
|
||||
"mirror_updated": "0001-01-01T00:00:00Z",
|
||||
"name": "example-push",
|
||||
"object_format_name": "",
|
||||
"open_issues_count": 0,
|
||||
"open_pr_counter": 0,
|
||||
"original_url": "",
|
||||
"owner": {
|
||||
"active": false,
|
||||
"avatar_url": "http://10.201.14.40:3000/avatars/04edfc0ef6c6cf6d6b88fbc69f9f9071",
|
||||
"created": "2024-01-24T18:57:32Z",
|
||||
"description": "",
|
||||
"email": "root@example.com",
|
||||
"followers_count": 0,
|
||||
"following_count": 0,
|
||||
"full_name": "",
|
||||
"id": 1,
|
||||
"is_admin": false,
|
||||
"language": "",
|
||||
"last_login": "0001-01-01T00:00:00Z",
|
||||
"location": "",
|
||||
"login": "root",
|
||||
"login_name": "",
|
||||
"prohibit_login": false,
|
||||
"restricted": false,
|
||||
"starred_repos_count": 0,
|
||||
"username": "root",
|
||||
"visibility": "public",
|
||||
"website": ""
|
||||
},
|
||||
"parent": null,
|
||||
"permissions": {
|
||||
"admin": true,
|
||||
"pull": true,
|
||||
"push": true
|
||||
},
|
||||
"private": false,
|
||||
"release_counter": 0,
|
||||
"repo_transfer": null,
|
||||
"size": 25,
|
||||
"ssh_url": "forgejo@10.201.14.40:root/example-push.git",
|
||||
"stars_count": 0,
|
||||
"template": false,
|
||||
"updated_at": "2024-01-24T18:59:25Z",
|
||||
"url": "http://10.201.14.40:3000/api/v1/repos/root/example-push",
|
||||
"watchers_count": 1,
|
||||
"website": ""
|
||||
},
|
||||
"sender": {
|
||||
"active": false,
|
||||
"avatar_url": "http://10.201.14.40:3000/avatars/04edfc0ef6c6cf6d6b88fbc69f9f9071",
|
||||
"created": "2024-01-24T18:57:32Z",
|
||||
"description": "",
|
||||
"email": "root@noreply.10.201.14.40",
|
||||
"followers_count": 0,
|
||||
"following_count": 0,
|
||||
"full_name": "",
|
||||
"id": 1,
|
||||
"is_admin": false,
|
||||
"language": "",
|
||||
"last_login": "0001-01-01T00:00:00Z",
|
||||
"location": "",
|
||||
"login": "root",
|
||||
"login_name": "",
|
||||
"prohibit_login": false,
|
||||
"restricted": false,
|
||||
"starred_repos_count": 0,
|
||||
"username": "root",
|
||||
"visibility": "public",
|
||||
"website": ""
|
||||
},
|
||||
"total_commits": 0
|
||||
}
|
||||
|
||||
-
|
||||
id: 792
|
||||
title: "update actions"
|
||||
|
@ -36,3 +225,191 @@
|
|||
updated: 1683636626
|
||||
need_approval: 0
|
||||
approved_by: 0
|
||||
event_payload: |
|
||||
{
|
||||
"after": "7a3858dc7f059543a8807a8b551304b7e362a7ef",
|
||||
"before": "0000000000000000000000000000000000000000",
|
||||
"commits": [
|
||||
{
|
||||
"added": [
|
||||
".forgejo/workflows/test.yml"
|
||||
],
|
||||
"author": {
|
||||
"email": "root@example.com",
|
||||
"name": "username",
|
||||
"username": "root"
|
||||
},
|
||||
"committer": {
|
||||
"email": "root@example.com",
|
||||
"name": "username",
|
||||
"username": "root"
|
||||
},
|
||||
"id": "7a3858dc7f059543a8807a8b551304b7e362a7ef",
|
||||
"message": "initial commit\n",
|
||||
"modified": [],
|
||||
"removed": [],
|
||||
"timestamp": "2024-01-24T18:59:25Z",
|
||||
"url": "http://10.201.14.40:3000/root/example-push/commit/7a3858dc7f059543a8807a8b551304b7e362a7ef",
|
||||
"verification": null
|
||||
}
|
||||
],
|
||||
"compare_url": "http://10.201.14.40:3000/",
|
||||
"head_commit": {
|
||||
"added": [
|
||||
".forgejo/workflows/test.yml"
|
||||
],
|
||||
"author": {
|
||||
"email": "root@example.com",
|
||||
"name": "username",
|
||||
"username": "root"
|
||||
},
|
||||
"committer": {
|
||||
"email": "root@example.com",
|
||||
"name": "username",
|
||||
"username": "root"
|
||||
},
|
||||
"id": "7a3858dc7f059543a8807a8b551304b7e362a7ef",
|
||||
"message": "initial commit\n",
|
||||
"modified": [],
|
||||
"removed": [],
|
||||
"timestamp": "2024-01-24T18:59:25Z",
|
||||
"url": "http://10.201.14.40:3000/root/example-push/commit/7a3858dc7f059543a8807a8b551304b7e362a7ef",
|
||||
"verification": null
|
||||
},
|
||||
"pusher": {
|
||||
"active": false,
|
||||
"avatar_url": "http://10.201.14.40:3000/avatars/04edfc0ef6c6cf6d6b88fbc69f9f9071",
|
||||
"created": "2024-01-24T18:57:32Z",
|
||||
"description": "",
|
||||
"email": "root@noreply.10.201.14.40",
|
||||
"followers_count": 0,
|
||||
"following_count": 0,
|
||||
"full_name": "",
|
||||
"id": 1,
|
||||
"is_admin": false,
|
||||
"language": "",
|
||||
"last_login": "0001-01-01T00:00:00Z",
|
||||
"location": "",
|
||||
"login": "root",
|
||||
"login_name": "",
|
||||
"prohibit_login": false,
|
||||
"restricted": false,
|
||||
"starred_repos_count": 0,
|
||||
"username": "root",
|
||||
"visibility": "public",
|
||||
"website": ""
|
||||
},
|
||||
"ref": "refs/heads/main",
|
||||
"repository": {
|
||||
"allow_merge_commits": true,
|
||||
"allow_rebase": true,
|
||||
"allow_rebase_explicit": true,
|
||||
"allow_rebase_update": true,
|
||||
"allow_squash_merge": true,
|
||||
"archived": false,
|
||||
"archived_at": "1970-01-01T00:00:00Z",
|
||||
"avatar_url": "",
|
||||
"clone_url": "http://10.201.14.40:3000/root/example-push.git",
|
||||
"created_at": "2024-01-24T18:59:25Z",
|
||||
"default_allow_maintainer_edit": false,
|
||||
"default_branch": "main",
|
||||
"default_delete_branch_after_merge": false,
|
||||
"default_merge_style": "merge",
|
||||
"description": "",
|
||||
"empty": false,
|
||||
"fork": false,
|
||||
"forks_count": 0,
|
||||
"full_name": "root/example-push",
|
||||
"has_actions": true,
|
||||
"has_issues": true,
|
||||
"has_packages": true,
|
||||
"has_projects": true,
|
||||
"has_pull_requests": true,
|
||||
"has_releases": true,
|
||||
"has_wiki": true,
|
||||
"html_url": "http://10.201.14.40:3000/root/example-push",
|
||||
"id": 2,
|
||||
"ignore_whitespace_conflicts": false,
|
||||
"internal": false,
|
||||
"internal_tracker": {
|
||||
"allow_only_contributors_to_track_time": true,
|
||||
"enable_issue_dependencies": true,
|
||||
"enable_time_tracker": true
|
||||
},
|
||||
"language": "",
|
||||
"languages_url": "http://10.201.14.40:3000/api/v1/repos/root/example-push/languages",
|
||||
"link": "",
|
||||
"mirror": false,
|
||||
"mirror_interval": "",
|
||||
"mirror_updated": "0001-01-01T00:00:00Z",
|
||||
"name": "example-push",
|
||||
"object_format_name": "",
|
||||
"open_issues_count": 0,
|
||||
"open_pr_counter": 0,
|
||||
"original_url": "",
|
||||
"owner": {
|
||||
"active": false,
|
||||
"avatar_url": "http://10.201.14.40:3000/avatars/04edfc0ef6c6cf6d6b88fbc69f9f9071",
|
||||
"created": "2024-01-24T18:57:32Z",
|
||||
"description": "",
|
||||
"email": "root@example.com",
|
||||
"followers_count": 0,
|
||||
"following_count": 0,
|
||||
"full_name": "",
|
||||
"id": 1,
|
||||
"is_admin": false,
|
||||
"language": "",
|
||||
"last_login": "0001-01-01T00:00:00Z",
|
||||
"location": "",
|
||||
"login": "root",
|
||||
"login_name": "",
|
||||
"prohibit_login": false,
|
||||
"restricted": false,
|
||||
"starred_repos_count": 0,
|
||||
"username": "root",
|
||||
"visibility": "public",
|
||||
"website": ""
|
||||
},
|
||||
"parent": null,
|
||||
"permissions": {
|
||||
"admin": true,
|
||||
"pull": true,
|
||||
"push": true
|
||||
},
|
||||
"private": false,
|
||||
"release_counter": 0,
|
||||
"repo_transfer": null,
|
||||
"size": 25,
|
||||
"ssh_url": "forgejo@10.201.14.40:root/example-push.git",
|
||||
"stars_count": 0,
|
||||
"template": false,
|
||||
"updated_at": "2024-01-24T18:59:25Z",
|
||||
"url": "http://10.201.14.40:3000/api/v1/repos/root/example-push",
|
||||
"watchers_count": 1,
|
||||
"website": ""
|
||||
},
|
||||
"sender": {
|
||||
"active": false,
|
||||
"avatar_url": "http://10.201.14.40:3000/avatars/04edfc0ef6c6cf6d6b88fbc69f9f9071",
|
||||
"created": "2024-01-24T18:57:32Z",
|
||||
"description": "",
|
||||
"email": "root@noreply.10.201.14.40",
|
||||
"followers_count": 0,
|
||||
"following_count": 0,
|
||||
"full_name": "",
|
||||
"id": 1,
|
||||
"is_admin": false,
|
||||
"language": "",
|
||||
"last_login": "0001-01-01T00:00:00Z",
|
||||
"location": "",
|
||||
"login": "root",
|
||||
"login_name": "",
|
||||
"prohibit_login": false,
|
||||
"restricted": false,
|
||||
"starred_repos_count": 0,
|
||||
"username": "root",
|
||||
"visibility": "public",
|
||||
"website": ""
|
||||
},
|
||||
"total_commits": 0
|
||||
}
|
||||
|
|
|
@ -1,15 +1,17 @@
|
|||
-
|
||||
id: 1
|
||||
repo_id: 1
|
||||
url: www.example.com/url1
|
||||
url: http://www.example.com/url1
|
||||
http_method: POST
|
||||
content_type: 1 # json
|
||||
events: '{"push_only":true,"send_everything":false,"choose_events":false,"events":{"create":false,"push":true,"pull_request":false}}'
|
||||
is_active: true
|
||||
is_active: false # disable to prevent sending hook task during unrelated tests
|
||||
|
||||
-
|
||||
id: 2
|
||||
repo_id: 1
|
||||
url: www.example.com/url2
|
||||
url: http://www.example.com/url2
|
||||
http_method: POST
|
||||
content_type: 1 # json
|
||||
events: '{"push_only":false,"send_everything":false,"choose_events":false,"events":{"create":false,"push":true,"pull_request":true}}'
|
||||
is_active: false
|
||||
|
@ -18,14 +20,16 @@
|
|||
id: 3
|
||||
owner_id: 3
|
||||
repo_id: 3
|
||||
url: www.example.com/url3
|
||||
url: http://www.example.com/url3
|
||||
http_method: POST
|
||||
content_type: 1 # json
|
||||
events: '{"push_only":false,"send_everything":false,"choose_events":false,"events":{"create":false,"push":true,"pull_request":true}}'
|
||||
is_active: true
|
||||
is_active: false
|
||||
-
|
||||
id: 4
|
||||
repo_id: 2
|
||||
url: www.example.com/url4
|
||||
url: http://www.example.com/url4
|
||||
http_method: POST
|
||||
content_type: 1 # json
|
||||
events: '{"push_only":true,"branch_filter":"{master,feature*}"}'
|
||||
is_active: true
|
||||
is_active: false
|
||||
|
|
|
@ -50,6 +50,8 @@ var migrations = []*Migration{
|
|||
NewMigration("create the forgejo_repo_flag table", forgejo_v1_22.CreateRepoFlagTable),
|
||||
// v5 -> v6
|
||||
NewMigration("Add wiki_branch to repository", forgejo_v1_22.AddWikiBranchToRepository),
|
||||
// v6 -> v7
|
||||
NewMigration("Add enable_repo_unit_hints to the user table", forgejo_v1_22.AddUserRepoUnitHintsSetting),
|
||||
}
|
||||
|
||||
// GetCurrentDBVersion returns the current Forgejo database version.
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
// Copyright 2024 The Forgejo Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package v1_22 //nolint
|
||||
|
||||
import (
|
||||
"xorm.io/xorm"
|
||||
)
|
||||
|
||||
func AddUserRepoUnitHintsSetting(x *xorm.Engine) error {
|
||||
type User struct {
|
||||
ID int64
|
||||
EnableRepoUnitHints bool `xorm:"NOT NULL DEFAULT true"`
|
||||
}
|
||||
|
||||
return x.Sync(&User{})
|
||||
}
|
|
@ -199,22 +199,17 @@ func (status *CommitStatus) LocaleString(lang translation.Locale) string {
|
|||
|
||||
// CalcCommitStatus returns commit status state via some status, the commit statues should order by id desc
|
||||
func CalcCommitStatus(statuses []*CommitStatus) *CommitStatus {
|
||||
var lastStatus *CommitStatus
|
||||
state := api.CommitStatusSuccess
|
||||
for _, status := range statuses {
|
||||
if status.State.NoBetterThan(state) {
|
||||
state = status.State
|
||||
lastStatus = status
|
||||
if len(statuses) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
latestWorstStatus := statuses[0]
|
||||
for _, status := range statuses[1:] {
|
||||
if status.State.NoBetterThan(latestWorstStatus.State) {
|
||||
latestWorstStatus = status
|
||||
}
|
||||
}
|
||||
if lastStatus == nil {
|
||||
if len(statuses) > 0 {
|
||||
lastStatus = statuses[0]
|
||||
} else {
|
||||
lastStatus = &CommitStatus{}
|
||||
}
|
||||
}
|
||||
return lastStatus
|
||||
return latestWorstStatus
|
||||
}
|
||||
|
||||
// CommitStatusOptions holds the options for query commit statuses
|
||||
|
|
|
@ -141,16 +141,20 @@ func Test_CalcCommitStatus(t *testing.T) {
|
|||
statuses: []*git_model.CommitStatus{
|
||||
{
|
||||
State: structs.CommitStatusSuccess,
|
||||
ID: 1,
|
||||
},
|
||||
{
|
||||
State: structs.CommitStatusSuccess,
|
||||
ID: 2,
|
||||
},
|
||||
{
|
||||
State: structs.CommitStatusSuccess,
|
||||
ID: 3,
|
||||
},
|
||||
},
|
||||
expected: &git_model.CommitStatus{
|
||||
State: structs.CommitStatusSuccess,
|
||||
ID: 3,
|
||||
},
|
||||
},
|
||||
{
|
||||
|
@ -169,6 +173,10 @@ func Test_CalcCommitStatus(t *testing.T) {
|
|||
State: structs.CommitStatusError,
|
||||
},
|
||||
},
|
||||
{
|
||||
statuses: []*git_model.CommitStatus{},
|
||||
expected: nil,
|
||||
},
|
||||
}
|
||||
|
||||
for _, kase := range kases {
|
||||
|
|
|
@ -500,7 +500,7 @@ func (issue *Issue) GetLastEventLabelFake() string {
|
|||
// GetIssueByIndex returns raw issue without loading attributes by index in a repository.
|
||||
func GetIssueByIndex(ctx context.Context, repoID, index int64) (*Issue, error) {
|
||||
if index < 1 {
|
||||
return nil, ErrIssueNotExist{}
|
||||
return nil, ErrIssueNotExist{0, repoID, index}
|
||||
}
|
||||
issue := &Issue{
|
||||
RepoID: repoID,
|
||||
|
|
|
@ -160,6 +160,10 @@ func MainTest(m *testing.M) {
|
|||
|
||||
exitStatus := m.Run()
|
||||
|
||||
if err := testlogger.WriterCloser.Reset(); err != nil && exitStatus == 0 {
|
||||
fmt.Printf("testlogger.WriterCloser.Reset: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
if err := removeAllWithRetry(setting.RepoRootPath); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "os.RemoveAll: %v\n", err)
|
||||
}
|
||||
|
|
|
@ -23,9 +23,9 @@ func AddBranchProtectionCanPushAndEnableWhitelist(x *xorm.Engine) error {
|
|||
Type int
|
||||
|
||||
// Permissions
|
||||
IsAdmin bool
|
||||
IsRestricted bool `xorm:"NOT NULL DEFAULT false"`
|
||||
Visibility int `xorm:"NOT NULL DEFAULT 0"`
|
||||
IsAdmin bool
|
||||
// IsRestricted bool `xorm:"NOT NULL DEFAULT false"` glitch: this column was added in v1_12/v121.go
|
||||
// Visibility int `xorm:"NOT NULL DEFAULT 0"` glitch: this column was added in v1_12/v124.go
|
||||
}
|
||||
|
||||
type Review struct {
|
||||
|
@ -51,9 +51,9 @@ func AddBranchProtectionCanPushAndEnableWhitelist(x *xorm.Engine) error {
|
|||
ReviewTypeReject int = 3
|
||||
|
||||
// VisibleTypePublic Visible for everyone
|
||||
VisibleTypePublic int = 0
|
||||
// VisibleTypePublic int = 0
|
||||
// VisibleTypePrivate Visible only for organization's members
|
||||
VisibleTypePrivate int = 2
|
||||
// VisibleTypePrivate int = 2
|
||||
|
||||
// unit.UnitTypeCode is unit type code
|
||||
UnitTypeCode int = 1
|
||||
|
@ -145,9 +145,9 @@ func AddBranchProtectionCanPushAndEnableWhitelist(x *xorm.Engine) error {
|
|||
hasOrgVisible := true
|
||||
// Not SignedUser
|
||||
if user == nil {
|
||||
hasOrgVisible = repoOwner.Visibility == VisibleTypePublic
|
||||
// hasOrgVisible = repoOwner.Visibility == VisibleTypePublic // VisibleTypePublic is the default
|
||||
} else if !user.IsAdmin {
|
||||
hasMemberWithUserID, err := sess.
|
||||
_, err := sess.
|
||||
Where("uid=?", user.ID).
|
||||
And("org_id=?", repoOwner.ID).
|
||||
Table("org_user").
|
||||
|
@ -155,9 +155,10 @@ func AddBranchProtectionCanPushAndEnableWhitelist(x *xorm.Engine) error {
|
|||
if err != nil {
|
||||
hasOrgVisible = false
|
||||
}
|
||||
if (repoOwner.Visibility == VisibleTypePrivate || user.IsRestricted) && !hasMemberWithUserID {
|
||||
hasOrgVisible = false
|
||||
}
|
||||
// VisibleTypePublic is the default so the condition below is always false
|
||||
// if (repoOwner.Visibility == VisibleTypePrivate) && !hasMemberWithUserID {
|
||||
// hasOrgVisible = false
|
||||
// }
|
||||
}
|
||||
|
||||
isCollaborator, err := sess.Get(&Collaboration{RepoID: repo.ID, UserID: user.ID})
|
||||
|
@ -195,7 +196,7 @@ func AddBranchProtectionCanPushAndEnableWhitelist(x *xorm.Engine) error {
|
|||
|
||||
if user != nil {
|
||||
userID = user.ID
|
||||
restricted = user.IsRestricted
|
||||
restricted = false
|
||||
}
|
||||
|
||||
if !restricted && !repo.IsPrivate {
|
||||
|
@ -284,7 +285,7 @@ func AddBranchProtectionCanPushAndEnableWhitelist(x *xorm.Engine) error {
|
|||
}
|
||||
|
||||
// for a public repo on an organization, a non-restricted user has read permission on non-team defined units.
|
||||
if !found && !repo.IsPrivate && !user.IsRestricted {
|
||||
if !found && !repo.IsPrivate {
|
||||
if _, ok := perm.UnitsMode[u.Type]; !ok {
|
||||
perm.UnitsMode[u.Type] = AccessModeRead
|
||||
}
|
||||
|
|
|
@ -94,7 +94,7 @@ func FixMergeBase(x *xorm.Engine) error {
|
|||
} else {
|
||||
parentsString, _, err := git.NewCommand(git.DefaultContext, "rev-list", "--parents", "-n", "1").AddDynamicArguments(pr.MergedCommitID).RunStdString(&git.RunOpts{Dir: repoPath})
|
||||
if err != nil {
|
||||
log.Error("Unable to get parents for merged PR ID %d, Index %d in %s/%s. Error: %v", pr.ID, pr.Index, baseRepo.OwnerName, baseRepo.Name, err)
|
||||
log.Warn("Unable to get parents for merged PR ID %d, Index %d in %s/%s. Error: %v", pr.ID, pr.Index, baseRepo.OwnerName, baseRepo.Name, err)
|
||||
continue
|
||||
}
|
||||
parents := strings.Split(strings.TrimSpace(parentsString), " ")
|
||||
|
|
|
@ -81,7 +81,7 @@ func RefixMergeBase(x *xorm.Engine) error {
|
|||
|
||||
parentsString, _, err := git.NewCommand(git.DefaultContext, "rev-list", "--parents", "-n", "1").AddDynamicArguments(pr.MergedCommitID).RunStdString(&git.RunOpts{Dir: repoPath})
|
||||
if err != nil {
|
||||
log.Error("Unable to get parents for merged PR ID %d, Index %d in %s/%s. Error: %v", pr.ID, pr.Index, baseRepo.OwnerName, baseRepo.Name, err)
|
||||
log.Warn("Unable to get parents for merged PR ID %d, Index %d in %s/%s. Error: %v", pr.ID, pr.Index, baseRepo.OwnerName, baseRepo.Name, err)
|
||||
continue
|
||||
}
|
||||
parents := strings.Split(strings.TrimSpace(parentsString), " ")
|
||||
|
|
|
@ -146,6 +146,7 @@ type User struct {
|
|||
DiffViewStyle string `xorm:"NOT NULL DEFAULT ''"`
|
||||
Theme string `xorm:"NOT NULL DEFAULT ''"`
|
||||
KeepActivityPrivate bool `xorm:"NOT NULL DEFAULT false"`
|
||||
EnableRepoUnitHints bool `xorm:"NOT NULL DEFAULT true"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
|
|
|
@ -451,6 +451,13 @@ func (opts ListWebhookOptions) ToConds() builder.Cond {
|
|||
return cond
|
||||
}
|
||||
|
||||
var _ db.FindOptionsOrder = ListWebhookOptions{}
|
||||
|
||||
// ToOrders implements db.FindOptionsOrder, to sort the webhooks by id asc
|
||||
func (opts ListWebhookOptions) ToOrders() string {
|
||||
return "webhook.id"
|
||||
}
|
||||
|
||||
// UpdateWebhook updates information of webhook.
|
||||
func UpdateWebhook(ctx context.Context, w *Webhook) error {
|
||||
_, err := db.GetEngine(ctx).ID(w.ID).AllCols().Update(w)
|
||||
|
|
|
@ -124,6 +124,9 @@ func TestGetWebhookByOwnerID(t *testing.T) {
|
|||
|
||||
func TestGetActiveWebhooksByRepoID(t *testing.T) {
|
||||
assert.NoError(t, unittest.PrepareTestDatabase())
|
||||
|
||||
activateWebhook(t, 1)
|
||||
|
||||
hooks, err := db.Find[Webhook](db.DefaultContext, ListWebhookOptions{RepoID: 1, IsActive: optional.Some(true)})
|
||||
assert.NoError(t, err)
|
||||
if assert.Len(t, hooks, 1) {
|
||||
|
@ -144,6 +147,9 @@ func TestGetWebhooksByRepoID(t *testing.T) {
|
|||
|
||||
func TestGetActiveWebhooksByOwnerID(t *testing.T) {
|
||||
assert.NoError(t, unittest.PrepareTestDatabase())
|
||||
|
||||
activateWebhook(t, 3)
|
||||
|
||||
hooks, err := db.Find[Webhook](db.DefaultContext, ListWebhookOptions{OwnerID: 3, IsActive: optional.Some(true)})
|
||||
assert.NoError(t, err)
|
||||
if assert.Len(t, hooks, 1) {
|
||||
|
@ -152,8 +158,18 @@ func TestGetActiveWebhooksByOwnerID(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func activateWebhook(t *testing.T, hookID int64) {
|
||||
t.Helper()
|
||||
updated, err := db.GetEngine(db.DefaultContext).ID(hookID).Cols("is_active").Update(Webhook{IsActive: true})
|
||||
assert.Equal(t, int64(1), updated)
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestGetWebhooksByOwnerID(t *testing.T) {
|
||||
assert.NoError(t, unittest.PrepareTestDatabase())
|
||||
|
||||
activateWebhook(t, 3)
|
||||
|
||||
hooks, err := db.Find[Webhook](db.DefaultContext, ListWebhookOptions{OwnerID: 3})
|
||||
assert.NoError(t, err)
|
||||
if assert.Len(t, hooks, 1) {
|
||||
|
|
|
@ -174,10 +174,3 @@ func NewColorPreview(color []byte) *ColorPreview {
|
|||
Color: color,
|
||||
}
|
||||
}
|
||||
|
||||
// IsColorPreview returns true if the given node implements the ColorPreview interface,
|
||||
// otherwise false.
|
||||
func IsColorPreview(node ast.Node) bool {
|
||||
_, ok := node.(*ColorPreview)
|
||||
return ok
|
||||
}
|
||||
|
|
|
@ -68,9 +68,10 @@ func (g *GitHubCalloutTransformer) Transform(node *ast.Document, reader text.Rea
|
|||
}
|
||||
|
||||
// color the blockquote
|
||||
v.SetAttributeString("class", []byte("gt-py-3 attention attention-"+attentionType))
|
||||
v.SetAttributeString("class", []byte("attention-header attention-"+attentionType))
|
||||
|
||||
// create an emphasis to make it bold
|
||||
attentionParagraph := ast.NewParagraph()
|
||||
emphasis := ast.NewEmphasis(2)
|
||||
emphasis.SetAttributeString("class", []byte("attention-"+attentionType))
|
||||
firstParagraph.InsertBefore(firstParagraph, firstTextNode, emphasis)
|
||||
|
@ -78,14 +79,11 @@ func (g *GitHubCalloutTransformer) Transform(node *ast.Document, reader text.Rea
|
|||
// capitalize first letter
|
||||
attentionText := ast.NewString([]byte(strings.ToUpper(string(attentionType[0])) + attentionType[1:]))
|
||||
|
||||
// replace the ![TYPE] with icon+Type
|
||||
// replace the ![TYPE] with a dedicated paragraph of icon+Type
|
||||
emphasis.AppendChild(emphasis, attentionText)
|
||||
for i := 0; i < 2; i++ {
|
||||
lineBreak := ast.NewText()
|
||||
lineBreak.SetSoftLineBreak(true)
|
||||
firstParagraph.InsertAfter(firstParagraph, emphasis, lineBreak)
|
||||
}
|
||||
firstParagraph.InsertBefore(firstParagraph, emphasis, NewAttention(attentionType))
|
||||
attentionParagraph.AppendChild(attentionParagraph, NewAttention(attentionType))
|
||||
attentionParagraph.AppendChild(attentionParagraph, emphasis)
|
||||
firstParagraph.Parent().InsertBefore(firstParagraph.Parent(), firstParagraph, attentionParagraph)
|
||||
firstParagraph.RemoveChild(firstParagraph, firstTextNode)
|
||||
firstParagraph.RemoveChild(firstParagraph, secondTextNode)
|
||||
firstParagraph.RemoveChild(firstParagraph, thirdTextNode)
|
||||
|
@ -106,27 +104,24 @@ func (r *GitHubCalloutHTMLRenderer) RegisterFuncs(reg renderer.NodeRendererFuncR
|
|||
// renderAttention renders a quote marked with i.e. "> **Note**" or "> **Warning**" with a corresponding svg
|
||||
func (r *GitHubCalloutHTMLRenderer) renderAttention(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
|
||||
if entering {
|
||||
_, _ = w.WriteString(`<span class="gt-mr-2 gt-vm attention-`)
|
||||
n := node.(*Attention)
|
||||
_, _ = w.WriteString(strings.ToLower(n.AttentionType))
|
||||
_, _ = w.WriteString(`">`)
|
||||
|
||||
var octiconType string
|
||||
var octiconName string
|
||||
switch n.AttentionType {
|
||||
case "note":
|
||||
octiconType = "info"
|
||||
octiconName = "info"
|
||||
case "tip":
|
||||
octiconType = "light-bulb"
|
||||
octiconName = "light-bulb"
|
||||
case "important":
|
||||
octiconType = "report"
|
||||
octiconName = "report"
|
||||
case "warning":
|
||||
octiconType = "alert"
|
||||
octiconName = "alert"
|
||||
case "caution":
|
||||
octiconType = "stop"
|
||||
octiconName = "stop"
|
||||
default:
|
||||
octiconName = "info"
|
||||
}
|
||||
_, _ = w.WriteString(string(svg.RenderHTML("octicon-" + octiconType)))
|
||||
} else {
|
||||
_, _ = w.WriteString("</span>\n")
|
||||
_, _ = w.WriteString(string(svg.RenderHTML("octicon-"+octiconName, 16, "attention-icon attention-"+n.AttentionType)))
|
||||
}
|
||||
return ast.WalkContinue, nil
|
||||
}
|
||||
|
|
|
@ -49,7 +49,7 @@ func (g *GitHubLegacyCalloutTransformer) Transform(node *ast.Document, reader te
|
|||
calloutNode.SetAttributeString("class", []byte("attention-"+calloutType))
|
||||
|
||||
// color the blockquote
|
||||
v.SetAttributeString("class", []byte("gt-py-3 attention attention-"+calloutType))
|
||||
v.SetAttributeString("class", []byte("attention-header attention-"+calloutType))
|
||||
|
||||
// Prepend callout icon before the callout node itself
|
||||
firstParagraph.InsertBefore(firstParagraph, calloutNode, NewAttention(calloutType))
|
||||
|
|
|
@ -64,10 +64,9 @@ func createDefaultPolicy() *bluemonday.Policy {
|
|||
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^color-preview$`)).OnElements("span")
|
||||
|
||||
// For attention
|
||||
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^gt-py-3 attention attention-\w+$`)).OnElements("blockquote")
|
||||
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^attention-header attention-\w+$`)).OnElements("blockquote")
|
||||
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^attention-\w+$`)).OnElements("strong")
|
||||
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^gt-mr-2 gt-vm attention-\w+$`)).OnElements("span", "strong")
|
||||
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^svg octicon-(\w|-)+$`)).OnElements("svg")
|
||||
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^attention-icon attention-\w+ svg octicon-[\w-]+$`)).OnElements("svg")
|
||||
policy.AllowAttrs("viewBox", "width", "height", "aria-hidden").OnElements("svg")
|
||||
policy.AllowAttrs("fill-rule", "d").OnElements("path")
|
||||
|
||||
|
@ -105,18 +104,12 @@ func createDefaultPolicy() *bluemonday.Policy {
|
|||
// Allow icons
|
||||
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^icon(\s+[\p{L}\p{N}_-]+)+$`)).OnElements("i")
|
||||
|
||||
// Allow unlabelled labels
|
||||
policy.AllowNoAttrs().OnElements("label")
|
||||
|
||||
// Allow classes for emojis
|
||||
policy.AllowAttrs("class").Matching(regexp.MustCompile(`emoji`)).OnElements("img")
|
||||
|
||||
// Allow icons, emojis, chroma syntax and keyword markup on span
|
||||
policy.AllowAttrs("class").Matching(regexp.MustCompile(`^((icon(\s+[\p{L}\p{N}_-]+)+)|(emoji)|(language-math display)|(language-math inline))$|^([a-z][a-z0-9]{0,2})$|^` + keywordClass + `$`)).OnElements("span")
|
||||
|
||||
// Allow 'style' attribute on text elements.
|
||||
policy.AllowAttrs("style").OnElements("span", "p")
|
||||
|
||||
// Allow 'color' and 'background-color' properties for the style attribute on text elements.
|
||||
policy.AllowStyles("color", "background-color").OnElements("span", "p")
|
||||
|
||||
|
@ -144,7 +137,7 @@ func createDefaultPolicy() *bluemonday.Policy {
|
|||
|
||||
generalSafeElements := []string{
|
||||
"h1", "h2", "h3", "h4", "h5", "h6", "h7", "h8", "br", "b", "i", "strong", "em", "a", "pre", "code", "img", "tt",
|
||||
"div", "ins", "del", "sup", "sub", "p", "ol", "ul", "table", "thead", "tbody", "tfoot", "blockquote",
|
||||
"div", "ins", "del", "sup", "sub", "p", "ol", "ul", "table", "thead", "tbody", "tfoot", "blockquote", "label",
|
||||
"dl", "dt", "dd", "kbd", "q", "samp", "var", "hr", "ruby", "rt", "rp", "li", "tr", "td", "th", "s", "strike", "summary",
|
||||
"details", "caption", "figure", "figcaption",
|
||||
"abbr", "bdo", "cite", "dfn", "mark", "small", "span", "time", "video", "wbr",
|
||||
|
|
|
@ -146,8 +146,6 @@ func (q *WorkerPoolQueue[T]) doStartNewWorker(wp *workerGroup[T]) {
|
|||
log.Debug("Queue %q starts new worker", q.GetName())
|
||||
defer log.Debug("Queue %q stops idle worker", q.GetName())
|
||||
|
||||
atomic.AddInt32(&q.workerStartedCounter, 1) // Only increase counter, used for debugging
|
||||
|
||||
t := time.NewTicker(workerIdleDuration)
|
||||
defer t.Stop()
|
||||
|
||||
|
@ -336,7 +334,10 @@ func (q *WorkerPoolQueue[T]) doRun() {
|
|||
// since we are already in a "flush" operation, so the dispatching function shouldn't read the flush chan.
|
||||
q.doDispatchBatchToWorker(wg, skipFlushChan)
|
||||
q.doFlush(wg, flush)
|
||||
case err := <-wg.popItemErr:
|
||||
case err, errOk := <-wg.popItemErr:
|
||||
if !errOk {
|
||||
return
|
||||
}
|
||||
if !q.isCtxRunCanceled() {
|
||||
log.Error("Failed to pop item from queue %q (doRun): %v", q.GetName(), err)
|
||||
}
|
||||
|
|
|
@ -40,8 +40,6 @@ type WorkerPoolQueue[T any] struct {
|
|||
workerMaxNum int
|
||||
workerActiveNum int
|
||||
workerNumMu sync.Mutex
|
||||
|
||||
workerStartedCounter int32
|
||||
}
|
||||
|
||||
type flushType chan struct{}
|
||||
|
|
|
@ -4,7 +4,9 @@
|
|||
package queue
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"sync"
|
||||
"testing"
|
||||
|
@ -14,6 +16,7 @@ import (
|
|||
"code.gitea.io/gitea/modules/test"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func runWorkerPoolQueue[T any](q *WorkerPoolQueue[T]) func() {
|
||||
|
@ -249,23 +252,40 @@ func TestWorkerPoolQueueShutdown(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestWorkerPoolQueueWorkerIdleReset(t *testing.T) {
|
||||
defer test.MockVariableValue(&workerIdleDuration, 10*time.Millisecond)()
|
||||
defer test.MockVariableValue(&workerIdleDuration, 1*time.Millisecond)()
|
||||
|
||||
chGoroutineIDs := make(chan string)
|
||||
handler := func(items ...int) (unhandled []int) {
|
||||
time.Sleep(50 * time.Millisecond)
|
||||
time.Sleep(10 * workerIdleDuration)
|
||||
chGoroutineIDs <- goroutineID() // hacky way to identify a worker
|
||||
return nil
|
||||
}
|
||||
|
||||
q, _ := newWorkerPoolQueueForTest("test-workpoolqueue", setting.QueueSettings{Type: "channel", BatchLength: 1, MaxWorkers: 2, Length: 100}, handler, false)
|
||||
stop := runWorkerPoolQueue(q)
|
||||
for i := 0; i < 20; i++ {
|
||||
|
||||
const workloadSize = 12
|
||||
for i := 0; i < workloadSize; i++ {
|
||||
assert.NoError(t, q.Push(i))
|
||||
}
|
||||
|
||||
time.Sleep(500 * time.Millisecond)
|
||||
assert.EqualValues(t, 2, q.GetWorkerNumber())
|
||||
assert.EqualValues(t, 2, q.GetWorkerActiveNumber())
|
||||
// when the queue never becomes empty, the existing workers should keep working
|
||||
assert.LessOrEqual(t, q.workerStartedCounter, int32(4)) // counter should be 2, but sometimes it gets bigger
|
||||
workerIDs := make(map[string]struct{})
|
||||
for i := 0; i < workloadSize; i++ {
|
||||
c := <-chGoroutineIDs
|
||||
workerIDs[c] = struct{}{}
|
||||
t.Logf("%d workers: overall=%d current=%d", i, len(workerIDs), q.GetWorkerNumber())
|
||||
|
||||
// ensure that no more than qs.MaxWorkers workers are created over the whole lifetime of the queue
|
||||
// (otherwise it would mean that some workers got shut down while the queue was full)
|
||||
require.LessOrEqual(t, len(workerIDs), q.GetWorkerMaxNumber())
|
||||
}
|
||||
close(chGoroutineIDs)
|
||||
|
||||
stop()
|
||||
}
|
||||
|
||||
func goroutineID() string {
|
||||
var buffer [31]byte
|
||||
_ = runtime.Stack(buffer[:], false)
|
||||
return string(bytes.Fields(buffer[10:])[0])
|
||||
}
|
||||
|
|
|
@ -15,8 +15,45 @@ type PictureStruct struct {
|
|||
EnableFederatedAvatar *config.Value[bool]
|
||||
}
|
||||
|
||||
type OpenWithEditorApp struct {
|
||||
DisplayName string
|
||||
OpenURL string
|
||||
}
|
||||
|
||||
type OpenWithEditorAppsType []OpenWithEditorApp
|
||||
|
||||
func (t OpenWithEditorAppsType) ToTextareaString() string {
|
||||
ret := ""
|
||||
for _, app := range t {
|
||||
ret += app.DisplayName + " = " + app.OpenURL + "\n"
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func DefaultOpenWithEditorApps() OpenWithEditorAppsType {
|
||||
return OpenWithEditorAppsType{
|
||||
{
|
||||
DisplayName: "VS Code",
|
||||
OpenURL: "vscode://vscode.git/clone?url={url}",
|
||||
},
|
||||
{
|
||||
DisplayName: "VSCodium",
|
||||
OpenURL: "vscodium://vscode.git/clone?url={url}",
|
||||
},
|
||||
{
|
||||
DisplayName: "Intellij IDEA",
|
||||
OpenURL: "jetbrains://idea/checkout/git?idea.required.plugins.id=Git4Idea&checkout.repo={url}",
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
type RepositoryStruct struct {
|
||||
OpenWithEditorApps *config.Value[OpenWithEditorAppsType]
|
||||
}
|
||||
|
||||
type ConfigStruct struct {
|
||||
Picture *PictureStruct
|
||||
Picture *PictureStruct
|
||||
Repository *RepositoryStruct
|
||||
}
|
||||
|
||||
var (
|
||||
|
@ -28,8 +65,11 @@ func initDefaultConfig() {
|
|||
config.SetCfgSecKeyGetter(&cfgSecKeyGetter{})
|
||||
defaultConfig = &ConfigStruct{
|
||||
Picture: &PictureStruct{
|
||||
DisableGravatar: config.Bool(false, config.CfgSecKey{Sec: "picture", Key: "DISABLE_GRAVATAR"}, "picture.disable_gravatar"),
|
||||
EnableFederatedAvatar: config.Bool(false, config.CfgSecKey{Sec: "picture", Key: "ENABLE_FEDERATED_AVATAR"}, "picture.enable_federated_avatar"),
|
||||
DisableGravatar: config.ValueJSON[bool]("picture.disable_gravatar").WithFileConfig(config.CfgSecKey{Sec: "picture", Key: "DISABLE_GRAVATAR"}),
|
||||
EnableFederatedAvatar: config.ValueJSON[bool]("picture.enable_federated_avatar").WithFileConfig(config.CfgSecKey{Sec: "picture", Key: "ENABLE_FEDERATED_AVATAR"}),
|
||||
},
|
||||
Repository: &RepositoryStruct{
|
||||
OpenWithEditorApps: config.ValueJSON[OpenWithEditorAppsType]("repository.open-with.editor-apps"),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
@ -42,6 +82,9 @@ func Config() *ConfigStruct {
|
|||
type cfgSecKeyGetter struct{}
|
||||
|
||||
func (c cfgSecKeyGetter) GetValue(sec, key string) (v string, has bool) {
|
||||
if key == "" {
|
||||
return "", false
|
||||
}
|
||||
cfgSec, err := CfgProvider.GetSection(sec)
|
||||
if err != nil {
|
||||
log.Error("Unable to get config section: %q", sec)
|
||||
|
|
|
@ -5,8 +5,11 @@ package config
|
|||
|
||||
import (
|
||||
"context"
|
||||
"strconv"
|
||||
"sync"
|
||||
|
||||
"code.gitea.io/gitea/modules/json"
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
"code.gitea.io/gitea/modules/util"
|
||||
)
|
||||
|
||||
type CfgSecKey struct {
|
||||
|
@ -23,14 +26,14 @@ type Value[T any] struct {
|
|||
revision int
|
||||
}
|
||||
|
||||
func (value *Value[T]) parse(s string) (v T) {
|
||||
switch any(v).(type) {
|
||||
case bool:
|
||||
b, _ := strconv.ParseBool(s)
|
||||
return any(b).(T)
|
||||
default:
|
||||
panic("unsupported config type, please complete the code")
|
||||
func (value *Value[T]) parse(key, valStr string) (v T) {
|
||||
v = value.def
|
||||
if valStr != "" {
|
||||
if err := json.Unmarshal(util.UnsafeStringToBytes(valStr), &v); err != nil {
|
||||
log.Error("Unable to unmarshal json config for key %q, err: %v", key, err)
|
||||
}
|
||||
}
|
||||
return v
|
||||
}
|
||||
|
||||
func (value *Value[T]) Value(ctx context.Context) (v T) {
|
||||
|
@ -62,7 +65,7 @@ func (value *Value[T]) Value(ctx context.Context) (v T) {
|
|||
if valStr == nil {
|
||||
v = value.def
|
||||
} else {
|
||||
v = value.parse(*valStr)
|
||||
v = value.parse(value.dynKey, *valStr)
|
||||
}
|
||||
|
||||
value.mu.Lock()
|
||||
|
@ -76,6 +79,16 @@ func (value *Value[T]) DynKey() string {
|
|||
return value.dynKey
|
||||
}
|
||||
|
||||
func Bool(def bool, cfgSecKey CfgSecKey, dynKey string) *Value[bool] {
|
||||
return &Value[bool]{def: def, cfgSecKey: cfgSecKey, dynKey: dynKey}
|
||||
func (value *Value[T]) WithDefault(def T) *Value[T] {
|
||||
value.def = def
|
||||
return value
|
||||
}
|
||||
|
||||
func (value *Value[T]) WithFileConfig(cfgSecKey CfgSecKey) *Value[T] {
|
||||
value.cfgSecKey = cfgSecKey
|
||||
return value
|
||||
}
|
||||
|
||||
func ValueJSON[T any](dynKey string) *Value[T] {
|
||||
return &Value[T]{dynKey: dynKey}
|
||||
}
|
||||
|
|
|
@ -20,11 +20,14 @@ var defaultI18nLangNames = []string{
|
|||
"pt-BR", "Português do Brasil",
|
||||
"pt-PT", "Português de Portugal",
|
||||
"pl-PL", "Polski",
|
||||
"bg-BG", "Български",
|
||||
"bg", "Български",
|
||||
"it-IT", "Italiano",
|
||||
"fi-FI", "Suomi",
|
||||
"fil", "Filipino",
|
||||
"eo", "Esperanto",
|
||||
"tr-TR", "Türkçe",
|
||||
"cs-CZ", "Čeština",
|
||||
"sl", "Slovenščina",
|
||||
"sv-SE", "Svenska",
|
||||
"ko-KR", "한국어",
|
||||
"el-GR", "Ελληνικά",
|
||||
|
|
|
@ -7,7 +7,6 @@ import (
|
|||
"os/exec"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"slices"
|
||||
"strings"
|
||||
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
|
@ -20,8 +19,6 @@ const (
|
|||
RepoCreatingPublic = "public"
|
||||
)
|
||||
|
||||
var RecognisedRepositoryDownloadOrCloneMethods = []string{"download-zip", "download-targz", "download-bundle", "vscode-clone", "vscodium-clone", "cite"}
|
||||
|
||||
// MaxUserCardsPerPage sets maximum amount of watchers and stargazers shown per page
|
||||
// those pages use 2 or 3 column layout, so the value should be divisible by 2 and 3
|
||||
var MaxUserCardsPerPage = 36
|
||||
|
@ -50,7 +47,6 @@ var (
|
|||
DisabledRepoUnits []string
|
||||
DefaultRepoUnits []string
|
||||
DefaultForkRepoUnits []string
|
||||
DownloadOrCloneMethods []string
|
||||
PrefixArchiveFiles bool
|
||||
DisableMigrations bool
|
||||
DisableStars bool
|
||||
|
@ -173,7 +169,6 @@ var (
|
|||
DisabledRepoUnits: []string{},
|
||||
DefaultRepoUnits: []string{},
|
||||
DefaultForkRepoUnits: []string{},
|
||||
DownloadOrCloneMethods: []string{"download-zip", "download-targz", "download-bundle", "vscode-clone"},
|
||||
PrefixArchiveFiles: true,
|
||||
DisableMigrations: false,
|
||||
DisableStars: false,
|
||||
|
@ -377,12 +372,5 @@ func loadRepositoryFrom(rootCfg ConfigProvider) {
|
|||
if err := loadRepoArchiveFrom(rootCfg); err != nil {
|
||||
log.Fatal("loadRepoArchiveFrom: %v", err)
|
||||
}
|
||||
|
||||
for _, method := range Repository.DownloadOrCloneMethods {
|
||||
if !slices.Contains(RecognisedRepositoryDownloadOrCloneMethods, method) {
|
||||
log.Error("Unrecognised repository download or clone method: %s", method)
|
||||
}
|
||||
}
|
||||
|
||||
Repository.EnableFlags = sec.Key("ENABLE_FLAGS").MustBool()
|
||||
}
|
||||
|
|
|
@ -67,13 +67,14 @@ func (u User) MarshalJSON() ([]byte, error) {
|
|||
// UserSettings represents user settings
|
||||
// swagger:model
|
||||
type UserSettings struct {
|
||||
FullName string `json:"full_name"`
|
||||
Website string `json:"website"`
|
||||
Description string `json:"description"`
|
||||
Location string `json:"location"`
|
||||
Language string `json:"language"`
|
||||
Theme string `json:"theme"`
|
||||
DiffViewStyle string `json:"diff_view_style"`
|
||||
FullName string `json:"full_name"`
|
||||
Website string `json:"website"`
|
||||
Description string `json:"description"`
|
||||
Location string `json:"location"`
|
||||
Language string `json:"language"`
|
||||
Theme string `json:"theme"`
|
||||
DiffViewStyle string `json:"diff_view_style"`
|
||||
EnableRepoUnitHints bool `json:"enable_repo_unit_hints"`
|
||||
// Privacy
|
||||
HideEmail bool `json:"hide_email"`
|
||||
HideActivity bool `json:"hide_activity"`
|
||||
|
@ -82,13 +83,14 @@ type UserSettings struct {
|
|||
// UserSettingsOptions represents options to change user settings
|
||||
// swagger:model
|
||||
type UserSettingsOptions struct {
|
||||
FullName *string `json:"full_name" binding:"MaxSize(100)"`
|
||||
Website *string `json:"website" binding:"OmitEmpty;ValidUrl;MaxSize(255)"`
|
||||
Description *string `json:"description" binding:"MaxSize(255)"`
|
||||
Location *string `json:"location" binding:"MaxSize(50)"`
|
||||
Language *string `json:"language"`
|
||||
Theme *string `json:"theme"`
|
||||
DiffViewStyle *string `json:"diff_view_style"`
|
||||
FullName *string `json:"full_name" binding:"MaxSize(100)"`
|
||||
Website *string `json:"website" binding:"OmitEmpty;ValidUrl;MaxSize(255)"`
|
||||
Description *string `json:"description" binding:"MaxSize(255)"`
|
||||
Location *string `json:"location" binding:"MaxSize(50)"`
|
||||
Language *string `json:"language"`
|
||||
Theme *string `json:"theme"`
|
||||
DiffViewStyle *string `json:"diff_view_style"`
|
||||
EnableRepoUnitHints *bool `json:"enable_repo_unit_hints"`
|
||||
// Privacy
|
||||
HideEmail *bool `json:"hide_email"`
|
||||
HideActivity *bool `json:"hide_activity"`
|
||||
|
|
|
@ -4,8 +4,11 @@
|
|||
package testlogger
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"runtime"
|
||||
"strings"
|
||||
|
@ -27,53 +30,146 @@ var WriterCloser = &testLoggerWriterCloser{}
|
|||
|
||||
type testLoggerWriterCloser struct {
|
||||
sync.RWMutex
|
||||
t []testing.TB
|
||||
t []testing.TB
|
||||
errs []error // stack of error, parallel to the stack of testing.TB
|
||||
err error // fallback if the stack is empty
|
||||
}
|
||||
|
||||
func (w *testLoggerWriterCloser) pushT(t testing.TB) {
|
||||
w.Lock()
|
||||
w.t = append(w.t, t)
|
||||
w.errs = append(w.errs, nil)
|
||||
w.Unlock()
|
||||
}
|
||||
|
||||
func (w *testLoggerWriterCloser) Write(p []byte) (int, error) {
|
||||
func (w *testLoggerWriterCloser) Log(level log.Level, msg string) {
|
||||
if len(msg) > 0 && msg[len(msg)-1] == '\n' {
|
||||
msg = msg[:len(msg)-1]
|
||||
}
|
||||
|
||||
w.printMsg(msg)
|
||||
if level >= log.ERROR {
|
||||
w.recordError(msg)
|
||||
}
|
||||
}
|
||||
|
||||
// list of error message which will not fail the test
|
||||
// ideally this list should be empty, however ensuring that it does not grow
|
||||
// is already a good first step.
|
||||
var ignoredErrorMessageSuffixes = []string{
|
||||
// only seen on mysql tests https://codeberg.org/forgejo/forgejo/pulls/2657#issuecomment-1693055
|
||||
`table columns using inconsistent collation, they should use "utf8mb4_0900_ai_ci". Please go to admin panel Self Check page`,
|
||||
|
||||
// TestAPIDeleteReleaseByTagName
|
||||
// action notification were a commit cannot be computed (because the commit got deleted)
|
||||
`Notify() [E] an error occurred while executing the DeleteRelease actions method: gitRepo.GetCommit: object does not exist [id: refs/tags/release-tag, rel_path: ]`,
|
||||
`Notify() [E] an error occurred while executing the PushCommits actions method: gitRepo.GetCommit: object does not exist [id: refs/tags/release-tag, rel_path: ]`,
|
||||
|
||||
// TestAPIRepoTags
|
||||
`Notify() [E] an error occurred while executing the DeleteRelease actions method: gitRepo.GetCommit: object does not exist [id: refs/tags/gitea/22, rel_path: ]`,
|
||||
`Notify() [E] an error occurred while executing the PushCommits actions method: gitRepo.GetCommit: object does not exist [id: refs/tags/gitea/22, rel_path: ]`,
|
||||
|
||||
// TestAPIDeleteTagByName
|
||||
`Notify() [E] an error occurred while executing the DeleteRelease actions method: gitRepo.GetCommit: object does not exist [id: refs/tags/delete-tag, rel_path: ]`,
|
||||
`Notify() [E] an error occurred while executing the PushCommits actions method: gitRepo.GetCommit: object does not exist [id: refs/tags/delete-tag, rel_path: ]`,
|
||||
|
||||
// TestAPIGenerateRepo
|
||||
`Notify() [E] an error occurred while executing the CreateRepository actions method: gitRepo.GetCommit: object does not exist [id: , rel_path: ]`,
|
||||
|
||||
// TestAPIPullReview
|
||||
`PullRequestReview() [E] Unsupported review webhook type`,
|
||||
|
||||
// TestAPIPullReviewRequest
|
||||
`ToAPIPullRequest() [E] unable to resolve PR head ref`,
|
||||
|
||||
// TestAPILFSUpload
|
||||
`Put() [E] Whilst putting LFS OID[ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb]: Failed to copy to tmpPath: ca/97/8112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb Error: content size does not match`,
|
||||
`[E] Error putting LFS MetaObject [ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb] into content store. Error: content size does not match`,
|
||||
`UploadHandler() [E] Upload does not match LFS MetaObject [ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb]. Error: content size does not match`,
|
||||
`Put() [E] Whilst putting LFS OID[2581dd7bbc1fe44726de4b7dd806a087a978b9c5aec0a60481259e34be09b06a]: Failed to copy to tmpPath: 25/81/dd7bbc1fe44726de4b7dd806a087a978b9c5aec0a60481259e34be09b06a Error: content hash does not match OID`,
|
||||
`[E] Error putting LFS MetaObject [2581dd7bbc1fe44726de4b7dd806a087a978b9c5aec0a60481259e34be09b06a] into content store. Error: content hash does not match OID`,
|
||||
`UploadHandler() [E] Upload does not match LFS MetaObject [2581dd7bbc1fe44726de4b7dd806a087a978b9c5aec0a60481259e34be09b06a]. Error: content hash does not match OID`,
|
||||
`UploadHandler() [E] Upload does not match LFS MetaObject [83de2e488b89a0aa1c97496b888120a28b0c1e15463a4adb8405578c540f36d4]. Error: content size does not match`,
|
||||
|
||||
// TestAPILFSVerify
|
||||
`getAuthenticatedMeta() [E] Unable to get LFS OID[fb8f7d8435968c4f82a726a92395be4d16f2f63116caf36c8ad35c60831ab042] Error: LFS Meta object does not exist`,
|
||||
|
||||
// TestAPIUpdateOrgAvatar
|
||||
`UpdateAvatar() [E] UploadAvatar: image.DecodeConfig: image: unknown format`,
|
||||
|
||||
// TestGetAttachment
|
||||
`/data/attachments/a/0/a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a18: no such file or directory`,
|
||||
|
||||
// TestBlockUser
|
||||
`BlockedUsersUnblock() [E] IsOrganization: org3 is an organization not a user`,
|
||||
`BlockedUsersBlock() [E] IsOrganization: org3 is an organization not a user`,
|
||||
`Action() [E] Cannot perform this action on an organization "unblock"`,
|
||||
`Action() [E] Cannot perform this action on an organization "block"`,
|
||||
|
||||
// TestBlockActions
|
||||
`/gitea-repositories/user10/repo7.git Error: no such file or directory`,
|
||||
|
||||
// TestE2e/explore.test.e2e
|
||||
`TrString() [E] Missing translation "more_items"`,
|
||||
|
||||
// TestRebuildCargo
|
||||
`RebuildCargoIndex() [E] RebuildIndex failed: GetRepositoryByOwnerAndName: repository does not exist [id: 0, uid: 0, owner_name: user2, name: _cargo-index]`,
|
||||
}
|
||||
|
||||
func (w *testLoggerWriterCloser) recordError(msg string) {
|
||||
for _, s := range ignoredErrorMessageSuffixes {
|
||||
if strings.HasSuffix(msg, s) {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
w.Lock()
|
||||
defer w.Unlock()
|
||||
|
||||
err := w.err
|
||||
if len(w.errs) > 0 {
|
||||
err = w.errs[len(w.errs)-1]
|
||||
}
|
||||
|
||||
err = errors.Join(err, errors.New(msg))
|
||||
|
||||
if len(w.errs) > 0 {
|
||||
w.errs[len(w.errs)-1] = err
|
||||
} else {
|
||||
w.err = err
|
||||
}
|
||||
}
|
||||
|
||||
func (w *testLoggerWriterCloser) printMsg(msg string) {
|
||||
// There was a data race problem: the logger system could still try to output logs after the runner is finished.
|
||||
// So we must ensure that the "t" in stack is still valid.
|
||||
w.RLock()
|
||||
defer w.RUnlock()
|
||||
|
||||
var t testing.TB
|
||||
if len(w.t) > 0 {
|
||||
t = w.t[len(w.t)-1]
|
||||
}
|
||||
|
||||
if len(p) > 0 && p[len(p)-1] == '\n' {
|
||||
p = p[:len(p)-1]
|
||||
}
|
||||
|
||||
if t == nil {
|
||||
t := w.t[len(w.t)-1]
|
||||
t.Log(msg)
|
||||
} else {
|
||||
// if there is no running test, the log message should be outputted to console, to avoid losing important information.
|
||||
// the "???" prefix is used to match the "===" and "+++" in PrintCurrentTest
|
||||
return fmt.Fprintf(os.Stdout, "??? [TestLogger] %s\n", p)
|
||||
fmt.Fprintln(os.Stdout, "??? [TestLogger]", msg)
|
||||
}
|
||||
|
||||
t.Log(string(p))
|
||||
return len(p), nil
|
||||
}
|
||||
|
||||
func (w *testLoggerWriterCloser) popT() {
|
||||
func (w *testLoggerWriterCloser) popT() error {
|
||||
w.Lock()
|
||||
defer w.Unlock()
|
||||
|
||||
if len(w.t) > 0 {
|
||||
w.t = w.t[:len(w.t)-1]
|
||||
err := w.errs[len(w.errs)-1]
|
||||
w.errs = w.errs[:len(w.errs)-1]
|
||||
return err
|
||||
}
|
||||
w.Unlock()
|
||||
return w.err
|
||||
}
|
||||
|
||||
func (w *testLoggerWriterCloser) Close() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (w *testLoggerWriterCloser) Reset() {
|
||||
func (w *testLoggerWriterCloser) Reset() error {
|
||||
w.Lock()
|
||||
if len(w.t) > 0 {
|
||||
for _, t := range w.t {
|
||||
|
@ -84,8 +180,12 @@ func (w *testLoggerWriterCloser) Reset() {
|
|||
t.Errorf("Unclosed logger writer in test: %s", t.Name())
|
||||
}
|
||||
w.t = nil
|
||||
w.errs = nil
|
||||
}
|
||||
err := w.err
|
||||
w.err = nil
|
||||
w.Unlock()
|
||||
return err
|
||||
}
|
||||
|
||||
// PrintCurrentTest prints the current test to os.Stdout
|
||||
|
@ -132,7 +232,10 @@ func PrintCurrentTest(t testing.TB, skip ...int) func() {
|
|||
_, _ = fmt.Fprintf(os.Stdout, "+++ %s had a slow clean-up flush (took %v)\n", t.Name(), flushTook)
|
||||
}
|
||||
}
|
||||
WriterCloser.popT()
|
||||
|
||||
if err := WriterCloser.popT(); err != nil {
|
||||
t.Errorf("testlogger.go:recordError() FATAL ERROR: log.Error has been called: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -146,19 +249,72 @@ func Printf(format string, args ...any) {
|
|||
_, _ = fmt.Fprintf(os.Stdout, "\t"+format, args...)
|
||||
}
|
||||
|
||||
// TestLogEventWriter is a logger which will write to the testing log
|
||||
type TestLogEventWriter struct {
|
||||
*log.EventWriterBaseImpl
|
||||
}
|
||||
|
||||
// NewTestLoggerWriter creates a TestLogEventWriter as a log.LoggerProvider
|
||||
func NewTestLoggerWriter(name string, mode log.WriterMode) log.EventWriter {
|
||||
w := &TestLogEventWriter{}
|
||||
w.EventWriterBaseImpl = log.NewEventWriterBase(name, "test-log-writer", mode)
|
||||
w.OutputWriteCloser = WriterCloser
|
||||
w.base = log.NewEventWriterBase(name, "test-log-writer", mode)
|
||||
w.writer = WriterCloser
|
||||
return w
|
||||
}
|
||||
|
||||
// TestLogEventWriter is a logger which will write to the testing log
|
||||
type TestLogEventWriter struct {
|
||||
base *log.EventWriterBaseImpl
|
||||
writer *testLoggerWriterCloser
|
||||
}
|
||||
|
||||
// Base implements log.EventWriter.
|
||||
func (t *TestLogEventWriter) Base() *log.EventWriterBaseImpl {
|
||||
return t.base
|
||||
}
|
||||
|
||||
// GetLevel implements log.EventWriter.
|
||||
func (t *TestLogEventWriter) GetLevel() log.Level {
|
||||
return t.base.GetLevel()
|
||||
}
|
||||
|
||||
// GetWriterName implements log.EventWriter.
|
||||
func (t *TestLogEventWriter) GetWriterName() string {
|
||||
return t.base.GetWriterName()
|
||||
}
|
||||
|
||||
// GetWriterType implements log.EventWriter.
|
||||
func (t *TestLogEventWriter) GetWriterType() string {
|
||||
return t.base.GetWriterType()
|
||||
}
|
||||
|
||||
// Run implements log.EventWriter.
|
||||
func (t *TestLogEventWriter) Run(ctx context.Context) {
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return
|
||||
case event, ok := <-t.base.Queue:
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
|
||||
var errorMsg string
|
||||
|
||||
switch msg := event.Msg.(type) {
|
||||
case string:
|
||||
errorMsg = msg
|
||||
case []byte:
|
||||
errorMsg = string(msg)
|
||||
case io.WriterTo:
|
||||
var buf bytes.Buffer
|
||||
if _, err := msg.WriteTo(&buf); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
errorMsg = buf.String()
|
||||
default:
|
||||
errorMsg = fmt.Sprint(msg)
|
||||
}
|
||||
t.writer.Log(event.Origin.Level, errorMsg)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func init() {
|
||||
const relFilePath = "modules/testlogger/testlogger.go"
|
||||
_, filename, _, _ := runtime.Caller(0)
|
||||
|
|
|
@ -114,16 +114,22 @@ func (l *locale) TrString(trKey string, trArgs ...any) string {
|
|||
format := trKey
|
||||
|
||||
idx, ok := l.store.trKeyToIdxMap[trKey]
|
||||
found := false
|
||||
if ok {
|
||||
if msg, ok := l.idxToMsgMap[idx]; ok {
|
||||
format = msg // use the found translation
|
||||
found = true
|
||||
} else if def, ok := l.store.localeMap[l.store.defaultLang]; ok {
|
||||
// try to use default locale's translation
|
||||
if msg, ok := def.idxToMsgMap[idx]; ok {
|
||||
format = msg
|
||||
found = true
|
||||
}
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
log.Error("Missing translation %q", trKey)
|
||||
}
|
||||
|
||||
msg, err := Format(format, trArgs...)
|
||||
if err != nil {
|
||||
|
|
|
@ -53,7 +53,6 @@ func CommonTemplateContextData() ContextData {
|
|||
"ShowMilestonesDashboardPage": setting.Service.ShowMilestonesDashboardPage,
|
||||
"ShowFooterVersion": setting.Other.ShowFooterVersion,
|
||||
"DisableDownloadSourceArchives": setting.Repository.DisableDownloadSourceArchives,
|
||||
"DownloadOrCloneMethods": setting.Repository.DownloadOrCloneMethods,
|
||||
|
||||
"EnableSwagger": setting.API.EnableSwagger,
|
||||
"EnableOpenIDSignIn": setting.Service.EnableOpenIDSignIn,
|
||||
|
|
|
@ -1655,6 +1655,7 @@ config.default_keep_email_private = أخفِ عناوين البريد الإل
|
|||
config.default_allow_create_organization = اسمح بإنشاء المنظمات مبدئيا
|
||||
config.enable_timetracking = فعّل تتبع الوقت
|
||||
config.default_enable_timetracking = فعّل تتبع الوقت مبدئيا
|
||||
config.allow_dots_in_usernames = السماح للمستخدمين بوضع نقاط في أسمائهم. لا يؤثر على الحسابات الموجودة.
|
||||
config.default_allow_only_contributors_to_track_time = اسمح للمشتركين في المستودع موحدهم بتتبع الوقت
|
||||
|
||||
[form]
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -167,6 +167,9 @@ number_of_contributions_in_the_last_12_months=%s Beiträge in den letzten 12 Mon
|
|||
contributions_zero=Keine Beiträge
|
||||
less=Weniger
|
||||
more=Mehr
|
||||
contributions_format = {contributions} am {day}. {month} {year}
|
||||
contributions_one = Beitrag
|
||||
contributions_few = Beiträge
|
||||
|
||||
[editor]
|
||||
buttons.heading.tooltip=Titel hinzufügen
|
||||
|
@ -238,7 +241,7 @@ err_admin_name_pattern_not_allowed=Administrator-Benutzername ist ungültig, der
|
|||
err_admin_name_is_invalid=Administratornutzername ist ungültig
|
||||
|
||||
general_title=Allgemeine Einstellungen
|
||||
app_name=Instanzname
|
||||
app_name=Instanztitel
|
||||
app_name_helper=Du kannst hier den Namen deines Unternehmens eingeben.
|
||||
repo_path=Repository-Verzeichnis
|
||||
repo_path_helper=Remote-Git-Repositorys werden in diesem Verzeichnis gespeichert.
|
||||
|
@ -269,7 +272,7 @@ register_confirm=E-Mail-Bestätigung benötigt zum Registrieren
|
|||
mail_notify=E-Mail-Benachrichtigungen aktivieren
|
||||
server_service_title=Sonstige Server- und Drittserviceeinstellungen
|
||||
offline_mode=Offline-Modus aktivieren
|
||||
offline_mode_popup=Drittanbieter-CDNs deaktivieren und alle Ressourcen lokal zur Verfügung stellen.
|
||||
offline_mode_popup=Drittanbieter-CDNs deaktivieren und alle Ressourcen lokal zustellen.
|
||||
disable_gravatar=Gravatar deaktivieren
|
||||
disable_gravatar_popup=Gravatar und Drittanbieter-Avatar-Quellen deaktivieren. Ein Standardavatar wird verwendet, bis der Nutzer einen eigenen Avatar hochlädt.
|
||||
federated_avatar_lookup=Föderierte Profilbilder einschalten
|
||||
|
@ -331,7 +334,7 @@ switch_dashboard_context=Kontext der Übersichtsseite wechseln
|
|||
my_repos=Repositorys
|
||||
show_more_repos=Zeige mehr Repositorys …
|
||||
collaborative_repos=Gemeinschaftliche Repositorys
|
||||
my_orgs=Meine Organisationen
|
||||
my_orgs=Organisationen
|
||||
my_mirrors=Meine Spiegel
|
||||
view_home=%s ansehen
|
||||
search_repos=Finde ein Repository …
|
||||
|
@ -369,9 +372,13 @@ user_no_results=Keine passenden Benutzer gefunden.
|
|||
org_no_results=Keine passenden Organisationen gefunden.
|
||||
code_no_results=Es konnte kein passender Code für deinen Suchbegriff gefunden werden.
|
||||
code_search_results=Suchergebnisse für „%s“
|
||||
code_last_indexed_at=Zuletzt indexiert %s
|
||||
code_last_indexed_at=Zuletzt indiziert %s
|
||||
relevant_repositories_tooltip=Repositorys, die Forks sind oder die kein Thema, kein Symbol und keine Beschreibung haben, werden ausgeblendet.
|
||||
relevant_repositories=Es werden nur relevante Repositorys angezeigt, <a href="%s">ungefilterte Ergebnisse anzeigen</a>.
|
||||
stars_one = %d Favorisierung
|
||||
stars_few = %d Favorisierungen
|
||||
forks_one = %d Fork
|
||||
forks_few = %d Forks
|
||||
|
||||
[auth]
|
||||
create_new_account=Konto anlegen
|
||||
|
@ -447,6 +454,8 @@ change_unconfirmed_email_error = Ändern der E-Mail-Adresse fehlgeschlagen: %v
|
|||
last_admin = Du kannst den letzten Administrator nicht entfernen. Es muss mindestens einen Administrator geben.
|
||||
change_unconfirmed_email = Wenn Sie bei der Registrierung eine falsche E-Mail-Adresse angegeben haben, können Sie diese unten ändern, woraufhin eine Bestätigung an die neue Adresse geschickt wird.
|
||||
remember_me.compromised = Der Anmeldetoken ist nicht mehr gültig, dies könnte auf ein kompromittiertes Konto hindeuten. Bitte prüfe dein Konto auf ungewöhnliche Aktivitäten.
|
||||
tab_signin = Anmelden
|
||||
tab_signup = Registrieren
|
||||
|
||||
[mail]
|
||||
view_it_on=Auf %s ansehen
|
||||
|
@ -666,7 +675,7 @@ applications=Anwendungen
|
|||
orgs=Organisationen verwalten
|
||||
repos=Repositorys
|
||||
delete=Konto löschen
|
||||
twofa=Zwei-Faktor-Authentifizierung
|
||||
twofa=Zwei-Faktor-Authentifizierung (TOTP)
|
||||
account_link=Verknüpfte Benutzerkonten
|
||||
organization=Organisationen
|
||||
uid=UID
|
||||
|
@ -682,7 +691,7 @@ website=Webseite
|
|||
location=Standort
|
||||
update_theme=Theme ändern
|
||||
update_profile=Profil aktualisieren
|
||||
update_language=Sprache aktualisieren
|
||||
update_language=Sprache ändern
|
||||
update_language_not_found=Sprache „%s“ ist nicht verfügbar.
|
||||
update_language_success=Sprache wurde aktualisiert.
|
||||
update_profile_success=Dein Profil wurde aktualisiert.
|
||||
|
@ -714,7 +723,7 @@ comment_type_group_issue_ref=Issue-Referenz
|
|||
saved_successfully=Die Einstellungen wurden erfolgreich gespeichert.
|
||||
privacy=Datenschutz
|
||||
keep_activity_private=Aktivität auf der Profilseite ausblenden
|
||||
keep_activity_private_popup=Macht die Aktivität nur für dich und die Administratoren sichtbar
|
||||
keep_activity_private_popup=Deine Aktivität wird nur für dich und die Instanzadministratoren sichtbar sein
|
||||
|
||||
lookup_avatar_by_mail=Profilbild anhand der E-Mail-Addresse suchen
|
||||
federated_avatar_lookup=Suche nach föderierten Profilbildern
|
||||
|
@ -985,7 +994,7 @@ visibility=Sichtbarkeit
|
|||
visibility_description=Nur der Besitzer oder Organisationsmitglieder mit entsprechender Berechtigung werden in der Lage sein, es zu sehen.
|
||||
visibility_helper=In privates Repository umwandeln
|
||||
visibility_helper_forced=Auf dieser Forgejo-Instanz können nur private Repositorys angelegt werden.
|
||||
visibility_fork_helper=(Eine Änderung dieses Wertes wirkt sich auf alle Forks aus)
|
||||
visibility_fork_helper=(Eine Änderung dieses Wertes wirkt sich auf die Sichtbarkeit aller Forks aus)
|
||||
clone_helper=Benötigst du Hilfe beim Klonen? Öffne die <a target="_blank" rel="noopener noreferrer" href="%s">Hilfe</a>.
|
||||
fork_repo=Repository forken
|
||||
fork_from=Fork von
|
||||
|
@ -1136,7 +1145,7 @@ migrate.migrating=Migriere von <b>%s</b> ...
|
|||
migrate.migrating_failed=Migrieren von <b>%s</b> fehlgeschlagen.
|
||||
migrate.migrating_failed.error=Migration fehlgeschlagen: %s
|
||||
migrate.migrating_failed_no_addr=Migration fehlgeschlagen.
|
||||
migrate.github.description=Daten von github.com oder anderen GitHub-Instanzen migrieren.
|
||||
migrate.github.description=Daten von github.com oder GitHub Enterprise Server migrieren.
|
||||
migrate.git.description=Ein Repository von einem beliebigen Git Service klonen.
|
||||
migrate.gitlab.description=Daten von gitlab.com oder anderen GitLab-Instanzen migrieren.
|
||||
migrate.gitea.description=Daten von gitea.com oder anderen Gitea-/Forgejo-Instanzen migrieren.
|
||||
|
@ -1427,7 +1436,7 @@ issues.new_label=Neues Label
|
|||
issues.new_label_placeholder=Labelname
|
||||
issues.new_label_desc_placeholder=Beschreibung
|
||||
issues.create_label=Label erstellen
|
||||
issues.label_templates.title=Eine vordefinierte Label-Sammung laden
|
||||
issues.label_templates.title=Eine Label-Sammlung laden
|
||||
issues.label_templates.info=Es existieren noch keine Labels. Erstelle ein neues Label („Neues Label“) oder verwende die Standard-Label-Sammlung:
|
||||
issues.label_templates.helper=Wähle eine Label-Sammlung
|
||||
issues.label_templates.use=Label-Sammlung verwenden
|
||||
|
@ -1755,8 +1764,8 @@ pulls.nothing_to_compare=Diese Branches sind identisch. Es muss kein Pull-Reques
|
|||
pulls.nothing_to_compare_and_allow_empty_pr=Diese Branches sind gleich. Der Pull-Request wird leer sein.
|
||||
pulls.has_pull_request=`Es existiert bereits ein Pull-Request zwischen diesen beiden Branches: <a href="%[1]s">%[2]s#%[3]d</a>`
|
||||
pulls.create=Pull-Request erstellen
|
||||
pulls.title_desc=möchte %[1]d Commits von <code>%[2]s</code> nach <code id="branch_target">%[3]s</code> mergen
|
||||
pulls.merged_title_desc=hat %[1]d Commits von <code>%[2]s</code> nach <code>%[3]s</code> %[4]s zusammengeführt
|
||||
pulls.title_desc_few=möchte %[1]d Commits von <code>%[2]s</code> nach <code id="branch_target">%[3]s</code> mergen
|
||||
pulls.merged_title_desc_few=hat %[1]d Commits von <code>%[2]s</code> nach <code>%[3]s</code> %[4]s zusammengeführt
|
||||
pulls.change_target_branch_at=`hat den Zielbranch von <b>%s</b> nach <b>%s</b> %s geändert`
|
||||
pulls.tab_conversation=Diskussion
|
||||
pulls.tab_commits=Commits
|
||||
|
@ -2099,10 +2108,10 @@ settings.admin_settings=Administratoreinstellungen
|
|||
settings.admin_enable_health_check=Repository-Health-Checks aktivieren (git fsck)
|
||||
settings.admin_code_indexer=Code-Indexer
|
||||
settings.admin_stats_indexer=Code-Statistik-Indexer
|
||||
settings.admin_indexer_commit_sha=Zuletzt indexierter SHA
|
||||
settings.admin_indexer_commit_sha=Zuletzt indizierter SHA
|
||||
settings.admin_indexer_unindexed=Unindiziert
|
||||
settings.reindex_button=Zur Warteschlange für erneutes Indexieren hinzufügen
|
||||
settings.reindex_requested=Erneutes Indexieren angefordert
|
||||
settings.reindex_button=Zur Warteschlange für erneutes Indizieren hinzufügen
|
||||
settings.reindex_requested=Erneutes Indizieren angefordert
|
||||
settings.admin_enable_close_issues_via_commit_in_any_branch=Einen Issue mit einem Commit auf einem Nicht-Standard-Branch schließen
|
||||
settings.danger_zone=Gefahrenzone
|
||||
settings.new_owner_has_same_repo=Der neue Besitzer hat bereits ein Repository mit dem gleichen Namen. Bitte wähle einen anderen Namen.
|
||||
|
@ -2186,7 +2195,7 @@ settings.hooks_desc=Webhooks senden bei bestimmten Forgejo-Events automatisch
|
|||
settings.webhook_deletion=Webhook löschen
|
||||
settings.webhook_deletion_desc=Das Entfernen eines Webhooks löscht seine Einstellungen und Zustellungsverlauf. Fortfahren?
|
||||
settings.webhook_deletion_success=Webhook wurde entfernt.
|
||||
settings.webhook.test_delivery=Senden testen
|
||||
settings.webhook.test_delivery=Zustellung testen
|
||||
settings.webhook.test_delivery_desc=Teste diesen Webhook mit einem Fake-Event.
|
||||
settings.webhook.test_delivery_desc_disabled=Um diesen Webhook mit einem Fake-Event zu testen, aktiviere ihn.
|
||||
settings.webhook.request=Anfrage
|
||||
|
@ -2196,7 +2205,7 @@ settings.webhook.payload=Inhalt
|
|||
settings.webhook.body=Inhalt
|
||||
settings.webhook.replay.description=Diesen Webhook wiederholen.
|
||||
settings.webhook.replay.description_disabled=Um diesen Webhook wiederzugeben, aktiviere ihn.
|
||||
settings.webhook.delivery.success=Ein Event wurde zur Sendungs-Warteschlange hinzugefügt. Es kann ein paar Sekunden dauern, bevor es im Verlauf erscheint.
|
||||
settings.webhook.delivery.success=Ein Event wurde zur Zustellungswarteschlange hinzugefügt. Es kann ein paar Sekunden dauern, bevor es im Zustellungsverlauf erscheint.
|
||||
settings.githooks_desc=Git-Hooks werden von Git selbst bereitgestellt. Du kannst die Dateien der unterstützten Hooks in der Liste unten bearbeiten, um eigene Operationen einzubinden.
|
||||
settings.githook_edit_desc=Wenn ein Hook nicht aktiv ist, wird der Standardinhalt benutzt. Lasse den Inhalt leer, um den Hook zu deaktivieren.
|
||||
settings.githook_name=Hook-Name
|
||||
|
@ -2326,7 +2335,7 @@ settings.protect_enable_push=Push aktivieren
|
|||
settings.protect_enable_push_desc=Jeder, der Schreibzugriff hat, darf in diesen Branch pushen (aber kein Force-Push).
|
||||
settings.protect_enable_merge=Merge aktivieren
|
||||
settings.protect_enable_merge_desc=Jeder mit Schreibzugriff darf die Pull-Requests in diesen Branch mergen.
|
||||
settings.protect_whitelist_committers=Schütze gewhitelistete Commiter
|
||||
settings.protect_whitelist_committers=Whitelist-eingeschränkter Push
|
||||
settings.protect_whitelist_committers_desc=Jeder, der auf der Whitelist steht, darf in diesen Branch pushen (aber kein Force-Push).
|
||||
settings.protect_whitelist_deploy_keys=Deploy-Key mit Schreibzugriff zum Pushen whitelisten.
|
||||
settings.protect_whitelist_users=Nutzer, die pushen dürfen:
|
||||
|
@ -2337,7 +2346,7 @@ settings.protect_merge_whitelist_committers=Merge-Whitelist aktivieren
|
|||
settings.protect_merge_whitelist_committers_desc=Erlaube Nutzern oder Teams auf der Whitelist, Pull-Requests in diesen Branch zu mergen.
|
||||
settings.protect_merge_whitelist_users=Nutzer, die mergen dürfen:
|
||||
settings.protect_merge_whitelist_teams=Teams, die mergen dürfen:
|
||||
settings.protect_check_status_contexts=Statusprüfungen aktivieren
|
||||
settings.protect_check_status_contexts=Statusprüfung aktivieren
|
||||
settings.protect_status_check_patterns=Statuscheck-Muster:
|
||||
settings.protect_status_check_patterns_desc=Gib Muster ein, um festzulegen, welche Statusüberprüfungen durchgeführt werden müssen, bevor Branches in einen Branch, der dieser Regel entspricht, gemergt werden können. Jede Zeile gibt ein Muster an. Muster dürfen nicht leer sein.
|
||||
settings.protect_check_status_contexts_desc=Vor dem Mergen müssen Statusprüfungen bestanden werden. Wähle aus, welche Statusprüfungen erfolgreich durchgeführt werden müssen, bevor Branches in einen anderen gemergt werden können, der dieser Regel entspricht. Wenn aktiviert, müssen Commits zuerst auf einen anderen Branch gepusht werden, dann nach bestandener Statusprüfung gemergt oder direkt auf einen Branch gepusht werden, der dieser Regel entspricht. Wenn kein Kontext ausgewählt ist, muss der letzte Commit unabhängig vom Kontext erfolgreich sein.
|
||||
|
@ -2366,7 +2375,7 @@ settings.delete_protected_branch=Schutz deaktivieren
|
|||
settings.update_protect_branch_success=Branchschutzregel „%s“ wurde aktualisiert.
|
||||
settings.remove_protected_branch_success=Branchschutzregel „%s“ wurde entfernt.
|
||||
settings.remove_protected_branch_failed=Entfernen der Branchschutzregel „%s“ fehlgeschlagen.
|
||||
settings.protected_branch_deletion=Branch-Schutz deaktivieren
|
||||
settings.protected_branch_deletion=Branch-Schutz löschen
|
||||
settings.protected_branch_deletion_desc=Wenn du den Branch-Schutz deaktivierst, können alle Nutzer mit Schreibrechten auf den Branch pushen. Fortfahren?
|
||||
settings.block_rejected_reviews=Merge bei abgelehnten Reviews blockieren
|
||||
settings.block_rejected_reviews_desc=Mergen ist nicht möglich, wenn Änderungen durch offizielle Reviewer angefragt werden, auch wenn es genügend Genehmigungen gibt.
|
||||
|
@ -2390,7 +2399,7 @@ settings.tags.protection.allowed=Erlaubt
|
|||
settings.tags.protection.allowed.users=Erlaubte Benutzer
|
||||
settings.tags.protection.allowed.teams=Erlaubte Teams
|
||||
settings.tags.protection.allowed.noone=Niemand
|
||||
settings.tags.protection.create=Tag schützen
|
||||
settings.tags.protection.create=Regel hinzufügen
|
||||
settings.tags.protection.none=Es gibt keine geschützten Tags.
|
||||
settings.tags.protection.pattern.description=Du kannst einen einzigen Namen oder ein globales Schema oder einen regulären Ausdruck verwenden, um mehrere Tags zu schützen. Mehr dazu im <a target="_blank" rel="noopener" href="https://forgejo.org/docs/latest/user/protection/#protected-tags">Guide für geschützte Tags (Englisch)</a>.
|
||||
settings.bot_token=Bot-Token
|
||||
|
@ -2449,11 +2458,11 @@ diff.browse_source=Quellcode durchsuchen
|
|||
diff.parent=Ursprung
|
||||
diff.commit=Commit
|
||||
diff.git-notes=Hinweise
|
||||
diff.data_not_available=Keine Diff-Daten verfügbar
|
||||
diff.data_not_available=Kein Diff-Inhalt verfügbar
|
||||
diff.options_button=Diff-Optionen
|
||||
diff.show_diff_stats=Statistiken anzeigen
|
||||
diff.download_patch=Patch-Datei herunterladen
|
||||
diff.download_diff=Vergleichs-Datei herunterladen
|
||||
diff.download_diff=Diff-Datei herunterladen
|
||||
diff.show_split_view=Geteilte Ansicht
|
||||
diff.show_unified_view=Gesamtansicht
|
||||
diff.whitespace_button=Leerzeichen
|
||||
|
@ -2716,7 +2725,7 @@ settings.visibility.limited_shortname=Begrenzt
|
|||
settings.visibility.private=Privat (nur für Organisationsmitglieder sichtbar)
|
||||
settings.visibility.private_shortname=Privat
|
||||
|
||||
settings.update_settings=Einstellungen speichern
|
||||
settings.update_settings=Einstellungen aktualisieren
|
||||
settings.update_setting_success=Organisationseinstellungen wurden aktualisiert.
|
||||
settings.change_orgname_prompt=Hinweis: Das Ändern des Organisationsnamens wird auch die URL deiner Organisation ändern und den alten Namen freigeben.
|
||||
settings.change_orgname_redirect_prompt=Der alte Name wird weiterleiten, bis er wieder beansprucht wird.
|
||||
|
@ -2801,7 +2810,7 @@ follow_blocked_user = Du kannst dieser Organisation nicht folgen, weil diese Org
|
|||
|
||||
[admin]
|
||||
dashboard=Übersicht
|
||||
identity_access=Identität & Zugriff
|
||||
identity_access=Identität u. Zugriff
|
||||
users=Benutzerkonten
|
||||
organizations=Organisationen
|
||||
assets=Code-Assets
|
||||
|
@ -2902,7 +2911,7 @@ dashboard.start_schedule_tasks=Terminierte Aufgaben starten
|
|||
dashboard.sync_branch.started=Synchronisierung der Branches gestartet
|
||||
dashboard.rebuild_issue_indexer=Issue-Indexer neu bauen
|
||||
|
||||
users.user_manage_panel=Benutzerkontenverwaltung
|
||||
users.user_manage_panel=Benutzerkonten verwalten
|
||||
users.new_account=Benutzerkonto erstellen
|
||||
users.name=Benutzername
|
||||
users.full_name=Vollständiger Name
|
||||
|
@ -2932,10 +2941,10 @@ users.is_activated=Account ist aktiviert
|
|||
users.prohibit_login=Anmelden deaktivieren
|
||||
users.is_admin=Ist Administrator
|
||||
users.is_restricted=Ist eingeschränkt
|
||||
users.allow_git_hook=Darf „Git Hooks“ erstellen
|
||||
users.allow_git_hook=Kann Git-Hooks erstellen
|
||||
users.allow_git_hook_tooltip=Git-Hooks werden mit denselben Benutzer-Rechten ausgeführt, mit denen Forgejo läuft, und haben die gleiche Ebene von Host-Zugriff. Dadurch können Benutzer mit diesen speziellen Git-Hook-Rechten auf alle Forgejo-Repositorys sowie auf die von Forgejo verwendete Datenbank zugreifen und diese ändern. Auch das Erhalten von Administratorrechten für Forgejo ist möglich.
|
||||
users.allow_import_local=Darf lokale Repositorys importieren
|
||||
users.allow_create_organization=Darf Organisationen erstellen
|
||||
users.allow_import_local=Kann lokale Repositorys importieren
|
||||
users.allow_create_organization=Kann Organisationen erstellen
|
||||
users.update_profile=Benutzerkonto aktualisieren
|
||||
users.delete_account=Benutzerkonto löschen
|
||||
users.cannot_delete_self=Du kannst dich nicht selbst löschen
|
||||
|
@ -2960,7 +2969,7 @@ users.list_status_filter.is_2fa_enabled=2FA aktiviert
|
|||
users.list_status_filter.not_2fa_enabled=2FA deaktiviert
|
||||
users.details=Benutzerdetails
|
||||
|
||||
emails.email_manage_panel=Benutzer-E-Mail-Verwaltung
|
||||
emails.email_manage_panel=Benutzer-E-Mails verwalten
|
||||
emails.primary=Primär
|
||||
emails.activated=Aktiviert
|
||||
emails.filter_sort.email=E-Mail
|
||||
|
@ -2972,13 +2981,13 @@ emails.not_updated=Fehler beim Aktualisieren der angeforderten E-Mail-Adresse: %
|
|||
emails.duplicate_active=Diese E-Mail-Adresse wird bereits von einem Nutzer verwendet.
|
||||
emails.change_email_header=E-Mail-Eigenschaften aktualisieren
|
||||
|
||||
orgs.org_manage_panel=Organisationsverwaltung
|
||||
orgs.org_manage_panel=Organisationen verwalten
|
||||
orgs.name=Name
|
||||
orgs.teams=Teams
|
||||
orgs.members=Mitglieder
|
||||
orgs.new_orga=Neue Organisation
|
||||
|
||||
repos.repo_manage_panel=Repositoryverwaltung
|
||||
repos.repo_manage_panel=Repositorys verwalten
|
||||
repos.unadopted=Nicht übernommene Repositorys
|
||||
repos.unadopted.no_more=Keine weiteren nicht übernommenen Repositorys gefunden
|
||||
repos.owner=Besitzer
|
||||
|
@ -2991,7 +3000,7 @@ repos.issues=Issues
|
|||
repos.size=Größe
|
||||
repos.lfs_size=LFS-Größe
|
||||
|
||||
packages.package_manage_panel=Paketverwaltung
|
||||
packages.package_manage_panel=Pakete verwalten
|
||||
packages.total_size=Gesamtgröße: %s
|
||||
packages.unreferenced_size=Nicht referenzierte Größe: %s
|
||||
packages.cleanup=Veraltete Daten löschen
|
||||
|
@ -3038,7 +3047,7 @@ auths.attribute_surname=Nachnamensattribut
|
|||
auths.attribute_mail=E-Mail-Attribut
|
||||
auths.attribute_ssh_public_key=Öffentlicher-SSH-Schlüssel-Attribut
|
||||
auths.attribute_avatar=Avatar-Attribut
|
||||
auths.attributes_in_bind=Hole Attribute im Bind-Kontext
|
||||
auths.attributes_in_bind=Hole Attribute im Nind-DN-Kontext
|
||||
auths.allow_deactivate_all=Erlaube ein leeres Suchergebnis, um alle Benutzer zu deaktivieren
|
||||
auths.use_paged_search=Seitensuche verwenden
|
||||
auths.search_page_size=Seitengröße
|
||||
|
@ -3048,7 +3057,7 @@ auths.restricted_filter=Eingeschränkte Filter
|
|||
auths.restricted_filter_helper=Leer lassen, um keine Benutzer als eingeschränkt festzulegen. Verwende einen Asterisk („*“), um alle Benutzer, die nicht dem Admin-Filter entsprechen, als eingeschränkt zu setzen.
|
||||
auths.verify_group_membership=Gruppenmitgliedschaft in LDAP verifizieren (zum Überspringen leer lassen)
|
||||
auths.group_search_base=Gruppensuche Basisdomainname
|
||||
auths.group_attribute_list_users=Gruppenattribut, welches die Benutzerliste enthält
|
||||
auths.group_attribute_list_users=Gruppenattribut, welches Benutzerliste enthält
|
||||
auths.user_attribute_in_group=Benutzerattribut in der Gruppenliste
|
||||
auths.map_group_to_team=Ordne LDAP-Gruppen Organisationsteams zu (zum Überspringen leer lassen)
|
||||
auths.map_group_to_team_removal=Benutzer aus synchronisierten Teams entfernen, wenn der Benutzer nicht zur entsprechenden LDAP-Gruppe gehört
|
||||
|
@ -3066,7 +3075,7 @@ auths.helo_hostname=HELO-Hostname
|
|||
auths.helo_hostname_helper=Mit HELO gesendeter Hostname. Leer lassen, um den aktuellen Hostnamen zu senden.
|
||||
auths.disable_helo=HELO deaktivieren
|
||||
auths.pam_service_name=PAM-Dienstname
|
||||
auths.pam_email_domain=PAM E-Mail-Domain (optional)
|
||||
auths.pam_email_domain=PAM-E-Mail-Domain (optional)
|
||||
auths.oauth2_provider=OAuth2-Anbieter
|
||||
auths.oauth2_icon_url=Symbol-URL
|
||||
auths.oauth2_clientID=Client-ID (Schlüssel)
|
||||
|
@ -3195,6 +3204,7 @@ config.default_keep_email_private=E-Mail-Adressen standardmäßig verbergen
|
|||
config.default_allow_create_organization=Erstellen von Organisationen standardmäßig erlauben
|
||||
config.enable_timetracking=Zeiterfassung aktivieren
|
||||
config.default_enable_timetracking=Zeiterfassung standardmäßig aktivieren
|
||||
config.allow_dots_in_usernames = Erlaubt Benutzern die Verwendung von Punkten in ihren Benutzernamen. Hat keine Auswirkungen auf bestehende Konten.
|
||||
config.default_allow_only_contributors_to_track_time=Nur Mitarbeitern erlauben, die Zeiterfassung zu nutzen
|
||||
config.no_reply_address=Versteckte E-Mail-Domain
|
||||
config.default_visibility_organization=Standard-Sichtbarkeit für neue Organisationen
|
||||
|
@ -3210,7 +3220,7 @@ config.mailer_enabled=Aktiviert
|
|||
config.mailer_enable_helo=HELO aktivieren
|
||||
config.mailer_name=Name
|
||||
config.mailer_protocol=Protokoll
|
||||
config.mailer_smtp_addr=SMTP-Adresse
|
||||
config.mailer_smtp_addr=SMTP-Host
|
||||
config.mailer_smtp_port=SMTP-Port
|
||||
config.mailer_user=Benutzer
|
||||
config.mailer_use_sendmail=Sendmail benutzen
|
||||
|
@ -3231,7 +3241,7 @@ config.cache_config=Cache-Konfiguration
|
|||
config.cache_adapter=Cache-Adapter
|
||||
config.cache_interval=Cache-Intervall
|
||||
config.cache_conn=Cache-Anbindung
|
||||
config.cache_item_ttl=Cache Item-TTL
|
||||
config.cache_item_ttl=Cache-Item-TTL
|
||||
|
||||
config.session_config=Session-Konfiguration
|
||||
config.session_provider=Session-Provider
|
||||
|
@ -3334,6 +3344,7 @@ self_check.database_fix_mssql = Für MSSQL-Benutzer: Du kannst das Problem im Mo
|
|||
self_check.no_problem_found = Noch kein Problem gefunden.
|
||||
self_check.database_inconsistent_collation_columns = Datenbank benutzt Collation %s, aber diese Spalten benutzen Collations, die nicht zusammenpassen. Das könnte ein paar unerwartete Probleme verursachen.
|
||||
self_check.database_collation_mismatch = Erwarte von Datenbank, folgende Collation zu verwenden: %s
|
||||
auths.tips.gmail_settings = Gmail-Einstellungen:
|
||||
|
||||
|
||||
[action]
|
||||
|
@ -3446,9 +3457,9 @@ dependencies=Abhängigkeiten
|
|||
keywords=Schlüsselwörter
|
||||
details=Details
|
||||
details.author=Autor
|
||||
details.project_site=Projektseite
|
||||
details.repository_site=Repository-Seite
|
||||
details.documentation_site=Dokumentationsseite
|
||||
details.project_site=Projektwebseite
|
||||
details.repository_site=Repository-Webseite
|
||||
details.documentation_site=Dokumentationswebseite
|
||||
details.license=Lizenz
|
||||
assets=Dateien
|
||||
versions=Versionen
|
||||
|
@ -3578,6 +3589,7 @@ owner.settings.chef.keypair.description=Ein Schlüsselpaar ist notwendig, um mit
|
|||
rpm.repository = Repository-Info
|
||||
rpm.repository.multiple_groups = Dieses Paket ist in mehreren Gruppen verfügbar.
|
||||
rpm.repository.architectures = Architekturen
|
||||
owner.settings.cargo.rebuild.no_index = Kann nicht erneut erzeugen, es wurde kein Index initialisiert.
|
||||
|
||||
[secrets]
|
||||
secrets=Secrets
|
||||
|
@ -3592,7 +3604,7 @@ deletion=Secret entfernen
|
|||
deletion.description=Das Entfernen eines Secrets kann nicht rückgängig gemacht werden. Fortfahren?
|
||||
deletion.success=Das Secret wurde entfernt.
|
||||
deletion.failed=Secret konnte nicht entfernt werden.
|
||||
management=Secret-Verwaltung
|
||||
management=Secrets verwalten
|
||||
|
||||
[actions]
|
||||
actions=Actions
|
||||
|
@ -3609,7 +3621,7 @@ status.skipped=Übersprungen
|
|||
status.blocked=Blockiert
|
||||
|
||||
runners=Runner
|
||||
runners.runner_manage_panel=Runner-Verwaltung
|
||||
runners.runner_manage_panel=Runner verwalten
|
||||
runners.new=Neuen Runner erstellen
|
||||
runners.new_notice=Wie man einen Runner startet
|
||||
runners.status=Status
|
||||
|
@ -3666,7 +3678,7 @@ workflow.disabled=Workflow ist deaktiviert.
|
|||
need_approval_desc=Um Workflows für den Pull-Request eines Forks auszuführen, ist eine Genehmigung erforderlich.
|
||||
|
||||
variables=Variablen
|
||||
variables.management=Variablenverwaltung
|
||||
variables.management=Variablen verwalten
|
||||
variables.creation=Variable hinzufügen
|
||||
variables.none=Es gibt noch keine Variablen.
|
||||
variables.deletion=Variable entfernen
|
||||
|
|
|
@ -1753,8 +1753,8 @@ pulls.nothing_to_compare=Αυτοί οι κλάδοι είναι όμοιοι.
|
|||
pulls.nothing_to_compare_and_allow_empty_pr=Αυτοί οι κλάδοι είναι ίσοι. Αυτό το PR θα είναι κενό.
|
||||
pulls.has_pull_request=`Υπάρχει ήδη pull request μεταξύ αυτών των κλάδων: <a href="%[1]s">%[2]s#%[3]d</a>`
|
||||
pulls.create=Δημιουργία Pull Request
|
||||
pulls.title_desc=θέλει να συγχωνεύσει %[1]d υποβολές από <code>%[2]s</code> σε <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc=συγχώνευσε %[1]d υποβολές από <code>%[2]s</code> σε <code>%[3]s</code> %[4]s
|
||||
pulls.title_desc_few=θέλει να συγχωνεύσει %[1]d υποβολές από <code>%[2]s</code> σε <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc_few=συγχώνευσε %[1]d υποβολές από <code>%[2]s</code> σε <code>%[3]s</code> %[4]s
|
||||
pulls.change_target_branch_at=`άλλαξε τον κλάδο προορισμού από <b>%s</b> σε <b>%s</b> %s`
|
||||
pulls.tab_conversation=Συζήτηση
|
||||
pulls.tab_commits=Υποβολές
|
||||
|
@ -3192,6 +3192,7 @@ config.default_keep_email_private=Να αποκρύπτονται οι διευ
|
|||
config.default_allow_create_organization=Να επιτρέπεται η δημιουργία οργανισμών από προεπιλογή
|
||||
config.enable_timetracking=Ενεργοποίηση καταγραφής χρόνου
|
||||
config.default_enable_timetracking=Ενεργοποίηση καταγραφής χρόνου από προεπιλογή
|
||||
config.allow_dots_in_usernames = Επιτρέπει την χρήση τελείων σε ονόματα χρηστών. Δεν θα επηρεαστούν λογαριασμοί που ήδη υπάρχουν.
|
||||
config.default_allow_only_contributors_to_track_time=Να επιτρέπεται η καταγραφή χρόνου μόνο από συνεισφέροντες
|
||||
config.no_reply_address=Κρυφό email domain
|
||||
config.default_visibility_organization=Προεπιλεγμένη ορατότητα νέων οργανισμών
|
||||
|
|
|
@ -156,6 +156,27 @@ filter.not_template = Not Template
|
|||
filter.public = Public
|
||||
filter.private = Private
|
||||
|
||||
[search]
|
||||
search = Search...
|
||||
type_tooltip = Search type
|
||||
fuzzy = Fuzzy
|
||||
fuzzy_tooltip = Include results that also match the search term closely
|
||||
match = Match
|
||||
match_tooltip = Include only results that match the exact search term
|
||||
repo_kind = Search repos...
|
||||
user_kind = Search users...
|
||||
org_kind = Search orgs...
|
||||
team_kind = Search teams...
|
||||
code_kind = Search code...
|
||||
code_search_unavailable = Code search is currently not available. Please contact the site administrator.
|
||||
package_kind = Search packages...
|
||||
project_kind = Search projects...
|
||||
branch_kind = Search branches...
|
||||
commit_kind = Search commits...
|
||||
runner_kind = Search runners...
|
||||
no_results = No matching results found.
|
||||
keyword_search_unavailable = Searching by keyword is currently not available. Please contact the site administrator.
|
||||
|
||||
[aria]
|
||||
navbar = Navigation Bar
|
||||
footer = Footer
|
||||
|
@ -336,7 +357,6 @@ my_orgs = Organizations
|
|||
show_more_repos = Show more repositories…
|
||||
collaborative_repos = Collaborative Repositories
|
||||
view_home = View %s
|
||||
search_repos = Find a repository…
|
||||
filter = Other Filters
|
||||
filter_by_team_repositories = Filter by team repositories
|
||||
feed_of = Feed of "%s"
|
||||
|
@ -361,20 +381,8 @@ stars_few = %d stars
|
|||
forks_one = %d fork
|
||||
forks_few = %d forks
|
||||
organizations = Organizations
|
||||
search = Search
|
||||
go_to = Go to
|
||||
code = Code
|
||||
search.type.tooltip = Search type
|
||||
search.fuzzy = Fuzzy
|
||||
search.fuzzy.tooltip = Include results that also matches the search term closely
|
||||
search.match = Match
|
||||
search.match.tooltip = Include only results that matches the exact search term
|
||||
code_search_unavailable = Currently code search is not available. Please contact your site administrator.
|
||||
repo_no_results = No matching repositories found.
|
||||
user_no_results = No matching users found.
|
||||
org_no_results = No matching organizations found.
|
||||
code_no_results = No source code matching your search term found.
|
||||
code_search_results = Search results for "%s"
|
||||
code_last_indexed_at = Last indexed %s
|
||||
relevant_repositories_tooltip = Repositories that are forks or that have no topic, no icon, and no description are hidden.
|
||||
relevant_repositories = Only relevant repositories are being shown, <a href="%s">show unfiltered results</a>.
|
||||
|
@ -703,6 +711,11 @@ continue = Continue
|
|||
cancel = Cancel
|
||||
language = Language
|
||||
ui = Theme
|
||||
hints = Hints
|
||||
additional_repo_units_hint_description = Display an "Add more units..." button for repositories that do not have all available units enabled.
|
||||
additional_repo_units_hint = Encourage enabling additional repository units
|
||||
update_hints = Update hints
|
||||
update_hints_success = Hints have been updated.
|
||||
hidden_comment_types = Hidden comment types
|
||||
hidden_comment_types_description = Comment types checked here will not be shown inside issue pages. Checking "Label" for example removes all "<user> added/removed <label>" comments.
|
||||
hidden_comment_types.ref_tooltip = Comments where this issue was referenced from another issue/commit/…
|
||||
|
@ -1015,8 +1028,7 @@ fork_branch = Branch to be cloned to the fork
|
|||
all_branches = All branches
|
||||
fork_no_valid_owners = This repository can not be forked because there are no valid owners.
|
||||
use_template = Use this template
|
||||
clone_in_vsc = Clone in VS Code
|
||||
clone_in_vscodium = Clone in VSCodium
|
||||
open_with_editor = Open with %s
|
||||
download_zip = Download ZIP
|
||||
download_tar = Download TAR.GZ
|
||||
download_bundle = Download BUNDLE
|
||||
|
@ -1343,9 +1355,8 @@ commits.desc = Browse source code change history.
|
|||
commits.commits = Commits
|
||||
commits.no_commits = No commits in common. "%s" and "%s" have entirely different histories.
|
||||
commits.nothing_to_compare = These branches are equal.
|
||||
commits.search = Search commits…
|
||||
commits.search.tooltip = You can prefix keywords with "author:", "committer:", "after:", or "before:", e.g. "revert author:Alice before:2019-01-13".
|
||||
commits.find = Search
|
||||
commits.search_branch = This Branch
|
||||
commits.search_all = All Branches
|
||||
commits.author = Author
|
||||
commits.message = Message
|
||||
|
@ -1521,7 +1532,6 @@ issues.filter_sort.moststars = Most stars
|
|||
issues.filter_sort.feweststars = Fewest stars
|
||||
issues.filter_sort.mostforks = Most forks
|
||||
issues.filter_sort.fewestforks = Fewest forks
|
||||
issues.keyword_search_unavailable = Searching by keyword is currently not available. Please contact your site administrator.
|
||||
issues.action_open = Open
|
||||
issues.action_close = Close
|
||||
issues.action_label = Label
|
||||
|
@ -1788,8 +1798,10 @@ pulls.nothing_to_compare_have_tag = The selected branch/tag are equal.
|
|||
pulls.nothing_to_compare_and_allow_empty_pr = These branches are equal. This PR will be empty.
|
||||
pulls.has_pull_request = `A pull request between these branches already exists: <a href="%[1]s">%[2]s#%[3]d</a>`
|
||||
pulls.create = Create pull request
|
||||
pulls.title_desc = wants to merge %[1]d commits from <code>%[2]s</code> into <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc = merged %[1]d commits from <code>%[2]s</code> into <code>%[3]s</code> %[4]s
|
||||
pulls.title_desc_one = wants to merge %[1]d commit from <code>%[2]s</code> into <code id="branch_target">%[3]s</code>
|
||||
pulls.title_desc_few = wants to merge %[1]d commits from <code>%[2]s</code> into <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc_one = merged %[1]d commit from <code>%[2]s</code> into <code>%[3]s</code> %[4]s
|
||||
pulls.merged_title_desc_few = merged %[1]d commits from <code>%[2]s</code> into <code>%[3]s</code> %[4]s
|
||||
pulls.change_target_branch_at = `changed target branch from <b>%s</b> to <b>%s</b> %s`
|
||||
pulls.tab_conversation = Conversation
|
||||
pulls.tab_commits = Commits
|
||||
|
@ -1806,6 +1818,7 @@ pulls.title_wip_desc = `<a href="#">Start the title with <strong>%s</strong></a>
|
|||
pulls.cannot_merge_work_in_progress = This pull request is marked as a work in progress.
|
||||
pulls.still_in_progress = Still in progress?
|
||||
pulls.add_prefix = Add <strong>%s</strong> prefix
|
||||
pulls.ready_for_review = Ready for review?
|
||||
pulls.remove_prefix = Remove <strong>%s</strong> prefix
|
||||
pulls.data_broken = This pull request is broken due to missing fork information.
|
||||
pulls.files_conflicted = This pull request has changes conflicting with the target branch.
|
||||
|
@ -2062,17 +2075,6 @@ contributors.contribution_type.commits = Commits
|
|||
contributors.contribution_type.additions = Additions
|
||||
contributors.contribution_type.deletions = Deletions
|
||||
|
||||
search = Search
|
||||
search.search_repo = Search repository
|
||||
search.type.tooltip = Search type
|
||||
search.fuzzy = Fuzzy
|
||||
search.fuzzy.tooltip = Include results that also matches the search term closely
|
||||
search.match = Match
|
||||
search.match.tooltip = Include only results that matches the exact search term
|
||||
search.results = Search results for "%s" in <a href="%s">%s</a>
|
||||
search.code_no_results = No source code matching your search term found.
|
||||
search.code_search_unavailable = Currently code search is not available. Please contact your site administrator.
|
||||
|
||||
settings = Settings
|
||||
settings.desc = Settings is where you can manage the settings for the repository
|
||||
settings.options = Repository
|
||||
|
@ -2241,7 +2243,6 @@ settings.delete_collaborator = Remove
|
|||
settings.collaborator_deletion = Remove Collaborator
|
||||
settings.collaborator_deletion_desc = Removing a collaborator will revoke their access to this repository. Continue?
|
||||
settings.remove_collaborator_success = The collaborator has been removed.
|
||||
settings.search_user_placeholder = Search user…
|
||||
settings.org_not_allowed_to_be_collaborator = Organizations cannot be added as a collaborator.
|
||||
settings.change_team_access_not_allowed = Changing team access for repository has been restricted to organization owner
|
||||
settings.team_not_in_organization = The team is not in the same organization as the repository
|
||||
|
@ -2249,7 +2250,6 @@ settings.teams = Teams
|
|||
settings.add_team = Add team
|
||||
settings.add_team_duplicate = Team already has the repository
|
||||
settings.add_team_success = The team now have access to the repository.
|
||||
settings.search_team = Search team…
|
||||
settings.change_team_permission_tip = Team's permission is set on the team setting page and can't be changed per repository
|
||||
settings.delete_team_tip = This team has access to all repositories and can't be removed
|
||||
settings.remove_team_success = The team's access to the repository has been removed.
|
||||
|
@ -2403,9 +2403,7 @@ settings.protect_whitelist_committers = Whitelist restricted push
|
|||
settings.protect_whitelist_committers_desc = Only whitelisted users or teams will be allowed to push to this branch (but not force push).
|
||||
settings.protect_whitelist_deploy_keys = Whitelist deploy keys with write access to push.
|
||||
settings.protect_whitelist_users = Whitelisted users for pushing:
|
||||
settings.protect_whitelist_search_users = Search users…
|
||||
settings.protect_whitelist_teams = Whitelisted teams for pushing:
|
||||
settings.protect_whitelist_search_teams = Search teams…
|
||||
settings.protect_merge_whitelist_committers = Enable merge whitelist
|
||||
settings.protect_merge_whitelist_committers_desc = Allow only whitelisted users or teams to merge pull requests into this branch.
|
||||
settings.protect_merge_whitelist_users = Whitelisted users for merging:
|
||||
|
@ -2650,7 +2648,6 @@ branch.default_deletion_failed = Branch "%s" is the default branch. It cannot be
|
|||
branch.restore = Restore branch "%s"
|
||||
branch.download = Download branch "%s"
|
||||
branch.rename = Rename branch "%s"
|
||||
branch.search = Search branch
|
||||
branch.included_desc = This branch is part of the default branch
|
||||
branch.included = Included
|
||||
branch.create_new_branch = Create branch from branch:
|
||||
|
@ -2797,7 +2794,6 @@ teams.write_permission_desc = This team grants <strong>Write</strong> access: me
|
|||
teams.admin_permission_desc = This team grants <strong>Admin</strong> access: members can read from, push to and add collaborators to team repositories.
|
||||
teams.create_repo_permission_desc = Additionally, this team grants <strong>Create repository</strong> permission: members can create new repositories in organization.
|
||||
teams.repositories = Team repositories
|
||||
teams.search_repo_placeholder = Search repository…
|
||||
teams.remove_all_repos_title = Remove all team repositories
|
||||
teams.remove_all_repos_desc = This will remove all repositories from the team.
|
||||
teams.add_all_repos_title = Add all repositories
|
||||
|
@ -2831,6 +2827,8 @@ authentication = Authentication sources
|
|||
emails = User emails
|
||||
config = Configuration
|
||||
notices = System notices
|
||||
config_summary = Summary
|
||||
config_settings = Settings
|
||||
monitor = Monitoring
|
||||
first_page = First
|
||||
last_page = Last
|
||||
|
@ -3060,7 +3058,7 @@ auths.attribute_surname = Surname attribute
|
|||
auths.attribute_mail = Email attribute
|
||||
auths.attribute_ssh_public_key = Public SSH key attribute
|
||||
auths.attribute_avatar = Avatar attribute
|
||||
auths.attributes_in_bind = Fetch attributes in nind DN context
|
||||
auths.attributes_in_bind = Fetch attributes in bind DN context
|
||||
auths.allow_deactivate_all = Allow an empty search result to deactivate all users
|
||||
auths.use_paged_search = Use paged search
|
||||
auths.search_page_size = Page size
|
||||
|
@ -3218,6 +3216,7 @@ config.default_keep_email_private = Hide email addresses by default
|
|||
config.default_allow_create_organization = Allow creation of organizations by default
|
||||
config.enable_timetracking = Enable time tracking
|
||||
config.default_enable_timetracking = Enable time tracking by default
|
||||
config.allow_dots_in_usernames = Allow users to use dots in their usernames. Doesn't affect existing accounts.
|
||||
config.default_allow_only_contributors_to_track_time = Let only contributors track time
|
||||
config.no_reply_address = Hidden email domain
|
||||
config.default_visibility_organization = Default visibility of new organizations
|
||||
|
@ -3269,6 +3268,7 @@ config.picture_config = Picture and avatar configuration
|
|||
config.picture_service = Picture service
|
||||
config.disable_gravatar = Disable Gravatar
|
||||
config.enable_federated_avatar = Enable federated avatars
|
||||
config.open_with_editor_app_help = The "Open with" editors for the clone menu. If left empty, the default will be used. Expand to see the default.
|
||||
|
||||
config.git_config = Git configuration
|
||||
config.git_disable_diff_highlight = Disable diff syntax highlighting
|
||||
|
|
|
@ -303,6 +303,7 @@ smtp_from_invalid = La «Sendu retleterojn kiel» adreso malvalidas
|
|||
|
||||
[admin]
|
||||
config.app_data_path = Programdatuja doseiervojo
|
||||
config.allow_dots_in_usernames = Permesi ĉeeston de punktoj en uzantonomoj. Ne efikas je jamaj kontoj.
|
||||
|
||||
[home]
|
||||
filter = Aliaj filtriloj
|
||||
|
|
|
@ -1734,8 +1734,8 @@ pulls.nothing_to_compare=Estas ramas son iguales. No hay necesidad para crear un
|
|||
pulls.nothing_to_compare_and_allow_empty_pr=Estas ramas son iguales. Este PR estará vacío.
|
||||
pulls.has_pull_request=`Ya existe un pull request entre estas ramas: <a href="%[1]s">%[2]s#%[3]d</a>`
|
||||
pulls.create=Crear Pull Request
|
||||
pulls.title_desc=desea fusionar %[1]d commits de <code>%[2]s</code> en <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc=fusionados %[1]d commits de <code>%[2]s</code> en <code>%[3]s</code> %[4]s
|
||||
pulls.title_desc_few=desea fusionar %[1]d commits de <code>%[2]s</code> en <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc_few=fusionados %[1]d commits de <code>%[2]s</code> en <code>%[3]s</code> %[4]s
|
||||
pulls.change_target_branch_at=`cambió la rama objetivo de <b>%s</b> a <b>%s</b> %s`
|
||||
pulls.tab_conversation=Conversación
|
||||
pulls.tab_commits=Commits
|
||||
|
@ -3107,6 +3107,7 @@ config.default_keep_email_private=Ocultar direcciones de correo electrónico por
|
|||
config.default_allow_create_organization=Permitir la creación de organizaciones por defecto
|
||||
config.enable_timetracking=Habilitar seguimiento de tiempo
|
||||
config.default_enable_timetracking=Habilitar seguimiento de tiempo por defecto
|
||||
config.allow_dots_in_usernames = Permite utilizar puntos en los nombres de usuario. No tiene efecto sobre cuentas existentes.
|
||||
config.default_allow_only_contributors_to_track_time=Deje que solo los colaboradores hagan un seguimiento del tiempo
|
||||
config.no_reply_address=Dominio de correos electrónicos ocultos
|
||||
config.default_visibility_organization=Visibilidad por defecto para nuevas organizaciones
|
||||
|
|
|
@ -24,12 +24,12 @@ licenses=گواهینامه ها
|
|||
return_to_gitea=بازگشت به Forgejo
|
||||
|
||||
username=نام کاربری
|
||||
email=آدرس ایمیل
|
||||
email=نشانی رایانامه
|
||||
password=رمز عبور
|
||||
access_token=ژتون دسترسی
|
||||
re_type=تکرارگذواژه
|
||||
re_type=تأیید گذرواژه
|
||||
captcha=کپچا
|
||||
twofa=احراز هویت دوگانه
|
||||
twofa=احراز هویت دو مرحلهای
|
||||
twofa_scratch=کد احراز هویت
|
||||
passcode=رمز عبور
|
||||
|
||||
|
@ -39,7 +39,7 @@ organization=سازمان
|
|||
mirror=قرینه
|
||||
new_repo=مخزن جدید
|
||||
new_migrate=انتقال جدید
|
||||
new_mirror=قرینه ای جدید
|
||||
new_mirror=آینه جدید
|
||||
new_fork=انشعاب مخزن جدید
|
||||
new_org=سازمان جدید
|
||||
new_project=پروژه جدید
|
||||
|
@ -100,6 +100,25 @@ concept_user_organization=سازمان
|
|||
|
||||
|
||||
name=نام
|
||||
logo = نشان
|
||||
sign_in_with_provider = ورود با %s
|
||||
enable_javascript = این وبگاه به جاوا اسکریپت نیاز دارد.
|
||||
webauthn_press_button = لطفاً دکمۀ روی کلید امنیتی را فشار دهید…
|
||||
webauthn_unsupported_browser = مرورگر شما در حال حاضر از WebAuthn پشتیبانی نمیکند.
|
||||
webauthn_error_unknown = خطایی ناشناخته رخ داد. لطفاً دوباره سعی کنید.
|
||||
webauthn_error_unable_to_process = کارساز نتوانست درخواست شما را پردازش کند.
|
||||
webauthn_reload = تازهسازی
|
||||
new_project_column = ستون جدید
|
||||
retry = سعی دوباره
|
||||
rerun = اجرای دوباره
|
||||
rerun_all = اجرای دوباره تمام کارها
|
||||
rss_feed = خوراک RSS
|
||||
pin = سنجاق
|
||||
unpin = حذف سنجاق
|
||||
locked = قفل شده
|
||||
copy_hash = رونوشت هش
|
||||
unknown = نامشخص
|
||||
copy_type_unsupported = این نوع از فایل نمیتواند رونوشت شود.
|
||||
|
||||
[aria]
|
||||
|
||||
|
@ -1307,8 +1326,8 @@ pulls.nothing_to_compare=این شاخهها یکی هستند. نیازی ب
|
|||
pulls.nothing_to_compare_and_allow_empty_pr=این شاخه ها برابر هستند. این PR خالی خواهد بود.
|
||||
pulls.has_pull_request=`A درخواست pull بین این شاخه ها از قبل وجود دارد: <a href="%[1]s">%[2]s#%[3]d</a>`
|
||||
pulls.create=ایجاد تقاضای واکشی
|
||||
pulls.title_desc=قصد ادغام %[1]d تغییر را از <code>%[2]s</code> به <code id="branch_target">%[3]s</code> دارد
|
||||
pulls.merged_title_desc=%[1]d کامیت ادغام شده از <code>%[2]s</code> به <code>%[3]s</code> %[4]s
|
||||
pulls.title_desc_few=قصد ادغام %[1]d تغییر را از <code>%[2]s</code> به <code id="branch_target">%[3]s</code> دارد
|
||||
pulls.merged_title_desc_few=%[1]d کامیت ادغام شده از <code>%[2]s</code> به <code>%[3]s</code> %[4]s
|
||||
pulls.change_target_branch_at=`هدف شاخه از <b>%s</b> به <b>%s</b> %s تغییر کرد`
|
||||
pulls.tab_conversation=گفتگو
|
||||
pulls.tab_commits=کامیتها
|
||||
|
|
|
@ -989,8 +989,8 @@ pulls.nothing_to_compare=Nämä haarat vastaavat toisiaan. Ei ole tarvetta luoda
|
|||
pulls.nothing_to_compare_and_allow_empty_pr=Nämä haarat vastaavat toisiaan. Vetopyyntö tulee olemaan tyhjä.
|
||||
pulls.has_pull_request=`Vetopyyntö haarojen välillä on jo olemassa: <a href="%[1]s">%[2]s#%[3]d</a>`
|
||||
pulls.create=Luo Pull-pyyntö
|
||||
pulls.title_desc=haluaa yhdistää %[1]d committia lähteestä <code>%[2]s</code> kohteeseen <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc=yhdistetty %[1]d committia lähteestä <code>%[2]s</code> kohteeseen <code>%[3]s</code> %[4]s
|
||||
pulls.title_desc_few=haluaa yhdistää %[1]d committia lähteestä <code>%[2]s</code> kohteeseen <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc_few=yhdistetty %[1]d committia lähteestä <code>%[2]s</code> kohteeseen <code>%[3]s</code> %[4]s
|
||||
pulls.tab_conversation=Keskustelu
|
||||
pulls.tab_commits=Commitit
|
||||
pulls.tab_files=Muuttuneet tiedostot
|
||||
|
|
|
@ -168,6 +168,9 @@ number_of_contributions_in_the_last_12_months=%s contributions au cours des 12 d
|
|||
contributions_zero=Aucune contribution
|
||||
less=Moins
|
||||
more=Plus
|
||||
contributions_one = contribution
|
||||
contributions_few = contributions
|
||||
contributions_format = {contributions} le {day} {month} {year}
|
||||
|
||||
[editor]
|
||||
buttons.heading.tooltip=Ajouter un en-tête
|
||||
|
@ -332,7 +335,7 @@ switch_dashboard_context=Basculer le contexte du tableau de bord
|
|||
my_repos=Dépôts
|
||||
show_more_repos=Afficher plus de dépôts…
|
||||
collaborative_repos=Dépôts collaboratifs
|
||||
my_orgs=Mes organisations
|
||||
my_orgs=Organisations
|
||||
my_mirrors=Mes miroirs
|
||||
view_home=Voir %s
|
||||
search_repos=Trouver un dépôt …
|
||||
|
@ -373,6 +376,10 @@ code_search_results=Résultats de la recherche pour « %s »
|
|||
code_last_indexed_at=Dernière indexation %s
|
||||
relevant_repositories_tooltip=Les dépôts qui sont des forks ou qui n'ont aucun sujet, aucune icône et aucune description sont cachés.
|
||||
relevant_repositories=Seuls les dépôts pertinents sont affichés, <a href="%s">afficher les résultats non filtrés</a>.
|
||||
stars_few = %d étoiles
|
||||
forks_one = %d bifurcation
|
||||
stars_one = %d étoiles
|
||||
forks_few = %d bifurcations
|
||||
|
||||
[auth]
|
||||
create_new_account=Créer un compte
|
||||
|
@ -449,6 +456,8 @@ change_unconfirmed_email = Si vous avez donné un courriel incorrect à l'inscri
|
|||
change_unconfirmed_email_summary = Modifier l'adresse à laquelle le courriel d'activation est envoyé.
|
||||
last_admin = Vous ne pouvez pas supprimer le dernier compte administrateur. Il doit exister au moins un compte administrateur.
|
||||
remember_me.compromised = Le jeton de login n'est plus valide ce qui pourrait indiquer une compromission de compte. Veuillez vérifier d'éventuelles activités inhabituelles.
|
||||
tab_signup = Enregistrement
|
||||
tab_signin = Connexion
|
||||
|
||||
[mail]
|
||||
view_it_on=Voir sur %s
|
||||
|
@ -673,7 +682,7 @@ twofa=Authentification à deux facteurs
|
|||
account_link=Comptes liés
|
||||
organization=Organisations
|
||||
uid=UID
|
||||
webauthn=Clés de sécurité
|
||||
webauthn=Clés de sécurité à deux facteurs
|
||||
|
||||
public_profile=Profil public
|
||||
biography_placeholder=Parlez-nous un peu de vous ! (Vous pouvez utiliser Markdown)
|
||||
|
@ -762,7 +771,7 @@ openid_deletion_desc=Supprimer cette adresse OpenID de votre compte vous empêch
|
|||
openid_deletion_success=L'adresse OpenID a été supprimée.
|
||||
add_new_email=Ajouter une nouvelle adresse e-mail
|
||||
add_new_openid=Ajouter une nouvelle URI OpenID
|
||||
add_email=Ajouter une adresse e-mail
|
||||
add_email=Ajouter une adresse courriel
|
||||
add_openid=Ajouter une URI OpenID
|
||||
add_email_confirmation_sent=Un e-mail de confirmation a été envoyé à "%s". Veuillez vérifier votre boîte de réception dans les %s suivants pour confirmer votre adresse e-mail.
|
||||
add_email_success=La nouvelle adresse e-mail a été ajoutée.
|
||||
|
@ -956,8 +965,8 @@ delete_account_desc=Êtes-vous sûr de vouloir supprimer définitivement ce comp
|
|||
|
||||
email_notifications.enable=Activer les notifications par e-mail
|
||||
email_notifications.onmention=N'envoyer un e-mail que si vous êtes mentionné
|
||||
email_notifications.disable=Désactiver les notifications par e-mail
|
||||
email_notifications.submit=Définir les préférences d'e-mail
|
||||
email_notifications.disable=Désactiver les notifications par courriel
|
||||
email_notifications.submit=Définir les préférences de courriel
|
||||
email_notifications.andyourown=Et vos propres notifications
|
||||
|
||||
visibility=Visibilité de l'utilisateur
|
||||
|
@ -989,7 +998,7 @@ visibility=Visibilité
|
|||
visibility_description=Seuls le propriétaire ou les membres de l'organisation, s'ils ont des droits, seront en mesure de le voir.
|
||||
visibility_helper=Rendre le dépôt privé
|
||||
visibility_helper_forced=L’administrateur requière que les nouveaux dépôts soient privés.
|
||||
visibility_fork_helper=(Changer ceci affectera toutes les bifurcations.)
|
||||
visibility_fork_helper=(Changer ceci affectera la visibilité des bifurcations.)
|
||||
clone_helper=Besoin d'aide pour dupliquer ? Visitez <a target="_blank" rel="noopener noreferrer" href="%s">l'aide</a>.
|
||||
fork_repo=Bifurquer le dépôt
|
||||
fork_from=Bifurquer depuis
|
||||
|
@ -1142,7 +1151,7 @@ migrate.migrating=Migration de <b>%s</b> ...
|
|||
migrate.migrating_failed=La migration de <b>%s</b> a échoué.
|
||||
migrate.migrating_failed.error=Échec de la migration : %s
|
||||
migrate.migrating_failed_no_addr=Échec de la migration.
|
||||
migrate.github.description=Migrer les données depuis github.com ou d’autres instances de GitHub.
|
||||
migrate.github.description=Migrer les données depuis github.com ou GitHub Enterprise Server.
|
||||
migrate.git.description=Migrer uniquement un dépôt depuis n’importe quel service Git.
|
||||
migrate.gitlab.description=Migrer les données depuis gitlab.com ou d’autres instances de GitLab.
|
||||
migrate.gitea.description=Migrer les données depuis gitea.com ou d’autres instances de Gitea/Forgejo.
|
||||
|
@ -1154,7 +1163,7 @@ migrate.migrating_git=Migration des données Git
|
|||
migrate.migrating_topics=Migration des sujets
|
||||
migrate.migrating_milestones=Migration des jalons
|
||||
migrate.migrating_labels=Migration des labels
|
||||
migrate.migrating_releases=Migration des Publications.
|
||||
migrate.migrating_releases=Migration des publications.
|
||||
migrate.migrating_issues=Migration des tickets
|
||||
migrate.migrating_pulls=Migration des demandes d'ajout
|
||||
migrate.cancel_migrating_title=Annuler la migration
|
||||
|
@ -1229,7 +1238,7 @@ ambiguous_character=`%[1]c [U+%04[1]X] peut être confondu avec %[2]c [U+%04[2]X
|
|||
escape_control_characters=Échapper
|
||||
unescape_control_characters=Annuler l'échappement
|
||||
file_copy_permalink=Copier le lien permanent
|
||||
view_git_blame=Voir Git Blâme
|
||||
view_git_blame=Voir Git blame
|
||||
video_not_supported_in_browser=Votre navigateur ne supporte pas la balise « vidéo » HTML5.
|
||||
audio_not_supported_in_browser=Votre navigateur ne supporte pas la balise « audio » HTML5.
|
||||
stored_lfs=Stocké avec Git LFS
|
||||
|
@ -1305,8 +1314,8 @@ editor.commit_empty_file_text=Le fichier que vous allez réviser est vide. Conti
|
|||
editor.no_changes_to_show=Il n’y a aucune modification à afficher.
|
||||
editor.fail_to_update_file=Impossible de mettre à jour/créer le fichier "%s".
|
||||
editor.fail_to_update_file_summary=Message d'erreur :
|
||||
editor.push_rejected_no_message=La modification a été rejetée par le serveur sans message. Veuillez vérifier les Git Hooks.
|
||||
editor.push_rejected=La modification a été rejetée par le serveur. Veuillez vérifier vos Git Hooks.
|
||||
editor.push_rejected_no_message=La modification a été rejetée par le serveur sans message. Veuillez vérifier les Git hooks.
|
||||
editor.push_rejected=La modification a été rejetée par le serveur. Veuillez vérifier vos Git hooks.
|
||||
editor.push_rejected_summary=Message de rejet complet :
|
||||
editor.add_subdir=Ajouter un dossier…
|
||||
editor.unable_to_upload_files=Impossible d'envoyer le fichier "%s" : %v
|
||||
|
@ -1435,8 +1444,8 @@ issues.new_label=Nouveau label
|
|||
issues.new_label_placeholder=Nom du label
|
||||
issues.new_label_desc_placeholder=Description
|
||||
issues.create_label=Créer un label
|
||||
issues.label_templates.title=Charger un ensemble prédéfini de label
|
||||
issues.label_templates.info=Il n'existe pas encore de label. Créez-en un avec « Nouveau label » ou utilisez un jeu de label prédéfini :
|
||||
issues.label_templates.title=Charger un ensemble de label
|
||||
issues.label_templates.info=Il n'existe pas encore de label. Créez-en un avec « Nouveau label » ou utilisez un jeu de label :
|
||||
issues.label_templates.helper=Sélectionnez un jeu de label
|
||||
issues.label_templates.use=Utiliser le jeu de labels
|
||||
issues.label_templates.fail_to_load_file=Impossible de charger le fichier de modèle de label « %s » : %v
|
||||
|
@ -1533,9 +1542,9 @@ issues.no_content=Sans contenu.
|
|||
issues.close=Fermer le ticket
|
||||
issues.comment_pull_merged_at=a fusionné la révision %[1]s dans %[2]s %[3]s
|
||||
issues.comment_manually_pull_merged_at=a fusionné manuellement la révision %[1]s dans %[2]s %[3]s
|
||||
issues.close_comment_issue=Commenter et Fermer
|
||||
issues.close_comment_issue=Commenter et fermer
|
||||
issues.reopen_issue=Rouvrir
|
||||
issues.reopen_comment_issue=Commenter et Réouvrir
|
||||
issues.reopen_comment_issue=Commenter et réouvrir
|
||||
issues.create_comment=Commenter
|
||||
issues.closed_at=`a fermé ce ticket <a id="%[1]s" href="#%[1]s">%[2]s</a>.`
|
||||
issues.reopened_at=`a réouvert ce ticket <a id="%[1]s" href="#%[1]s">%[2]s</a>.`
|
||||
|
@ -1573,7 +1582,7 @@ issues.label_title=Nom du label
|
|||
issues.label_description=Description du label
|
||||
issues.label_color=Couleur du label
|
||||
issues.label_exclusive=Exclusif
|
||||
issues.label_archive=Archivé
|
||||
issues.label_archive=Label archivé
|
||||
issues.label_archived_filter=Afficher les labels archivés
|
||||
issues.label_archive_tooltip=Les labels archivés sont par défaut exclus des suggestions lors de la recherche par label.
|
||||
issues.label_exclusive_desc=Remarque : pour rendre des labels mutuellement exclusifs, préfixez leur nom d’une portée au format <code>portée/label</code>.
|
||||
|
@ -1622,12 +1631,12 @@ issues.delete=Supprimer
|
|||
issues.delete.title=Supprimer ce ticket ?
|
||||
issues.delete.text=Voulez-vous vraiment supprimer ce ticket ? (Cette opération supprimera définitivement tout le contenu. Envisagez plutôt de le fermer si vous avez l'intention de l'archiver)
|
||||
issues.tracker=Minuteur
|
||||
issues.start_tracking_short=Démarrer la minuteuse
|
||||
issues.start_tracking_short=Démarrer le chronomètre
|
||||
issues.start_tracking=Démarrer le suivi du temps
|
||||
issues.start_tracking_history=`a commencé son travail %s.`
|
||||
issues.tracker_auto_close=Le minuteur sera automatiquement arrêté quand le ticket sera fermé.
|
||||
issues.tracking_already_started=`Vous avez déjà un minuteur en cours sur <a href="%s">un autre ticket</a> !`
|
||||
issues.stop_tracking=Arrêter la minuteuse
|
||||
issues.stop_tracking=Arrêter le chronomètre
|
||||
issues.stop_tracking_history=`a fini de travailler %s.`
|
||||
issues.cancel_tracking=Abandonner le minuteur
|
||||
issues.cancel_tracking_history=`a abandonné son minuteur %s.`
|
||||
|
@ -1763,8 +1772,8 @@ pulls.nothing_to_compare=Ces branches sont identiques. Il n’y a pas besoin de
|
|||
pulls.nothing_to_compare_and_allow_empty_pr=Ces branches sont égales. Cette demande d'ajout sera vide.
|
||||
pulls.has_pull_request='Il existe déjà une demande d'ajout entre ces deux branches : <a href="%[1]s">%[2]s#%[3]d</a>'
|
||||
pulls.create=Créer une demande d'ajout
|
||||
pulls.title_desc=souhaite fusionner %[1]d révision(s) depuis <code>%[2]s</code> vers <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc=a fusionné %[1]d révision(s) à partir de <code>%[2]s</code> vers <code>%[3]s</code> %[4]s
|
||||
pulls.title_desc_few=souhaite fusionner %[1]d révision(s) depuis <code>%[2]s</code> vers <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc_few=a fusionné %[1]d révision(s) à partir de <code>%[2]s</code> vers <code>%[3]s</code> %[4]s
|
||||
pulls.change_target_branch_at=`a remplacée la branche cible <b><strike>%s</strike></b> par <b>%s</b> %s.`
|
||||
pulls.tab_conversation=Discussion
|
||||
pulls.tab_commits=Révisions
|
||||
|
@ -1832,9 +1841,9 @@ pulls.unrelated_histories=Échec de la fusion: La tête de fusion et la base ne
|
|||
pulls.merge_out_of_date=Échec de la fusion: La base a été mise à jour en cours de fusion. Indice : Réessayez.
|
||||
pulls.head_out_of_date=Échec de la fusion : L’en-tête a été mis à jour pendant la fusion. Conseil : réessayez.
|
||||
pulls.has_merged=Échec : La demande d’ajout est déjà fusionnée, vous ne pouvez plus la fusionner, ni modifier sa branche cible.
|
||||
pulls.push_rejected=Échec du push : la soumission a été rejetée. Revoyez les déclencheurs Git pour ce dépôt.
|
||||
pulls.push_rejected=Échec du push : la soumission a été rejetée. Revoyez les Git hook pour ce dépôt.
|
||||
pulls.push_rejected_summary=Message de rejet complet
|
||||
pulls.push_rejected_no_message=Échec du push : la soumission a été rejetée sans raison. Revoyez les déclencheurs Git pour ce dépôt
|
||||
pulls.push_rejected_no_message=Échec du push : la soumission a été rejetée sans raison. Revoyez les Git hook pour ce dépôt
|
||||
pulls.open_unmerged_pull_exists=`Vous ne pouvez pas rouvrir ceci car la demande d’ajout #%d, en attente, a des propriétés identiques.`
|
||||
pulls.status_checking=Certains contrôles sont en attente
|
||||
pulls.status_checks_success=Tous les contrôles ont réussi
|
||||
|
@ -2047,9 +2056,9 @@ settings.collaboration.read=Lecture
|
|||
settings.collaboration.owner=Propriétaire
|
||||
settings.collaboration.undefined=Indéfini
|
||||
settings.hooks=Webhooks
|
||||
settings.githooks=Déclencheurs Git
|
||||
settings.githooks=Git hooks
|
||||
settings.basic_settings=Paramètres de base
|
||||
settings.mirror_settings=Réglages Miroir
|
||||
settings.mirror_settings=Réglages miroir
|
||||
settings.mirror_settings.docs=Configurez votre dépôt pour synchroniser automatiquement les révisions, étiquettes et branches avec un autre dépôt.
|
||||
settings.mirror_settings.docs.disabled_pull_mirror.instructions=Configurez votre projet pour soumettre automatiquement les révisions, étiquettes et branches vers un autre dépôt. Les miroirs ont été désactivés par l'administrateur de votre site.
|
||||
settings.mirror_settings.docs.disabled_push_mirror.instructions=Configurez votre projet pour synchroniser automatiquement les révisions, étiquettes et branches d'un autre dépôt.
|
||||
|
@ -2076,16 +2085,16 @@ settings.sync_mirror=Synchroniser maintenant
|
|||
settings.pull_mirror_sync_in_progress=Récupération des changements depuis le miroir distant %s en cours.
|
||||
settings.push_mirror_sync_in_progress=Versement des changements vers le miroir distant %s en cours.
|
||||
settings.site=Site Web
|
||||
settings.update_settings=Appliquer
|
||||
settings.update_settings=Appliquer les paramètres
|
||||
settings.update_mirror_settings=Mettre à jour les paramètres du miroir
|
||||
settings.branches.switch_default_branch=Changer de branche
|
||||
settings.branches.update_default_branch=Changer la Branche par Défaut
|
||||
settings.branches.update_default_branch=Changer la branche par défaut
|
||||
settings.branches.add_new_rule=Ajouter une nouvelle règle
|
||||
settings.advanced_settings=Paramètres avancés
|
||||
settings.wiki_desc=Activer le wiki du dépôt
|
||||
settings.use_internal_wiki=Utiliser le wiki interne
|
||||
settings.use_external_wiki=Utiliser un wiki externe
|
||||
settings.external_wiki_url=URL Wiki externe
|
||||
settings.external_wiki_url=URL wiki externe
|
||||
settings.external_wiki_url_error=L’URL du wiki externe n’est pas une URL valide.
|
||||
settings.external_wiki_url_desc=Les visiteurs sont redirigés vers l’URL du wiki externe lors d'un clic sur l’onglet wiki.
|
||||
settings.issues_desc=Activer le suivi de tickets du dépôt
|
||||
|
@ -2105,7 +2114,7 @@ settings.tracker_issue_style.regexp_pattern_desc=Le premier groupe capturé sera
|
|||
settings.tracker_url_format_desc=Utilisez les balises <code>{user}</code>, <code>{repo}</code> et <code>{index}</code> respectivement pour le nom d'utilisateur, le nom du dépôt et le numéro de ticket.
|
||||
settings.enable_timetracker=Activer le suivi du temps
|
||||
settings.allow_only_contributors_to_track_time=Restreindre le suivi de temps aux contributeurs
|
||||
settings.pulls_desc=Activer les demandes de fusion
|
||||
settings.pulls_desc=Activer les demandes d'ajout
|
||||
settings.pulls.ignore_whitespace=Ignorer les espaces lors des conflits
|
||||
settings.pulls.enable_autodetect_manual_merge=Activer la détection automatique de la fusion manuelle (Remarque : dans certains cas particuliers, des erreurs de détection peuvent se produire)
|
||||
settings.pulls.allow_rebase_update=Activer la mise à jour de demande d'ajout par rebase
|
||||
|
@ -2154,7 +2163,7 @@ settings.transfer_started=`Ce dépôt a été marqué pour le transfert et atten
|
|||
settings.transfer_succeed=Le dépôt a été transféré.
|
||||
settings.signing_settings=Paramètres de vérification de la signature
|
||||
settings.trust_model=Niveau de confiance
|
||||
settings.trust_model.default=Par défaut
|
||||
settings.trust_model.default=Modèle de confiance par défaut
|
||||
settings.trust_model.default.desc=Utiliser le niveau de confiance configuré par défaut pour cette instance Forgejo.
|
||||
settings.trust_model.collaborator=Collaborateur
|
||||
settings.trust_model.collaborator.long=Collaborateur : ne se fier qu'aux signatures des collaborateurs du dépôt
|
||||
|
@ -2165,10 +2174,10 @@ settings.trust_model.committer.desc=La signature d'une révision est dite « fia
|
|||
settings.trust_model.collaboratorcommitter=Collaborateur et Auteur
|
||||
settings.trust_model.collaboratorcommitter.long=Collaborateur et Auteur : ne se fier qu'aux signatures des auteurs collaborant au dépôt
|
||||
settings.trust_model.collaboratorcommitter.desc=La signature d'une révision est dite « fiable » si elle correponds à l'auteur collaborant au dépôt. Elle est « dilettante » si elle ne correponds qu'à l'auteur, et autrement « discordante ». Pour les révisions déléguées à Forgejo, elles seront signées par Forgejo et l'auteur original sera crédité "Co-authored-by:" et "Co-committed-by:" en pied de révision. Pour cela, la clé configurée par défaut de Forgejo doit correspondre à celle d'un utilisateur.
|
||||
settings.wiki_delete=Supprimer les données du Wiki
|
||||
settings.wiki_delete=Supprimer les données du wiki
|
||||
settings.wiki_delete_desc=Supprimer les données du wiki d'un dépôt est permanent. Cette action est irréversible.
|
||||
settings.wiki_delete_notices_1=- Ceci supprimera de manière permanente et désactivera le wiki de dépôt pour %s.
|
||||
settings.confirm_wiki_delete=Supprimer les données du Wiki
|
||||
settings.confirm_wiki_delete=Supprimer les données du wiki
|
||||
settings.wiki_deletion_success=Les données du wiki de ce dépôt ont été effacées.
|
||||
settings.delete=Supprimer ce dépôt
|
||||
settings.delete_desc=Supprimer un dépôt est permanent et irréversible.
|
||||
|
@ -2650,7 +2659,7 @@ vendored = Vendored
|
|||
issues.blocked_by_user = Vous ne pouvez pas créer un ticket sur ce dépôt car vous avez été bloqué par son propriétaire.
|
||||
pulls.blocked_by_user = Vous ne pouvez pas créer une pull request sur ce dépôt car vous êtes bloqué par son propriétaire.
|
||||
wiki.cancel = Annuler
|
||||
settings.wiki_globally_editable = Permettre l'édition du Wiki a tout le monde
|
||||
settings.wiki_globally_editable = Permettre l'édition du wiki a tout le monde
|
||||
settings.ignore_stale_approvals = Ignorer les approbations obsolètes
|
||||
settings.ignore_stale_approvals_desc = Ne pas prendre en compte les approbations faites sur d'anciens commits (revues obsolètes) dans le total des approbations pour cette PR. Sans effet si les revues obsolètes ont déjà été annulées.
|
||||
settings.archive.mirrors_unavailable = Les mirroirs ne sont pas disponibles si le dépôt a été archivé.
|
||||
|
@ -2659,7 +2668,7 @@ settings.new_owner_blocked_doer = Le nouveau propriétaire vous a bloqué.
|
|||
settings.enter_repo_name = Confirmez en entrant le propriétaire et le nom du dépôt exactement comme affiché :
|
||||
settings.wiki_rename_branch_main = Normalise le nom de la branche du Wiki
|
||||
settings.wiki_rename_branch_main_desc = Renommer la branche utilisée en interne par le Wiki en "%s". Cette modification est permanente et ne peut être annulée.
|
||||
settings.wiki_rename_branch_main_notices_2 = Cela changera le nom de la branche interne du Wiki associé au dépôt %s de façon permanente. Les checkouts existant devront être mis à jour.
|
||||
settings.wiki_rename_branch_main_notices_2 = Cela changera le nom de la branche interne associée au dépôt du wiki %s de façon permanente. Les checkouts existant devront être mis à jour.
|
||||
settings.wiki_branch_rename_success = Le nom de branche du wiki associé au dépôt a été normalisé avec succès.
|
||||
settings.confirm_wiki_branch_rename = Renommer la branche du wiki
|
||||
settings.add_collaborator_blocked_them = Il n'est pas possible d'ajouter ce collaborateur parce-qu'il a bloqué le propriétaire du dépôt.
|
||||
|
@ -2668,7 +2677,7 @@ settings.add_collaborator_blocked_our = Il n'est pas possible d'ajouter ce colla
|
|||
settings.wiki_rename_branch_main_notices_1 = Cette operation <strong>NE PEUT PAS</strong> être annulée.
|
||||
settings.wiki_branch_rename_failure = Le nom de la branche associée au wiki du dépôt n'a pu être normalisé.
|
||||
pulls.reopen_failed.head_branch = La pull request ne peut pas être re-ouverte car la branch d'origine n'existe plus.
|
||||
settings.units.units = Fonctionalités des dépôt
|
||||
settings.units.units = Fonctionnalités des dépôt
|
||||
pulls.fast_forward_only_merge_pull_request = Fast-forward uniquement
|
||||
pulls.reopen_failed.base_branch = La pull request ne peut pas être re-ouverte car la branche de destination n'existe plus.
|
||||
settings.units.overview = Vue générale
|
||||
|
@ -2685,7 +2694,7 @@ activity.navbar.recent_commits = Commits récents
|
|||
file_follow = Suivre le lien symbolique
|
||||
error.broken_git_hook = Les hooks Git de ce dépôt semblent cassés. Référez vous à la <a target="_blank" rel="noreferrer" href="%s">documentation</a> pour les réparer, puis poussez des commits pour mettre à jour le statut.
|
||||
settings.confirmation_string = Chaine de confirmation
|
||||
pulls.agit_explanation = Créé par le workflow AGit. AGit permet aux contributeurs de proposer des modifications en utilisant "git push" sans créer une fourche ou une nouvelle branche.
|
||||
pulls.agit_explanation = Créé par le workflow AGit. AGit permet aux contributeurs de proposer des modifications en utilisant "git push" sans créer une bifurcation ou une nouvelle branche.
|
||||
|
||||
[graphs]
|
||||
component_loading=Chargement de %s…
|
||||
|
@ -3220,6 +3229,7 @@ config.default_keep_email_private=Masquer les adresses courriel par défaut
|
|||
config.default_allow_create_organization=Autoriser la création d'organisations par défaut
|
||||
config.enable_timetracking=Activer le suivi du temps
|
||||
config.default_enable_timetracking=Activer le suivi de temps par défaut
|
||||
config.allow_dots_in_usernames = Les points sont autorisés dans les noms d'utilisateurs. Sans effet sur les comptes existants.
|
||||
config.default_allow_only_contributors_to_track_time=Restreindre le suivi de temps aux contributeurs
|
||||
config.no_reply_address=Domaine pour les courriels cachés
|
||||
config.default_visibility_organization=Visibilité par défaut des nouvelles organisations
|
||||
|
|
|
@ -933,8 +933,8 @@ pulls.filter_branch=Ágra szűrés
|
|||
pulls.no_results=Nincs találat.
|
||||
pulls.nothing_to_compare=Ezek az ágak egyenlőek. Nincs szükség egyesítési kérésre.
|
||||
pulls.create=Egyesítési kérés létrehozása
|
||||
pulls.title_desc=egyesíteni szeretné %[1]d változás(oka)t a(z) <code>%[2]s</code>-ból <code id="branch_target">%[3]s</code>-ba
|
||||
pulls.merged_title_desc=egyesítve %[1]d változás(ok) a <code>%[2]s</code>-ból <code>%[3]s</code>-ba %[4]s
|
||||
pulls.title_desc_few=egyesíteni szeretné %[1]d változás(oka)t a(z) <code>%[2]s</code>-ból <code id="branch_target">%[3]s</code>-ba
|
||||
pulls.merged_title_desc_few=egyesítve %[1]d változás(ok) a <code>%[2]s</code>-ból <code>%[3]s</code>-ba %[4]s
|
||||
pulls.tab_conversation=Beszélgetés
|
||||
pulls.tab_commits=Commit-ok
|
||||
pulls.tab_files=Módosított fájlok
|
||||
|
|
|
@ -752,8 +752,8 @@ pulls.compare_changes=Permintaan Tarik Baru
|
|||
pulls.filter_branch=Penyaringan cabang
|
||||
pulls.no_results=Hasil tidak ditemukan.
|
||||
pulls.create=Buat Permintaan Tarik
|
||||
pulls.title_desc=ingin menggabungkan komit %[1]d dari <code>%[2]s</code> menuju <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc=commit %[1]d telah digabungkan dari <code>%[2]s</code> menjadi <code>%[3]s</code> %[4]s
|
||||
pulls.title_desc_few=ingin menggabungkan komit %[1]d dari <code>%[2]s</code> menuju <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc_few=commit %[1]d telah digabungkan dari <code>%[2]s</code> menjadi <code>%[3]s</code> %[4]s
|
||||
pulls.tab_conversation=Percakapan
|
||||
pulls.tab_commits=Melakukan
|
||||
pulls.reopen_to_merge=Tolong buka kembali permintaan tarik ini untuk melaksanakan penggabungan.
|
||||
|
|
|
@ -889,7 +889,7 @@ pulls.new=Ný Sameiningarbeiðni
|
|||
pulls.view=Skoða Sameiningarbeiðni
|
||||
pulls.compare_changes=Ný Sameiningarbeiðni
|
||||
pulls.create=Skapa Sameiningarbeiðni
|
||||
pulls.title_desc=vill sameina %[1]d framlög frá <code>%[2]s</code> í <code id="branch_target">%[3]s</code>
|
||||
pulls.title_desc_few=vill sameina %[1]d framlög frá <code>%[2]s</code> í <code id="branch_target">%[3]s</code>
|
||||
pulls.tab_conversation=Umræða
|
||||
pulls.tab_commits=Framlög
|
||||
pulls.tab_files=Skráum Breytt
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1760,8 +1760,8 @@ pulls.nothing_to_compare=同じブランチ同士のため、 プルリクエス
|
|||
pulls.nothing_to_compare_and_allow_empty_pr=これらのブランチは内容が同じです。 空のプルリクエストになります。
|
||||
pulls.has_pull_request=`同じブランチのプルリクエストはすでに存在します: <a href="%[1]s">%[2]s#%[3]d</a>`
|
||||
pulls.create=プルリクエストを作成
|
||||
pulls.title_desc=が <code>%[2]s</code> から <code id="branch_target">%[3]s</code> への %[1]d コミットのマージを希望しています
|
||||
pulls.merged_title_desc=が %[1]d 個のコミットを <code>%[2]s</code> から <code>%[3]s</code> へマージ %[4]s
|
||||
pulls.title_desc_few=が <code>%[2]s</code> から <code id="branch_target">%[3]s</code> への %[1]d コミットのマージを希望しています
|
||||
pulls.merged_title_desc_few=が %[1]d 個のコミットを <code>%[2]s</code> から <code>%[3]s</code> へマージ %[4]s
|
||||
pulls.change_target_branch_at=`がターゲットブランチを <b>%s</b> から <b>%s</b> に変更 %s`
|
||||
pulls.tab_conversation=会話
|
||||
pulls.tab_commits=コミット
|
||||
|
@ -3184,6 +3184,7 @@ config.default_keep_email_private=デフォルトでメールアドレスを隠
|
|||
config.default_allow_create_organization=デフォルトで組織の作成を許可
|
||||
config.enable_timetracking=タイムトラッキング有効
|
||||
config.default_enable_timetracking=デフォルトでタイムトラッキング有効
|
||||
config.allow_dots_in_usernames = ユーザー名にドットを使用できるようにします。既存のアカウントには影響しません。
|
||||
config.default_allow_only_contributors_to_track_time=コントリビューターだけタイムトラッキングする
|
||||
config.no_reply_address=メールを隠すときのドメイン
|
||||
config.default_visibility_organization=新しい組織のデフォルトの表示設定
|
||||
|
|
|
@ -847,8 +847,8 @@ pulls.compare_compare=다음으로부터 풀
|
|||
pulls.filter_branch=Filter Branch
|
||||
pulls.no_results=결과 없음
|
||||
pulls.create=풀 리퀘스트 생성
|
||||
pulls.title_desc="<code>%[2]s</code> 에서 <code id=\"branch_target\">%[3]s</code> 로 %[1]d commits 를 머지하려 합니다"
|
||||
pulls.merged_title_desc=<code>%[2]s</code> 에서 <code>%[3]s</code> 로 %[1]d commits 를 머지했습니다 %[4]s
|
||||
pulls.title_desc_few="<code>%[2]s</code> 에서 <code id=\"branch_target\">%[3]s</code> 로 %[1]d commits 를 머지하려 합니다"
|
||||
pulls.merged_title_desc_few=<code>%[2]s</code> 에서 <code>%[3]s</code> 로 %[1]d commits 를 머지했습니다 %[4]s
|
||||
pulls.tab_conversation=대화
|
||||
pulls.tab_commits=커밋
|
||||
pulls.tab_files=파일 변경됨
|
||||
|
|
|
@ -1713,8 +1713,8 @@ pulls.nothing_to_compare=Nav ko salīdzināt, jo bāzes un salīdzināmie atzari
|
|||
pulls.nothing_to_compare_and_allow_empty_pr=Šie atzari ir vienādi. Izveidotais izmaiņu pieprasījums būs tukšs.
|
||||
pulls.has_pull_request=`Izmaiņu pieprasījums starp šiem atzariem jau eksistē: <a href="%[1]s">%[2]s#%[3]d</a>`
|
||||
pulls.create=Izveidot izmaiņu pieprasījumu
|
||||
pulls.title_desc=vēlas sapludināt %[1]d revīzijas no <code>%[2]s</code> uz <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc=sapludināja %[1]d revīzijas no <code>%[2]s</code> uz <code>%[3]s</code> %[4]s
|
||||
pulls.title_desc_few=vēlas sapludināt %[1]d revīzijas no <code>%[2]s</code> uz <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc_few=sapludināja %[1]d revīzijas no <code>%[2]s</code> uz <code>%[3]s</code> %[4]s
|
||||
pulls.change_target_branch_at=`nomainīja mērķa atzaru no <b>%s</b> uz <b>%s</b> %s`
|
||||
pulls.tab_conversation=Saruna
|
||||
pulls.tab_commits=Revīzijas
|
||||
|
|
|
@ -1618,8 +1618,8 @@ pulls.nothing_to_compare=Deze branches zijn gelijk. Er is geen pull request nodi
|
|||
pulls.nothing_to_compare_and_allow_empty_pr=Deze branches zijn gelijk. Deze pull verzoek zal leeg zijn.
|
||||
pulls.has_pull_request=`Een pull-verzoek tussen deze branches bestaat al: <a href="%[1]s">%[2]s#%[3]d</a>`
|
||||
pulls.create=Pull verzoek aanmaken
|
||||
pulls.title_desc=wil %[1]d commits van <code>%[2]s</code> samenvoegen met <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc=heeft %[1]d commits samengevoegd van <code>%[2]s</code> naar <code>%[3]s</code> %[4]s
|
||||
pulls.title_desc_few=wil %[1]d commits van <code>%[2]s</code> samenvoegen met <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc_few=heeft %[1]d commits samengevoegd van <code>%[2]s</code> naar <code>%[3]s</code> %[4]s
|
||||
pulls.change_target_branch_at='doelbranch aangepast van <b>%s</b> naar <b>%s</b> %s'
|
||||
pulls.tab_conversation=Discussie
|
||||
pulls.tab_commits=Commits
|
||||
|
@ -3096,6 +3096,7 @@ config.default_keep_email_private=Verberg standaard alle e-mailadressen
|
|||
config.default_allow_create_organization=Standaard toestaan om organisaties aan te maken
|
||||
config.enable_timetracking=Tijdregistratie inschakelen
|
||||
config.default_enable_timetracking=Tijdregistratie standaard inschakelen
|
||||
config.allow_dots_in_usernames = Sta gebruikers toe om punten te gebruiken in hun gebruikersnaam. Heeft geen invloed op bestaande accounts.
|
||||
config.default_allow_only_contributors_to_track_time=Sta alleen bijdragers toe tijdregistratie te gebruiken
|
||||
config.no_reply_address=Verborgen e-maildomein
|
||||
config.default_visibility_organization=Standaard zichtbaarheid voor nieuwe organisaties
|
||||
|
|
|
@ -1302,8 +1302,8 @@ pulls.no_results=Nie znaleziono wyników.
|
|||
pulls.nothing_to_compare=Te gałęzie są sobie równe. Nie ma potrzeby tworzyć Pull Requesta.
|
||||
pulls.nothing_to_compare_and_allow_empty_pr=Te gałęzie są równe. Ten PR będzie pusty.
|
||||
pulls.create=Utwórz Pull Request
|
||||
pulls.title_desc=chce scalić %[1]d commity/ów z <code>%[2]s</code> do <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc=scala %[1]d commity/ów z <code>%[2]s</code> do <code>%[3]s</code> %[4]s
|
||||
pulls.title_desc_few=chce scalić %[1]d commity/ów z <code>%[2]s</code> do <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc_few=scala %[1]d commity/ów z <code>%[2]s</code> do <code>%[3]s</code> %[4]s
|
||||
pulls.change_target_branch_at=`zmienia gałąź docelową z <b>%s</b> na <b>%s</b> %s`
|
||||
pulls.tab_conversation=Dyskusja
|
||||
pulls.tab_commits=Commity
|
||||
|
|
|
@ -1724,8 +1724,8 @@ pulls.nothing_to_compare=Estes branches são iguais. Não há nenhuma necessidad
|
|||
pulls.nothing_to_compare_and_allow_empty_pr=Estes branches são iguais. Este PR ficará vazio.
|
||||
pulls.has_pull_request=`Um pull request entre esses branches já existe: <a href="%[1]s">%[2]s#%[3]d</a>`
|
||||
pulls.create=Criar pull request
|
||||
pulls.title_desc=quer aplicar o merge de %[1]d commits de <code>%[2]s</code> em <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc=aplicou merge dos %[1]d commits de <code>%[2]s</code> em <code>%[3]s</code> %[4]s
|
||||
pulls.title_desc_few=quer aplicar o merge de %[1]d commits de <code>%[2]s</code> em <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc_few=aplicou merge dos %[1]d commits de <code>%[2]s</code> em <code>%[3]s</code> %[4]s
|
||||
pulls.change_target_branch_at=`mudou o branch de destino de <b>%s</b> para <b>%s</b> %s`
|
||||
pulls.tab_conversation=Conversação
|
||||
pulls.tab_commits=Commits
|
||||
|
@ -3096,6 +3096,7 @@ config.default_keep_email_private=Ocultar endereços de e-mail por padrão
|
|||
config.default_allow_create_organization=Permitir a criação de organizações por padrão
|
||||
config.enable_timetracking=Habilitar Cronômetro
|
||||
config.default_enable_timetracking=Habilitar o Cronômetro por Padrão
|
||||
config.allow_dots_in_usernames = Permitir pontos em nomes de usuário. Esta opção não afeta contas já existentes.
|
||||
config.default_allow_only_contributors_to_track_time=Permitir que apenas os colaboradores acompanhem o contador de tempo
|
||||
config.no_reply_address=Ocultar domínio de e-mail
|
||||
config.default_visibility_organization=Visibilidade padrão para novas organizações
|
||||
|
|
|
@ -1722,8 +1722,8 @@ pulls.nothing_to_compare_have_tag=O ramo/etiqueta escolhidos são iguais.
|
|||
pulls.nothing_to_compare_and_allow_empty_pr=Estes ramos são iguais. Este pedido de integração ficará vazio.
|
||||
pulls.has_pull_request=`Já existe um pedido de integração entre estes ramos: <a href="%[1]s">%[2]s#%[3]d</a>`
|
||||
pulls.create=Criar um pedido de integração
|
||||
pulls.title_desc=quer integrar %[1]d cometimento(s) do ramo <code>%[2]s</code> no ramo <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc=integrou %[1]d cometimento(s) do ramo <code>%[2]s</code> no ramo <code>%[3]s</code> %[4]s
|
||||
pulls.title_desc_few=quer integrar %[1]d cometimento(s) do ramo <code>%[2]s</code> no ramo <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc_few=integrou %[1]d cometimento(s) do ramo <code>%[2]s</code> no ramo <code>%[3]s</code> %[4]s
|
||||
pulls.change_target_branch_at=`mudou o ramo de destino de <b>%s</b> para <b>%s</b> %s`
|
||||
pulls.tab_conversation=Diálogo
|
||||
pulls.tab_commits=Cometimentos
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
[common]
|
||||
home=Главная
|
||||
dashboard=Панель управления
|
||||
dashboard=Главная
|
||||
explore=Обзор
|
||||
help=Помощь
|
||||
logo=Логотип
|
||||
|
@ -269,13 +269,13 @@ smtp_from_helper=Адрес эл. почты, который будет испо
|
|||
mailer_user=Логин SMTP
|
||||
mailer_password=Пароль SMTP
|
||||
register_confirm=Требовать подтверждение по эл. почте для регистрации
|
||||
mail_notify=Разрешить почтовые уведомления
|
||||
server_service_title=Сервер и настройки внешних служб
|
||||
offline_mode=Включить локальный режим
|
||||
mail_notify=Уведомления по эл. почте
|
||||
server_service_title=Настройки сервера и внешних служб
|
||||
offline_mode=Локальный режим
|
||||
offline_mode_popup=Отключить сторонние сети доставки контента и передавать все ресурсы из их локальных копий.
|
||||
disable_gravatar=Отключить Gravatar
|
||||
disable_gravatar_popup=Отключить Gravatar и сторонние источники аватаров. Если пользователь не загрузит аватар локально, то по умолчанию будет использоваться стандартный аватар.
|
||||
federated_avatar_lookup=Включить федерированные аватары
|
||||
federated_avatar_lookup=Федерированные аватары
|
||||
federated_avatar_lookup_popup=Включите поиск федеративного аватара для использования службы с открытым исходным кодом на основе libravatar.
|
||||
disable_registration=Отключить самостоятельную регистрацию
|
||||
disable_registration_popup=Отключить самостоятельную регистрацию. Только администраторы смогут создавать новые учётные записи пользователей.
|
||||
|
@ -390,7 +390,7 @@ forgot_password=Забыли пароль?
|
|||
sign_up_now=Нужна учётная запись? Зарегистрируйтесь.
|
||||
sign_up_successful=Учётная запись успешно создана. Добро пожаловать!
|
||||
confirmation_mail_sent_prompt=Новое письмо для подтверждения направлено на <b>%s</b>. Пожалуйста, проверьте ваш почтовый ящик в течение %s для завершения регистрации.
|
||||
must_change_password=Обновить пароль
|
||||
must_change_password=Обновите пароль
|
||||
allow_password_change=Требовать смену пароля пользователем (рекомендуется)
|
||||
reset_password_mail_sent_prompt=Письмо с подтверждением отправлено на <b>%s</b>. Пожалуйста, проверьте входящую почту в течение %s, чтобы завершить процесс восстановления учётной записи.
|
||||
active_your_account=Активируйте свою учётную запись
|
||||
|
@ -671,7 +671,7 @@ applications=Приложения
|
|||
orgs=Управление организациями
|
||||
repos=Репозитории
|
||||
delete=Удалить учётную запись
|
||||
twofa=Двухфакторная аутентификация
|
||||
twofa=Двухфакторная аутентификация (TOTP)
|
||||
account_link=Привязанные учётные записи
|
||||
organization=Организации
|
||||
uid=UID
|
||||
|
@ -682,12 +682,12 @@ biography_placeholder=Расскажите немного о себе! (Можн
|
|||
location_placeholder=Поделитесь своим приблизительным местоположением с другими
|
||||
profile_desc=Как ваш профиль будет отображаться для других пользователей. Ваш основной адрес эл. почты будет использоваться для уведомлений, восстановления пароля и веб-операций с Git.
|
||||
password_username_disabled=Нелокальным пользователям запрещено изменение их имени пользователя. Для получения более подробной информации обратитесь к администратору сайта.
|
||||
full_name=Имя и фамилия
|
||||
full_name=Полное имя
|
||||
website=Веб-сайт
|
||||
location=Местоположение
|
||||
update_theme=Обновить тему
|
||||
update_theme=Изменить тему
|
||||
update_profile=Обновить профиль
|
||||
update_language=Обновить язык
|
||||
update_language=Сменить язык
|
||||
update_language_not_found=Язык «%s» недоступен.
|
||||
update_language_success=Язык обновлён.
|
||||
update_profile_success=Ваш профиль успешно обновлён.
|
||||
|
@ -711,7 +711,7 @@ comment_type_group_branch=Операции с ветками
|
|||
comment_type_group_time_tracking=Отслеживание времени
|
||||
comment_type_group_deadline=Модификации сроков выполнения
|
||||
comment_type_group_dependency=Модификации зависимостей
|
||||
comment_type_group_lock=Смена статуса ограничения на обсуждение
|
||||
comment_type_group_lock=Статус ограничения
|
||||
comment_type_group_review_request=Запросы на рецензию
|
||||
comment_type_group_pull_request_push=Добавленные коммиты
|
||||
comment_type_group_project=Проект
|
||||
|
@ -743,7 +743,7 @@ password_change_disabled=Нелокальные учётные записи не
|
|||
emails=Email адреса
|
||||
manage_emails=Управление адресами эл. почты
|
||||
manage_themes=Выберите тему по умолчанию
|
||||
manage_openid=Управление OpenID
|
||||
manage_openid=Управление адресами OpenID
|
||||
email_desc=Ваш основной адрес эл. почты будет использоваться для уведомлений, восстановления пароля и, если он не скрыт, для действий с Git в веб-интерфейсе.
|
||||
theme_desc=Это будет темой по умолчанию для всего сайта.
|
||||
primary=Основной
|
||||
|
@ -764,7 +764,7 @@ openid_deletion_desc=После удаления адреса OpenID вы не
|
|||
openid_deletion_success=Адрес OpenID удален.
|
||||
add_new_email=Добавить адрес эл. почты
|
||||
add_new_openid=Добавить новый OpenID URI
|
||||
add_email=Добавить новый адрес
|
||||
add_email=Добавить адрес эл. почты
|
||||
add_openid=Добавить адрес OpenID
|
||||
add_email_confirmation_sent=Письмо для подтверждения отправлено на «%s». Пожалуйста, проверьте ваш почтовый ящик в течение %s, чтобы завершить процесс подтверждения.
|
||||
add_email_success=Добавлен новый адрес эл. почты.
|
||||
|
@ -946,11 +946,11 @@ repos_none=Вы не владеете ни одним репозиторием.
|
|||
delete_account=Удаление учётной записи
|
||||
delete_prompt=Эта операция навсегда удалит вашу учётную запись. Это <strong>НЕВОЗМОЖНО</strong> будет отменить.
|
||||
delete_with_all_comments=Ваша учётная запись младше %s. Чтобы избежать комментариев к плану, все комментарии к ней будут удалены.
|
||||
confirm_delete_account=Подтвердите удаление
|
||||
confirm_delete_account=Подтвердить удаление
|
||||
delete_account_title=Удалить эту учётную запись
|
||||
delete_account_desc=Вы уверены, что хотите навсегда удалить эту учётную запись?
|
||||
|
||||
email_notifications.enable=Включить почтовые уведомления
|
||||
email_notifications.enable=Разрешить уведомления по почте
|
||||
email_notifications.onmention=Посылать письмо на эл. почту только при упоминании
|
||||
email_notifications.disable=Отключить почтовые уведомления
|
||||
email_notifications.submit=Установить настройки эл. почты
|
||||
|
@ -990,7 +990,7 @@ visibility=Видимость
|
|||
visibility_description=Это увидят только владелец организации или участники при наличии прав.
|
||||
visibility_helper=Сделать репозиторий приватным
|
||||
visibility_helper_forced=Администратор сайта настроил параметр видимости новых репозиториев. Репозиторий приватный по умолчанию.
|
||||
visibility_fork_helper=(Это изменит все ответвления.)
|
||||
visibility_fork_helper=(Это изменит видимость всех ответвлений.)
|
||||
clone_helper=Нужна помощь в клонировании? Посетите страницу <a target="_blank" rel="noopener noreferrer" href="%s">помощи</a>.
|
||||
fork_repo=Создать ответвление
|
||||
fork_from=Ответвить от
|
||||
|
@ -1004,7 +1004,7 @@ clone_in_vsc=Клонировать в VS Code
|
|||
download_zip=Скачать ZIP
|
||||
download_tar=Скачать TAR.GZ
|
||||
download_bundle=Скачать BUNDLE
|
||||
generate_repo=Создать репозиторий
|
||||
generate_repo=Сгенерировать репозиторий
|
||||
generate_from=Создать из
|
||||
repo_desc=Описание
|
||||
repo_desc_helper=Добавьте краткое описание (необязательно)
|
||||
|
@ -1066,9 +1066,9 @@ author_search_tooltip=Показывает максимум 30 пользова
|
|||
tree_path_not_found_commit=Путь %[1]s не существует в коммите %[2]s
|
||||
tree_path_not_found_branch=Путь %[1]s не существует в ветке %[2]s
|
||||
|
||||
transfer.accept=Принять перенос
|
||||
transfer.accept=Принять передачу
|
||||
transfer.accept_desc=Переместить в «%s»
|
||||
transfer.reject=Отказаться от перемещения
|
||||
transfer.reject=Отказаться от передачи
|
||||
transfer.reject_desc=Отменить перемещение в «%s»
|
||||
|
||||
desc.private=Приватный
|
||||
|
@ -1097,14 +1097,14 @@ form.name_reserved=Название репозитория «%s» зарезер
|
|||
form.name_pattern_not_allowed=Шаблон «%s» не допускается в названии репозитория.
|
||||
|
||||
need_auth=Авторизация
|
||||
migrate_options=Параметры миграции
|
||||
migrate_options=Параметры переноса
|
||||
migrate_service=Сервис миграции
|
||||
migrate_options_mirror_helper=Этот репозиторий будет зеркалом
|
||||
migrate_options_lfs=Перенос LFS файлов
|
||||
migrate_options_lfs_endpoint.label=Конечная точка LFS
|
||||
migrate_options_lfs_endpoint.description=Миграция попытается использовать ваш Git удаленно, чтобы <a target="_blank" rel="noopener noreferrer" href="%s">определить сервер LFS</a>. Вы также можете указать пользовательскую конечную точку, если данные хранятся в другом месте.
|
||||
migrate_options_lfs_endpoint.description=При переносе будет произведена попытка <a target="_blank" rel="noopener noreferrer" href="%s">определить сервер LFS</a> автоматически через Git. Если данные LFS хранятся в другом месте, укажите конечную точку самостоятельно.
|
||||
migrate_options_lfs_endpoint.description.local=Также поддерживается путь на локальном сервере.
|
||||
migrate_items=Элементы миграции
|
||||
migrate_items=Переносимые элементы
|
||||
migrate_items_wiki=Вики
|
||||
migrate_items_milestones=Этапы
|
||||
migrate_items_labels=Метки
|
||||
|
@ -1121,16 +1121,16 @@ migrate.permission_denied=У вас нет прав на импорт локал
|
|||
migrate.permission_denied_blocked=Вы не можете импортировать с запрещённых хостов, пожалуйста, попросите администратора проверить настройки ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS.
|
||||
migrate.invalid_local_path=Недопустимый локальный путь. Он не существует или не является каталогом.
|
||||
migrate.invalid_lfs_endpoint=Конечная точка LFS недействительна.
|
||||
migrate.failed=Миграция не удалась: %v
|
||||
migrate.migrate_items_options=Токен доступа необходим для миграции дополнительных элементов
|
||||
migrate.failed=Перенос не удался: %v
|
||||
migrate.migrate_items_options=Токен доступа необходим для переноса дополнительных элементов
|
||||
migrated_from=Перенесено из <a href="%[1]s">%[2]s</a>
|
||||
migrated_from_fake=Перенесено из %[1]s
|
||||
migrate.migrate=Миграция из %s
|
||||
migrate.migrate=Перенос из %s
|
||||
migrate.migrating=Перенос из <b>%s</b>...
|
||||
migrate.migrating_failed=Перенос из <b>%s</b> не удался.
|
||||
migrate.migrating_failed.error=Не удалось мигрировать: %s
|
||||
migrate.migrating_failed_no_addr=Миграция не удалась.
|
||||
migrate.github.description=Переносите данные с github.com или других серверов GitHub.
|
||||
migrate.migrating_failed_no_addr=Перенос не удался.
|
||||
migrate.github.description=Перенесите данные с github.com или сервера GitHub Enterprise.
|
||||
migrate.git.description=Перенести только репозиторий из любого Git сервиса.
|
||||
migrate.gitlab.description=Перенести данные с gitlab.com или других серверов GitLab.
|
||||
migrate.gitea.description=Перенести данные с gitea.com или других серверов Gitea/Forgejo.
|
||||
|
@ -1138,14 +1138,14 @@ migrate.gogs.description=Перенести данные с notabug.org или
|
|||
migrate.onedev.description=Перенести данные с code.onedev.io или других серверов OneDev.
|
||||
migrate.codebase.description=Перенос данных с codebasehq.com.
|
||||
migrate.gitbucket.description=Перенести данные из экземпляров GitBucket.
|
||||
migrate.migrating_git=Перенос Git данных
|
||||
migrate.migrating_topics=Миграция тем
|
||||
migrate.migrating_git=Перенос данных Git
|
||||
migrate.migrating_topics=Перенос тем
|
||||
migrate.migrating_milestones=Перенос этапов
|
||||
migrate.migrating_labels=Миграция меток
|
||||
migrate.migrating_releases=Миграция выпусков
|
||||
migrate.migrating_issues=Миграция задач
|
||||
migrate.migrating_pulls=Миграция запросов на слияние
|
||||
migrate.cancel_migrating_title=Отменить миграцию
|
||||
migrate.migrating_labels=Перенос меток
|
||||
migrate.migrating_releases=Перенос выпусков
|
||||
migrate.migrating_issues=Перенос задач
|
||||
migrate.migrating_pulls=Перенос запросов на слияние
|
||||
migrate.cancel_migrating_title=Отменить перенос
|
||||
migrate.cancel_migrating_confirm=Вы хотите отменить эту миграцию?
|
||||
|
||||
mirror_from=зеркало из
|
||||
|
@ -1555,7 +1555,7 @@ issues.label_title=Имя метки
|
|||
issues.label_description=Описание метки
|
||||
issues.label_color=Цвет метки
|
||||
issues.label_exclusive=Эксклюзивный
|
||||
issues.label_archive=Метка архива
|
||||
issues.label_archive=Архивная метка
|
||||
issues.label_archived_filter=Показать архивированные метки
|
||||
issues.label_archive_tooltip=Архивированные метки исключаются по умолчанию из подсказок при поиске по метке.
|
||||
issues.label_exclusive_desc=Назовите метку <code>область/элемент</code>, чтобы сделать ее взаимоисключающей с другими метками <code>область/</code>.
|
||||
|
@ -1603,17 +1603,17 @@ issues.comment_on_locked=Вы не можете оставить коммент
|
|||
issues.delete=Удалить
|
||||
issues.delete.title=Удалить эту задачу?
|
||||
issues.delete.text=Вы точно хотите удалить эту задачу? (Это навсегда удалит всё её содержимое. Возможно, лучше закрыть её в архивных целях)
|
||||
issues.tracker=Отслеживание времени
|
||||
issues.start_tracking_short=Запустить таймер
|
||||
issues.start_tracking=Начать отслеживание времени
|
||||
issues.tracker=Подсчёт времени
|
||||
issues.start_tracking_short=Запустить подсчёт
|
||||
issues.start_tracking=Начать подсчёт времени
|
||||
issues.start_tracking_history=`начал(а) работать %s`
|
||||
issues.tracker_auto_close=Таймер будет остановлен автоматически, когда эта проблема будет закрыта
|
||||
issues.tracking_already_started=`Вы уже начали отслеживать время для <a href="%s">другой задачи</a>!`
|
||||
issues.stop_tracking=Остановить таймер
|
||||
issues.stop_tracking=Остановить подсчёт
|
||||
issues.stop_tracking_history=`перестал(а) работать %s`
|
||||
issues.cancel_tracking=Отмена
|
||||
issues.cancel_tracking_history=`отменил(а) отслеживание времени %s`
|
||||
issues.add_time=Вручную добавить время
|
||||
issues.add_time=Добавить время вручную
|
||||
issues.del_time=Удалить этот журнал времени
|
||||
issues.add_time_short=Добавить время
|
||||
issues.add_time_cancel=Отмена
|
||||
|
@ -1622,8 +1622,8 @@ issues.del_time_history=`удалил(а) потраченное время %s`
|
|||
issues.add_time_hours=Часы
|
||||
issues.add_time_minutes=Минуты
|
||||
issues.add_time_sum_to_small=Время не было введено.
|
||||
issues.time_spent_total=Общее затраченное время
|
||||
issues.time_spent_from_all_authors=`Общее затраченное время: %s`
|
||||
issues.time_spent_total=Всего затрачено времени
|
||||
issues.time_spent_from_all_authors=`Всего затрачено времени: %s`
|
||||
issues.due_date=Срок выполнения
|
||||
issues.invalid_due_date_format=Срок выполнения должен быть в формате «гггг-мм-дд».
|
||||
issues.error_modifying_due_date=Не удалось изменить срок выполнения.
|
||||
|
@ -1741,8 +1741,10 @@ pulls.nothing_to_compare=Нечего сравнивать, родительск
|
|||
pulls.nothing_to_compare_and_allow_empty_pr=Ветки идентичны. Этот PR будет пустым.
|
||||
pulls.has_pull_request=`Запрос на слияние этих веток уже существует: <a href="%[1]s">%[2]s#%[3]d</a>`
|
||||
pulls.create=Создать запрос на слияние
|
||||
pulls.title_desc=хочет влить %[1]d коммит(ов) из <code>%[2]s</code> в <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc=слито %[1]d коммит(ов) из <code>%[2]s</code> в <code>%[3]s</code> %[4]s
|
||||
pulls.title_desc_one=хочет влить %[1]d коммит из <code>%[2]s</code> в <code id="branch_target">%[3]s</code>
|
||||
pulls.title_desc_few=хочет влить %[1]d коммит(ов) из <code>%[2]s</code> в <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc_one=слит %[1]d коммит из <code>%[2]s</code> в <code>%[3]s</code> %[4]s
|
||||
pulls.merged_title_desc_few=слито %[1]d коммит(ов) из <code>%[2]s</code> в <code>%[3]s</code> %[4]s
|
||||
pulls.change_target_branch_at=`изменил(а) целевую ветку с <b>%s</b> на <b>%s</b> %s`
|
||||
pulls.tab_conversation=Обсуждение
|
||||
pulls.tab_commits=Коммиты
|
||||
|
@ -2093,22 +2095,22 @@ settings.convert_succeed=Репозиторий успешно преобраз
|
|||
settings.convert_fork=Преобразовать в обычный репозиторий
|
||||
settings.convert_fork_desc=Вы можете преобразовать это ответвление в обычный репозиторий. Это не может быть отменено.
|
||||
settings.convert_fork_notices_1=Эта операция преобразует этот ответвление в обычный репозиторий, и не может быть отменена.
|
||||
settings.convert_fork_confirm=Преобразовать Репозиторий
|
||||
settings.convert_fork_confirm=Преобразовать репозиторий
|
||||
settings.convert_fork_succeed=Ответвление преобразовано в обычный репозиторий.
|
||||
settings.transfer=Передать права собственности
|
||||
settings.transfer.rejected=Перенос репозитория отменён.
|
||||
settings.transfer.success=Перенос репозитория выполнен успешно.
|
||||
settings.transfer_abort=Отменить перенос
|
||||
settings.transfer_abort_invalid=Невозможно отменить перенос несуществующего репозитория.
|
||||
settings.transfer.rejected=Передача репозитория отменена.
|
||||
settings.transfer.success=Передача репозитория выполнена успешно.
|
||||
settings.transfer_abort=Отменить передачу
|
||||
settings.transfer_abort_invalid=Невозможно отменить передачу несуществующего репозитория.
|
||||
settings.transfer_abort_success=Передача репозитория %s успешно отменена.
|
||||
settings.transfer_desc=Передать репозиторий другому пользователю или организации где у вас есть права администратора.
|
||||
settings.transfer_form_title=Введите сопутствующую информацию для подтверждения операции:
|
||||
settings.transfer_in_progress=Имеется текущий перенос. Отмените его, если хотите выполнить перенос другому пользователю.
|
||||
settings.transfer_in_progress=Имеется текущая передача. Отмените её, если хотите выполнить передачу другому пользователю.
|
||||
settings.transfer_notices_1=- Вы можете потерять доступ, если новый владелец является отдельным пользователем.
|
||||
settings.transfer_notices_2=- Вы сохраните доступ, если новым владельцем станет организация, владельцем которой вы являетесь.
|
||||
settings.transfer_notices_3=- если репозиторий является приватным и передается отдельному пользователю, это действие позволяет убедиться, что пользователь имеет хотя бы права на чтение (и при необходимости изменяет права доступа).
|
||||
settings.transfer_owner=Новый владелец
|
||||
settings.transfer_perform=Выполнить перенос
|
||||
settings.transfer_perform=Выполнить передачу
|
||||
settings.transfer_started=Репозиторий ожидает подтверждения передачи от «%s»
|
||||
settings.transfer_succeed=Репозиторий перенесён.
|
||||
settings.signing_settings=Настройки подписи верификации
|
||||
|
@ -2611,8 +2613,8 @@ diff.comment.add_line_comment = Добавить комментарий к ст
|
|||
tree_path_not_found_tag = Путь %[1]s отсутствует в теге %[2]s
|
||||
migrate_options_lfs_endpoint.placeholder = Если не заполнено, конечная точка будет определена из URL клонирования
|
||||
invisible_runes_description = `Этот файл содержит невидимые символы Юникода, которые невозможно заметить, но которые потенциально будут влиять на обработку файла. Если так и должно быть, можете спокойно игнорировать это предупреждение. Отобразить символы можно кнопкой Экранирования.`
|
||||
transfer.no_permission_to_accept = У вас недостаточно прав для принятия этого переноса.
|
||||
transfer.no_permission_to_reject = У вас недостаточно прав для отклонения этого переноса.
|
||||
transfer.no_permission_to_accept = У вас недостаточно прав для принятия этой передачи.
|
||||
transfer.no_permission_to_reject = У вас недостаточно прав для отклонения этой передачи.
|
||||
commits.view_path = Просмотреть в этом моменте истории
|
||||
commits.renamed_from = Переименован с %s
|
||||
issues.due_date_not_writer = Для обновления срока выполнения задачи требуется право на запись в этом репозитории.
|
||||
|
@ -2705,17 +2707,17 @@ form.create_org_not_allowed=Этому пользователю не разре
|
|||
settings=Настройки
|
||||
settings.options=Организация
|
||||
settings.full_name=Полное имя
|
||||
settings.email=Почта для связи
|
||||
settings.email=Эл. почта для связи
|
||||
settings.website=Сайт
|
||||
settings.location=Местоположение
|
||||
settings.permission=Разрешения
|
||||
settings.repoadminchangeteam=Администратор репозитория может добавлять и удалять права доступа для команд
|
||||
settings.visibility=Видимость
|
||||
settings.visibility.public=Публичный
|
||||
settings.visibility.limited=Ограниченный (Видимый только выполнившим вход пользователям)
|
||||
settings.visibility.limited=Ограниченная (видна только авторизованным пользователям)
|
||||
settings.visibility.limited_shortname=Ограниченный
|
||||
settings.visibility.private=Приватный (Видимый только для участников организации)
|
||||
settings.visibility.private_shortname=Приватный
|
||||
settings.visibility.private=Частная (видна только участникам организации)
|
||||
settings.visibility.private_shortname=Частная
|
||||
|
||||
settings.update_settings=Обновить настройки
|
||||
settings.update_setting_success=Настройки организации обновлены.
|
||||
|
@ -2726,13 +2728,13 @@ settings.delete=Удалить организацию
|
|||
settings.delete_account=Удалить эту организацию
|
||||
settings.delete_prompt=Это действие <strong>БЕЗВОЗВРАТНО</strong> удалит эту организацию навсегда!
|
||||
settings.confirm_delete_account=Подтвердить удаление
|
||||
settings.delete_org_title=Удалить организацию
|
||||
settings.delete_org_title=Удаление организации
|
||||
settings.delete_org_desc=Эта организация будет безвозвратно удалена. Продолжить?
|
||||
settings.hooks_desc=Добавьте веб-хуки, которые будет вызываться для <strong>всех репозиториев</strong> под этой организации.
|
||||
|
||||
settings.labels_desc=Добавьте метки, которые могут быть использованы в задачах для <strong>всех репозиториев</strong> этой организации.
|
||||
|
||||
members.membership_visibility=Видимость участника команды:
|
||||
members.membership_visibility=Видимость участника:
|
||||
members.public=Видимый
|
||||
members.public_helper=скрыть
|
||||
members.private=Скрыт
|
||||
|
@ -2770,14 +2772,14 @@ teams.delete_team=Удалить команду
|
|||
teams.add_team_member=Добавить участника
|
||||
teams.invite_team_member=Пригласить в %s
|
||||
teams.invite_team_member.list=Приглашения в ожидании
|
||||
teams.delete_team_title=Удалить команду
|
||||
teams.delete_team_title=Удаление команды
|
||||
teams.delete_team_desc=Удаление команды отменяет доступ к репозиторию для её членов. Продолжить?
|
||||
teams.delete_team_success=Команда удалена.
|
||||
teams.read_permission_desc=Эта команда предоставляет доступ на <strong>Чтение</strong>: члены могут просматривать и клонировать репозитории команды.
|
||||
teams.write_permission_desc=Эта команда предоставляет доступ на <strong>Запись</strong>: члены могут получать и выполнять push команды в репозитории.
|
||||
teams.admin_permission_desc=Эта команда даёт <strong>административный</strong> доступ: участники могут читать, отправлять изменения и добавлять соучастников к её репозиториям.
|
||||
teams.create_repo_permission_desc=Кроме того, эта команда предоставляет право <strong>Создание репозитория</strong>: участники команды могут создавать новые репозитории в организации.
|
||||
teams.repositories=Репозитории группы разработки
|
||||
teams.repositories=Репозитории команды
|
||||
teams.search_repo_placeholder=Поиск репозитория…
|
||||
teams.remove_all_repos_title=Удалить все репозитории команды
|
||||
teams.remove_all_repos_desc=Удаляет все репозитории из команды.
|
||||
|
@ -2801,7 +2803,7 @@ follow_blocked_user = Вы не можете подписаться на эту
|
|||
teams.general_access = Настраиваемый доступ
|
||||
|
||||
[admin]
|
||||
dashboard=Панель
|
||||
dashboard=Панель управления
|
||||
identity_access=Идентификация и доступ
|
||||
users=Пользователи
|
||||
organizations=Организации
|
||||
|
@ -3187,6 +3189,7 @@ config.default_keep_email_private=Скрывать адреса эл. почты
|
|||
config.default_allow_create_organization=Разрешить создание организаций по умолчанию
|
||||
config.enable_timetracking=Отслеживание времени
|
||||
config.default_enable_timetracking=Включить отслеживание времени по умолчанию
|
||||
config.allow_dots_in_usernames = Разрешить точки в логинах пользователей. Это не повлияет на уже созданные учётные записи.
|
||||
config.default_allow_only_contributors_to_track_time=Подсчитывать время могут только соавторы
|
||||
config.no_reply_address=Домен скрытых адресов почты
|
||||
config.default_visibility_organization=Видимость новых организаций по умолчанию
|
||||
|
@ -3208,7 +3211,7 @@ config.mailer_user=Пользователь
|
|||
config.mailer_use_sendmail=Использовать Sendmail
|
||||
config.mailer_sendmail_path=Путь к Sendmail
|
||||
config.mailer_sendmail_args=Дополнительные аргументы для Sendmail
|
||||
config.mailer_sendmail_timeout=Тайм-аут Sendmail
|
||||
config.mailer_sendmail_timeout=Истечение ожидания Sendmail
|
||||
config.mailer_use_dummy=Заглушка
|
||||
config.test_email_placeholder=Эл. почта (например, test@example.com)
|
||||
config.send_test_mail=Отправить тестовое письмо
|
||||
|
@ -3237,7 +3240,7 @@ config.cookie_life_time=Время жизни файла cookie
|
|||
config.picture_config=Конфигурация аватаров и изображений
|
||||
config.picture_service=Служба изображений
|
||||
config.disable_gravatar=Отключить Gravatar
|
||||
config.enable_federated_avatar=Включить федерированные аватары
|
||||
config.enable_federated_avatar=Федерированные аватары
|
||||
|
||||
config.git_config=Конфигурация Git
|
||||
config.git_disable_diff_highlight=Отключить подсветку синтаксиса при сравнении
|
||||
|
|
|
@ -1269,8 +1269,8 @@ pulls.nothing_to_compare=මෙම ශාඛා සමාන වේ. අදි
|
|||
pulls.nothing_to_compare_and_allow_empty_pr=මෙම ශාඛා සමාන වේ. මෙම මහජන සම්බන්ධතා හිස් වනු ඇත.
|
||||
pulls.has_pull_request=`මෙම ශාඛා අතර අදින්න ඉල්ලීම දැනටමත් පවතී: <a href="%[1]s">%[2]s #%[3]d</a>`
|
||||
pulls.create=අදින්න ඉල්ලීම නිර්මාණය
|
||||
pulls.title_desc=%[1]d සිට <code>%[2]s</code> දක්වා <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc=මර්ජ්%[1]d සිට <code>%[2]s</code> දක්වා <code>%[3]s</code> %[4]s
|
||||
pulls.title_desc_few=%[1]d සිට <code>%[2]s</code> දක්වා <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc_few=මර්ජ්%[1]d සිට <code>%[2]s</code> දක්වා <code>%[3]s</code> %[4]s
|
||||
pulls.change_target_branch_at=`ඉලක්කගත ශාඛාව <b>%s</b> සිට <b>%s</b> %sදක්වා වෙනස් කර ඇත`
|
||||
pulls.tab_conversation=සංවාදය
|
||||
pulls.tab_commits=විවරයන්
|
||||
|
|
|
@ -267,6 +267,7 @@ config.git_config = Konfiguracija Git
|
|||
config.git_max_diff_line_characters = Največ različnih znakov na vrstico
|
||||
notices.view_detail_header = Podrobnosti obvestila
|
||||
config.log_config = Konfiguracija dnevnika
|
||||
config.allow_dots_in_usernames = Uporabnikom dovolite uporabo pik v uporabniških imenih. Ne vpliva na obstoječe račune.
|
||||
|
||||
[repo]
|
||||
migrate.github_token_desc = Tu lahko vstavite enega ali več žetonov, ločenih z vejico, da bo selitev hitrejša zaradi omejitve hitrosti GitHub API. OPOZORILO: Zloraba te funkcije lahko krši pravila ponudnika storitev in povzroči blokado računa.
|
||||
|
|
|
@ -1088,8 +1088,8 @@ pulls.filter_branch=Filtrera gren
|
|||
pulls.no_results=Inga resultat hittades.
|
||||
pulls.nothing_to_compare=Dessa brancher är ekvivalenta. Det finns ingen anledning att skapa en pull-request.
|
||||
pulls.create=Skapa Pullförfrågan
|
||||
pulls.title_desc=vill sammanfoga %[1]d incheckningar från <code>s[2]s</code> in i <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc=sammanfogade %[1]d incheckningar från <code>%[2]s</code> in i <code>%[3]s</code> %[4]s
|
||||
pulls.title_desc_few=vill sammanfoga %[1]d incheckningar från <code>s[2]s</code> in i <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc_few=sammanfogade %[1]d incheckningar från <code>%[2]s</code> in i <code>%[3]s</code> %[4]s
|
||||
pulls.change_target_branch_at=`ändrade mål-branch från <b>%s</b> till <b>%s</b>%s`
|
||||
pulls.tab_conversation=Konversation
|
||||
pulls.tab_commits=Incheckningar
|
||||
|
|
|
@ -1712,8 +1712,8 @@ pulls.nothing_to_compare=Bu dallar eşit. Değişiklik isteği oluşturmaya gere
|
|||
pulls.nothing_to_compare_and_allow_empty_pr=Bu dallar eşittir. Bu Dİ boş olacak.
|
||||
pulls.has_pull_request=`Bu dallar arasında zaten bir değişiklik isteği var: <a href="%[1]s">%[2]s#%[3]d</a>`
|
||||
pulls.create=Değişiklik İsteği Oluştur
|
||||
pulls.title_desc=<code>%[2]s</code> içindeki %[1]d işlemeyi <code id="branch_target">%[3]s</code> ile birleştirmek istiyor
|
||||
pulls.merged_title_desc=%[4]s <code>%[2]s</code> içindeki %[1]d işlemeyi <code>%[3]s</code> ile birleştirdi
|
||||
pulls.title_desc_few=<code>%[2]s</code> içindeki %[1]d işlemeyi <code id="branch_target">%[3]s</code> ile birleştirmek istiyor
|
||||
pulls.merged_title_desc_few=%[4]s <code>%[2]s</code> içindeki %[1]d işlemeyi <code>%[3]s</code> ile birleştirdi
|
||||
pulls.change_target_branch_at='hedef dal <b>%s</b> adresinden <b>%s</b>%s adresine değiştirildi'
|
||||
pulls.tab_conversation=Sohbet
|
||||
pulls.tab_commits=İşleme
|
||||
|
|
|
@ -1385,8 +1385,8 @@ pulls.nothing_to_compare=Ці гілки однакові. Немає необх
|
|||
pulls.nothing_to_compare_and_allow_empty_pr=Одинакові гілки. Цей PR буде порожнім.
|
||||
pulls.has_pull_request=`Запит злиття для цих гілок вже існує: <a href="%[1]s">%[2]s#%[3]d</a>`
|
||||
pulls.create=Створити запит на злиття
|
||||
pulls.title_desc=хоче злити %[1]d комітів з <code>%[2]s</code> в <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc=злито %[1]d комітів з <code>%[2]s</code> до <code>%[3]s</code> %[4]s
|
||||
pulls.title_desc_few=хоче злити %[1]d комітів з <code>%[2]s</code> в <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc_few=злито %[1]d комітів з <code>%[2]s</code> до <code>%[3]s</code> %[4]s
|
||||
pulls.change_target_branch_at=`змінена цільова гілка з <b>%s</b> на <b>%s</b> %s`
|
||||
pulls.tab_conversation=Обговорення
|
||||
pulls.tab_commits=Коміти
|
||||
|
|
|
@ -167,6 +167,7 @@ number_of_contributions_in_the_last_12_months=一年内 %s 次贡献
|
|||
contributions_zero=目前还没有贡献。
|
||||
less=更少的
|
||||
more=更多的
|
||||
contributions_format = {contributions} 于 {month} {day}, {year}
|
||||
|
||||
[editor]
|
||||
buttons.heading.tooltip=添加标题
|
||||
|
@ -248,7 +249,7 @@ run_user=以用户名运行
|
|||
run_user_helper=输入 Forgejo 运行的操作系统用户名。请注意,此用户必须具有对仓库根路径的访问权限。
|
||||
domain=服务器域名
|
||||
domain_helper=服务器的域名或主机地址。
|
||||
ssh_port=SSH 服务端口
|
||||
ssh_port=SSH 服务器端口
|
||||
ssh_port_helper=SSH 服务器的端口号,为空则禁用它。
|
||||
http_port=HTTP 服务端口
|
||||
http_port_helper=Forgejos web 服务器将侦听的端口号。
|
||||
|
@ -372,6 +373,10 @@ code_search_results=“%s” 的搜索结果是
|
|||
code_last_indexed_at=最后索引于 %s
|
||||
relevant_repositories_tooltip=派生的仓库,以及缺少主题、图标和描述的仓库将被隐藏。
|
||||
relevant_repositories=只显示相关的仓库, <a href="%s">显示未过滤结果</a>。
|
||||
stars_one = %d 点赞
|
||||
stars_few = %d 点赞
|
||||
forks_one = %d 派生
|
||||
forks_few = %d 派生
|
||||
|
||||
[auth]
|
||||
create_new_account=注册帐号
|
||||
|
@ -447,6 +452,8 @@ last_admin=您不能删除最后一个管理员。必须至少保留一个管理
|
|||
change_unconfirmed_email = 如果您在注册时提供了错误的邮箱地址,您可以在下方修改,激活邮件会发送到修改后的邮箱地址。
|
||||
change_unconfirmed_email_summary = 修改用来接收激活邮件的邮箱地址。
|
||||
change_unconfirmed_email_error = 无法修改邮箱地址: %v
|
||||
tab_signin = 登录
|
||||
tab_signup = 注册
|
||||
|
||||
[mail]
|
||||
view_it_on=在 %s 上查看
|
||||
|
@ -501,12 +508,12 @@ release.downloads=下载:
|
|||
release.download.zip=源代码 (ZIP)
|
||||
release.download.targz=源代码 (TAR.GZ)
|
||||
|
||||
repo.transfer.subject_to=%s 想要将 "%s" 转让给 %s
|
||||
repo.transfer.subject_to_you=%s 想要将 "%s" 转让给你
|
||||
repo.transfer.subject_to=%s 想要将 "%s" 仓库转让给 %s
|
||||
repo.transfer.subject_to_you=%s 想要将 "%s" 仓库转让给你
|
||||
repo.transfer.to_you=你
|
||||
repo.transfer.body=访问 %s 以接受或拒绝转移,亦可忽略此邮件。
|
||||
|
||||
repo.collaborator.added.subject=%s 把你添加到了 %s
|
||||
repo.collaborator.added.subject=%s 已将你作为协作者添加到 %s
|
||||
repo.collaborator.added.text=您已被添加为代码库的协作者:
|
||||
|
||||
team_invite.subject=%[1]s 邀请您加入组织 %[2]s
|
||||
|
@ -678,12 +685,12 @@ biography_placeholder=告诉我们一点您自己! (您可以使用Markdown)
|
|||
location_placeholder=与他人分享你的大概位置
|
||||
profile_desc=控制您的个人资料对其他用户的显示方式。您的主要电子邮件地址将用于通知、密码恢复和基于网页界面的 Git 操作。
|
||||
password_username_disabled=不允许非本地用户更改他们的用户名。更多详情请联系您的系统管理员。
|
||||
full_name=自定义名称
|
||||
full_name=全名
|
||||
website=个人网站
|
||||
location=所在地区
|
||||
update_theme=更新主题
|
||||
update_profile=更新信息
|
||||
update_language=更新语言
|
||||
update_theme=更换主题
|
||||
update_profile=更新个人资料
|
||||
update_language=更改语言
|
||||
update_language_not_found=语言 %s 不可用。
|
||||
update_language_success=语言已更新。
|
||||
update_profile_success=您的资料信息已经更新
|
||||
|
@ -717,7 +724,7 @@ privacy=隐私设置
|
|||
keep_activity_private=隐藏个人资料页面中的活动
|
||||
keep_activity_private_popup=使活动仅对您和管理员可见
|
||||
|
||||
lookup_avatar_by_mail=从电子邮箱地址查找头像
|
||||
lookup_avatar_by_mail=使用电子邮箱地址查找头像
|
||||
federated_avatar_lookup=Federated Avatar 查找
|
||||
enable_custom_avatar=启动自定义头像
|
||||
choose_new_avatar=选择新的头像
|
||||
|
@ -858,7 +865,7 @@ generate_token=生成令牌
|
|||
generate_token_success=新令牌生成成功。请拷贝因为令牌将只会显示一次。
|
||||
generate_token_name_duplicate=<strong>%s</strong> 已被用作应用程序名称。请使用一个新的名称。
|
||||
delete_token=删除令牌
|
||||
access_token_deletion=删除 Access Token
|
||||
access_token_deletion=删除访问令牌
|
||||
access_token_deletion_cancel_action=取消
|
||||
access_token_deletion_confirm_action=刪除
|
||||
access_token_deletion_desc=删除令牌将撤销程序对您账户的访问权限。此操作无法撤消。是否继续?
|
||||
|
@ -910,7 +917,7 @@ twofa_recovery_tip=如果您丢失了您的设备,您将能够使用一次性
|
|||
twofa_is_enrolled=你的账号<strong>已启用</strong>了两步验证。
|
||||
twofa_not_enrolled=你的账号未开启两步验证。
|
||||
twofa_disable=禁用两步认证
|
||||
twofa_scratch_token_regenerate=重新生成初始令牌
|
||||
twofa_scratch_token_regenerate=重新生成一次性恢复令牌
|
||||
twofa_scratch_token_regenerated=您的临时令牌现在是 %s。将其存放在安全的地方,它将不会再次显示。
|
||||
twofa_enroll=启用两步验证
|
||||
twofa_disable_note=如果需要, 可以禁用双因素身份验证。
|
||||
|
@ -1151,12 +1158,12 @@ migrate.onedev.description=从 code.onedev.io 或其他 OneDev 实例迁移数
|
|||
migrate.codebase.description=从 codebasehq.com 迁移数据
|
||||
migrate.gitbucket.description=从 GitBucket 实例迁移数据
|
||||
migrate.migrating_git=迁移Git数据
|
||||
migrate.migrating_topics=迁移主题
|
||||
migrate.migrating_milestones=迁移里程碑
|
||||
migrate.migrating_labels=迁移标签
|
||||
migrate.migrating_releases=迁移发布
|
||||
migrate.migrating_issues=迁移工单
|
||||
migrate.migrating_pulls=迁移合并请求
|
||||
migrate.migrating_topics=正在迁移主题
|
||||
migrate.migrating_milestones=正在迁移里程碑
|
||||
migrate.migrating_labels=正在迁移标签
|
||||
migrate.migrating_releases=正在迁移发布
|
||||
migrate.migrating_issues=正在迁移工单
|
||||
migrate.migrating_pulls=正在迁移合并请求
|
||||
migrate.cancel_migrating_title=取消迁移
|
||||
migrate.cancel_migrating_confirm=您想要取消此次迁移吗?
|
||||
|
||||
|
@ -1228,7 +1235,7 @@ ambiguous_character=`%[1]c [U+%04[1]X] 容易和 %[2]c [U+%04[2]X] 混淆`
|
|||
|
||||
escape_control_characters=Escape
|
||||
unescape_control_characters=Unescape
|
||||
file_copy_permalink=复制永久链接
|
||||
file_copy_permalink=复制固定链接
|
||||
view_git_blame=查看 Git Blame
|
||||
video_not_supported_in_browser=您的浏览器不支持 HTML5 “video” 标签。
|
||||
audio_not_supported_in_browser=您的浏览器不支持 HTML5 “audio” 标签。
|
||||
|
@ -1429,7 +1436,7 @@ issues.choose.blank_about=从默认模板创建一个工单。
|
|||
issues.choose.ignore_invalid_templates=已忽略无效模板
|
||||
issues.choose.invalid_templates=发现了 %v 个无效模板
|
||||
issues.choose.invalid_config=问题配置包含错误:
|
||||
issues.no_ref=分支/标记未指定
|
||||
issues.no_ref=未指定分支或标签
|
||||
issues.create=创建工单
|
||||
issues.new_label=创建标签
|
||||
issues.new_label_placeholder=标签名称
|
||||
|
@ -1631,7 +1638,7 @@ issues.stop_tracking=停止计时器
|
|||
issues.stop_tracking_history=`停止工作 %s`
|
||||
issues.cancel_tracking=放弃
|
||||
issues.cancel_tracking_history=`取消时间跟踪 %s`
|
||||
issues.add_time=手动添加时间
|
||||
issues.add_time=手动记录时间
|
||||
issues.del_time=删除此时间跟踪日志
|
||||
issues.add_time_short=添加时间
|
||||
issues.add_time_cancel=取消
|
||||
|
@ -1735,7 +1742,7 @@ compare.compare_head=比较
|
|||
|
||||
pulls.desc=启用合并请求和代码评审。
|
||||
pulls.new=创建合并请求
|
||||
pulls.view=查看拉取请求
|
||||
pulls.view=审阅合并请求
|
||||
pulls.compare_changes=创建合并请求
|
||||
pulls.allow_edits_from_maintainers=允许维护者编辑
|
||||
pulls.allow_edits_from_maintainers_desc=对基础分支有写入权限的用户也可以推送到此分支
|
||||
|
@ -1764,8 +1771,8 @@ pulls.nothing_to_compare_have_tag=所选分支/标签相同。
|
|||
pulls.nothing_to_compare_and_allow_empty_pr=这些分支是相等的,此合并请求将为空。
|
||||
pulls.has_pull_request=这些分支之间的合并请求已存在: <a href="%[1]s">%[2]s#%[3]d</a>
|
||||
pulls.create=创建合并请求
|
||||
pulls.title_desc=请求将 %[1]d 次代码提交从 <code>%[2]s</code> 合并至 <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc=于 %[4]s 将 %[1]d 次代码提交从 <code>%[2]s</code>合并至 <code>%[3]s</code>
|
||||
pulls.title_desc_few=请求将 %[1]d 次代码提交从 <code>%[2]s</code> 合并至 <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc_few=于 %[4]s 将 %[1]d 次代码提交从 <code>%[2]s</code>合并至 <code>%[3]s</code>
|
||||
pulls.change_target_branch_at=将目标分支从 <b>%s</b> 更改为 <b>%s</b> %s
|
||||
pulls.tab_conversation=对话内容
|
||||
pulls.tab_commits=代码提交
|
||||
|
@ -1967,14 +1974,14 @@ activity.period.yearly=1年
|
|||
activity.overview=概览
|
||||
activity.active_prs_count_1=<strong>%d</strong> 合并请求
|
||||
activity.active_prs_count_n=<strong>%d</strong> 合并请求
|
||||
activity.merged_prs_count_1=合并请求
|
||||
activity.merged_prs_count_n=合并请求
|
||||
activity.merged_prs_count_1=已合并的合并请求
|
||||
activity.merged_prs_count_n=已合并的合并请求
|
||||
activity.opened_prs_count_1=新合并请求
|
||||
activity.opened_prs_count_n=新合并请求
|
||||
activity.title.user_1=%d 用户
|
||||
activity.title.user_n=%d 用户
|
||||
activity.title.prs_1=%d 合并请求
|
||||
activity.title.prs_n=%d 合并请求
|
||||
activity.title.prs_1=%d 个合并请求
|
||||
activity.title.prs_n=%d 个合并请求
|
||||
activity.title.prs_merged_by=%[2]s 由 %[1]s 合并
|
||||
activity.title.prs_opened_by=%[2]s 创建了 %[1]s
|
||||
activity.merged_prs_label=已合并
|
||||
|
@ -2073,7 +2080,7 @@ settings.mirror_settings.push_mirror.remote_url=Git 远程仓库链接
|
|||
settings.mirror_settings.push_mirror.add=添加推送镜像
|
||||
settings.mirror_settings.push_mirror.edit_sync_time=编辑镜像同步间隔
|
||||
|
||||
settings.sync_mirror=同步
|
||||
settings.sync_mirror=立即同步
|
||||
settings.pull_mirror_sync_in_progress=正在从远程 %s 拉取更改。
|
||||
settings.push_mirror_sync_in_progress=正在推送变更到远程 %s 。
|
||||
settings.site=网站
|
||||
|
@ -2951,7 +2958,7 @@ users.max_repo_creation_desc=(设置为 -1 表示使用全局默认值)
|
|||
users.is_activated=该用户已被激活
|
||||
users.prohibit_login=禁用登录
|
||||
users.is_admin=是管理员
|
||||
users.is_restricted=受限
|
||||
users.is_restricted=受限制的
|
||||
users.allow_git_hook=允许创建 Git 钩子
|
||||
users.allow_git_hook_tooltip=Git 钩子将会被以操作系统用户运行,将会拥有同样的主机访问权限。因此,拥有此特殊的Git 钩子权限将能够访问合修改所有的 Forgejo 仓库或者Forgejo的数据库。同时也能获得Forgejo的管理员权限。
|
||||
users.allow_import_local=允许导入本地仓库
|
||||
|
@ -2980,7 +2987,7 @@ users.list_status_filter.is_2fa_enabled=已启用 2FA
|
|||
users.list_status_filter.not_2fa_enabled=未启用 2FA
|
||||
users.details=用户详细信息
|
||||
|
||||
emails.email_manage_panel=邮件管理
|
||||
emails.email_manage_panel=管理用户邮件地址
|
||||
emails.primary=主要的
|
||||
emails.activated=已激活
|
||||
emails.filter_sort.email=电子邮件
|
||||
|
@ -3217,6 +3224,7 @@ config.default_keep_email_private=默认情况下隐藏电子邮件地址
|
|||
config.default_allow_create_organization=默认情况下允许创建组织
|
||||
config.enable_timetracking=启用时间跟踪
|
||||
config.default_enable_timetracking=默认情况下启用时间跟踪
|
||||
config.allow_dots_in_usernames = 允许用户在用户名中使用英文句号。不影响已有的帐户。
|
||||
config.default_allow_only_contributors_to_track_time=仅允许成员跟踪时间
|
||||
config.no_reply_address=隐藏电子邮件域
|
||||
config.default_visibility_organization=新组织的默认可见性
|
||||
|
@ -3361,6 +3369,7 @@ self_check.database_collation_case_insensitive=数据库正在使用一个校验
|
|||
self_check.database_inconsistent_collation_columns=数据库正在使用%s的排序规则,但是这些列使用了不匹配的排序规则。这可能会造成一些意外问题。
|
||||
self_check.database_fix_mysql=对于MySQL/MariaDB用户,您可以使用“gitea doctor convert”命令来解决校验问题。 或者您也可以通过 "ALTER ... COLLATE ..." 这样的SQL 来手动解决这个问题。
|
||||
self_check.database_fix_mssql=对于MSSQL用户,您现在只能通过"ALTER ... COLLATE ..."SQLs手动解决这个问题。
|
||||
auths.tips.gmail_settings = Gmail 设置:
|
||||
|
||||
[action]
|
||||
create_repo=创建了仓库 <a href="%s">%s</a>
|
||||
|
@ -3605,6 +3614,7 @@ owner.settings.chef.keypair.description=需要密钥对才能向 Chef 注册中
|
|||
rpm.repository = 仓库信息
|
||||
rpm.repository.architectures = 架构
|
||||
rpm.repository.multiple_groups = 该软件包可在多个组中使用。
|
||||
owner.settings.cargo.rebuild.no_index = 无法重建,未初始化任何索引。
|
||||
|
||||
[secrets]
|
||||
secrets=密钥
|
||||
|
|
|
@ -484,7 +484,7 @@ pulls.compare_changes=建立合併請求
|
|||
pulls.filter_branch=過濾分支
|
||||
pulls.no_results=未找到結果
|
||||
pulls.create=建立合併請求
|
||||
pulls.merged_title_desc=於 %[4]s 將 %[1]d 次代碼提交從 <code>%[2]s</code>合併至 <code>%[3]s</code>
|
||||
pulls.merged_title_desc_few=於 %[4]s 將 %[1]d 次代碼提交從 <code>%[2]s</code>合併至 <code>%[3]s</code>
|
||||
pulls.tab_conversation=對話內容
|
||||
pulls.tab_commits=程式碼提交
|
||||
pulls.reopen_to_merge=請重新開啟合併請求來完成合併操作。
|
||||
|
|
|
@ -54,7 +54,7 @@ organization=組織
|
|||
mirror=鏡像
|
||||
new_repo=新增儲存庫
|
||||
new_migrate=遷移外部儲存庫
|
||||
new_mirror=新鏡像
|
||||
new_mirror=建立新的鏡像
|
||||
new_fork=新增儲存庫 Fork
|
||||
new_org=新增組織
|
||||
new_project=新增專案
|
||||
|
@ -141,8 +141,8 @@ filter.is_archived = 已歸檔
|
|||
filter.not_archived = 未歸檔
|
||||
filter.is_fork = 已派生
|
||||
filter.not_fork = 未派生
|
||||
filter.is_mirror = 已映象
|
||||
filter.not_mirror = 未映象
|
||||
filter.is_mirror = 已鏡像
|
||||
filter.not_mirror = 未鏡像
|
||||
filter.is_template = 模板
|
||||
filter.not_template = 非模版
|
||||
filter.public = 公開
|
||||
|
@ -1592,8 +1592,8 @@ pulls.nothing_to_compare=這些分支的內容相同,無需建立合併請求
|
|||
pulls.nothing_to_compare_and_allow_empty_pr=這些分支的內容相同,此合併請求將會是空白的。
|
||||
pulls.has_pull_request=`已有介於這些分支間的合併請求:<a href="%[1]s">%[2]s#%[3]d</a>`
|
||||
pulls.create=建立合併請求
|
||||
pulls.title_desc=請求將 %[1]d 次程式碼提交從 <code>%[2]s</code> 合併至 <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc=將 %[1]d 次提交從 <code>%[2]s</code> 合併至 <code>%[3]s</code> %[4]s
|
||||
pulls.title_desc_few=請求將 %[1]d 次程式碼提交從 <code>%[2]s</code> 合併至 <code id="branch_target">%[3]s</code>
|
||||
pulls.merged_title_desc_few=將 %[1]d 次提交從 <code>%[2]s</code> 合併至 <code>%[3]s</code> %[4]s
|
||||
pulls.change_target_branch_at=`將目標分支從 <b>%s</b> 更改為 <b>%s</b> %s`
|
||||
pulls.tab_conversation=對話內容
|
||||
pulls.tab_commits=程式碼提交
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 70 70" class="svg gitea-open-with-jetbrains" width="16" height="16" aria-hidden="true"><linearGradient id="gitea-open-with-jetbrains__a" x1=".79" x2="33.317" y1="40.089" y2="40.089" gradientUnits="userSpaceOnUse"><stop offset=".258" style="stop-color:#f97a12"/><stop offset=".459" style="stop-color:#b07b58"/><stop offset=".724" style="stop-color:#577bae"/><stop offset=".91" style="stop-color:#1e7ce5"/><stop offset="1" style="stop-color:#087cfa"/></linearGradient><path d="M17.7 54.6.8 41.2l8.4-15.6L33.3 35z" style="fill:url(#gitea-open-with-jetbrains__a)"/><linearGradient id="gitea-open-with-jetbrains__b" x1="25.767" x2="79.424" y1="24.88" y2="54.57" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#f97a12"/><stop offset=".072" style="stop-color:#cb7a3e"/><stop offset=".154" style="stop-color:#9e7b6a"/><stop offset=".242" style="stop-color:#757b91"/><stop offset=".334" style="stop-color:#537bb1"/><stop offset=".432" style="stop-color:#387ccc"/><stop offset=".538" style="stop-color:#237ce0"/><stop offset=".655" style="stop-color:#147cef"/><stop offset=".792" style="stop-color:#0b7cf7"/><stop offset="1" style="stop-color:#087cfa"/></linearGradient><path d="m70 18.7-1.3 40.5L41.8 70 25.6 59.6 49.3 35 38.9 12.3l9.3-11.2z" style="fill:url(#gitea-open-with-jetbrains__b)"/><linearGradient id="gitea-open-with-jetbrains__c" x1="63.228" x2="48.29" y1="42.915" y2="-1.719" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#fe315d"/><stop offset=".078" style="stop-color:#cb417e"/><stop offset=".16" style="stop-color:#9e4e9b"/><stop offset=".247" style="stop-color:#755bb4"/><stop offset=".339" style="stop-color:#5365ca"/><stop offset=".436" style="stop-color:#386ddb"/><stop offset=".541" style="stop-color:#2374e9"/><stop offset=".658" style="stop-color:#1478f3"/><stop offset=".794" style="stop-color:#0b7bf8"/><stop offset="1" style="stop-color:#087cfa"/></linearGradient><path d="M70 18.7 48.7 43.9l-9.8-31.6 9.3-11.2z" style="fill:url(#gitea-open-with-jetbrains__c)"/><linearGradient id="gitea-open-with-jetbrains__d" x1="10.72" x2="55.524" y1="16.473" y2="90.58" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#fe315d"/><stop offset=".04" style="stop-color:#f63462"/><stop offset=".104" style="stop-color:#df3a71"/><stop offset=".167" style="stop-color:#c24383"/><stop offset=".291" style="stop-color:#ad4a91"/><stop offset=".55" style="stop-color:#755bb4"/><stop offset=".917" style="stop-color:#1d76ed"/><stop offset="1" style="stop-color:#087cfa"/></linearGradient><path d="M33.7 58.1 5.6 68.3l4.5-15.8L16 33.1 0 27.7 10.1 0l22 2.7 21.6 24.7z" style="fill:url(#gitea-open-with-jetbrains__d)"/><path d="M13.7 13.5h43.2v43.2H13.7z" style="fill:#000"/><path d="M17.7 48.6h16.2v2.7H17.7zM29.4 22.4v-3.3h-9v3.3H23v11.3h-2.6V37h9v-3.3h-2.5V22.4zM38 37.3c-1.4 0-2.6-.3-3.5-.8s-1.7-1.2-2.3-1.9l2.5-2.8c.5.6 1 1 1.5 1.3s1.1.5 1.7.5c.7 0 1.3-.2 1.8-.7.4-.5.6-1.2.6-2.3V19.1h4v11.7c0 1.1-.1 2-.4 2.8s-.7 1.4-1.3 2c-.5.5-1.2 1-2 1.2-.8.3-1.6.5-2.6.5" style="fill:#fff"/></svg>
|
After Width: | Height: | Size: 3.0 KiB |
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-1 -1 34 34" class="svg gitea-open-with-vscode" width="16" height="16" aria-hidden="true"><path d="M30.9 3.4 24.3.3a2 2 0 0 0-2.3.4L9.4 12.2 3.9 8c-.5-.4-1.2-.4-1.7 0L.4 9.8c-.5.5-.5 1.4 0 2L5.2 16 .4 20.3c-.5.6-.5 1.5 0 2L2.2 24c.5.5 1.2.5 1.7 0l5.5-4L22 31.2a2 2 0 0 0 2.3.4l6.6-3.2a2 2 0 0 0 1.1-1.8V5.2a2 2 0 0 0-1.1-1.8M24 23.3 14.4 16 24 8.7z"/></svg>
|
After Width: | Height: | Size: 406 B |
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" clip-rule="evenodd" viewBox="0 0 16 16" class="svg gitea-open-with-vscodium" width="16" height="16" aria-hidden="true"><path fill-rule="nonzero" d="m10.2.2.5-.3c.3 0 .5.2.7.4l.2.8-.2 1-.8 2.4c-.3 1-.4 2 0 2.9l.8-2c.2 0 .4.1.4.3l-.3 1L9.2 13l3.1-2.9c.3-.2.7-.5.8-1a2 2 0 0 0-.3-1c-.2-.5-.5-.9-.6-1.4l.1-.7c.1-.1.3-.2.5-.1.2 0 .3.2.4.4.3.5.4 1.2.5 1.8l.6-1.2c0-.2.2-.4.4-.6l.4-.2c.2 0 .4.3.4.4v.6l-.8 1.6-1.4 1.8 1-.4c.2 0 .6.2.7.5 0 .2 0 .4-.2.5-.3.2-.6.2-1 .2-1 0-2.2.6-2.9 1.4L9.6 15c-.4.4-.9 1-1.4.8-.8-.1-.8-1.3-1-1.8 0-.3-.2-.6-.4-.7-.3-.2-.5-.3-.8-.3-.6-.1-1.2 0-1.8-.2l-.8-.4-.4-.7c-.3-.6-.3-1.2-.5-1.8A4 4 0 0 0 1 8l-.4-.4v-.4c.2-.2.5-.2.7 0 .5.2.5.8 1 1.1V6.2s.3-.1.4 0l.2.5L3 9c.4-.4.6-1 .5-1.5L3.4 7l.3-.2c.2 0 .3.2.4.3v.7c0 .6-.3 1.1-.4 1.7-.2.4-.3 1-.1 1.4.1.5.5.9.9 1 .5.3 1.1.4 1.7.4-.4-.6-.7-1.2-.7-2 0-.7.4-1.3.6-2C6.3 7 5.7 5.8 4.8 5l-1.5-.7c-.4-.2-.7-.7-.7-1.2.3-.1.7 0 1 .1L5 4.5l.6.1c.2-.3 0-.6-.2-.8-.3-.5-1-.6-1.3-1a.9.9 0 0 1-.2-.8c0-.2.3-.4.5-.4.4 0 .7.3.9.5.8.8 1.2 1.8 1.4 3s0 2.5-.2 3.7c0 .3-.2.5-.1.8l.2.2c.2 0 .4 0 .5-.2.4-.3.8-.8.9-1.3l.1-1.2.1-.6.4-.2.3.3v.6c-.1.5-.2 1-.5 1.6a2 2 0 0 1-.6 1l-1 1c-.1.2-.2.6-.1.9 0 .2.2.4.4.5.4.2.8.2 1 0 .3-.1.5-.4.7-.6l.5-1.4.4-2.5C9.7 7 9.6 6 9 5.2c-.2-.4-.5-.7-1-1l-1-.8c-.2-.3-.4-.7-.3-1.2h.6c.4.1.7.4.9.8s.4.8.9 1l-1-2c-.1-.3-.3-.5-.2-.8 0-.2.2-.4.4-.4s.4.1.5.3l.2.5 1 3.1a4 4 0 0 0 .4-2.3L10 1V.2Z"/></svg>
|
After Width: | Height: | Size: 1.5 KiB |
|
@ -1 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-1 -1 34 34" class="svg gitea-vscode" width="16" height="16" aria-hidden="true"><path d="M30.9 3.4 24.3.3a2 2 0 0 0-2.3.4L9.4 12.2 3.9 8c-.5-.4-1.2-.4-1.7 0L.4 9.8c-.5.5-.5 1.4 0 2L5.2 16 .4 20.3c-.5.6-.5 1.5 0 2L2.2 24c.5.5 1.2.5 1.7 0l5.5-4L22 31.2a2 2 0 0 0 2.3.4l6.6-3.2a2 2 0 0 0 1.1-1.8V5.2a2 2 0 0 0-1.1-1.8M24 23.3 14.4 16 24 8.7z"/></svg>
|
Before Width: | Height: | Size: 396 B |
|
@ -0,0 +1,46 @@
|
|||
{
|
||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||
"extends": ["config:best-practices", ":approveMajorUpdates"],
|
||||
"ignorePresets": [":semanticPrefixFixDepsChoreOthers", "docker:pinDigests", "helpers:pinGitHubActionDigests"],
|
||||
"semanticCommits": "disabled",
|
||||
"postUpdateOptions": ["gomodTidy", "gomodUpdateImportPaths", "npmDedupe"],
|
||||
"platformAutomerge": false,
|
||||
"packageRules": [
|
||||
{
|
||||
"description": "Require approval for go and python minor version",
|
||||
"matchDepNames": ["go", "python"],
|
||||
"matchUpdateTypes": ["minor"],
|
||||
"dependencyDashboardApproval": true
|
||||
},
|
||||
{
|
||||
"description": "Automerge renovate updates",
|
||||
"matchDatasources": ["docker"],
|
||||
"matchPackageNames": ["ghcr.io/visualon/renovate"],
|
||||
"matchUpdateTypes": ["minor", "patch", "digest"],
|
||||
"automerge": true
|
||||
},
|
||||
{
|
||||
"description": "Update renovate only daily",
|
||||
"matchDatasources": ["docker"],
|
||||
"matchDepNames": ["ghcr.io/visualon/renovate"],
|
||||
"extends": ["schedule:daily"]
|
||||
},
|
||||
{
|
||||
"description": "Disable actions/cascading-pr for now <https://github.com/renovatebot/renovate/issues/28120>",
|
||||
"matchDepNames": ["actions/cascading-pr"],
|
||||
"matchManagers": ["github-actions"],
|
||||
"enabled": false
|
||||
}
|
||||
],
|
||||
"customManagers": [
|
||||
{
|
||||
"description": "Update go-version in forgejo workflows",
|
||||
"customType": "regex",
|
||||
"fileMatch": ["^.forgejo/workflows/.+\\.yml$"],
|
||||
"matchStrings": ["\\s+go-version: ['\"]?(?<currentValue>.+?)['\"]?\\s"],
|
||||
"depNameTemplate": "go",
|
||||
"datasourceTemplate": "golang-version",
|
||||
"versioningTemplate": "go-mod-directive"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -311,7 +311,7 @@ func (ar artifactRoutes) comfirmUploadArtifact(ctx *ArtifactContext) {
|
|||
}
|
||||
artifactName := ctx.Req.URL.Query().Get("artifactName")
|
||||
if artifactName == "" {
|
||||
log.Error("Error artifact name is empty")
|
||||
log.Warn("Error artifact name is empty")
|
||||
ctx.Error(http.StatusBadRequest, "Error artifact name is empty")
|
||||
return
|
||||
}
|
||||
|
|
|
@ -61,7 +61,7 @@ func validateArtifactHash(ctx *ArtifactContext, artifactName string) bool {
|
|||
if paramHash == artifactHash {
|
||||
return true
|
||||
}
|
||||
log.Error("Invalid artifact hash: %s", paramHash)
|
||||
log.Warn("Invalid artifact hash: %s", paramHash)
|
||||
ctx.Error(http.StatusBadRequest, "Invalid artifact hash")
|
||||
return false
|
||||
}
|
||||
|
|
|
@ -359,7 +359,7 @@ func (r *artifactV4Routes) finalizeArtifact(ctx *ArtifactContext) {
|
|||
checksum = req.Hash.Value
|
||||
}
|
||||
if err := mergeChunksForArtifact(ctx, chunks, r.fs, artifact, checksum); err != nil {
|
||||
log.Error("Error merge chunks: %v", err)
|
||||
log.Warn("Error merge chunks: %v", err)
|
||||
ctx.Error(http.StatusInternalServerError, "Error merge chunks")
|
||||
return
|
||||
}
|
||||
|
|
|
@ -49,7 +49,10 @@ var (
|
|||
func apiError(ctx *context.Context, status int, obj any) {
|
||||
helper.LogAndProcessError(ctx, status, obj, func(message string) {
|
||||
// The maven client does not present the error message to the user. Log it for users with access to server logs.
|
||||
if status == http.StatusBadRequest || status == http.StatusInternalServerError {
|
||||
switch status {
|
||||
case http.StatusBadRequest:
|
||||
log.Warn(message)
|
||||
case http.StatusInternalServerError:
|
||||
log.Error(message)
|
||||
}
|
||||
|
||||
|
|
|
@ -14,6 +14,7 @@ import (
|
|||
|
||||
"code.gitea.io/gitea/modules/activitypub"
|
||||
"code.gitea.io/gitea/modules/httplib"
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
gitea_context "code.gitea.io/gitea/services/context"
|
||||
|
||||
|
@ -89,7 +90,8 @@ func verifyHTTPSignatures(ctx *gitea_context.APIContext) (authenticated bool, er
|
|||
func ReqHTTPSignature() func(ctx *gitea_context.APIContext) {
|
||||
return func(ctx *gitea_context.APIContext) {
|
||||
if authenticated, err := verifyHTTPSignatures(ctx); err != nil {
|
||||
ctx.ServerError("verifyHttpSignatures", err)
|
||||
log.Warn("verifyHttpSignatures failed: %v", err)
|
||||
ctx.Error(http.StatusBadRequest, "reqSignature", "request signature verification failed")
|
||||
} else if !authenticated {
|
||||
ctx.Error(http.StatusForbidden, "reqSignature", "request signature verification failed")
|
||||
}
|
||||
|
|
|
@ -10,7 +10,6 @@ import (
|
|||
|
||||
activities_model "code.gitea.io/gitea/models/activities"
|
||||
"code.gitea.io/gitea/models/db"
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
"code.gitea.io/gitea/modules/structs"
|
||||
"code.gitea.io/gitea/services/context"
|
||||
"code.gitea.io/gitea/services/convert"
|
||||
|
@ -201,7 +200,6 @@ func ReadRepoNotifications(ctx *context.APIContext) {
|
|||
if !ctx.FormBool("all") {
|
||||
statuses := ctx.FormStrings("status-types")
|
||||
opts.Status = statusStringsToNotificationStatuses(statuses, []string{"unread"})
|
||||
log.Error("%v", opts.Status)
|
||||
}
|
||||
nl, err := db.Find[activities_model.Notification](ctx, opts)
|
||||
if err != nil {
|
||||
|
|
|
@ -55,6 +55,7 @@ func UpdateUserSettings(ctx *context.APIContext) {
|
|||
DiffViewStyle: optional.FromPtr(form.DiffViewStyle),
|
||||
KeepEmailPrivate: optional.FromPtr(form.HideEmail),
|
||||
KeepActivityPrivate: optional.FromPtr(form.HideActivity),
|
||||
EnableRepoUnitHints: optional.FromPtr(form.EnableRepoUnitHints),
|
||||
}
|
||||
if err := user_service.UpdateUser(ctx, ctx.Doer, opts); err != nil {
|
||||
ctx.InternalServerError(err)
|
||||
|
|
|
@ -7,11 +7,11 @@ package admin
|
|||
import (
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
system_model "code.gitea.io/gitea/models/system"
|
||||
"code.gitea.io/gitea/modules/base"
|
||||
"code.gitea.io/gitea/modules/container"
|
||||
"code.gitea.io/gitea/modules/git"
|
||||
"code.gitea.io/gitea/modules/json"
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
|
@ -24,7 +24,10 @@ import (
|
|||
"gitea.com/go-chi/session"
|
||||
)
|
||||
|
||||
const tplConfig base.TplName = "admin/config"
|
||||
const (
|
||||
tplConfig base.TplName = "admin/config"
|
||||
tplConfigSettings base.TplName = "admin/config_settings"
|
||||
)
|
||||
|
||||
// SendTestMail send test mail to confirm mail service is OK
|
||||
func SendTestMail(ctx *context.Context) {
|
||||
|
@ -98,8 +101,9 @@ func shadowPassword(provider, cfgItem string) string {
|
|||
|
||||
// Config show admin config page
|
||||
func Config(ctx *context.Context) {
|
||||
ctx.Data["Title"] = ctx.Tr("admin.config")
|
||||
ctx.Data["Title"] = ctx.Tr("admin.config_summary")
|
||||
ctx.Data["PageIsAdminConfig"] = true
|
||||
ctx.Data["PageIsAdminConfigSummary"] = true
|
||||
|
||||
ctx.Data["CustomConf"] = setting.CustomConf
|
||||
ctx.Data["AppUrl"] = setting.AppURL
|
||||
|
@ -161,23 +165,70 @@ func Config(ctx *context.Context) {
|
|||
|
||||
ctx.Data["Loggers"] = log.GetManager().DumpLoggers()
|
||||
config.GetDynGetter().InvalidateCache()
|
||||
ctx.Data["SystemConfig"] = setting.Config()
|
||||
prepareDeprecatedWarningsAlert(ctx)
|
||||
|
||||
ctx.HTML(http.StatusOK, tplConfig)
|
||||
}
|
||||
|
||||
func ConfigSettings(ctx *context.Context) {
|
||||
ctx.Data["Title"] = ctx.Tr("admin.config_settings")
|
||||
ctx.Data["PageIsAdminConfig"] = true
|
||||
ctx.Data["PageIsAdminConfigSettings"] = true
|
||||
ctx.Data["DefaultOpenWithEditorAppsString"] = setting.DefaultOpenWithEditorApps().ToTextareaString()
|
||||
ctx.HTML(http.StatusOK, tplConfigSettings)
|
||||
}
|
||||
|
||||
func ChangeConfig(ctx *context.Context) {
|
||||
key := strings.TrimSpace(ctx.FormString("key"))
|
||||
value := ctx.FormString("value")
|
||||
cfg := setting.Config()
|
||||
allowedKeys := container.SetOf(cfg.Picture.DisableGravatar.DynKey(), cfg.Picture.EnableFederatedAvatar.DynKey())
|
||||
if !allowedKeys.Contains(key) {
|
||||
|
||||
marshalBool := func(v string) (string, error) {
|
||||
if b, _ := strconv.ParseBool(v); b {
|
||||
return "true", nil
|
||||
}
|
||||
return "false", nil
|
||||
}
|
||||
marshalOpenWithApps := func(value string) (string, error) {
|
||||
lines := strings.Split(value, "\n")
|
||||
var openWithEditorApps setting.OpenWithEditorAppsType
|
||||
for _, line := range lines {
|
||||
line = strings.TrimSpace(line)
|
||||
if line == "" {
|
||||
continue
|
||||
}
|
||||
displayName, openURL, ok := strings.Cut(line, "=")
|
||||
displayName, openURL = strings.TrimSpace(displayName), strings.TrimSpace(openURL)
|
||||
if !ok || displayName == "" || openURL == "" {
|
||||
continue
|
||||
}
|
||||
openWithEditorApps = append(openWithEditorApps, setting.OpenWithEditorApp{
|
||||
DisplayName: strings.TrimSpace(displayName),
|
||||
OpenURL: strings.TrimSpace(openURL),
|
||||
})
|
||||
}
|
||||
b, err := json.Marshal(openWithEditorApps)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return string(b), nil
|
||||
}
|
||||
marshallers := map[string]func(string) (string, error){
|
||||
cfg.Picture.DisableGravatar.DynKey(): marshalBool,
|
||||
cfg.Picture.EnableFederatedAvatar.DynKey(): marshalBool,
|
||||
cfg.Repository.OpenWithEditorApps.DynKey(): marshalOpenWithApps,
|
||||
}
|
||||
marshaller, hasMarshaller := marshallers[key]
|
||||
if !hasMarshaller {
|
||||
ctx.JSONError(ctx.Tr("admin.config.set_setting_failed", key))
|
||||
return
|
||||
}
|
||||
if err := system_model.SetSettings(ctx, map[string]string{key: value}); err != nil {
|
||||
log.Error("set setting failed: %v", err)
|
||||
marshaledValue, err := marshaller(value)
|
||||
if err != nil {
|
||||
ctx.JSONError(ctx.Tr("admin.config.set_setting_failed", key))
|
||||
return
|
||||
}
|
||||
if err = system_model.SetSettings(ctx, map[string]string{key: marshaledValue}); err != nil {
|
||||
ctx.JSONError(ctx.Tr("admin.config.set_setting_failed", key))
|
||||
return
|
||||
}
|
||||
|
|
|
@ -35,12 +35,11 @@ func Code(ctx *context.Context) {
|
|||
language := ctx.FormTrim("l")
|
||||
keyword := ctx.FormTrim("q")
|
||||
|
||||
queryType := ctx.FormTrim("t")
|
||||
isFuzzy := queryType != "match"
|
||||
isFuzzy := ctx.FormOptionalBool("fuzzy").ValueOrDefault(true)
|
||||
|
||||
ctx.Data["Keyword"] = keyword
|
||||
ctx.Data["Language"] = language
|
||||
ctx.Data["queryType"] = queryType
|
||||
ctx.Data["IsFuzzy"] = isFuzzy
|
||||
ctx.Data["PageIsViewCode"] = true
|
||||
|
||||
if keyword == "" {
|
||||
|
|
|
@ -203,7 +203,7 @@ func SearchCommits(ctx *context.Context) {
|
|||
|
||||
ctx.Data["Keyword"] = query
|
||||
if all {
|
||||
ctx.Data["All"] = "checked"
|
||||
ctx.Data["All"] = true
|
||||
}
|
||||
ctx.Data["Username"] = ctx.Repo.Owner.Name
|
||||
ctx.Data["Reponame"] = ctx.Repo.Repository.Name
|
||||
|
|
|
@ -21,12 +21,11 @@ func Search(ctx *context.Context) {
|
|||
language := ctx.FormTrim("l")
|
||||
keyword := ctx.FormTrim("q")
|
||||
|
||||
queryType := ctx.FormTrim("t")
|
||||
isFuzzy := queryType != "match"
|
||||
isFuzzy := ctx.FormOptionalBool("fuzzy").ValueOrDefault(true)
|
||||
|
||||
ctx.Data["Keyword"] = keyword
|
||||
ctx.Data["Language"] = language
|
||||
ctx.Data["queryType"] = queryType
|
||||
ctx.Data["IsFuzzy"] = isFuzzy
|
||||
ctx.Data["PageIsViewCode"] = true
|
||||
|
||||
if keyword == "" {
|
||||
|
@ -34,7 +33,7 @@ func Search(ctx *context.Context) {
|
|||
return
|
||||
}
|
||||
|
||||
ctx.Data["SourcePath"] = ctx.Repo.Repository.Link()
|
||||
ctx.Data["Repo"] = ctx.Repo.Repository
|
||||
|
||||
page := ctx.FormInt("page")
|
||||
if page <= 0 {
|
||||
|
@ -42,7 +41,7 @@ func Search(ctx *context.Context) {
|
|||
}
|
||||
|
||||
if setting.Indexer.RepoIndexerEnabled {
|
||||
ctx.Data["CodeIndexerEnabled"] = true
|
||||
ctx.Data["CodeIndexerDisabled"] = false
|
||||
|
||||
total, searchResults, searchResultLanguages, err := code_indexer.PerformSearch(ctx, &code_indexer.SearchOptions{
|
||||
RepoIDs: []int64{ctx.Repo.Repository.ID},
|
||||
|
@ -78,7 +77,7 @@ func Search(ctx *context.Context) {
|
|||
return
|
||||
}
|
||||
|
||||
ctx.Data["CodeIndexerEnabled"] = false
|
||||
ctx.Data["CodeIndexerDisabled"] = true
|
||||
ctx.Data["SearchResults"] = data
|
||||
|
||||
pager := context.NewPagination(len(data), setting.UI.RepoSearchPagingNum, page, 5)
|
||||
|
|
|
@ -214,9 +214,10 @@ func createWebhook(ctx *context.Context, params webhookParams) {
|
|||
return
|
||||
}
|
||||
ctx.Data["BaseLink"] = orCtx.LinkNew
|
||||
ctx.Data["BaseLinkNew"] = orCtx.LinkNew
|
||||
|
||||
if ctx.HasError() {
|
||||
ctx.HTML(http.StatusOK, orCtx.NewTemplate)
|
||||
ctx.HTML(http.StatusUnprocessableEntity, orCtx.NewTemplate)
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -271,7 +272,7 @@ func editWebhook(ctx *context.Context, params webhookParams) {
|
|||
ctx.Data["Webhook"] = w
|
||||
|
||||
if ctx.HasError() {
|
||||
ctx.HTML(http.StatusOK, orCtx.NewTemplate)
|
||||
ctx.HTML(http.StatusUnprocessableEntity, orCtx.NewTemplate)
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -44,6 +44,7 @@ import (
|
|||
repo_module "code.gitea.io/gitea/modules/repository"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
"code.gitea.io/gitea/modules/structs"
|
||||
"code.gitea.io/gitea/modules/svg"
|
||||
"code.gitea.io/gitea/modules/typesniffer"
|
||||
"code.gitea.io/gitea/modules/util"
|
||||
"code.gitea.io/gitea/routers/web/feed"
|
||||
|
@ -812,7 +813,7 @@ func Home(ctx *context.Context) {
|
|||
return
|
||||
}
|
||||
|
||||
renderCode(ctx)
|
||||
renderHomeCode(ctx)
|
||||
}
|
||||
|
||||
// LastCommit returns lastCommit data for the provided branch/tag/commit and directory (in url) and filenames in body
|
||||
|
@ -932,9 +933,33 @@ func renderRepoTopics(ctx *context.Context) {
|
|||
ctx.Data["Topics"] = topics
|
||||
}
|
||||
|
||||
func renderCode(ctx *context.Context) {
|
||||
func prepareOpenWithEditorApps(ctx *context.Context) {
|
||||
var tmplApps []map[string]any
|
||||
apps := setting.Config().Repository.OpenWithEditorApps.Value(ctx)
|
||||
if len(apps) == 0 {
|
||||
apps = setting.DefaultOpenWithEditorApps()
|
||||
}
|
||||
for _, app := range apps {
|
||||
schema, _, _ := strings.Cut(app.OpenURL, ":")
|
||||
var iconHTML template.HTML
|
||||
if schema == "vscode" || schema == "vscodium" || schema == "jetbrains" {
|
||||
iconHTML = svg.RenderHTML(fmt.Sprintf("gitea-open-with-%s", schema), 16, "gt-mr-3")
|
||||
} else {
|
||||
iconHTML = svg.RenderHTML("gitea-git", 16, "gt-mr-3") // TODO: it could support user's customized icon in the future
|
||||
}
|
||||
tmplApps = append(tmplApps, map[string]any{
|
||||
"DisplayName": app.DisplayName,
|
||||
"OpenURL": app.OpenURL,
|
||||
"IconHTML": iconHTML,
|
||||
})
|
||||
}
|
||||
ctx.Data["OpenWithEditorApps"] = tmplApps
|
||||
}
|
||||
|
||||
func renderHomeCode(ctx *context.Context) {
|
||||
ctx.Data["PageIsViewCode"] = true
|
||||
ctx.Data["RepositoryUploadEnabled"] = setting.Repository.Upload.Enabled
|
||||
prepareOpenWithEditorApps(ctx)
|
||||
|
||||
if ctx.Repo.Commit == nil || ctx.Repo.Repository.IsEmpty || ctx.Repo.Repository.IsBroken() {
|
||||
showEmpty := true
|
||||
|
|
|
@ -40,12 +40,11 @@ func CodeSearch(ctx *context.Context) {
|
|||
language := ctx.FormTrim("l")
|
||||
keyword := ctx.FormTrim("q")
|
||||
|
||||
queryType := ctx.FormTrim("t")
|
||||
isFuzzy := queryType != "match"
|
||||
isFuzzy := ctx.FormOptionalBool("fuzzy").ValueOrDefault(true)
|
||||
|
||||
ctx.Data["Keyword"] = keyword
|
||||
ctx.Data["Language"] = language
|
||||
ctx.Data["queryType"] = queryType
|
||||
ctx.Data["IsFuzzy"] = isFuzzy
|
||||
ctx.Data["IsCodePage"] = true
|
||||
|
||||
if keyword == "" {
|
||||
|
|
|
@ -393,6 +393,25 @@ func UpdateUserLang(ctx *context.Context) {
|
|||
ctx.Redirect(setting.AppSubURL + "/user/settings/appearance")
|
||||
}
|
||||
|
||||
// UpdateUserHints updates a user's hints settings
|
||||
func UpdateUserHints(ctx *context.Context) {
|
||||
form := web.GetForm(ctx).(*forms.UpdateHintsForm)
|
||||
ctx.Data["Title"] = ctx.Tr("settings")
|
||||
ctx.Data["PageIsSettingsAppearance"] = true
|
||||
|
||||
opts := &user_service.UpdateOptions{
|
||||
EnableRepoUnitHints: optional.Some(form.EnableRepoUnitHints),
|
||||
}
|
||||
if err := user_service.UpdateUser(ctx, ctx.Doer, opts); err != nil {
|
||||
ctx.ServerError("UpdateUser", err)
|
||||
return
|
||||
}
|
||||
|
||||
log.Trace("User settings updated: %s", ctx.Doer.Name)
|
||||
ctx.Flash.Success(translation.NewLocale(ctx.Doer.Language).TrString("settings.update_hints_success"))
|
||||
ctx.Redirect(setting.AppSubURL + "/user/settings/appearance")
|
||||
}
|
||||
|
||||
// UpdateUserHiddenComments update a user's shown comment types
|
||||
func UpdateUserHiddenComments(ctx *context.Context) {
|
||||
err := user_model.SetUserSetting(ctx, ctx.Doer.ID, user_model.SettingsKeyHiddenCommentTypes, forms.UserHiddenCommentTypesFromRequest(ctx).String())
|
||||
|
|
|
@ -568,6 +568,7 @@ func registerRoutes(m *web.Route) {
|
|||
m.Group("/appearance", func() {
|
||||
m.Get("", user_setting.Appearance)
|
||||
m.Post("/language", web.Bind(forms.UpdateLanguageForm{}), user_setting.UpdateUserLang)
|
||||
m.Post("/hints", web.Bind(forms.UpdateHintsForm{}), user_setting.UpdateUserHints)
|
||||
m.Post("/hidden_comments", user_setting.UpdateUserHiddenComments)
|
||||
m.Post("/theme", web.Bind(forms.UpdateThemeForm{}), user_setting.UpdateUIThemePost)
|
||||
})
|
||||
|
@ -691,6 +692,7 @@ func registerRoutes(m *web.Route) {
|
|||
m.Get("", admin.Config)
|
||||
m.Post("", admin.ChangeConfig)
|
||||
m.Post("/test_mail", admin.SendTestMail)
|
||||
m.Get("/settings", admin.ConfigSettings)
|
||||
})
|
||||
|
||||
m.Group("/monitor", func() {
|
||||
|
|
|
@ -6,6 +6,7 @@ package actions
|
|||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"slices"
|
||||
"strings"
|
||||
|
@ -25,6 +26,7 @@ import (
|
|||
"code.gitea.io/gitea/modules/log"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
api "code.gitea.io/gitea/modules/structs"
|
||||
"code.gitea.io/gitea/modules/util"
|
||||
webhook_module "code.gitea.io/gitea/modules/webhook"
|
||||
"code.gitea.io/gitea/services/convert"
|
||||
|
||||
|
@ -190,6 +192,12 @@ func notify(ctx context.Context, input *notifyInput) error {
|
|||
baseRef := git.BranchPrefix + input.PullRequest.BaseBranch
|
||||
baseCommit, err := gitRepo.GetCommit(baseRef)
|
||||
if err != nil {
|
||||
if prp, ok := input.Payload.(*api.PullRequestPayload); ok && errors.Is(err, util.ErrNotExist) {
|
||||
// the baseBranch was deleted and the PR closed: the action can be skipped
|
||||
if prp.Action == api.HookIssueClosed {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
return fmt.Errorf("gitRepo.GetCommit: %w", err)
|
||||
}
|
||||
baseWorkflows, _, err := actions_module.DetectWorkflows(gitRepo, baseCommit, input.Event, input.Payload)
|
||||
|
|
|
@ -192,6 +192,7 @@ func Contexter() func(next http.Handler) http.Handler {
|
|||
httpcache.SetCacheControlInHeader(ctx.Resp.Header(), 0, "no-transform")
|
||||
ctx.Resp.Header().Set(`X-Frame-Options`, setting.CORSConfig.XFrameOptions)
|
||||
|
||||
ctx.Data["SystemConfig"] = setting.Config()
|
||||
ctx.Data["CsrfToken"] = ctx.Csrf.GetToken()
|
||||
ctx.Data["CsrfTokenHtml"] = template.HTML(`<input type="hidden" name="_csrf" value="` + ctx.Data["CsrfToken"].(string) + `">`)
|
||||
|
||||
|
|
|
@ -53,5 +53,5 @@ func (p *Pagination) SetDefaultParams(ctx *Context) {
|
|||
p.AddParam(ctx, "sort", "SortType")
|
||||
p.AddParam(ctx, "q", "Keyword")
|
||||
// do not add any more uncommon params here!
|
||||
p.AddParam(ctx, "t", "queryType")
|
||||
p.AddParam(ctx, "fuzzy", "IsFuzzy")
|
||||
}
|
||||
|
|
|
@ -86,15 +86,16 @@ func toUser(ctx context.Context, user *user_model.User, signed, authed bool) *ap
|
|||
// User2UserSettings return UserSettings based on a user
|
||||
func User2UserSettings(user *user_model.User) api.UserSettings {
|
||||
return api.UserSettings{
|
||||
FullName: user.FullName,
|
||||
Website: user.Website,
|
||||
Location: user.Location,
|
||||
Language: user.Language,
|
||||
Description: user.Description,
|
||||
Theme: user.Theme,
|
||||
HideEmail: user.KeepEmailPrivate,
|
||||
HideActivity: user.KeepActivityPrivate,
|
||||
DiffViewStyle: user.DiffViewStyle,
|
||||
FullName: user.FullName,
|
||||
Website: user.Website,
|
||||
Location: user.Location,
|
||||
Language: user.Language,
|
||||
Description: user.Description,
|
||||
Theme: user.Theme,
|
||||
HideEmail: user.KeepEmailPrivate,
|
||||
HideActivity: user.KeepActivityPrivate,
|
||||
DiffViewStyle: user.DiffViewStyle,
|
||||
EnableRepoUnitHints: user.EnableRepoUnitHints,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -234,6 +234,11 @@ type UpdateLanguageForm struct {
|
|||
Language string
|
||||
}
|
||||
|
||||
// UpdateHintsForm form for updating user hint settings
|
||||
type UpdateHintsForm struct {
|
||||
EnableRepoUnitHints bool
|
||||
}
|
||||
|
||||
// Validate validates the fields
|
||||
func (f *UpdateLanguageForm) Validate(req *http.Request, errs binding.Errors) binding.Errors {
|
||||
ctx := context.GetValidateContext(req)
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue