Merge branch 'master' into branch-special-chars

This commit is contained in:
nubenum 2018-07-21 11:47:26 +02:00 committed by GitHub
commit c0ba41a89b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
655 changed files with 18391 additions and 170788 deletions

View File

@ -4,7 +4,7 @@ workspace:
clone: clone:
git: git:
image: plugins/git:1 image: plugins/git:next
depth: 50 depth: 50
tags: true tags: true
@ -75,7 +75,7 @@ pipeline:
- make lint - make lint
- make fmt-check - make fmt-check
- make swagger-check - make swagger-check
- make swagger-validate # - make swagger-validate
- make misspell-check - make misspell-check
- make test-vendor - make test-vendor
- make build - make build
@ -203,7 +203,7 @@ pipeline:
when: when:
event: [ push, tag ] event: [ push, tag ]
build_docs: build-docs:
image: webhippie/hugo:latest image: webhippie/hugo:latest
pull: true pull: true
commands: commands:
@ -212,26 +212,12 @@ pipeline:
- make clean - make clean
- make build - make build
docker_docs: publish-docs:
image: plugins/docker:17.05 image: lucap/drone-netlify:latest
pull: true pull: true
secrets: [ docker_username, docker_password ] secrets: [ netlify_token ]
repo: gitea/docs site_id: d2260bae-7861-4c02-8646-8f6440b12672
context: docs path: docs/public/
dockerfile: docs/Dockerfile
tags: [ '${DRONE_BRANCH##release/v}' ]
when:
event: [ push ]
branch: [ release/* ]
docker_docs:
image: plugins/docker:17.05
pull: true
secrets: [ docker_username, docker_password ]
repo: gitea/docs
context: docs
dockerfile: docs/Dockerfile
tags: [ 'latest' ]
when: when:
event: [ push ] event: [ push ]
branch: [ master ] branch: [ master ]
@ -255,6 +241,18 @@ pipeline:
when: when:
event: [ push, tag ] event: [ push, tag ]
gpg-sign:
image: plugins/gpgsign:1
pull: true
secrets: [ gpgsign_key, gpgsign_passphrase ]
detach_sign: true
files:
- dist/release/*
excludes:
- dist/release/*.sha256
when:
event: [ push, tag ]
release: release:
image: plugins/s3:1 image: plugins/s3:1
pull: true pull: true

51
BSDmakefile Normal file
View File

@ -0,0 +1,51 @@
# GNU makefile proxy script for BSD make
# Written and maintained by Mahmoud Al-Qudsi <mqudsi@neosmart.net>
# Copyright NeoSmart Technologies <https://neosmart.net/> 2014-2018
# Obtain updates from <https://github.com/neosmart/gmake-proxy>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
JARG =
GMAKE = "gmake"
#When gmake is called from another make instance, -w is automatically added
#which causes extraneous messages about directory changes to be emitted.
#--no-print-directory silences these messages.
GARGS = "--no-print-directory"
.if "$(.MAKE.JOBS)" != ""
JARG = -j$(.MAKE.JOBS)
.endif
#by default bmake will cd into ./obj first
.OBJDIR: ./
.PHONY: FRC
$(.TARGETS): FRC
$(GMAKE) $(GARGS) $(.TARGETS:S,.DONE,,) $(JARG)
.DONE .DEFAULT: .SILENT
$(GMAKE) $(GARGS) $(.TARGETS:S,.DONE,,) $(JARG)
.ERROR: .SILENT
if ! which $(GMAKE) > /dev/null; then \
echo "GNU Make is required!"; \
fi

View File

@ -4,6 +4,66 @@ This changelog goes through all the changes that have been made in each release
without substantial changes to our git log; to see the highlights of what has without substantial changes to our git log; to see the highlights of what has
been added to each release, please refer to the [blog](https://blog.gitea.io). been added to each release, please refer to the [blog](https://blog.gitea.io).
## [1.5.0-RC1](https://github.com/go-gitea/gitea/releases/tag/v1.5.0-rc1) - 2018-07-04
* SECURITY
* Limit uploaded avatar image-size to 4096px x 3072px by default (#4353)
* Do not allow to reuse TOTP passcode (#3878)
* FEATURE
* Add cli commands to regen hooks & keys (#3979)
* Add support for FIDO U2F (#3971)
* Added user language setting (#3875)
* LDAP Public SSH Keys synchronization (#1844)
* Add topic support (#3711)
* Multiple assignees (#3705)
* Add protected branch whitelists for merging (#3689)
* Global code search support (#3664)
* Add label descriptions (#3662)
* Add issue search via API (#3612)
* Add repository setting to enable/disable health checks (#3607)
* Emoji Autocomplete (#3433)
* Implements generator cli for secrets (#3531)
* ENHANCEMENT
* Add more webhooks support and refactor webhook templates directory (#3929)
* Add new option to allow only OAuth2/OpenID user registration (#3910)
* Add option to use paged LDAP search when synchronizing users (#3895)
* Symlink icons (#1416)
* Improve release page UI (#3693)
* Add admin dashboard option to run health checks (#3606)
* Add branch link in branch list (#3576)
* Reduce sql query times in retrieveFeeds (#3547)
* Option to enable or disable swagger endpoints (#3502)
* Add missing licenses (#3497)
* Reduce repo indexer disk usage (#3452)
* Enable caching on assets and avatars (#3376)
* Add repository search ordered by stars/forks. Forks column in admin repo list (#3969)
* Add Environment Variables to Docker template (#4012)
* LFS: make HTTP auth period configurable (#4035)
* Add config path as an optionial flag when changing pass via CLI (#4184)
* Refactor User Settings sections (#3900)
* Allow square brackets in external issue patterns (#3408)
* Add Attachment API (#3478)
* Add EnableTimetracking option to app settings (#3719)
* Add config option to enable or disable log executed SQL (#3726)
* Shows total tracked time in issue and milestone list (#3341)
* TRANSLATION
* Improve English grammar and consistency (#3614)
* DEPLOYMENT
* Allow Gitea to run as different USER in Docker (#3961)
* Provide compressed release binaries (#3991)
* Sign release binaries (#4188)
## [1.4.3](https://github.com/go-gitea/gitea/releases/tag/v1.4.3) - 2018-06-26
* SECURITY
* HTML-escape plain-text READMEs (#4192) (#4214)
* Fix open redirect vulnerability on login screen (#4312) (#4312)
* BUGFIXES
* Fix broken monitoring page when running processes are shown (#4203) (#4208)
* Fix delete comment bug (#4216) (#4228)
* Delete reactions added to issues and comments when deleting repository (#4232) (#4237)
* Fix wiki URL encoding bug (#4091) (#4254)
* Fix code tab link when viewing tags (#3908) (#4263)
* Fix webhook type conflation (#4285) (#4285)
## [1.4.2](https://github.com/go-gitea/gitea/releases/tag/v1.4.2) - 2018-06-04 ## [1.4.2](https://github.com/go-gitea/gitea/releases/tag/v1.4.2) - 2018-06-04
* BUGFIXES * BUGFIXES
* Adjust z-index for floating labels (#3939) (#3950) * Adjust z-index for floating labels (#3939) (#3950)

View File

@ -58,3 +58,4 @@ CMD ["/bin/s6-svscan", "/etc/s6"]
COPY docker / COPY docker /
COPY --from=build-env /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea COPY --from=build-env /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea
RUN ln -s /app/gitea/gitea /usr/local/bin/gitea

186
Gopkg.lock generated
View File

@ -11,7 +11,7 @@
branch = "master" branch = "master"
name = "code.gitea.io/sdk" name = "code.gitea.io/sdk"
packages = ["gitea"] packages = ["gitea"]
revision = "b2308e3f700875a3642a78bd3f6e5db8ef6f974d" revision = "ec80752c9512cf07fc62ddc42565118183743942"
[[projects]] [[projects]]
name = "github.com/PuerkitoBio/goquery" name = "github.com/PuerkitoBio/goquery"
@ -143,17 +143,6 @@
packages = ["."] packages = ["."]
revision = "098da33fde5f9220736531b3cb26a2dec86a8367" revision = "098da33fde5f9220736531b3cb26a2dec86a8367"
[[projects]]
name = "github.com/coreos/etcd"
packages = ["error"]
revision = "01c303113d0a3d5a8075864321c3aedb72035bdd"
[[projects]]
branch = "master"
name = "github.com/coreos/go-etcd"
packages = ["etcd"]
revision = "003851be7bb0694fe3cc457a49529a19388ee7cf"
[[projects]] [[projects]]
branch = "master" branch = "master"
name = "github.com/couchbase/vellum" name = "github.com/couchbase/vellum"
@ -294,27 +283,24 @@
[[projects]] [[projects]]
name = "github.com/go-sql-driver/mysql" name = "github.com/go-sql-driver/mysql"
packages = ["."] packages = ["."]
revision = "ce924a41eea897745442daaa1739089b0f3f561d" revision = "d523deb1b23d913de5bdada721a6071e71283618"
[[projects]] [[projects]]
name = "github.com/go-xorm/builder" name = "github.com/go-xorm/builder"
packages = ["."] packages = ["."]
revision = "488224409dd8aa2ce7a5baf8d10d55764a913738" revision = "dc8bf48f58fab2b4da338ffd25191905fd741b8f"
version = "v0.3.0"
[[projects]] [[projects]]
name = "github.com/go-xorm/core" name = "github.com/go-xorm/core"
packages = ["."] packages = ["."]
revision = "cb1d0ca71f42d3ee1bf4aba7daa16099bc31a7e9" revision = "c10e21e7e1cec20e09398f2dfae385e58c8df555"
version = "v0.6.0"
[[projects]]
name = "github.com/go-xorm/tidb"
packages = ["."]
revision = "21e49190ce47a766fa741cf7edc831a30c12c6ac"
[[projects]] [[projects]]
name = "github.com/go-xorm/xorm" name = "github.com/go-xorm/xorm"
packages = ["."] packages = ["."]
revision = "d4149d1eee0c2c488a74a5863fd9caf13d60fd03" revision = "ad69f7d8f0861a29438154bb0a20b60501298480"
[[projects]] [[projects]]
branch = "master" branch = "master"
@ -370,11 +356,6 @@
packages = ["."] packages = ["."]
revision = "8fb95d837f7d6db1913fecfd7bcc5333e6499596" revision = "8fb95d837f7d6db1913fecfd7bcc5333e6499596"
[[projects]]
name = "github.com/juju/errors"
packages = ["."]
revision = "b2c7a7da5b2995941048f60146e67702a292e468"
[[projects]] [[projects]]
name = "github.com/kballard/go-shellquote" name = "github.com/kballard/go-shellquote"
packages = ["."] packages = ["."]
@ -497,134 +478,12 @@
packages = ["."] packages = ["."]
revision = "891127d8d1b52734debe1b3c3d7e747502b6c366" revision = "891127d8d1b52734debe1b3c3d7e747502b6c366"
[[projects]]
name = "github.com/ngaut/deadline"
packages = ["."]
revision = "fae8f9dfd7048de16575b9d4c255278e38c28a4f"
[[projects]]
branch = "master"
name = "github.com/ngaut/go-zookeeper"
packages = ["zk"]
revision = "9c3719e318c7cfd072e41eb48cb71fcaa49d5e05"
[[projects]]
name = "github.com/ngaut/log"
packages = ["."]
revision = "d2af3a61f64d093457fb23b25d20f4ce3cd551ce"
[[projects]]
branch = "master"
name = "github.com/ngaut/pools"
packages = ["."]
revision = "b7bc8c42aac787667ba45adea78233f53f548443"
[[projects]]
branch = "master"
name = "github.com/ngaut/sync2"
packages = ["."]
revision = "7a24ed77b2efb460c1468b7dc917821c66e80e55"
[[projects]]
branch = "master"
name = "github.com/ngaut/tso"
packages = [
"client",
"proto",
"util"
]
revision = "118f6c141d58f1e72577ff61f43f649bf39355ee"
[[projects]]
branch = "master"
name = "github.com/ngaut/zkhelper"
packages = ["."]
revision = "6738bdc138d469112c6687fbfcfe049ccabd6a0a"
[[projects]]
branch = "master"
name = "github.com/petar/GoLLRB"
packages = ["llrb"]
revision = "53be0d36a84c2a886ca057d34b6aa4468df9ccb4"
[[projects]] [[projects]]
name = "github.com/philhofer/fwd" name = "github.com/philhofer/fwd"
packages = ["."] packages = ["."]
revision = "bb6d471dc95d4fe11e432687f8b70ff496cf3136" revision = "bb6d471dc95d4fe11e432687f8b70ff496cf3136"
version = "v1.0.0" version = "v1.0.0"
[[projects]]
name = "github.com/pingcap/go-hbase"
packages = [
".",
"iohelper",
"proto"
]
revision = "7a98d1fe4e9e115de8c77ae0e158c0d08732c550"
[[projects]]
branch = "master"
name = "github.com/pingcap/go-themis"
packages = [
".",
"oracle",
"oracle/oracles"
]
revision = "dbb996606c1d1fe8571fd9ac6da2254c76d2c5c9"
[[projects]]
name = "github.com/pingcap/tidb"
packages = [
".",
"ast",
"column",
"context",
"ddl",
"domain",
"evaluator",
"executor",
"infoschema",
"inspectkv",
"kv",
"kv/memkv",
"meta",
"meta/autoid",
"model",
"mysql",
"optimizer",
"optimizer/plan",
"parser",
"parser/opcode",
"perfschema",
"privilege",
"privilege/privileges",
"sessionctx",
"sessionctx/autocommit",
"sessionctx/db",
"sessionctx/forupdate",
"sessionctx/variable",
"store/hbase",
"store/localstore",
"store/localstore/boltdb",
"store/localstore/engine",
"store/localstore/goleveldb",
"structure",
"table",
"table/tables",
"terror",
"util",
"util/bytes",
"util/charset",
"util/codec",
"util/distinct",
"util/hack",
"util/segmentmap",
"util/sqlexec",
"util/stringutil",
"util/types"
]
revision = "33197485abe227dcb254644cf5081c9a3c281669"
[[projects]] [[projects]]
name = "github.com/pmezard/go-difflib" name = "github.com/pmezard/go-difflib"
packages = ["difflib"] packages = ["difflib"]
@ -673,24 +532,6 @@
revision = "12b6f73e6084dad08a7c6e575284b177ecafbc71" revision = "12b6f73e6084dad08a7c6e575284b177ecafbc71"
version = "v1.2.1" version = "v1.2.1"
[[projects]]
name = "github.com/syndtr/goleveldb"
packages = [
"leveldb",
"leveldb/cache",
"leveldb/comparer",
"leveldb/errors",
"leveldb/filter",
"leveldb/iterator",
"leveldb/journal",
"leveldb/memdb",
"leveldb/opt",
"leveldb/storage",
"leveldb/table",
"leveldb/util"
]
revision = "917f41c560270110ceb73c5b38be2a9127387071"
[[projects]] [[projects]]
branch = "master" branch = "master"
name = "github.com/tinylib/msgp" name = "github.com/tinylib/msgp"
@ -703,17 +544,6 @@
packages = ["."] packages = ["."]
revision = "d21a03e0b1d9fc1df59ff54e7a513655c1748b0c" revision = "d21a03e0b1d9fc1df59ff54e7a513655c1748b0c"
[[projects]]
name = "github.com/twinj/uuid"
packages = ["."]
revision = "89173bcdda19db0eb88aef1e1cb1cb2505561d31"
version = "0.10.0"
[[projects]]
name = "github.com/ugorji/go"
packages = ["codec"]
revision = "c062049c1793b01a3cc3fe786108edabbaf7756b"
[[projects]] [[projects]]
name = "github.com/urfave/cli" name = "github.com/urfave/cli"
packages = ["."] packages = ["."]
@ -873,6 +703,6 @@
[solve-meta] [solve-meta]
analyzer-name = "dep" analyzer-name = "dep"
analyzer-version = 1 analyzer-version = 1
inputs-digest = "036b8c882671cf8d2c5e2fdbe53b1bdfbd39f7ebd7765bd50276c7c4ecf16687" inputs-digest = "5ae18d543bbb8186589c003422b333097d67bb5fed8b4c294be70c012ccffc94"
solver-name = "gps-cdcl" solver-name = "gps-cdcl"
solver-version = 1 solver-version = 1

View File

@ -30,15 +30,14 @@ ignored = ["google.golang.org/appengine*"]
revision = "f2499483f923065a842d38eb4c7f1927e6fc6e6d" revision = "f2499483f923065a842d38eb4c7f1927e6fc6e6d"
name = "golang.org/x/net" name = "golang.org/x/net"
[[constraint]]
#version = "v1.0.0"
revision = "33197485abe227dcb254644cf5081c9a3c281669"
name = "github.com/pingcap/tidb"
[[override]] [[override]]
name = "github.com/go-xorm/xorm" name = "github.com/go-xorm/xorm"
#version = "0.6.5" #version = "0.6.5"
revision = "d4149d1eee0c2c488a74a5863fd9caf13d60fd03" revision = "ad69f7d8f0861a29438154bb0a20b60501298480"
[[override]]
name = "github.com/go-sql-driver/mysql"
revision = "d523deb1b23d913de5bdada721a6071e71283618"
[[override]] [[override]]
name = "github.com/gorilla/mux" name = "github.com/gorilla/mux"

View File

@ -23,3 +23,4 @@ Matti Ranta <matti@mdranta.net> (@techknowlogick)
Michael Lustfield <mtecknology@debian.org> (@MTecknology) Michael Lustfield <mtecknology@debian.org> (@MTecknology)
Jonas Franz <info@jonasfranz.software> (@JonasFranzDEV) Jonas Franz <info@jonasfranz.software> (@JonasFranzDEV)
Flynn Lufmons <fluf@warpmail.net> (@flufmonster) Flynn Lufmons <fluf@warpmail.net> (@flufmonster)
Alexey Terentyev <axifnx@gmail.com> (@axifive)

View File

@ -21,7 +21,19 @@ GOFMT ?= gofmt -s
GOFLAGS := -i -v GOFLAGS := -i -v
EXTRA_GOFLAGS ?= EXTRA_GOFLAGS ?=
LDFLAGS := -X "main.Version=$(shell git describe --tags --always | sed 's/-/+/' | sed 's/^v//')" -X "main.Tags=$(TAGS)" ifneq ($(DRONE_TAG),)
VERSION ?= $(subst v,,$(DRONE_TAG))
GITEA_VERSION := $(VERSION)
else
ifneq ($(DRONE_BRANCH),)
VERSION ?= $(subst release/v,,$(DRONE_BRANCH))
else
VERSION ?= master
endif
GITEA_VERSION := $(shell git describe --tags --always | sed 's/-/+/' | sed 's/^v//')
endif
LDFLAGS := -X "main.Version=$(GITEA_VERSION)" -X "main.Tags=$(TAGS)"
PACKAGES ?= $(filter-out code.gitea.io/gitea/integrations,$(shell $(GO) list ./... | grep -v /vendor/)) PACKAGES ?= $(filter-out code.gitea.io/gitea/integrations,$(shell $(GO) list ./... | grep -v /vendor/))
SOURCES ?= $(shell find . -name "*.go" -type f) SOURCES ?= $(shell find . -name "*.go" -type f)
@ -45,15 +57,8 @@ else
EXECUTABLE := gitea EXECUTABLE := gitea
endif endif
ifneq ($(DRONE_TAG),) # $(call strip-suffix,filename)
VERSION ?= $(subst v,,$(DRONE_TAG)) strip-suffix = $(firstword $(subst ., ,$(1)))
else
ifneq ($(DRONE_BRANCH),)
VERSION ?= $(subst release/v,,$(DRONE_BRANCH))
else
VERSION ?= master
endif
endif
.PHONY: all .PHONY: all
all: build all: build
@ -301,7 +306,7 @@ public/js/index.js: $(JAVASCRIPTS)
.PHONY: stylesheets-check .PHONY: stylesheets-check
stylesheets-check: generate-stylesheets stylesheets-check: generate-stylesheets
@diff=$$(git diff public/css/index.css); \ @diff=$$(git diff public/css/*); \
if [ -n "$$diff" ]; then \ if [ -n "$$diff" ]; then \
echo "Please run 'make generate-stylesheets' and commit the result:"; \ echo "Please run 'make generate-stylesheets' and commit the result:"; \
echo "$${diff}"; \ echo "$${diff}"; \
@ -311,6 +316,7 @@ stylesheets-check: generate-stylesheets
.PHONY: generate-stylesheets .PHONY: generate-stylesheets
generate-stylesheets: generate-stylesheets:
node_modules/.bin/lessc --clean-css public/less/index.less public/css/index.css node_modules/.bin/lessc --clean-css public/less/index.less public/css/index.css
$(foreach file, $(filter-out public/less/themes/_base.less, $(wildcard public/less/themes/*)),node_modules/.bin/lessc --clean-css public/less/themes/$(notdir $(file)) > public/css/theme-$(notdir $(call strip-suffix,$(file))).css;)
.PHONY: swagger-ui .PHONY: swagger-ui
swagger-ui: swagger-ui:

View File

@ -90,6 +90,10 @@ Support this project by becoming a sponsor. Your logo will show up here with a l
Gitea is pronounced [/ɡɪti:/](https://youtu.be/EM71-2uDAoY) as in "gi-tea" with a hard g. Gitea is pronounced [/ɡɪti:/](https://youtu.be/EM71-2uDAoY) as in "gi-tea" with a hard g.
**Why is this not hosted on a Gitea instance?**
We're [working on it](https://github.com/go-gitea/gitea/issues/1029).
## License ## License
This project is licensed under the MIT License. This project is licensed under the MIT License.

View File

@ -0,0 +1,46 @@
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type="manifest" name="export">
<service name="gitea" type="service" version="1">
<create_default_instance enabled="false"/>
<dependency name="network" grouping="require_all" restart_on="refresh" type="service">
<service_fmri value="svc:/milestone/network:default"/>
</dependency>
<dependency name="filesystem" grouping="require_all" restart_on="refresh" type="service">
<service_fmri value="svc:/system/filesystem/local"/>
</dependency>
<exec_method
type="method"
name="start"
exec="/opt/local/bin/gitea web"
timeout_seconds="60">
<method_context>
<method_credential user="git" group="git" />
<method_environment>
<envvar name='GITEA_WORK_DIR' value='/opt/local/share/gitea'/>
<envvar name='GITEA_CUSTOM' value='/opt/local/etc/gitea'/>
<envvar name='HOME' value='/var/db/gitea'/>
<envvar name='PATH' value='/opt/local/bin:${PATH}'/>
<envvar name='USER' value='git'/>
</method_environment>
</method_context>
</exec_method>
<exec_method type="method" name="stop" exec=":kill" timeout_seconds="60"/>
<property_group name="application" type="application"></property_group>
<property_group name="startd" type="framework">
<propval name="duration" type="astring" value="child"/>
<propval name="ignore_error" type="astring" value="core,signal"/>
</property_group>
<template>
<common_name>
<loctext xml:lang="C">A painless, self-hosted Git service</loctext>
</common_name>
</template>
</service>
</service_bundle>

View File

@ -75,6 +75,8 @@ THEME_COLOR_META_TAG = `#6cc644`
MAX_DISPLAY_FILE_SIZE = 8388608 MAX_DISPLAY_FILE_SIZE = 8388608
; Whether the email of the user should be shown in the Explore Users page ; Whether the email of the user should be shown in the Explore Users page
SHOW_USER_EMAIL = true SHOW_USER_EMAIL = true
; Set the default theme for the Gitea install
DEFAULT_THEME = gitea
[ui.admin] [ui.admin]
; Number of users that are displayed on one page ; Number of users that are displayed on one page
@ -301,13 +303,22 @@ ENABLE_NOTIFY_MAIL = false
ENABLE_REVERSE_PROXY_AUTHENTICATION = false ENABLE_REVERSE_PROXY_AUTHENTICATION = false
ENABLE_REVERSE_PROXY_AUTO_REGISTRATION = false ENABLE_REVERSE_PROXY_AUTO_REGISTRATION = false
; Enable captcha validation for registration ; Enable captcha validation for registration
ENABLE_CAPTCHA = true ENABLE_CAPTCHA = false
; Type of captcha you want to use. Options: image, recaptcha
CAPTCHA_TYPE = image
; Enable recaptcha to use Google's recaptcha service
; Go to https://www.google.com/recaptcha/admin to sign up for a key
RECAPTCHA_SECRET =
RECAPTCHA_SITEKEY =
; Default value for KeepEmailPrivate ; Default value for KeepEmailPrivate
; Each new user will get the value of this setting copied into their profile ; Each new user will get the value of this setting copied into their profile
DEFAULT_KEEP_EMAIL_PRIVATE = false DEFAULT_KEEP_EMAIL_PRIVATE = false
; Default value for AllowCreateOrganization ; Default value for AllowCreateOrganization
; Every new user will have rights set to create organizations depending on this setting ; Every new user will have rights set to create organizations depending on this setting
DEFAULT_ALLOW_CREATE_ORGANIZATION = true DEFAULT_ALLOW_CREATE_ORGANIZATION = true
; Default value for EnableDependencies
; Repositories will use depencies by default depending on this setting
DEFAULT_ENABLE_DEPENDENCIES = true
; Enable Timetracking ; Enable Timetracking
ENABLE_TIMETRACKING = true ENABLE_TIMETRACKING = true
; Default value for EnableTimetracking ; Default value for EnableTimetracking
@ -402,6 +413,10 @@ SESSION_LIFE_TIME = 86400
[picture] [picture]
AVATAR_UPLOAD_PATH = data/avatars AVATAR_UPLOAD_PATH = data/avatars
; Max Width and Height of uploaded avatars. This is to limit the amount of RAM
; used when resizing the image.
AVATAR_MAX_WIDTH = 4096
AVATAR_MAX_HEIGHT = 3072
; Chinese users can choose "duoshuo" ; Chinese users can choose "duoshuo"
; or a custom avatar source, like: http://cn.gravatar.com/avatar/ ; or a custom avatar source, like: http://cn.gravatar.com/avatar/
GRAVATAR_SOURCE = gravatar GRAVATAR_SOURCE = gravatar
@ -601,9 +616,9 @@ ko-KR = ko
[U2F] [U2F]
; Two Factor authentication with security keys ; Two Factor authentication with security keys
; https://developers.yubico.com/U2F/App_ID.html ; https://developers.yubico.com/U2F/App_ID.html
APP_ID = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s APP_ID = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s/
; Comma seperated list of truisted facets ; Comma seperated list of truisted facets
TRUSTED_FACETS = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s TRUSTED_FACETS = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s/
; Extension mapping to highlight class ; Extension mapping to highlight class
; e.g. .toml=ini ; e.g. .toml=ini

View File

@ -1,7 +1,5 @@
#!/bin/bash #!/bin/bash
/usr/sbin/update-ca-certificates
if [ ! -d /data/git/.ssh ]; then if [ ! -d /data/git/.ssh ]; then
mkdir -p /data/git/.ssh mkdir -p /data/git/.ssh
chmod 700 /data/git/.ssh chmod 700 /data/git/.ssh

View File

@ -4,6 +4,9 @@ RUN_MODE = $RUN_MODE
[repository] [repository]
ROOT = /data/git/repositories ROOT = /data/git/repositories
[repository.local]
LOCAL_COPY_PATH = /data/gitea/tmp/local-repo
[repository.upload] [repository.upload]
TEMP_PATH = /data/gitea/uploads TEMP_PATH = /data/gitea/uploads
@ -14,6 +17,7 @@ HTTP_PORT = $HTTP_PORT
ROOT_URL = $ROOT_URL ROOT_URL = $ROOT_URL
DISABLE_SSH = $DISABLE_SSH DISABLE_SSH = $DISABLE_SSH
SSH_PORT = $SSH_PORT SSH_PORT = $SSH_PORT
LFS_CONTENT_PATH = /data/git/lfs
[database] [database]
PATH = /data/gitea/gitea.db PATH = /data/gitea/gitea.db
@ -23,6 +27,9 @@ NAME = $DB_NAME
USER = $DB_USER USER = $DB_USER
PASSWD = $DB_PASSWD PASSWD = $DB_PASSWD
[indexer]
ISSUE_INDEXER_PATH = /data/gitea/indexers/issues.bleve
[session] [session]
PROVIDER_CONFIG = /data/gitea/sessions PROVIDER_CONFIG = /data/gitea/sessions

View File

@ -1,22 +0,0 @@
# build stage
FROM golang:alpine AS build-env
RUN apk add --no-cache git
RUN go get -d -v github.com/mholt/caddy/caddy github.com/pedronasser/caddy-search github.com/simia-tech/caddy-locale
WORKDIR /go/src/github.com/mholt/caddy/caddy
RUN sed -i '/This is where other plugins get plugged in (imported)/a _ "github.com/pedronasser/caddy-search"' caddymain/run.go \
&& sed -i '/This is where other plugins get plugged in (imported)/a _ "github.com/simia-tech/caddy-locale"' caddymain/run.go \
&& go install -v . \
&& /go/bin/caddy -version
FROM alpine:edge
EXPOSE 80
RUN apk add --no-cache wget mailcap ca-certificates
COPY --from=build-env /go/bin/caddy /usr/sbin/caddy
COPY docker/caddy.conf /etc/caddy.conf
COPY public /srv/www
CMD ["/usr/sbin/caddy", "-conf", "/etc/caddy.conf"]

View File

@ -31,7 +31,7 @@ menu:
post: active post: active
- name: API - name: API
url: https://try.gitea.io/api/swagger url: https://try.gitea.io/api/swagger
weight: 25 weight: 45
pre: plug pre: plug
- name: Blog - name: Blog
url: https://blog.gitea.io/ url: https://blog.gitea.io/
@ -79,7 +79,7 @@ languages:
post: active post: active
- name: API - name: API
url: https://try.gitea.io/api/swagger url: https://try.gitea.io/api/swagger
weight: 25 weight: 45
pre: plug pre: plug
- name: 博客 - name: 博客
url: https://blog.gitea.io/ url: https://blog.gitea.io/
@ -122,7 +122,7 @@ languages:
post: active post: active
- name: API - name: API
url: https://try.gitea.io/api/swagger url: https://try.gitea.io/api/swagger
weight: 25 weight: 45
pre: plug pre: plug
- name: 部落格 - name: 部落格
url: https://blog.gitea.io/ url: https://blog.gitea.io/
@ -165,7 +165,7 @@ languages:
post: active post: active
- name: API - name: API
url: https://try.gitea.io/api/swagger url: https://try.gitea.io/api/swagger
weight: 25 weight: 45
pre: plug pre: plug
- name: Blog - name: Blog
url: https://blog.gitea.io/ url: https://blog.gitea.io/
@ -208,7 +208,7 @@ languages:
post: active post: active
- name: API - name: API
url: https://try.gitea.io/api/swagger url: https://try.gitea.io/api/swagger
weight: 25 weight: 45
pre: plug pre: plug
- name: Blog - name: Blog
url: https://blog.gitea.io/ url: https://blog.gitea.io/
@ -241,17 +241,17 @@ languages:
menu: menu:
page: page:
- name: Site - name: Site
url: /fr-fr/ url: https://gitea.io/en-us/
weight: 10 weight: 10
pre: home pre: home
post: active post: active
- name: Documentation - name: Documentation
url: https://docs.gitea.io/fr-fr/ url: /fr-fr/
weight: 20 weight: 20
pre: question pre: question
- name: API - name: API
url: https://try.gitea.io/api/swagger url: https://try.gitea.io/api/swagger
weight: 25 weight: 45
pre: plug pre: plug
- name: Blog - name: Blog
url: https://blog.gitea.io/ url: https://blog.gitea.io/

View File

@ -0,0 +1,75 @@
---
date: "2018-06-24:00:00+02:00"
title: "API Usage"
slug: "api-usage"
weight: 40
toc: true
draft: false
menu:
sidebar:
parent: "advanced"
name: "API Usage"
weight: 40
identifier: "api-usage"
---
# Gitea API Usage
## Enabling/configuring API access
By default, `ENABLE_SWAGGER_ENDPOINT` is true, and
`MAX_RESPONSE_ITEMS` is set to 50. See [Config Cheat
Sheet](https://docs.gitea.io/en-us/config-cheat-sheet/) for more
information.
## Authentication via the API
Gitea supports these methods of API authentication:
- HTTP basic authentication
- `token=...` parameter in URL query string
- `access_token=...` parameter in URL query string
- `Authorization: token ...` header in HTTP headers
All of these methods accept the same apiKey token type. You can
better understand this by looking at the code -- as of this writing,
Gitea parses queries and headers to find the token in
[modules/auth/auth.go](https://github.com/go-gitea/gitea/blob/6efdcaed86565c91a3dc77631372a9cc45a58e89/modules/auth/auth.go#L47).
You can create an apiKey token via your gitea install's web interface:
`Settings | Applications | Generate New Token`.
### More on the `Authorization:` header
For historical reasons, Gitea needs the word `token` included before
the apiKey token in an authorization header, like this:
```
Authorization: token 65eaa9c8ef52460d22a93307fe0aee76289dc675
```
In a `curl` command, for instance, this would look like:
```
curl -X POST "http://localhost:4000/api/v1/repos/test1/test1/issues" \
-H "accept: application/json" \
-H "Authorization: token 65eaa9c8ef52460d22a93307fe0aee76289dc675" \
-H "Content-Type: application/json" -d "{ \"body\": \"testing\", \"title\": \"test 20\"}" -i
```
As mentioned above, the token used is the same one you would use in
the `token=` string in a GET request.
## Listing your issued tokens via the API
As mentioned in
[#3842](https://github.com/go-gitea/gitea/issues/3842#issuecomment-397743346),
`/users/:name/tokens` is special and requires you to authenticate
using BasicAuth, as follows:
### Using basic authentication:
```
$ curl --request GET --url https://yourusername:yourpassword@gitea.your.host/api/v1/users/yourusername/tokens
[{"name":"test","sha1":"..."},{"name":"dev","sha1":"..."}]
```

View File

@ -68,6 +68,7 @@ Values containing `#` or `;` must be quoted using `` ` `` or `"""`.
- `EXPLORE_PAGING_NUM`: **20**: Number of repositories that are shown in one explore page. - `EXPLORE_PAGING_NUM`: **20**: Number of repositories that are shown in one explore page.
- `ISSUE_PAGING_NUM`: **10**: Number of issues that are shown in one page (for all pages that list issues). - `ISSUE_PAGING_NUM`: **10**: Number of issues that are shown in one page (for all pages that list issues).
- `FEED_MAX_COMMIT_NUM`: **5**: Number of maximum commits shown in one activity feed. - `FEED_MAX_COMMIT_NUM`: **5**: Number of maximum commits shown in one activity feed.
- `DEFAULT_THEME`: **gitea**: \[gitea, arc-green\]: Set the default theme for the Gitea install.
### UI - Admin (`ui.admin`) ### UI - Admin (`ui.admin`)
@ -177,7 +178,11 @@ Values containing `#` or `;` must be quoted using `` ` `` or `"""`.
- `ENABLE_REVERSE_PROXY_AUTHENTICATION`: **false**: Enable this to allow reverse proxy authentication. - `ENABLE_REVERSE_PROXY_AUTHENTICATION`: **false**: Enable this to allow reverse proxy authentication.
- `ENABLE_REVERSE_PROXY_AUTO_REGISTRATION`: **false**: Enable this to allow auto-registration - `ENABLE_REVERSE_PROXY_AUTO_REGISTRATION`: **false**: Enable this to allow auto-registration
for reverse authentication. for reverse authentication.
- `ENABLE_CAPTCHA`: **true**: Enable this to use captcha validation for registration. - `ENABLE_CAPTCHA`: **false**: Enable this to use captcha validation for registration.
- `CAPTCHA_TYPE`: **image**: \[image, recaptcha\]
- `RECAPTCHA_SECRET`: **""**: Go to https://www.google.com/recaptcha/admin to get a secret for recaptcha
- `RECAPTCHA_SITEKEY`: **""**: Go to https://www.google.com/recaptcha/admin to get a sitekey for recaptcha
- `DEFAULT_ENABLE_DEPENDENCIES`: **true** Enable this to have dependencies enabled by default.
## Webhook (`webhook`) ## Webhook (`webhook`)
@ -279,6 +284,13 @@ Values containing `#` or `;` must be quoted using `` ` `` or `"""`.
- `MAX_GIT_DIFF_FILES`: **100**: Max number of files shown in diff view. - `MAX_GIT_DIFF_FILES`: **100**: Max number of files shown in diff view.
- `GC_ARGS`: **\<empty\>**: Arguments for command `git gc`, e.g. `--aggressive --auto`. - `GC_ARGS`: **\<empty\>**: Arguments for command `git gc`, e.g. `--aggressive --auto`.
## Git - Timeout settings (`git.timeout`)
- `MIGRATE`: **600**: Migrate external repositories timeout seconds.
- `MIRROR`: **300**: Mirror external repositories timeout seconds.
- `CLONE`: **300**: Git clone from internal repositories timeout seconds.
- `PULL`: **300**: Git pull from internal repositories timeout seconds.
- `GC`: **60**: Git repository GC timeout seconds.
## API (`api`) ## API (`api`)
- `ENABLE_SWAGGER_ENDPOINT`: **true**: Enables /api/swagger, /api/v1/swagger etc. endpoints. True or false; default is true. - `ENABLE_SWAGGER_ENDPOINT`: **true**: Enables /api/swagger, /api/v1/swagger etc. endpoints. True or false; default is true.

View File

@ -187,6 +187,13 @@ menu:
- `MAX_GIT_DIFF_FILES`: 比较视图中的最大现实文件数目。 - `MAX_GIT_DIFF_FILES`: 比较视图中的最大现实文件数目。
- `GC_ARGS`: 执行 `git gc` 命令的参数, 比如: `--aggressive --auto` - `GC_ARGS`: 执行 `git gc` 命令的参数, 比如: `--aggressive --auto`
## Git - 超时设置 (`git.timeout`)
- `MIGRATE`: **600**: 迁移外部仓库时的超时时间,单位秒
- `MIRROR`: **300**: 镜像外部仓库的超时时间,单位秒
- `CLONE`: **300**: 内部仓库间克隆的超时时间,单位秒
- `PULL`: **300**: 内部仓库间拉取的超时时间,单位秒
- `GC`: **60**: git仓库GC的超时时间单位秒
## markup (`markup`) ## markup (`markup`)
外部渲染工具支持,你可以用你熟悉的文档渲染工具. 比如一下将新增一个名字为 `asciidoc` 的渲染工具which is followed `markup.` ini section. And there are some config items below. 外部渲染工具支持,你可以用你熟悉的文档渲染工具. 比如一下将新增一个名字为 `asciidoc` 的渲染工具which is followed `markup.` ini section. And there are some config items below.

View File

@ -91,3 +91,7 @@ Apart from `extra_links.tmpl` and `extra_tabs.tmpl`, there are other useful temp
## Customizing gitignores, labels, licenses, locales, and readmes. ## Customizing gitignores, labels, licenses, locales, and readmes.
Place custom files in corresponding sub-folder under `custom/options`. Place custom files in corresponding sub-folder under `custom/options`.
## Customizing the look of Gitea
Gitea has two built-in themes, the default theme `gitea`, and a dark theme `arc-green`. To change the look of your Gitea install change the value of `DEFAULT_THEME` in the [ui](https://docs.gitea.io/en-us/config-cheat-sheet/#ui-ui) section of `app.ini` to another one of the available options.

View File

@ -27,659 +27,93 @@ _Symbols used in table:_
* _✘ - unsupported_ * _✘ - unsupported_
<table border="1" cellpadding="4"> #### General Features
<thead>
<tr> | Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE |
<td>Feature</td> |---------|-------|------|-----------|-----------|-----------|-----------|--------------|
<td>Gitea</td> | Open source and free | ✓ | ✓ | ✘| ✓ | ✘ | ✘ | ✓ |
<td>Gogs</td> | Low resource usage (RAM/CPU) | ✓ | ✓ | ✘ | ✘ | ✘ | ✘ | ✘ |
<td>GitHub EE</td> | Multiple database support | ✓ | ✓ | ✘ | | | ✓ | ✓ |
<td>GitLab CE</td> | Multiple OS support | ✓ | ✓ | ✘ | ✘ | ✘ | ✘ | ✓ |
<td>GitLab EE</td> | Easy upgrade process | ✓ | ✓ | ✘ | ✓ | ✓ | ✘ | ✓ |
<td>BitBucket</td> | Markdown support | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
<td>RhodeCode CE</td> | Static Git-powered pages | ✘ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ |
</tr> | Integrated Git-powered wiki | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ |
</thead> | Deploy Tokens | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
<tbody> | Repository Tokens with write rights | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✓ |
<tr> | Built-in Container Registry | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ |
<td>Open source and free</td> | External git mirroring | ✓ | ✓ | ✘ | ✘ | ✓ | ✓ | ✓ |
<td></td> | FIDO U2F (2FA) | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ |
<td></td> | Built-in CI/CD | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ |
<td></td> | Subgroups: groups within groups | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✓ |
<td></td>
<td></td> #### Code management
<td></td>
<td></td> | Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE |
</tr> |---------|-------|------|-----------|-----------|-----------|-----------|--------------|
<tr> | Repository topics | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ |
<td>Issue tracker</td> | Repository code search | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
<td></td> | Global code search | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
<td></td> | Git LFS 2.0 | ✓ | ✘ | ✓ | ✓ | ✓ | | ✓ |
<td></td> | Group Milestones | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ |
<td></td> | Granular user roles (Code, Issues, Wiki etc) | ✓ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ |
<td></td> | Verified Committer | ✘ | ✘ | ? | ✓ | ✓ | ✓ | ✘ |
<td></td> | GPG Signed Commits | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
<td></td> | Reject unsigned commits | ✘ | ✘ | ✓ | ✓ | ✓ | ✘ | ✓ |
</tr> | Repository Activity page | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
<tr> | Branch manager | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
<td>Pull/Merge requests</td> | Create new branches | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ |
<td></td> | Web code editor | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
<td></td> | Commit graph | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
<td></td>
<td></td> #### Issue Tracker
<td></td>
<td></td> | Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE |
<td></td> |---------|-------|------|-----------|-----------|-----------|-----------|--------------|
</tr> | Issue tracker | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ |
<tr> | Issue templates | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ | ✘ |
<td>Squash merging</td> | Labels | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ | ✘ |
<td></td> | Time tracking | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ |
<td></td> | Multiple assignees for issues | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ |
<td></td> | Related issues | ✘ | ✘ | | ✘ | ✓ | ✘ | ✘ |
<td></td> | Confidential issues | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ |
<td></td> | Comment reactions | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ |
<td></td> | Lock Discussion | ✘ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ |
<td></td> | Batch issue handling | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ |
</tr> | Issue Boards | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ |
<tr> | Create new branches from issues | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ |
<td>Rebase merging</td> | Issue search | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ |
<td></td> | Global issue search | ✘ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ |
<td></td>
<td></td> #### Pull/Merge requests
<td></td>
<td></td> | Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE |
<td></td> |---------|-------|------|-----------|-----------|-----------|-----------|--------------|
<td></td> | Pull/Merge requests | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
</tr> | Squash merging | ✓ | ✘ | ✓ | ✘ | ✓ | ✓ | ✓ |
<tr> | Rebase merging | ✓ | ✓ | ✓ | ✘ | | ✘ | ✓ |
<td>Pull/Merge request inline comments</td> | Pull/Merge request inline comments | ✘ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
<td></td> | Pull/Merge request approval | ✘ | ✘ | | ✓ | ✓ | ✓ | ✓ |
<td></td> | Merge conflict resolution | ✘ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ |
<td></td> | Restrict push and merge access to certain users | ✓ | ✘ | ✓ | | ✓ | ✓ | ✓ |
<td></td> | Revert specific commits or a merge request | ✘ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ |
<td></td> | Pull/Merge requests templates | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ | ✘ |
<td></td> | Cherry-picking changes | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ |
<td></td>
</tr>
<tr> #### 3rd-party integrations
<td>Pull/Merge request approval</td>
<td></td> | Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE |
<td></td> |---------|-------|------|-----------|-----------|-----------|-----------|--------------|
<td></td> | Webhook support | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
<td></td> | Custom Git Hooks | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
<td></td> | AD / LDAP integration | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
<td></td> | Multiple LDAP / AD server support | ✓ | ✓ | ✘ | ✘ | ✓ | ✓ | ✓ |
<td></td> | LDAP user synchronization | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
</tr> | OpenId Connect support | ✓ | ✘ | ✓ | ✓ | ✓ | ? | ✘ |
<tr> | OAuth 2.0 integration (external authorization) | ✓ | ✘ | | ✓ | ✓ | ? | ✓ |
<td>Merge conflict resolution</td> | Act as OAuth 2.0 provider | ✘ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ |
<td></td> | Two factor authentication (2FA) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ |
<td></td> | Mattermost/Slack integration | ✓ | ✓ | | ✓ | ✓ | | ✓ |
<td></td> | Discord integration | ✓ | ✓ | ✓ | ✘ | ✘ | ✘ | ✘ |
<td></td> | External CI/CD status display | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Restrict push and merge access to certain users</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Markdown support</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Issues and pull/merge requests templates</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Revert specific commits or a merge request</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Labels</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Time tracking</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Multiple assignees for issues</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Related issues</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Confidential issues</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Comment reactions</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Lock Discussion</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Batch issue handling</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Issue Boards</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Create new branches from issues</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Commit graph</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Web code editor</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Branch manager</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Create new branches</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Repository topics</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Repository code search</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Global code search</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Issue search</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Global issue search</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Git LFS 2.0</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Integrated Git-powered wiki</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Static Git-powered pages</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Group Milestones</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Granular user roles (Code, Issues, Wiki etc)</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Cherry-picking changes</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>GPG Signed Commits</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Reject unsigned commits</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Verified Committer</td>
<td></td>
<td></td>
<td>?</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Subgroups: groups within groups</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Custom Git Hooks</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Repository Activity page</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Deploy Tokens</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Repository Tokens with write rights</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Easy upgrade process</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Built-in Container Registry</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>External git mirroring</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>AD / LDAP integration</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Multiple LDAP / AD server support</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>LDAP user synchronization</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>OpenId Connect support</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>?</td>
<td></td>
</tr>
<tr>
<td>OAuth 2.0 integration (external authorization)</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>?</td>
<td></td>
</tr>
<tr>
<td>Act as OAuth 2.0 provider</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Two factor authentication (2FA)</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>FIDO U2F (2FA)</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Webhook support</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Mattermost/Slack integration</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Discord integration</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Built-in CI/CD</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>External CI/CD status display</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Multiple database support</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Multiple OS support</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Low resource usage (RAM/CPU)</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>

View File

@ -21,10 +21,18 @@ the destination platform from the [downloads page](https://dl.gitea.io/gitea), c
the URL and replace the URL within the commands below: the URL and replace the URL within the commands below:
```sh ```sh
wget -O gitea https://dl.gitea.io/gitea/1.4.2/gitea-1.4.2-linux-amd64 wget -O gitea https://dl.gitea.io/gitea/1.4.3/gitea-1.4.3-linux-amd64
chmod +x gitea chmod +x gitea
``` ```
## Verify GPG signature
Gitea signs all binaries with a [GPG key](https://pgp.mit.edu/pks/lookup?op=vindex&fingerprint=on&search=0x2D9AE806EC1592E2) to prevent against unwanted modification of binaries. To validate the binary download the signature file which ends in `.asc` for the binary you downloaded and use the gpg command line tool.
```sh
gpg --keyserver pgp.mit.edu --recv 0x2D9AE806EC1592E2
gpg --verify gitea-1.5.0-linux-amd64.asc gitea-1.5.0-linux-amd64
```
## Test ## Test
After getting a binary, it can be tested with `./gitea web` or moved to a permanent After getting a binary, it can be tested with `./gitea web` or moved to a permanent

View File

@ -245,6 +245,8 @@ You can configure some of Gitea's settings via environment variables:
* `SECRET_KEY`: **""**: Global secret key. This should be changed. If this has a value and `INSTALL_LOCK` is empty, `INSTALL_LOCK` will automatically set to `true`. * `SECRET_KEY`: **""**: Global secret key. This should be changed. If this has a value and `INSTALL_LOCK` is empty, `INSTALL_LOCK` will automatically set to `true`.
* `DISABLE_REGISTRATION`: **false**: Disable registration, after which only admin can create accounts for users. * `DISABLE_REGISTRATION`: **false**: Disable registration, after which only admin can create accounts for users.
* `REQUIRE_SIGNIN_VIEW`: **false**: Enable this to force users to log in to view any page. * `REQUIRE_SIGNIN_VIEW`: **false**: Enable this to force users to log in to view any page.
* `USER_UID`: **1000**: The UID (Unix user ID) of the user that runs Gitea within the container. Match this to the UID of the owner of the `/data` volume if using host volumes (this is not necessary with named volumes).
* `USER_GID`: **1000**: The GID (Unix group ID) of the user that runs Gitea within the container. Match this to the GID of the owner of the `/data` volume if using host volumes (this is not necessary with named volumes).
# Customization # Customization

View File

@ -1,44 +0,0 @@
:80 {
root /srv/www
locale en-US zh-CN zh-TW pt-BR nl-NL fr-FR {
detect header
}
redir 301 {
if {path} match ^/$
/ /{>Detected-Locale}/
}
rewrite /en-US/ {
regexp (.*)
to /en-us/{1}
}
rewrite /zh-CN/ {
regexp (.*)
to /zh-cn/{1}
}
rewrite /zh-TW/ {
regexp (.*)
to /zh-tw/{1}
}
rewrite /pt-BR/ {
regexp (.*)
to /pt-br/{1}
}
rewrite /nl-NL/ {
regexp (.*)
to /nl-nl/{1}
}
rewrite /fr-FR/ {
regexp (.*)
to /fr-fr/{1}
}
header / Vary "Accept-Language"
}

View File

6
docs/static/_headers vendored Normal file
View File

@ -0,0 +1,6 @@
/*
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' https://fonts.googleapis.com https://cdnjs.cloudflare.com; font-src 'self' data: https://cdnjs.cloudflare.com https://fonts.gstatic.com
X-Frame-Options: DENY
X-Xss-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin

8
docs/static/_redirects vendored Normal file
View File

@ -0,0 +1,8 @@
https://gitea-docs.netlify.com/* https://docs.gitea.io/:splat 302!
/ /fr-fr/ 302! Language=fr
/ /nl-nl/ 302! Language=nl
/ /pt-br/ 302! Language=pt-br
/ /zh-cn/ 302! Language=zh-cn
/ /zh-tw/ 302! Language=zh-tw
/ /en-us/ 302!

View File

@ -67,9 +67,9 @@ func TestAPISearchRepo(t *testing.T) {
expectedResults expectedResults
}{ }{
{name: "RepositoriesMax50", requestURL: "/api/v1/repos/search?limit=50", expectedResults: expectedResults{ {name: "RepositoriesMax50", requestURL: "/api/v1/repos/search?limit=50", expectedResults: expectedResults{
nil: {count: 15}, nil: {count: 16},
user: {count: 15}, user: {count: 16},
user2: {count: 15}}, user2: {count: 16}},
}, },
{name: "RepositoriesMax10", requestURL: "/api/v1/repos/search?limit=10", expectedResults: expectedResults{ {name: "RepositoriesMax10", requestURL: "/api/v1/repos/search?limit=10", expectedResults: expectedResults{
nil: {count: 10}, nil: {count: 10},
@ -235,3 +235,53 @@ func TestAPIGetRepoByIDUnauthorized(t *testing.T) {
req := NewRequestf(t, "GET", "/api/v1/repositories/2") req := NewRequestf(t, "GET", "/api/v1/repositories/2")
sess.MakeRequest(t, req, http.StatusNotFound) sess.MakeRequest(t, req, http.StatusNotFound)
} }
func TestAPIRepoMigrate(t *testing.T) {
testCases := []struct {
ctxUserID, userID int64
cloneURL, repoName string
expectedStatus int
}{
{ctxUserID: 1, userID: 2, cloneURL: "https://github.com/go-gitea/git.git", repoName: "git-admin", expectedStatus: http.StatusCreated},
{ctxUserID: 2, userID: 2, cloneURL: "https://github.com/go-gitea/git.git", repoName: "git-own", expectedStatus: http.StatusCreated},
{ctxUserID: 2, userID: 1, cloneURL: "https://github.com/go-gitea/git.git", repoName: "git-bad", expectedStatus: http.StatusForbidden},
{ctxUserID: 2, userID: 3, cloneURL: "https://github.com/go-gitea/git.git", repoName: "git-org", expectedStatus: http.StatusCreated},
{ctxUserID: 2, userID: 6, cloneURL: "https://github.com/go-gitea/git.git", repoName: "git-bad-org", expectedStatus: http.StatusForbidden},
}
prepareTestEnv(t)
for _, testCase := range testCases {
user := models.AssertExistsAndLoadBean(t, &models.User{ID: testCase.ctxUserID}).(*models.User)
session := loginUser(t, user.Name)
req := NewRequestWithJSON(t, "POST", "/api/v1/repos/migrate", &api.MigrateRepoOption{
CloneAddr: testCase.cloneURL,
UID: int(testCase.userID),
RepoName: testCase.repoName,
})
session.MakeRequest(t, req, testCase.expectedStatus)
}
}
func TestAPIOrgRepoCreate(t *testing.T) {
testCases := []struct {
ctxUserID int64
orgName, repoName string
expectedStatus int
}{
{ctxUserID: 1, orgName: "user3", repoName: "repo-admin", expectedStatus: http.StatusCreated},
{ctxUserID: 2, orgName: "user3", repoName: "repo-own", expectedStatus: http.StatusCreated},
{ctxUserID: 2, orgName: "user6", repoName: "repo-bad-org", expectedStatus: http.StatusForbidden},
}
prepareTestEnv(t)
for _, testCase := range testCases {
user := models.AssertExistsAndLoadBean(t, &models.User{ID: testCase.ctxUserID}).(*models.User)
session := loginUser(t, user.Name)
req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/org/%s/repos", testCase.orgName), &api.CreateRepoOption{
Name: testCase.repoName,
})
session.MakeRequest(t, req, testCase.expectedStatus)
}
}

View File

@ -0,0 +1,50 @@
// Copyright 2018 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package integrations
import (
"net/http"
"testing"
"code.gitea.io/gitea/models"
api "code.gitea.io/sdk/gitea"
)
// TestAPICreateAndDeleteToken tests that token that was just created can be deleted
func TestAPICreateAndDeleteToken(t *testing.T) {
prepareTestEnv(t)
user := models.AssertExistsAndLoadBean(t, &models.User{ID: 1}).(*models.User)
req := NewRequestWithJSON(t, "POST", "/api/v1/users/user1/tokens", map[string]string{
"name": "test-key-1",
})
req = AddBasicAuthHeader(req, user.Name)
resp := MakeRequest(t, req, http.StatusCreated)
var newAccessToken api.AccessToken
DecodeJSON(t, resp, &newAccessToken)
models.AssertExistsAndLoadBean(t, &models.AccessToken{
ID: newAccessToken.ID,
Name: newAccessToken.Name,
Sha1: newAccessToken.Sha1,
UID: user.ID,
})
req = NewRequestf(t, "DELETE", "/api/v1/users/user1/tokens/%d", newAccessToken.ID)
req = AddBasicAuthHeader(req, user.Name)
MakeRequest(t, req, http.StatusNoContent)
models.AssertNotExistsBean(t, &models.AccessToken{ID: newAccessToken.ID})
}
// TestAPIDeleteMissingToken ensures that error is thrown when token not found
func TestAPIDeleteMissingToken(t *testing.T) {
prepareTestEnv(t)
user := models.AssertExistsAndLoadBean(t, &models.User{ID: 1}).(*models.User)
req := NewRequestf(t, "DELETE", "/api/v1/users/user1/tokens/%d", models.NonexistentID)
req = AddBasicAuthHeader(req, user.Name)
MakeRequest(t, req, http.StatusNotFound)
}

View File

@ -256,6 +256,11 @@ func NewRequestWithBody(t testing.TB, method, urlStr string, body io.Reader) *ht
return request return request
} }
func AddBasicAuthHeader(request *http.Request, username string) *http.Request {
request.SetBasicAuth(username, userPassword)
return request
}
const NoExpectedStatus = -1 const NoExpectedStatus = -1
func MakeRequest(t testing.TB, req *http.Request, expectedStatus int) *httptest.ResponseRecorder { func MakeRequest(t testing.TB, req *http.Request, expectedStatus int) *httptest.ResponseRecorder {

View File

@ -14,6 +14,7 @@ import (
"code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
// register supported doc types // register supported doc types
_ "code.gitea.io/gitea/modules/markup/csv"
_ "code.gitea.io/gitea/modules/markup/markdown" _ "code.gitea.io/gitea/modules/markup/markdown"
_ "code.gitea.io/gitea/modules/markup/orgmode" _ "code.gitea.io/gitea/modules/markup/orgmode"

View File

@ -22,8 +22,12 @@ func TestAccessLevel(t *testing.T) {
user1 := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) user1 := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
user2 := AssertExistsAndLoadBean(t, &User{ID: 5}).(*User) user2 := AssertExistsAndLoadBean(t, &User{ID: 5}).(*User)
repo1 := AssertExistsAndLoadBean(t, &Repository{OwnerID: 2, IsPrivate: false}).(*Repository) // A public repository owned by User 2
repo2 := AssertExistsAndLoadBean(t, &Repository{OwnerID: 3, IsPrivate: true}).(*Repository) repo1 := AssertExistsAndLoadBean(t, &Repository{ID: 1}).(*Repository)
assert.False(t, repo1.IsPrivate)
// A private repository owned by Org 3
repo2 := AssertExistsAndLoadBean(t, &Repository{ID: 3}).(*Repository)
assert.True(t, repo2.IsPrivate)
level, err := AccessLevel(user1.ID, repo1) level, err := AccessLevel(user1.ID, repo1)
assert.NoError(t, err) assert.NoError(t, err)
@ -47,8 +51,12 @@ func TestHasAccess(t *testing.T) {
user1 := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) user1 := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
user2 := AssertExistsAndLoadBean(t, &User{ID: 5}).(*User) user2 := AssertExistsAndLoadBean(t, &User{ID: 5}).(*User)
repo1 := AssertExistsAndLoadBean(t, &Repository{OwnerID: 2, IsPrivate: false}).(*Repository) // A public repository owned by User 2
repo2 := AssertExistsAndLoadBean(t, &Repository{OwnerID: 3, IsPrivate: true}).(*Repository) repo1 := AssertExistsAndLoadBean(t, &Repository{ID: 1}).(*Repository)
assert.False(t, repo1.IsPrivate)
// A private repository owned by Org 3
repo2 := AssertExistsAndLoadBean(t, &Repository{ID: 3}).(*Repository)
assert.True(t, repo2.IsPrivate)
for _, accessMode := range accessModes { for _, accessMode := range accessModes {
has, err := HasAccess(user1.ID, repo1, accessMode) has, err := HasAccess(user1.ID, repo1, accessMode)

View File

@ -122,6 +122,12 @@ func (a *Action) loadRepo() {
} }
} }
// GetActFullName gets the action's user full name.
func (a *Action) GetActFullName() string {
a.loadActUser()
return a.ActUser.FullName
}
// GetActUserName gets the action's user name. // GetActUserName gets the action's user name.
func (a *Action) GetActUserName() string { func (a *Action) GetActUserName() string {
a.loadActUser() a.loadActUser()
@ -471,6 +477,10 @@ func UpdateIssuesCommit(doer *User, repo *Repository, commits []*PushCommit) err
} }
if err = issue.ChangeStatus(doer, repo, true); err != nil { if err = issue.ChangeStatus(doer, repo, true); err != nil {
// Don't return an error when dependencies are open as this would let the push fail
if IsErrDependenciesLeft(err) {
return nil
}
return err return err
} }
} }

View File

@ -1259,3 +1259,88 @@ func IsErrU2FRegistrationNotExist(err error) bool {
_, ok := err.(ErrU2FRegistrationNotExist) _, ok := err.(ErrU2FRegistrationNotExist)
return ok return ok
} }
// .___ ________ .___ .__
// | | ______ ________ __ ____ \______ \ ____ ______ ____ ____ __| _/____ ____ ____ |__| ____ ______
// | |/ ___// ___/ | \_/ __ \ | | \_/ __ \\____ \_/ __ \ / \ / __ |/ __ \ / \_/ ___\| |/ __ \ / ___/
// | |\___ \ \___ \| | /\ ___/ | ` \ ___/| |_> > ___/| | \/ /_/ \ ___/| | \ \___| \ ___/ \___ \
// |___/____ >____ >____/ \___ >_______ /\___ > __/ \___ >___| /\____ |\___ >___| /\___ >__|\___ >____ >
// \/ \/ \/ \/ \/|__| \/ \/ \/ \/ \/ \/ \/ \/
// ErrDependencyExists represents a "DependencyAlreadyExists" kind of error.
type ErrDependencyExists struct {
IssueID int64
DependencyID int64
}
// IsErrDependencyExists checks if an error is a ErrDependencyExists.
func IsErrDependencyExists(err error) bool {
_, ok := err.(ErrDependencyExists)
return ok
}
func (err ErrDependencyExists) Error() string {
return fmt.Sprintf("issue dependency does already exist [issue id: %d, dependency id: %d]", err.IssueID, err.DependencyID)
}
// ErrDependencyNotExists represents a "DependencyAlreadyExists" kind of error.
type ErrDependencyNotExists struct {
IssueID int64
DependencyID int64
}
// IsErrDependencyNotExists checks if an error is a ErrDependencyExists.
func IsErrDependencyNotExists(err error) bool {
_, ok := err.(ErrDependencyNotExists)
return ok
}
func (err ErrDependencyNotExists) Error() string {
return fmt.Sprintf("issue dependency does not exist [issue id: %d, dependency id: %d]", err.IssueID, err.DependencyID)
}
// ErrCircularDependency represents a "DependencyCircular" kind of error.
type ErrCircularDependency struct {
IssueID int64
DependencyID int64
}
// IsErrCircularDependency checks if an error is a ErrCircularDependency.
func IsErrCircularDependency(err error) bool {
_, ok := err.(ErrCircularDependency)
return ok
}
func (err ErrCircularDependency) Error() string {
return fmt.Sprintf("circular dependencies exists (two issues blocking each other) [issue id: %d, dependency id: %d]", err.IssueID, err.DependencyID)
}
// ErrDependenciesLeft represents an error where the issue you're trying to close still has dependencies left.
type ErrDependenciesLeft struct {
IssueID int64
}
// IsErrDependenciesLeft checks if an error is a ErrDependenciesLeft.
func IsErrDependenciesLeft(err error) bool {
_, ok := err.(ErrDependenciesLeft)
return ok
}
func (err ErrDependenciesLeft) Error() string {
return fmt.Sprintf("issue has open dependencies [issue id: %d]", err.IssueID)
}
// ErrUnknownDependencyType represents an error where an unknown dependency type was passed
type ErrUnknownDependencyType struct {
Type DependencyType
}
// IsErrUnknownDependencyType checks if an error is ErrUnknownDependencyType
func IsErrUnknownDependencyType(err error) bool {
_, ok := err.(ErrUnknownDependencyType)
return ok
}
func (err ErrUnknownDependencyType) Error() string {
return fmt.Sprintf("unknown dependency type [type: %d]", err.Type)
}

View File

@ -389,3 +389,14 @@
num_forks: 0 num_forks: 0
num_issues: 0 num_issues: 0
is_mirror: false is_mirror: false
-
id: 32
owner_id: 3
lower_name: repo21
name: repo21
is_private: false
num_stars: 0
num_forks: 0
num_issues: 0
is_mirror: false

View File

@ -4,9 +4,8 @@
lower_name: owners lower_name: owners
name: Owners name: Owners
authorize: 4 # owner authorize: 4 # owner
num_repos: 2 num_repos: 3
num_members: 1 num_members: 1
unit_types: '[1,2,3,4,5,6,7]'
- -
id: 2 id: 2
@ -16,7 +15,6 @@
authorize: 2 # write authorize: 2 # write
num_repos: 1 num_repos: 1
num_members: 2 num_members: 2
unit_types: '[1,2,3,4,5,6,7]'
- -
id: 3 id: 3
@ -26,7 +24,6 @@
authorize: 4 # owner authorize: 4 # owner
num_repos: 0 num_repos: 0
num_members: 1 num_members: 1
unit_types: '[1,2,3,4,5,6,7]'
- -
id: 4 id: 4
@ -36,7 +33,6 @@
authorize: 4 # owner authorize: 4 # owner
num_repos: 0 num_repos: 0
num_members: 1 num_members: 1
unit_types: '[1,2,3,4,5,6,7]'
- -
id: 5 id: 5
@ -46,7 +42,6 @@
authorize: 4 # owner authorize: 4 # owner
num_repos: 2 num_repos: 2
num_members: 2 num_members: 2
unit_types: '[1,2,3,4,5,6,7]'
- -
id: 6 id: 6
@ -56,4 +51,3 @@
authorize: 4 # owner authorize: 4 # owner
num_repos: 2 num_repos: 2
num_members: 1 num_members: 1
unit_types: '[1,2,3,4,5,6,7]'

View File

@ -39,3 +39,9 @@
org_id: 19 org_id: 19
team_id: 6 team_id: 6
repo_id: 28 repo_id: 28
-
id: 8
org_id: 3
team_id: 1
repo_id: 32

View File

@ -0,0 +1,209 @@
-
id: 1
team_id: 1
type: 1
-
id: 2
team_id: 1
type: 2
-
id: 3
team_id: 1
type: 3
-
id: 4
team_id: 1
type: 4
-
id: 5
team_id: 1
type: 5
-
id: 6
team_id: 1
type: 6
-
id: 7
team_id: 1
type: 7
-
id: 8
team_id: 2
type: 1
-
id: 9
team_id: 2
type: 2
-
id: 10
team_id: 2
type: 3
-
id: 11
team_id: 2
type: 4
-
id: 12
team_id: 2
type: 5
-
id: 13
team_id: 2
type: 6
-
id: 14
team_id: 2
type: 7
-
id: 15
team_id: 3
type: 1
-
id: 16
team_id: 3
type: 2
-
id: 17
team_id: 3
type: 3
-
id: 18
team_id: 3
type: 4
-
id: 19
team_id: 3
type: 5
-
id: 20
team_id: 3
type: 6
-
id: 21
team_id: 3
type: 7
-
id: 22
team_id: 4
type: 1
-
id: 23
team_id: 4
type: 2
-
id: 24
team_id: 4
type: 3
-
id: 25
team_id: 4
type: 4
-
id: 26
team_id: 4
type: 5
-
id: 27
team_id: 4
type: 6
-
id: 28
team_id: 4
type: 7
-
id: 29
team_id: 5
type: 1
-
id: 30
team_id: 5
type: 2
-
id: 31
team_id: 5
type: 3
-
id: 32
team_id: 5
type: 4
-
id: 33
team_id: 5
type: 5
-
id: 34
team_id: 5
type: 6
-
id: 35
team_id: 5
type: 7
-
id: 36
team_id: 6
type: 1
-
id: 37
team_id: 6
type: 2
-
id: 38
team_id: 6
type: 3
-
id: 39
team_id: 6
type: 4
-
id: 40
team_id: 6
type: 5
-
id: 41
team_id: 6
type: 6
-
id: 42
team_id: 6
type: 7

View File

@ -45,7 +45,7 @@
is_admin: false is_admin: false
avatar: avatar3 avatar: avatar3
avatar_email: user3@example.com avatar_email: user3@example.com
num_repos: 2 num_repos: 3
num_members: 2 num_members: 2
num_teams: 2 num_teams: 2

View File

@ -649,6 +649,20 @@ func (issue *Issue) changeStatus(e *xorm.Session, doer *User, repo *Repository,
if issue.IsClosed == isClosed { if issue.IsClosed == isClosed {
return nil return nil
} }
// Check for open dependencies
if isClosed && issue.Repo.IsDependenciesEnabled() {
// only check if dependencies are enabled and we're about to close an issue, otherwise reopening an issue would fail when there are unsatisfied dependencies
noDeps, err := IssueNoDependenciesLeft(issue)
if err != nil {
return err
}
if !noDeps {
return ErrDependenciesLeft{issue.ID}
}
}
issue.IsClosed = isClosed issue.IsClosed = isClosed
if isClosed { if isClosed {
issue.ClosedUnix = util.TimeStampNow() issue.ClosedUnix = util.TimeStampNow()
@ -1283,7 +1297,7 @@ func getParticipantsByIssueID(e Engine, issueID int64) ([]*User, error) {
And("`comment`.type = ?", CommentTypeComment). And("`comment`.type = ?", CommentTypeComment).
And("`user`.is_active = ?", true). And("`user`.is_active = ?", true).
And("`user`.prohibit_login = ?", false). And("`user`.prohibit_login = ?", false).
Join("INNER", "user", "`user`.id = `comment`.poster_id"). Join("INNER", "`user`", "`user`.id = `comment`.poster_id").
Distinct("poster_id"). Distinct("poster_id").
Find(&userIDs); err != nil { Find(&userIDs); err != nil {
return nil, fmt.Errorf("get poster IDs: %v", err) return nil, fmt.Errorf("get poster IDs: %v", err)
@ -1598,3 +1612,33 @@ func UpdateIssueDeadline(issue *Issue, deadlineUnix util.TimeStamp, doer *User)
return sess.Commit() return sess.Commit()
} }
// Get Blocked By Dependencies, aka all issues this issue is blocked by.
func (issue *Issue) getBlockedByDependencies(e Engine) (issueDeps []*Issue, err error) {
return issueDeps, e.
Table("issue_dependency").
Select("issue.*").
Join("INNER", "issue", "issue.id = issue_dependency.dependency_id").
Where("issue_id = ?", issue.ID).
Find(&issueDeps)
}
// Get Blocking Dependencies, aka all issues this issue blocks.
func (issue *Issue) getBlockingDependencies(e Engine) (issueDeps []*Issue, err error) {
return issueDeps, e.
Table("issue_dependency").
Select("issue.*").
Join("INNER", "issue", "issue.id = issue_dependency.issue_id").
Where("dependency_id = ?", issue.ID).
Find(&issueDeps)
}
// BlockedByDependencies finds all Dependencies an issue is blocked by
func (issue *Issue) BlockedByDependencies() ([]*Issue, error) {
return issue.getBlockedByDependencies(x)
}
// BlockingDependencies returns all blocking dependencies, aka all other issues a given issue blocks
func (issue *Issue) BlockingDependencies() ([]*Issue, error) {
return issue.getBlockingDependencies(x)
}

View File

@ -66,6 +66,10 @@ const (
CommentTypeModifiedDeadline CommentTypeModifiedDeadline
// Removed a due date // Removed a due date
CommentTypeRemovedDeadline CommentTypeRemovedDeadline
// Dependency added
CommentTypeAddDependency
//Dependency removed
CommentTypeRemoveDependency
) )
// CommentTag defines comment tag type // CommentTag defines comment tag type
@ -98,6 +102,8 @@ type Comment struct {
Assignee *User `xorm:"-"` Assignee *User `xorm:"-"`
OldTitle string OldTitle string
NewTitle string NewTitle string
DependentIssueID int64
DependentIssue *Issue `xorm:"-"`
CommitID int64 CommitID int64
Line int64 Line int64
@ -281,6 +287,15 @@ func (c *Comment) LoadAssigneeUser() error {
return nil return nil
} }
// LoadDepIssueDetails loads Dependent Issue Details
func (c *Comment) LoadDepIssueDetails() (err error) {
if c.DependentIssueID <= 0 || c.DependentIssue != nil {
return nil
}
c.DependentIssue, err = getIssueByID(x, c.DependentIssueID)
return err
}
// MailParticipants sends new comment emails to repository watchers // MailParticipants sends new comment emails to repository watchers
// and mentioned people. // and mentioned people.
func (c *Comment) MailParticipants(e Engine, opType ActionType, issue *Issue) (err error) { func (c *Comment) MailParticipants(e Engine, opType ActionType, issue *Issue) (err error) {
@ -332,6 +347,7 @@ func createComment(e *xorm.Session, opts *CreateCommentOptions) (_ *Comment, err
if opts.Label != nil { if opts.Label != nil {
LabelID = opts.Label.ID LabelID = opts.Label.ID
} }
comment := &Comment{ comment := &Comment{
Type: opts.Type, Type: opts.Type,
PosterID: opts.Doer.ID, PosterID: opts.Doer.ID,
@ -348,6 +364,7 @@ func createComment(e *xorm.Session, opts *CreateCommentOptions) (_ *Comment, err
Content: opts.Content, Content: opts.Content,
OldTitle: opts.OldTitle, OldTitle: opts.OldTitle,
NewTitle: opts.NewTitle, NewTitle: opts.NewTitle,
DependentIssueID: opts.DependentIssueID,
} }
if _, err = e.Insert(comment); err != nil { if _, err = e.Insert(comment); err != nil {
return nil, err return nil, err
@ -549,6 +566,39 @@ func createDeleteBranchComment(e *xorm.Session, doer *User, repo *Repository, is
}) })
} }
// Creates issue dependency comment
func createIssueDependencyComment(e *xorm.Session, doer *User, issue *Issue, dependentIssue *Issue, add bool) (err error) {
cType := CommentTypeAddDependency
if !add {
cType = CommentTypeRemoveDependency
}
// Make two comments, one in each issue
_, err = createComment(e, &CreateCommentOptions{
Type: cType,
Doer: doer,
Repo: issue.Repo,
Issue: issue,
DependentIssueID: dependentIssue.ID,
})
if err != nil {
return
}
_, err = createComment(e, &CreateCommentOptions{
Type: cType,
Doer: doer,
Repo: issue.Repo,
Issue: dependentIssue,
DependentIssueID: issue.ID,
})
if err != nil {
return
}
return
}
// CreateCommentOptions defines options for creating comment // CreateCommentOptions defines options for creating comment
type CreateCommentOptions struct { type CreateCommentOptions struct {
Type CommentType Type CommentType
@ -557,6 +607,7 @@ type CreateCommentOptions struct {
Issue *Issue Issue *Issue
Label *Label Label *Label
DependentIssueID int64
OldMilestoneID int64 OldMilestoneID int64
MilestoneID int64 MilestoneID int64
AssigneeID int64 AssigneeID int64

137
models/issue_dependency.go Normal file
View File

@ -0,0 +1,137 @@
// Copyright 2018 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package models
import (
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
)
// IssueDependency represents an issue dependency
type IssueDependency struct {
ID int64 `xorm:"pk autoincr"`
UserID int64 `xorm:"NOT NULL"`
IssueID int64 `xorm:"UNIQUE(issue_dependency) NOT NULL"`
DependencyID int64 `xorm:"UNIQUE(issue_dependency) NOT NULL"`
CreatedUnix util.TimeStamp `xorm:"created"`
UpdatedUnix util.TimeStamp `xorm:"updated"`
}
// DependencyType Defines Dependency Type Constants
type DependencyType int
// Define Dependency Types
const (
DependencyTypeBlockedBy DependencyType = iota
DependencyTypeBlocking
)
// CreateIssueDependency creates a new dependency for an issue
func CreateIssueDependency(user *User, issue, dep *Issue) error {
sess := x.NewSession()
defer sess.Close()
if err := sess.Begin(); err != nil {
return err
}
// Check if it aleready exists
exists, err := issueDepExists(sess, issue.ID, dep.ID)
if err != nil {
return err
}
if exists {
return ErrDependencyExists{issue.ID, dep.ID}
}
// And if it would be circular
circular, err := issueDepExists(sess, dep.ID, issue.ID)
if err != nil {
return err
}
if circular {
return ErrCircularDependency{issue.ID, dep.ID}
}
if _, err := sess.Insert(&IssueDependency{
UserID: user.ID,
IssueID: issue.ID,
DependencyID: dep.ID,
}); err != nil {
return err
}
// Add comment referencing the new dependency
if err = createIssueDependencyComment(sess, user, issue, dep, true); err != nil {
return err
}
return sess.Commit()
}
// RemoveIssueDependency removes a dependency from an issue
func RemoveIssueDependency(user *User, issue *Issue, dep *Issue, depType DependencyType) (err error) {
sess := x.NewSession()
defer sess.Close()
if err = sess.Begin(); err != nil {
return err
}
var issueDepToDelete IssueDependency
switch depType {
case DependencyTypeBlockedBy:
issueDepToDelete = IssueDependency{IssueID: issue.ID, DependencyID: dep.ID}
case DependencyTypeBlocking:
issueDepToDelete = IssueDependency{IssueID: dep.ID, DependencyID: issue.ID}
default:
return ErrUnknownDependencyType{depType}
}
affected, err := sess.Delete(&issueDepToDelete)
if err != nil {
return err
}
// If we deleted nothing, the dependency did not exist
if affected <= 0 {
return ErrDependencyNotExists{issue.ID, dep.ID}
}
// Add comment referencing the removed dependency
if err = createIssueDependencyComment(sess, user, issue, dep, false); err != nil {
return err
}
return sess.Commit()
}
// Check if the dependency already exists
func issueDepExists(e Engine, issueID int64, depID int64) (bool, error) {
return e.Where("(issue_id = ? AND dependency_id = ?)", issueID, depID).Exist(&IssueDependency{})
}
// IssueNoDependenciesLeft checks if issue can be closed
func IssueNoDependenciesLeft(issue *Issue) (bool, error) {
exists, err := x.
Table("issue_dependency").
Select("issue.*").
Join("INNER", "issue", "issue.id = issue_dependency.dependency_id").
Where("issue_dependency.issue_id = ?", issue.ID).
And("issue.is_closed = ?", "0").
Exist(&Issue{})
return !exists, err
}
// IsDependenciesEnabled returns if dependecies are enabled and returns the default setting if not set.
func (repo *Repository) IsDependenciesEnabled() bool {
var u *RepoUnit
var err error
if u, err = repo.GetUnit(UnitTypeIssues); err != nil {
log.Trace("%s", err)
return setting.Service.DefaultEnableDependencies
}
return u.IssuesConfig().EnableDependencies
}

View File

@ -0,0 +1,57 @@
// Copyright 2018 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package models
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestCreateIssueDependency(t *testing.T) {
// Prepare
assert.NoError(t, PrepareTestDatabase())
user1, err := GetUserByID(1)
assert.NoError(t, err)
issue1, err := GetIssueByID(1)
assert.NoError(t, err)
issue2, err := GetIssueByID(2)
assert.NoError(t, err)
// Create a dependency and check if it was successful
err = CreateIssueDependency(user1, issue1, issue2)
assert.NoError(t, err)
// Do it again to see if it will check if the dependency already exists
err = CreateIssueDependency(user1, issue1, issue2)
assert.Error(t, err)
assert.True(t, IsErrDependencyExists(err))
// Check for circular dependencies
err = CreateIssueDependency(user1, issue2, issue1)
assert.Error(t, err)
assert.True(t, IsErrCircularDependency(err))
_ = AssertExistsAndLoadBean(t, &Comment{Type: CommentTypeAddDependency, PosterID: user1.ID, IssueID: issue1.ID})
// Check if dependencies left is correct
left, err := IssueNoDependenciesLeft(issue1)
assert.NoError(t, err)
assert.False(t, left)
// Close #2 and check again
err = issue2.ChangeStatus(user1, issue2.Repo, true)
assert.NoError(t, err)
left, err = IssueNoDependenciesLeft(issue1)
assert.NoError(t, err)
assert.True(t, left)
// Test removing the dependency
err = RemoveIssueDependency(user1, issue1, issue2, DependencyTypeBlockedBy)
assert.NoError(t, err)
}

View File

@ -166,7 +166,7 @@ func (issues IssueList) loadAssignees(e Engine) error {
var assignees = make(map[int64][]*User, len(issues)) var assignees = make(map[int64][]*User, len(issues))
rows, err := e.Table("issue_assignees"). rows, err := e.Table("issue_assignees").
Join("INNER", "user", "`user`.id = `issue_assignees`.assignee_id"). Join("INNER", "`user`", "`user`.id = `issue_assignees`.assignee_id").
In("`issue_assignees`.issue_id", issues.getIssueIDs()). In("`issue_assignees`.issue_id", issues.getIssueIDs()).
Rows(new(AssigneeIssue)) Rows(new(AssigneeIssue))
if err != nil { if err != nil {

View File

@ -67,7 +67,19 @@ func getIssueWatchers(e Engine, issueID int64) (watches []*IssueWatch, err error
Where("`issue_watch`.issue_id = ?", issueID). Where("`issue_watch`.issue_id = ?", issueID).
And("`user`.is_active = ?", true). And("`user`.is_active = ?", true).
And("`user`.prohibit_login = ?", false). And("`user`.prohibit_login = ?", false).
Join("INNER", "user", "`user`.id = `issue_watch`.user_id"). Join("INNER", "`user`", "`user`.id = `issue_watch`.user_id").
Find(&watches) Find(&watches)
return return
} }
func removeIssueWatchersByRepoID(e Engine, userID int64, repoID int64) error {
iw := &IssueWatch{
IsWatching: false,
}
_, err := e.
Join("INNER", "issue", "`issue`.id = `issue_watch`.issue_id AND `issue`.repo_id = ?", repoID).
Cols("is_watching", "updated_unix").
Where("`issue_watch`.user_id = ?", userID).
Update(iw)
return err
}

View File

@ -186,6 +186,14 @@ var migrations = []Migration{
NewMigration("add u2f", addU2FReg), NewMigration("add u2f", addU2FReg),
// v66 -> v67 // v66 -> v67
NewMigration("add login source id column for public_key table", addLoginSourceIDToPublicKeyTable), NewMigration("add login source id column for public_key table", addLoginSourceIDToPublicKeyTable),
// v67 -> v68
NewMigration("remove stale watches", removeStaleWatches),
// v68 -> V69
NewMigration("Reformat and remove incorrect topics", reformatAndRemoveIncorrectTopics),
// v69 -> v70
NewMigration("move team units to team_unit table", moveTeamUnitsToTeamUnitTable),
// v70 -> v71
NewMigration("add issue_dependencies", addIssueDependencies),
} }
// Migrate database to current version // Migrate database to current version

View File

@ -25,10 +25,15 @@ func removeCommitsUnitType(x *xorm.Engine) (err error) {
Created time.Time `xorm:"-"` Created time.Time `xorm:"-"`
} }
type Team struct {
ID int64
UnitTypes []int `xorm:"json"`
}
// Update team unit types // Update team unit types
const batchSize = 100 const batchSize = 100
for start := 0; ; start += batchSize { for start := 0; ; start += batchSize {
teams := make([]*models.Team, 0, batchSize) teams := make([]*Team, 0, batchSize)
if err := x.Limit(batchSize, start).Find(&teams); err != nil { if err := x.Limit(batchSize, start).Find(&teams); err != nil {
return err return err
} }
@ -36,7 +41,7 @@ func removeCommitsUnitType(x *xorm.Engine) (err error) {
break break
} }
for _, team := range teams { for _, team := range teams {
ut := make([]models.UnitType, 0, len(team.UnitTypes)) ut := make([]int, 0, len(team.UnitTypes))
for _, u := range team.UnitTypes { for _, u := range team.UnitTypes {
if u < V16UnitTypeCommits { if u < V16UnitTypeCommits {
ut = append(ut, u) ut = append(ut, u)

View File

@ -120,6 +120,14 @@ func addMultipleAssignees(x *xorm.Engine) error {
} }
} }
// Commit and begin new transaction for dropping columns
if err := sess.Commit(); err != nil {
return err
}
if err := sess.Begin(); err != nil {
return err
}
if err := dropTableColumns(sess, "issue", "assignee_id"); err != nil { if err := dropTableColumns(sess, "issue", "assignee_id"); err != nil {
return err return err
} }

158
models/migrations/v67.go Normal file
View File

@ -0,0 +1,158 @@
// Copyright 2018 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package migrations
import (
"code.gitea.io/gitea/modules/setting"
"github.com/go-xorm/xorm"
)
func removeStaleWatches(x *xorm.Engine) error {
type Watch struct {
ID int64
UserID int64
RepoID int64
}
type IssueWatch struct {
ID int64
UserID int64
RepoID int64
IsWatching bool
}
type Repository struct {
ID int64
IsPrivate bool
OwnerID int64
}
type Access struct {
UserID int64
RepoID int64
Mode int
}
const (
// AccessModeNone no access
AccessModeNone int = iota // 0
// AccessModeRead read access
AccessModeRead // 1
)
accessLevel := func(userID int64, repo *Repository) (int, error) {
mode := AccessModeNone
if !repo.IsPrivate {
mode = AccessModeRead
}
if userID == 0 {
return mode, nil
}
if userID == repo.OwnerID {
return 4, nil
}
a := &Access{UserID: userID, RepoID: repo.ID}
if has, err := x.Get(a); !has || err != nil {
return mode, err
}
return a.Mode, nil
}
sess := x.NewSession()
defer sess.Close()
if err := sess.Begin(); err != nil {
return err
}
repoCache := make(map[int64]*Repository)
err := x.BufferSize(setting.IterateBufferSize).Iterate(new(Watch),
func(idx int, bean interface{}) error {
watch := bean.(*Watch)
repo := repoCache[watch.RepoID]
if repo == nil {
repo = &Repository{
ID: watch.RepoID,
}
if _, err := x.Get(repo); err != nil {
return err
}
repoCache[watch.RepoID] = repo
}
// Remove watches from now unaccessible repositories
mode, err := accessLevel(watch.UserID, repo)
if err != nil {
return err
}
has := AccessModeRead <= mode
if has {
return nil
}
if _, err = sess.Delete(&Watch{0, watch.UserID, repo.ID}); err != nil {
return err
}
_, err = sess.Exec("UPDATE `repository` SET num_watches = num_watches - 1 WHERE id = ?", repo.ID)
return err
})
if err != nil {
return err
}
repoCache = make(map[int64]*Repository)
err = x.BufferSize(setting.IterateBufferSize).
Distinct("issue_watch.user_id", "issue.repo_id").
Join("INNER", "issue", "issue_watch.issue_id = issue.id").
Where("issue_watch.is_watching = ?", true).
Iterate(new(IssueWatch),
func(idx int, bean interface{}) error {
watch := bean.(*IssueWatch)
repo := repoCache[watch.RepoID]
if repo == nil {
repo = &Repository{
ID: watch.RepoID,
}
if _, err := x.Get(repo); err != nil {
return err
}
repoCache[watch.RepoID] = repo
}
// Remove issue watches from now unaccssible repositories
mode, err := accessLevel(watch.UserID, repo)
if err != nil {
return err
}
has := AccessModeRead <= mode
if has {
return nil
}
iw := &IssueWatch{
IsWatching: false,
}
_, err = sess.
Join("INNER", "issue", "`issue`.id = `issue_watch`.issue_id AND `issue`.repo_id = ?", watch.RepoID).
Cols("is_watching", "updated_unix").
Where("`issue_watch`.user_id = ?", watch.UserID).
Update(iw)
return err
})
if err != nil {
return err
}
return sess.Commit()
}

213
models/migrations/v68.go Normal file
View File

@ -0,0 +1,213 @@
// Copyright 2018 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package migrations
import (
"fmt"
"regexp"
"strings"
"code.gitea.io/gitea/modules/log"
"github.com/go-xorm/xorm"
)
var topicPattern = regexp.MustCompile(`^[a-z0-9][a-z0-9-]*$`)
func validateTopic(topic string) bool {
return len(topic) <= 35 && topicPattern.MatchString(topic)
}
func reformatAndRemoveIncorrectTopics(x *xorm.Engine) (err error) {
log.Info("This migration could take up to minutes, please be patient.")
type Topic struct {
ID int64
Name string `xorm:"UNIQUE"`
RepoCount int
CreatedUnix int64 `xorm:"INDEX created"`
UpdatedUnix int64 `xorm:"INDEX updated"`
}
type RepoTopic struct {
RepoID int64 `xorm:"UNIQUE(s)"`
TopicID int64 `xorm:"UNIQUE(s)"`
}
type Repository struct {
ID int64 `xorm:"pk autoincr"`
Topics []string `xorm:"TEXT JSON"`
}
if err := x.Sync2(new(Topic)); err != nil {
return fmt.Errorf("Sync2: %v", err)
}
if err := x.Sync2(new(RepoTopic)); err != nil {
return fmt.Errorf("Sync2: %v", err)
}
sess := x.NewSession()
defer sess.Close()
const batchSize = 100
touchedRepo := make(map[int64]struct{})
delTopicIDs := make([]int64, 0, batchSize)
log.Info("Validating existed topics...")
if err := sess.Begin(); err != nil {
return err
}
for start := 0; ; start += batchSize {
topics := make([]*Topic, 0, batchSize)
if err := x.Cols("id", "name").Asc("id").Limit(batchSize, start).Find(&topics); err != nil {
return err
}
if len(topics) == 0 {
break
}
for _, topic := range topics {
if validateTopic(topic.Name) {
continue
}
log.Info("Incorrect topic: id = %v, name = %q", topic.ID, topic.Name)
topic.Name = strings.Replace(strings.TrimSpace(strings.ToLower(topic.Name)), " ", "-", -1)
ids := make([]int64, 0, 30)
if err := sess.Table("repo_topic").Cols("repo_id").
Where("topic_id = ?", topic.ID).Find(&ids); err != nil {
return err
}
log.Info("Touched repo ids: %v", ids)
for _, id := range ids {
touchedRepo[id] = struct{}{}
}
if validateTopic(topic.Name) {
unifiedTopic := Topic{Name: topic.Name}
exists, err := sess.Cols("id", "name").Get(&unifiedTopic)
log.Info("Exists topic with the name %q? %v, id = %v", topic.Name, exists, unifiedTopic.ID)
if err != nil {
return err
}
if exists {
log.Info("Updating repo_topic rows with topic_id = %v to topic_id = %v", topic.ID, unifiedTopic.ID)
if _, err := sess.Where("topic_id = ? AND repo_id NOT IN "+
"(SELECT rt1.repo_id FROM repo_topic rt1 INNER JOIN repo_topic rt2 "+
"ON rt1.repo_id = rt2.repo_id WHERE rt1.topic_id = ? AND rt2.topic_id = ?)",
topic.ID, topic.ID, unifiedTopic.ID).Update(&RepoTopic{TopicID: unifiedTopic.ID}); err != nil {
return err
}
log.Info("Updating topic `repo_count` field")
if _, err := sess.Exec(
"UPDATE topic SET repo_count = (SELECT COUNT(*) FROM repo_topic WHERE topic_id = ? GROUP BY topic_id) WHERE id = ?",
unifiedTopic.ID, unifiedTopic.ID); err != nil {
return err
}
} else {
log.Info("Updating topic: id = %v, name = %q", topic.ID, topic.Name)
if _, err := sess.Table("topic").ID(topic.ID).
Update(&Topic{Name: topic.Name}); err != nil {
return err
}
continue
}
}
delTopicIDs = append(delTopicIDs, topic.ID)
}
}
if err := sess.Commit(); err != nil {
return err
}
sess.Init()
log.Info("Deleting incorrect topics...")
if err := sess.Begin(); err != nil {
return err
}
log.Info("Deleting 'repo_topic' rows for topics with ids = %v", delTopicIDs)
if _, err := sess.In("topic_id", delTopicIDs).Delete(&RepoTopic{}); err != nil {
return err
}
log.Info("Deleting topics with id = %v", delTopicIDs)
if _, err := sess.In("id", delTopicIDs).Delete(&Topic{}); err != nil {
return err
}
if err := sess.Commit(); err != nil {
return err
}
delRepoTopics := make([]*RepoTopic, 0, batchSize)
log.Info("Checking the number of topics in the repositories...")
for start := 0; ; start += batchSize {
repoTopics := make([]*RepoTopic, 0, batchSize)
if err := x.Cols("repo_id").Asc("repo_id").Limit(batchSize, start).
GroupBy("repo_id").Having("COUNT(*) > 25").Find(&repoTopics); err != nil {
return err
}
if len(repoTopics) == 0 {
break
}
log.Info("Number of repositories with more than 25 topics: %v", len(repoTopics))
for _, repoTopic := range repoTopics {
touchedRepo[repoTopic.RepoID] = struct{}{}
tmpRepoTopics := make([]*RepoTopic, 0, 30)
if err := x.Where("repo_id = ?", repoTopic.RepoID).Find(&tmpRepoTopics); err != nil {
return err
}
log.Info("Repository with id = %v has %v topics", repoTopic.RepoID, len(tmpRepoTopics))
for i := len(tmpRepoTopics) - 1; i > 24; i-- {
delRepoTopics = append(delRepoTopics, tmpRepoTopics[i])
}
}
}
sess.Init()
log.Info("Deleting superfluous topics for repositories (more than 25 topics)...")
if err := sess.Begin(); err != nil {
return err
}
for _, repoTopic := range delRepoTopics {
log.Info("Deleting 'repo_topic' rows for 'repository' with id = %v. Topic id = %v",
repoTopic.RepoID, repoTopic.TopicID)
if _, err := sess.Where("repo_id = ? AND topic_id = ?", repoTopic.RepoID,
repoTopic.TopicID).Delete(&RepoTopic{}); err != nil {
return err
}
if _, err := sess.Exec(
"UPDATE topic SET repo_count = (SELECT repo_count FROM topic WHERE id = ?) - 1 WHERE id = ?",
repoTopic.TopicID, repoTopic.TopicID); err != nil {
return err
}
}
log.Info("Updating repositories 'topics' fields...")
for repoID := range touchedRepo {
topicNames := make([]string, 0, 30)
if err := sess.Table("topic").Cols("name").
Join("INNER", "repo_topic", "repo_topic.topic_id = topic.id").
Where("repo_topic.repo_id = ?", repoID).Desc("topic.repo_count").Find(&topicNames); err != nil {
return err
}
log.Info("Updating 'topics' field for repository with id = %v", repoID)
if _, err := sess.ID(repoID).Cols("topics").
Update(&Repository{Topics: topicNames}); err != nil {
return err
}
}
if err := sess.Commit(); err != nil {
return err
}
return nil
}

88
models/migrations/v69.go Normal file
View File

@ -0,0 +1,88 @@
// Copyright 2018 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package migrations
import (
"fmt"
"github.com/go-xorm/xorm"
)
func moveTeamUnitsToTeamUnitTable(x *xorm.Engine) error {
// Team see models/team.go
type Team struct {
ID int64
OrgID int64
UnitTypes []int `xorm:"json"`
}
// TeamUnit see models/org_team.go
type TeamUnit struct {
ID int64 `xorm:"pk autoincr"`
OrgID int64 `xorm:"INDEX"`
TeamID int64 `xorm:"UNIQUE(s)"`
Type int `xorm:"UNIQUE(s)"`
}
if err := x.Sync2(new(TeamUnit)); err != nil {
return fmt.Errorf("Sync2: %v", err)
}
sess := x.NewSession()
defer sess.Close()
if err := sess.Begin(); err != nil {
return err
}
// Update team unit types
const batchSize = 100
for start := 0; ; start += batchSize {
teams := make([]*Team, 0, batchSize)
if err := x.Limit(batchSize, start).Find(&teams); err != nil {
return err
}
if len(teams) == 0 {
break
}
for _, team := range teams {
var unitTypes []int
if len(team.UnitTypes) == 0 {
unitTypes = allUnitTypes
} else {
unitTypes = team.UnitTypes
}
// insert units for team
var units = make([]TeamUnit, 0, len(unitTypes))
for _, tp := range unitTypes {
units = append(units, TeamUnit{
OrgID: team.OrgID,
TeamID: team.ID,
Type: tp,
})
}
if _, err := sess.Insert(&units); err != nil {
return fmt.Errorf("Insert team units: %v", err)
}
}
}
// Commit and begin new transaction for dropping columns
if err := sess.Commit(); err != nil {
return err
}
if err := sess.Begin(); err != nil {
return err
}
if err := dropTableColumns(sess, "team", "unit_types"); err != nil {
return err
}
return sess.Commit()
}

100
models/migrations/v70.go Normal file
View File

@ -0,0 +1,100 @@
// Copyright 2018 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package migrations
import (
"fmt"
"time"
"code.gitea.io/gitea/modules/setting"
"github.com/go-xorm/xorm"
)
func addIssueDependencies(x *xorm.Engine) (err error) {
type IssueDependency struct {
ID int64 `xorm:"pk autoincr"`
UserID int64 `xorm:"NOT NULL"`
IssueID int64 `xorm:"NOT NULL"`
DependencyID int64 `xorm:"NOT NULL"`
Created time.Time `xorm:"-"`
CreatedUnix int64 `xorm:"created"`
Updated time.Time `xorm:"-"`
UpdatedUnix int64 `xorm:"updated"`
}
if err = x.Sync(new(IssueDependency)); err != nil {
return fmt.Errorf("Error creating issue_dependency_table column definition: %v", err)
}
// Update Comment definition
// This (copied) struct does only contain fields used by xorm as the only use here is to update the database
// CommentType defines the comment type
type CommentType int
// TimeStamp defines a timestamp
type TimeStamp int64
type Comment struct {
ID int64 `xorm:"pk autoincr"`
Type CommentType
PosterID int64 `xorm:"INDEX"`
IssueID int64 `xorm:"INDEX"`
LabelID int64
OldMilestoneID int64
MilestoneID int64
OldAssigneeID int64
AssigneeID int64
OldTitle string
NewTitle string
DependentIssueID int64
CommitID int64
Line int64
Content string `xorm:"TEXT"`
CreatedUnix TimeStamp `xorm:"INDEX created"`
UpdatedUnix TimeStamp `xorm:"INDEX updated"`
// Reference issue in commit message
CommitSHA string `xorm:"VARCHAR(40)"`
}
if err = x.Sync(new(Comment)); err != nil {
return fmt.Errorf("Error updating issue_comment table column definition: %v", err)
}
// RepoUnit describes all units of a repository
type RepoUnit struct {
ID int64
RepoID int64 `xorm:"INDEX(s)"`
Type int `xorm:"INDEX(s)"`
Config map[string]interface{} `xorm:"JSON"`
CreatedUnix int64 `xorm:"INDEX CREATED"`
Created time.Time `xorm:"-"`
}
//Updating existing issue units
units := make([]*RepoUnit, 0, 100)
err = x.Where("`type` = ?", V16UnitTypeIssues).Find(&units)
if err != nil {
return fmt.Errorf("Query repo units: %v", err)
}
for _, unit := range units {
if unit.Config == nil {
unit.Config = make(map[string]interface{})
}
if _, ok := unit.Config["EnableDependencies"]; !ok {
unit.Config["EnableDependencies"] = setting.Service.DefaultEnableDependencies
}
if _, err := x.ID(unit.ID).Cols("config").Update(unit); err != nil {
return err
}
}
return err
}

View File

@ -1,4 +1,5 @@
// Copyright 2014 The Gogs Authors. All rights reserved. // Copyright 2014 The Gogs Authors. All rights reserved.
// Copyright 2018 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style // Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
@ -117,10 +118,12 @@ func init() {
new(TrackedTime), new(TrackedTime),
new(DeletedBranch), new(DeletedBranch),
new(RepoIndexerStatus), new(RepoIndexerStatus),
new(IssueDependency),
new(LFSLock), new(LFSLock),
new(Reaction), new(Reaction),
new(IssueAssignees), new(IssueAssignees),
new(U2FRegistration), new(U2FRegistration),
new(TeamUnit),
) )
gonicNames := []string{"SSL", "UID"} gonicNames := []string{"SSL", "UID"}
@ -184,6 +187,18 @@ func parsePostgreSQLHostPort(info string) (string, string) {
return host, port return host, port
} }
func getPostgreSQLConnectionString(DBHost, DBUser, DBPasswd, DBName, DBParam, DBSSLMode string) (connStr string) {
host, port := parsePostgreSQLHostPort(DBHost)
if host[0] == '/' { // looks like a unix socket
connStr = fmt.Sprintf("postgres://%s:%s@:%s/%s%ssslmode=%s&host=%s",
url.PathEscape(DBUser), url.PathEscape(DBPasswd), port, DBName, DBParam, DBSSLMode, host)
} else {
connStr = fmt.Sprintf("postgres://%s:%s@%s:%s/%s%ssslmode=%s",
url.PathEscape(DBUser), url.PathEscape(DBPasswd), host, port, DBName, DBParam, DBSSLMode)
}
return
}
func parseMSSQLHostPort(info string) (string, string) { func parseMSSQLHostPort(info string) (string, string) {
host, port := "127.0.0.1", "1433" host, port := "127.0.0.1", "1433"
if strings.Contains(info, ":") { if strings.Contains(info, ":") {
@ -214,14 +229,7 @@ func getEngine() (*xorm.Engine, error) {
DbCfg.User, DbCfg.Passwd, DbCfg.Host, DbCfg.Name, Param) DbCfg.User, DbCfg.Passwd, DbCfg.Host, DbCfg.Name, Param)
} }
case "postgres": case "postgres":
host, port := parsePostgreSQLHostPort(DbCfg.Host) connStr = getPostgreSQLConnectionString(DbCfg.Host, DbCfg.User, DbCfg.Passwd, DbCfg.Name, Param, DbCfg.SSLMode)
if host[0] == '/' { // looks like a unix socket
connStr = fmt.Sprintf("postgres://%s:%s@:%s/%s%ssslmode=%s&host=%s",
url.QueryEscape(DbCfg.User), url.QueryEscape(DbCfg.Passwd), port, DbCfg.Name, Param, DbCfg.SSLMode, host)
} else {
connStr = fmt.Sprintf("postgres://%s:%s@%s:%s/%s%ssslmode=%s",
url.QueryEscape(DbCfg.User), url.QueryEscape(DbCfg.Passwd), host, port, DbCfg.Name, Param, DbCfg.SSLMode)
}
case "mssql": case "mssql":
host, port := parseMSSQLHostPort(DbCfg.Host) host, port := parseMSSQLHostPort(DbCfg.Host)
connStr = fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;", host, port, DbCfg.Name, DbCfg.User, DbCfg.Passwd) connStr = fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;", host, port, DbCfg.Name, DbCfg.User, DbCfg.Passwd)

View File

@ -1,4 +1,5 @@
// Copyright 2016 The Gogs Authors. All rights reserved. // Copyright 2016 The Gogs Authors. All rights reserved.
// Copyright 2018 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style // Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
@ -53,3 +54,42 @@ func Test_parsePostgreSQLHostPort(t *testing.T) {
assert.Equal(t, test.Port, port) assert.Equal(t, test.Port, port)
} }
} }
func Test_getPostgreSQLConnectionString(t *testing.T) {
tests := []struct {
Host string
Port string
User string
Passwd string
Name string
Param string
SSLMode string
Output string
}{
{
Host: "/tmp/pg.sock",
Port: "4321",
User: "testuser",
Passwd: "space space !#$%^^%^```-=?=",
Name: "gitea",
Param: "",
SSLMode: "false",
Output: "postgres://testuser:space%20space%20%21%23$%25%5E%5E%25%5E%60%60%60-=%3F=@:5432/giteasslmode=false&host=/tmp/pg.sock",
},
{
Host: "localhost",
Port: "1234",
User: "pgsqlusername",
Passwd: "I love Gitea!",
Name: "gitea",
Param: "",
SSLMode: "true",
Output: "postgres://pgsqlusername:I%20love%20Gitea%21@localhost:5432/giteasslmode=true",
},
}
for _, test := range tests {
connStr := getPostgreSQLConnectionString(test.Host, test.User, test.Passwd, test.Name, test.Param, test.SSLMode)
assert.Equal(t, test.Output, connStr)
}
}

View File

@ -1,18 +0,0 @@
// +build tidb
// Copyright 2015 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package models
import (
_ "github.com/go-xorm/tidb"
"github.com/ngaut/log"
_ "github.com/pingcap/tidb"
)
func init() {
EnableTiDB = true
log.SetLevelByString("error")
}

View File

@ -119,7 +119,17 @@ func createOrUpdateIssueNotifications(e Engine, issue *Issue, notificationAuthor
} }
} }
issue.loadRepo(e)
for _, watch := range watches { for _, watch := range watches {
issue.Repo.Units = nil
if issue.IsPull && !issue.Repo.CheckUnitUser(watch.UserID, false, UnitTypePullRequests) {
continue
}
if !issue.IsPull && !issue.Repo.CheckUnitUser(watch.UserID, false, UnitTypeIssues) {
continue
}
if err := notifyUser(watch.UserID); err != nil { if err := notifyUser(watch.UserID); err != nil {
return err return err
} }

View File

@ -154,12 +154,26 @@ func CreateOrganization(org, owner *User) (err error) {
Name: ownerTeamName, Name: ownerTeamName,
Authorize: AccessModeOwner, Authorize: AccessModeOwner,
NumMembers: 1, NumMembers: 1,
UnitTypes: allRepUnitTypes,
} }
if _, err = sess.Insert(t); err != nil { if _, err = sess.Insert(t); err != nil {
return fmt.Errorf("insert owner team: %v", err) return fmt.Errorf("insert owner team: %v", err)
} }
// insert units for team
var units = make([]TeamUnit, 0, len(allRepUnitTypes))
for _, tp := range allRepUnitTypes {
units = append(units, TeamUnit{
OrgID: org.ID,
TeamID: t.ID,
Type: tp,
})
}
if _, err = sess.Insert(&units); err != nil {
sess.Rollback()
return err
}
if _, err = sess.Insert(&TeamUser{ if _, err = sess.Insert(&TeamUser{
UID: owner.ID, UID: owner.ID,
OrgID: org.ID, OrgID: org.ID,
@ -238,6 +252,7 @@ func deleteOrg(e *xorm.Session, u *User) error {
&Team{OrgID: u.ID}, &Team{OrgID: u.ID},
&OrgUser{OrgID: u.ID}, &OrgUser{OrgID: u.ID},
&TeamUser{OrgID: u.ID}, &TeamUser{OrgID: u.ID},
&TeamUnit{OrgID: u.ID},
); err != nil { ); err != nil {
return fmt.Errorf("deleteBeans: %v", err) return fmt.Errorf("deleteBeans: %v", err)
} }
@ -368,7 +383,7 @@ func GetOwnedOrgsByUserIDDesc(userID int64, desc string) ([]*User, error) {
func GetOrgUsersByUserID(uid int64, all bool) ([]*OrgUser, error) { func GetOrgUsersByUserID(uid int64, all bool) ([]*OrgUser, error) {
ous := make([]*OrgUser, 0, 10) ous := make([]*OrgUser, 0, 10)
sess := x. sess := x.
Join("LEFT", "user", "`org_user`.org_id=`user`.id"). Join("LEFT", "`user`", "`org_user`.org_id=`user`.id").
Where("`org_user`.uid=?", uid) Where("`org_user`.uid=?", uid)
if !all { if !all {
// Only show public organizations // Only show public organizations
@ -560,7 +575,7 @@ func (org *User) getUserTeams(e Engine, userID int64, cols ...string) ([]*Team,
return teams, e. return teams, e.
Where("`team_user`.org_id = ?", org.ID). Where("`team_user`.org_id = ?", org.ID).
Join("INNER", "team_user", "`team_user`.team_id = team.id"). Join("INNER", "team_user", "`team_user`.team_id = team.id").
Join("INNER", "user", "`user`.id=team_user.uid"). Join("INNER", "`user`", "`user`.id=team_user.uid").
And("`team_user`.uid = ?", userID). And("`team_user`.uid = ?", userID).
Asc("`user`.name"). Asc("`user`.name").
Cols(cols...). Cols(cols...).

View File

@ -1,3 +1,4 @@
// Copyright 2018 The Gitea Authors. All rights reserved.
// Copyright 2016 The Gogs Authors. All rights reserved. // Copyright 2016 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style // Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
@ -10,7 +11,6 @@ import (
"strings" "strings"
"code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/log"
"github.com/go-xorm/xorm" "github.com/go-xorm/xorm"
) )
@ -28,15 +28,16 @@ type Team struct {
Members []*User `xorm:"-"` Members []*User `xorm:"-"`
NumRepos int NumRepos int
NumMembers int NumMembers int
UnitTypes []UnitType `xorm:"json"` Units []*TeamUnit `xorm:"-"`
} }
// GetUnitTypes returns unit types the team owned, empty means all the unit types func (t *Team) getUnits(e Engine) (err error) {
func (t *Team) GetUnitTypes() []UnitType { if t.Units != nil {
if len(t.UnitTypes) == 0 { return nil
return allRepUnitTypes
} }
return t.UnitTypes
t.Units, err = getUnitsByTeamID(e, t.ID)
return err
} }
// HasWriteAccess returns true if team has at least write level access mode. // HasWriteAccess returns true if team has at least write level access mode.
@ -178,6 +179,11 @@ func (t *Team) removeRepository(e Engine, repo *Repository, recalculate bool) (e
if err = watchRepo(e, teamUser.UID, repo.ID, false); err != nil { if err = watchRepo(e, teamUser.UID, repo.ID, false); err != nil {
return err return err
} }
// Remove all IssueWatches a user has subscribed to in the repositories
if err := removeIssueWatchersByRepoID(e, teamUser.UID, repo.ID); err != nil {
return err
}
} }
return nil return nil
@ -209,11 +215,12 @@ func (t *Team) RemoveRepository(repoID int64) error {
// UnitEnabled returns if the team has the given unit type enabled // UnitEnabled returns if the team has the given unit type enabled
func (t *Team) UnitEnabled(tp UnitType) bool { func (t *Team) UnitEnabled(tp UnitType) bool {
if len(t.UnitTypes) == 0 { if err := t.getUnits(x); err != nil {
return true log.Warn("Error loading repository (ID: %d) units: %s", t.ID, err.Error())
} }
for _, u := range t.UnitTypes {
if u == tp { for _, unit := range t.Units {
if unit.Type == tp {
return true return true
} }
} }
@ -270,6 +277,17 @@ func NewTeam(t *Team) (err error) {
return err return err
} }
// insert units for team
if len(t.Units) > 0 {
for _, unit := range t.Units {
unit.TeamID = t.ID
}
if _, err = sess.Insert(&t.Units); err != nil {
sess.Rollback()
return err
}
}
// Update organization number of teams. // Update organization number of teams.
if _, err = sess.Exec("UPDATE `user` SET num_teams=num_teams+1 WHERE id = ?", t.OrgID); err != nil { if _, err = sess.Exec("UPDATE `user` SET num_teams=num_teams+1 WHERE id = ?", t.OrgID); err != nil {
sess.Rollback() sess.Rollback()
@ -374,11 +392,34 @@ func DeleteTeam(t *Team) error {
return err return err
} }
if err := t.getMembers(sess); err != nil {
return err
}
// Delete all accesses. // Delete all accesses.
for _, repo := range t.Repos { for _, repo := range t.Repos {
if err := repo.recalculateTeamAccesses(sess, t.ID); err != nil { if err := repo.recalculateTeamAccesses(sess, t.ID); err != nil {
return err return err
} }
// Remove watches from all users and now unaccessible repos
for _, user := range t.Members {
has, err := hasAccess(sess, user.ID, repo, AccessModeRead)
if err != nil {
return err
} else if has {
continue
}
if err = watchRepo(sess, user.ID, repo.ID, false); err != nil {
return err
}
// Remove all IssueWatches a user has subscribed to in the repositories
if err = removeIssueWatchersByRepoID(sess, user.ID, repo.ID); err != nil {
return err
}
}
} }
// Delete team-repo // Delete team-repo
@ -396,6 +437,13 @@ func DeleteTeam(t *Team) error {
return err return err
} }
// Delete team-unit.
if _, err := sess.
Where("team_id=?", t.ID).
Delete(new(TeamUnit)); err != nil {
return err
}
// Delete team. // Delete team.
if _, err := sess.ID(t.ID).Delete(new(Team)); err != nil { if _, err := sess.ID(t.ID).Delete(new(Team)); err != nil {
return err return err
@ -518,6 +566,10 @@ func AddTeamMember(team *Team, userID int64) error {
if err := repo.recalculateTeamAccesses(sess, 0); err != nil { if err := repo.recalculateTeamAccesses(sess, 0); err != nil {
return err return err
} }
if err = watchRepo(sess, userID, repo.ID, true); err != nil {
return err
}
} }
return sess.Commit() return sess.Commit()
@ -558,6 +610,23 @@ func removeTeamMember(e *xorm.Session, team *Team, userID int64) error {
if err := repo.recalculateTeamAccesses(e, 0); err != nil { if err := repo.recalculateTeamAccesses(e, 0); err != nil {
return err return err
} }
// Remove watches from now unaccessible
has, err := hasAccess(e, userID, repo, AccessModeRead)
if err != nil {
return err
} else if has {
continue
}
if err = watchRepo(e, userID, repo.ID, false); err != nil {
return err
}
// Remove all IssueWatches a user has subscribed to in the repositories
if err := removeIssueWatchersByRepoID(e, userID, repo.ID); err != nil {
return err
}
} }
// Check if the user is a member of any team in the organization. // Check if the user is a member of any team in the organization.
@ -646,3 +715,47 @@ func GetTeamsWithAccessToRepo(orgID, repoID int64, mode AccessMode) ([]*Team, er
And("team_repo.repo_id = ?", repoID). And("team_repo.repo_id = ?", repoID).
Find(&teams) Find(&teams)
} }
// ___________ ____ ___ .__ __
// \__ ___/___ _____ _____ | | \____ |__|/ |_
// | |_/ __ \\__ \ / \| | / \| \ __\
// | |\ ___/ / __ \| Y Y \ | / | \ || |
// |____| \___ >____ /__|_| /______/|___| /__||__|
// \/ \/ \/ \/
// TeamUnit describes all units of a repository
type TeamUnit struct {
ID int64 `xorm:"pk autoincr"`
OrgID int64 `xorm:"INDEX"`
TeamID int64 `xorm:"UNIQUE(s)"`
Type UnitType `xorm:"UNIQUE(s)"`
}
// Unit returns Unit
func (t *TeamUnit) Unit() Unit {
return Units[t.Type]
}
func getUnitsByTeamID(e Engine, teamID int64) (units []*TeamUnit, err error) {
return units, e.Where("team_id = ?", teamID).Find(&units)
}
// UpdateTeamUnits updates a teams's units
func UpdateTeamUnits(team *Team, units []TeamUnit) (err error) {
sess := x.NewSession()
defer sess.Close()
if err = sess.Begin(); err != nil {
return err
}
if _, err = sess.Where("team_id = ?", team.ID).Delete(new(TeamUnit)); err != nil {
return err
}
if _, err = sess.Insert(units); err != nil {
sess.Rollback()
return err
}
return sess.Commit()
}

View File

@ -489,8 +489,8 @@ func TestAccessibleReposEnv_CountRepos(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, expectedCount, count) assert.EqualValues(t, expectedCount, count)
} }
testSuccess(2, 2) testSuccess(2, 3)
testSuccess(4, 1) testSuccess(4, 2)
} }
func TestAccessibleReposEnv_RepoIDs(t *testing.T) { func TestAccessibleReposEnv_RepoIDs(t *testing.T) {
@ -503,8 +503,8 @@ func TestAccessibleReposEnv_RepoIDs(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, expectedRepoIDs, repoIDs) assert.Equal(t, expectedRepoIDs, repoIDs)
} }
testSuccess(2, 1, 100, []int64{3, 5}) testSuccess(2, 1, 100, []int64{3, 5, 32})
testSuccess(4, 0, 100, []int64{3}) testSuccess(4, 0, 100, []int64{3, 32})
} }
func TestAccessibleReposEnv_Repos(t *testing.T) { func TestAccessibleReposEnv_Repos(t *testing.T) {
@ -522,8 +522,8 @@ func TestAccessibleReposEnv_Repos(t *testing.T) {
} }
assert.Equal(t, expectedRepos, repos) assert.Equal(t, expectedRepos, repos)
} }
testSuccess(2, []int64{3, 5}) testSuccess(2, []int64{3, 5, 32})
testSuccess(4, []int64{3}) testSuccess(4, []int64{3, 32})
} }
func TestAccessibleReposEnv_MirrorRepos(t *testing.T) { func TestAccessibleReposEnv_MirrorRepos(t *testing.T) {

View File

@ -365,22 +365,14 @@ func (repo *Repository) getUnitsByUserID(e Engine, userID int64, isAdmin bool) (
return err return err
} }
var allTypes = make(map[UnitType]struct{}, len(allRepUnitTypes))
for _, team := range teams {
// Administrators can not be limited
if team.Authorize >= AccessModeAdmin {
return nil
}
for _, unitType := range team.UnitTypes {
allTypes[unitType] = struct{}{}
}
}
// unique // unique
var newRepoUnits = make([]*RepoUnit, 0, len(repo.Units)) var newRepoUnits = make([]*RepoUnit, 0, len(repo.Units))
for _, u := range repo.Units { for _, u := range repo.Units {
if _, ok := allTypes[u.Type]; ok { for _, team := range teams {
if team.UnitEnabled(u.Type) {
newRepoUnits = append(newRepoUnits, u) newRepoUnits = append(newRepoUnits, u)
break
}
} }
} }
@ -789,7 +781,7 @@ var (
// DescriptionHTML does special handles to description and return HTML string. // DescriptionHTML does special handles to description and return HTML string.
func (repo *Repository) DescriptionHTML() template.HTML { func (repo *Repository) DescriptionHTML() template.HTML {
sanitize := func(s string) string { sanitize := func(s string) string {
return fmt.Sprintf(`<a href="%[1]s" target="_blank" rel="noopener">%[1]s</a>`, s) return fmt.Sprintf(`<a href="%[1]s" target="_blank" rel="noopener noreferrer">%[1]s</a>`, s)
} }
return template.HTML(descPattern.ReplaceAllStringFunc(markup.Sanitize(repo.Description), sanitize)) return template.HTML(descPattern.ReplaceAllStringFunc(markup.Sanitize(repo.Description), sanitize))
} }
@ -1353,7 +1345,17 @@ func createRepository(e *xorm.Session, doer, u *User, repo *Repository) (err err
units = append(units, RepoUnit{ units = append(units, RepoUnit{
RepoID: repo.ID, RepoID: repo.ID,
Type: tp, Type: tp,
Config: &IssuesConfig{EnableTimetracker: setting.Service.DefaultEnableTimetracking, AllowOnlyContributorsToTrackTime: setting.Service.DefaultAllowOnlyContributorsToTrackTime}, Config: &IssuesConfig{
EnableTimetracker: setting.Service.DefaultEnableTimetracking,
AllowOnlyContributorsToTrackTime: setting.Service.DefaultAllowOnlyContributorsToTrackTime,
EnableDependencies: setting.Service.DefaultEnableDependencies,
},
})
} else if tp == UnitTypePullRequests {
units = append(units, RepoUnit{
RepoID: repo.ID,
Type: tp,
Config: &PullRequestsConfig{AllowMerge: true, AllowRebase: true, AllowSquash: true},
}) })
} else { } else {
units = append(units, RepoUnit{ units = append(units, RepoUnit{
@ -1851,6 +1853,9 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
if _, err = sess.In("issue_id", issueIDs).Delete(&Reaction{}); err != nil { if _, err = sess.In("issue_id", issueIDs).Delete(&Reaction{}); err != nil {
return err return err
} }
if _, err = sess.In("issue_id", issueIDs).Delete(&IssueWatch{}); err != nil {
return err
}
attachments := make([]*Attachment, 0, 5) attachments := make([]*Attachment, 0, 5)
if err = sess. if err = sess.
@ -1953,7 +1958,7 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
func GetRepositoryByOwnerAndName(ownerName, repoName string) (*Repository, error) { func GetRepositoryByOwnerAndName(ownerName, repoName string) (*Repository, error) {
var repo Repository var repo Repository
has, err := x.Select("repository.*"). has, err := x.Select("repository.*").
Join("INNER", "user", "`user`.id = repository.owner_id"). Join("INNER", "`user`", "`user`.id = repository.owner_id").
Where("repository.lower_name = ?", strings.ToLower(repoName)). Where("repository.lower_name = ?", strings.ToLower(repoName)).
And("`user`.lower_name = ?", strings.ToLower(ownerName)). And("`user`.lower_name = ?", strings.ToLower(ownerName)).
Get(&repo) Get(&repo)

View File

@ -172,5 +172,14 @@ func (repo *Repository) DeleteCollaboration(uid int64) (err error) {
return err return err
} }
if err = watchRepo(sess, uid, repo.ID, false); err != nil {
return err
}
// Remove all IssueWatches a user has subscribed to in the repository
if err := removeIssueWatchersByRepoID(sess, uid, repo.ID); err != nil {
return err
}
return sess.Commit() return sess.Commit()
} }

View File

@ -147,10 +147,10 @@ func TestSearchRepositoryByName(t *testing.T) {
count: 14}, count: 14},
{name: "AllPublic/PublicRepositoriesOfUserIncludingCollaborative", {name: "AllPublic/PublicRepositoriesOfUserIncludingCollaborative",
opts: &SearchRepoOptions{Page: 1, PageSize: 10, OwnerID: 15, AllPublic: true}, opts: &SearchRepoOptions{Page: 1, PageSize: 10, OwnerID: 15, AllPublic: true},
count: 15}, count: 16},
{name: "AllPublic/PublicAndPrivateRepositoriesOfUserIncludingCollaborative", {name: "AllPublic/PublicAndPrivateRepositoriesOfUserIncludingCollaborative",
opts: &SearchRepoOptions{Page: 1, PageSize: 10, OwnerID: 15, Private: true, AllPublic: true}, opts: &SearchRepoOptions{Page: 1, PageSize: 10, OwnerID: 15, Private: true, AllPublic: true},
count: 19}, count: 20},
{name: "AllPublic/PublicAndPrivateRepositoriesOfUserIncludingCollaborativeByName", {name: "AllPublic/PublicAndPrivateRepositoriesOfUserIncludingCollaborativeByName",
opts: &SearchRepoOptions{Keyword: "test", Page: 1, PageSize: 10, OwnerID: 15, Private: true, AllPublic: true}, opts: &SearchRepoOptions{Keyword: "test", Page: 1, PageSize: 10, OwnerID: 15, Private: true, AllPublic: true},
count: 13}, count: 13},
@ -159,7 +159,7 @@ func TestSearchRepositoryByName(t *testing.T) {
count: 11}, count: 11},
{name: "AllPublic/PublicRepositoriesOfOrganization", {name: "AllPublic/PublicRepositoriesOfOrganization",
opts: &SearchRepoOptions{Page: 1, PageSize: 10, OwnerID: 17, AllPublic: true, Collaborate: util.OptionalBoolFalse}, opts: &SearchRepoOptions{Page: 1, PageSize: 10, OwnerID: 17, AllPublic: true, Collaborate: util.OptionalBoolFalse},
count: 15}, count: 16},
} }
for _, testCase := range testCases { for _, testCase := range testCases {

View File

@ -73,6 +73,7 @@ func (cfg *ExternalTrackerConfig) ToDB() ([]byte, error) {
type IssuesConfig struct { type IssuesConfig struct {
EnableTimetracker bool EnableTimetracker bool
AllowOnlyContributorsToTrackTime bool AllowOnlyContributorsToTrackTime bool
EnableDependencies bool
} }
// FromDB fills up a IssuesConfig from serialized format. // FromDB fills up a IssuesConfig from serialized format.
@ -165,7 +166,6 @@ func (r *RepoUnit) IssuesConfig() *IssuesConfig {
func (r *RepoUnit) ExternalTrackerConfig() *ExternalTrackerConfig { func (r *RepoUnit) ExternalTrackerConfig() *ExternalTrackerConfig {
return r.Config.(*ExternalTrackerConfig) return r.Config.(*ExternalTrackerConfig)
} }
func getUnitsByRepoID(e Engine, repoID int64) (units []*RepoUnit, err error) { func getUnitsByRepoID(e Engine, repoID int64) (units []*RepoUnit, err error) {
return units, e.Where("repo_id = ?", repoID).Find(&units) return units, e.Where("repo_id = ?", repoID).Find(&units)
} }

View File

@ -54,7 +54,7 @@ func getWatchers(e Engine, repoID int64) ([]*Watch, error) {
return watches, e.Where("`watch`.repo_id=?", repoID). return watches, e.Where("`watch`.repo_id=?", repoID).
And("`user`.is_active=?", true). And("`user`.is_active=?", true).
And("`user`.prohibit_login=?", false). And("`user`.prohibit_login=?", false).
Join("INNER", "user", "`user`.id = `watch`.user_id"). Join("INNER", "`user`", "`user`.id = `watch`.user_id").
Find(&watches) Find(&watches)
} }
@ -109,6 +109,23 @@ func notifyWatchers(e Engine, act *Action) error {
act.ID = 0 act.ID = 0
act.UserID = watches[i].UserID act.UserID = watches[i].UserID
act.Repo.Units = nil
switch act.OpType {
case ActionCommitRepo, ActionPushTag, ActionDeleteTag, ActionDeleteBranch:
if !act.Repo.CheckUnitUser(act.UserID, false, UnitTypeCode) {
continue
}
case ActionCreateIssue, ActionCommentIssue, ActionCloseIssue, ActionReopenIssue:
if !act.Repo.CheckUnitUser(act.UserID, false, UnitTypeIssues) {
continue
}
case ActionCreatePullRequest, ActionMergePullRequest, ActionClosePullRequest, ActionReopenPullRequest:
if !act.Repo.CheckUnitUser(act.UserID, false, UnitTypePullRequests) {
continue
}
}
if _, err = e.InsertOne(act); err != nil { if _, err = e.InsertOne(act); err != nil {
return fmt.Errorf("insert new action: %v", err) return fmt.Errorf("insert new action: %v", err)
} }

View File

@ -6,6 +6,7 @@ package models
import ( import (
"fmt" "fmt"
"regexp"
"strings" "strings"
"code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/util"
@ -20,10 +21,12 @@ func init() {
) )
} }
var topicPattern = regexp.MustCompile(`^[a-z0-9][a-z0-9-]*$`)
// Topic represents a topic of repositories // Topic represents a topic of repositories
type Topic struct { type Topic struct {
ID int64 ID int64
Name string `xorm:"unique"` Name string `xorm:"UNIQUE"`
RepoCount int RepoCount int
CreatedUnix util.TimeStamp `xorm:"INDEX created"` CreatedUnix util.TimeStamp `xorm:"INDEX created"`
UpdatedUnix util.TimeStamp `xorm:"INDEX updated"` UpdatedUnix util.TimeStamp `xorm:"INDEX updated"`
@ -31,8 +34,8 @@ type Topic struct {
// RepoTopic represents associated repositories and topics // RepoTopic represents associated repositories and topics
type RepoTopic struct { type RepoTopic struct {
RepoID int64 `xorm:"unique(s)"` RepoID int64 `xorm:"UNIQUE(s)"`
TopicID int64 `xorm:"unique(s)"` TopicID int64 `xorm:"UNIQUE(s)"`
} }
// ErrTopicNotExist represents an error that a topic is not exist // ErrTopicNotExist represents an error that a topic is not exist
@ -51,6 +54,11 @@ func (err ErrTopicNotExist) Error() string {
return fmt.Sprintf("topic is not exist [name: %s]", err.Name) return fmt.Sprintf("topic is not exist [name: %s]", err.Name)
} }
// ValidateTopic checks topics by length and match pattern rules
func ValidateTopic(topic string) bool {
return len(topic) <= 35 && topicPattern.MatchString(topic)
}
// GetTopicByName retrieves topic by name // GetTopicByName retrieves topic by name
func GetTopicByName(name string) (*Topic, error) { func GetTopicByName(name string) (*Topic, error) {
var topic Topic var topic Topic
@ -182,6 +190,13 @@ func SaveTopics(repoID int64, topicNames ...string) error {
} }
} }
topicNames = make([]string, 0, 25)
if err := sess.Table("topic").Cols("name").
Join("INNER", "repo_topic", "repo_topic.topic_id = topic.id").
Where("repo_topic.repo_id = ?", repoID).Desc("topic.repo_count").Find(&topicNames); err != nil {
return err
}
if _, err := sess.ID(repoID).Cols("topics").Update(&Repository{ if _, err := sess.ID(repoID).Cols("topics").Update(&Repository{
Topics: topicNames, Topics: topicNames,
}); err != nil { }); err != nil {

View File

@ -55,3 +55,16 @@ func TestAddTopic(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 2, len(topics)) assert.EqualValues(t, 2, len(topics))
} }
func TestTopicValidator(t *testing.T) {
assert.True(t, ValidateTopic("12345"))
assert.True(t, ValidateTopic("2-test"))
assert.True(t, ValidateTopic("test-3"))
assert.True(t, ValidateTopic("first"))
assert.True(t, ValidateTopic("second-test-topic"))
assert.True(t, ValidateTopic("third-project-topic-with-max-length"))
assert.False(t, ValidateTopic("$fourth-test,topic"))
assert.False(t, ValidateTopic("-fifth-test-topic"))
assert.False(t, ValidateTopic("sixth-go-project-topic-with-excess-length"))
}

View File

@ -374,9 +374,9 @@ func (u *User) GetFollowers(page int) ([]*User, error) {
Limit(ItemsPerPage, (page-1)*ItemsPerPage). Limit(ItemsPerPage, (page-1)*ItemsPerPage).
Where("follow.follow_id=?", u.ID) Where("follow.follow_id=?", u.ID)
if setting.UsePostgreSQL { if setting.UsePostgreSQL {
sess = sess.Join("LEFT", "follow", `"user".id=follow.user_id`) sess = sess.Join("LEFT", "follow", "`user`.id=follow.user_id")
} else { } else {
sess = sess.Join("LEFT", "follow", "user.id=follow.user_id") sess = sess.Join("LEFT", "follow", "`user`.id=follow.user_id")
} }
return users, sess.Find(&users) return users, sess.Find(&users)
} }
@ -393,9 +393,9 @@ func (u *User) GetFollowing(page int) ([]*User, error) {
Limit(ItemsPerPage, (page-1)*ItemsPerPage). Limit(ItemsPerPage, (page-1)*ItemsPerPage).
Where("follow.user_id=?", u.ID) Where("follow.user_id=?", u.ID)
if setting.UsePostgreSQL { if setting.UsePostgreSQL {
sess = sess.Join("LEFT", "follow", `"user".id=follow.follow_id`) sess = sess.Join("LEFT", "follow", "`user`.id=follow.follow_id")
} else { } else {
sess = sess.Join("LEFT", "follow", "user.id=follow.follow_id") sess = sess.Join("LEFT", "follow", "`user`.id=follow.follow_id")
} }
return users, sess.Find(&users) return users, sess.Find(&users)
} }
@ -433,6 +433,17 @@ func (u *User) IsPasswordSet() bool {
// UploadAvatar saves custom avatar for user. // UploadAvatar saves custom avatar for user.
// FIXME: split uploads to different subdirs in case we have massive users. // FIXME: split uploads to different subdirs in case we have massive users.
func (u *User) UploadAvatar(data []byte) error { func (u *User) UploadAvatar(data []byte) error {
imgCfg, _, err := image.DecodeConfig(bytes.NewReader(data))
if err != nil {
return fmt.Errorf("DecodeConfig: %v", err)
}
if imgCfg.Width > setting.AvatarMaxWidth {
return fmt.Errorf("Image width is to large: %d > %d", imgCfg.Width, setting.AvatarMaxWidth)
}
if imgCfg.Height > setting.AvatarMaxHeight {
return fmt.Errorf("Image height is to large: %d > %d", imgCfg.Height, setting.AvatarMaxHeight)
}
img, _, err := image.Decode(bytes.NewReader(data)) img, _, err := image.Decode(bytes.NewReader(data))
if err != nil { if err != nil {
return fmt.Errorf("Decode: %v", err) return fmt.Errorf("Decode: %v", err)
@ -546,28 +557,46 @@ func (u *User) GetRepositories(page, pageSize int) (err error) {
return err return err
} }
// GetRepositoryIDs returns repositories IDs where user owned // GetRepositoryIDs returns repositories IDs where user owned and has unittypes
func (u *User) GetRepositoryIDs() ([]int64, error) { func (u *User) GetRepositoryIDs(units ...UnitType) ([]int64, error) {
var ids []int64 var ids []int64
return ids, x.Table("repository").Cols("id").Where("owner_id = ?", u.ID).Find(&ids)
sess := x.Table("repository").Cols("repository.id")
if len(units) > 0 {
sess = sess.Join("INNER", "repo_unit", "repository.id = repo_unit.repo_id")
sess = sess.In("repo_unit.type", units)
} }
// GetOrgRepositoryIDs returns repositories IDs where user's team owned return ids, sess.Where("owner_id = ?", u.ID).Find(&ids)
func (u *User) GetOrgRepositoryIDs() ([]int64, error) { }
// GetOrgRepositoryIDs returns repositories IDs where user's team owned and has unittypes
func (u *User) GetOrgRepositoryIDs(units ...UnitType) ([]int64, error) {
var ids []int64 var ids []int64
return ids, x.Table("repository").
sess := x.Table("repository").
Cols("repository.id"). Cols("repository.id").
Join("INNER", "team_user", "repository.owner_id = team_user.org_id AND team_user.uid = ?", u.ID). Join("INNER", "team_user", "repository.owner_id = team_user.org_id").
Join("INNER", "team_repo", "repository.is_private != ? OR (team_user.team_id = team_repo.team_id AND repository.id = team_repo.repo_id)", true)
if len(units) > 0 {
sess = sess.Join("INNER", "team_unit", "team_unit.team_id = team_user.team_id")
sess = sess.In("team_unit.type", units)
}
return ids, sess.
Where("team_user.uid = ?", u.ID).
GroupBy("repository.id").Find(&ids) GroupBy("repository.id").Find(&ids)
} }
// GetAccessRepoIDs returns all repositories IDs where user's or user is a team member organizations // GetAccessRepoIDs returns all repositories IDs where user's or user is a team member organizations
func (u *User) GetAccessRepoIDs() ([]int64, error) { func (u *User) GetAccessRepoIDs(units ...UnitType) ([]int64, error) {
ids, err := u.GetRepositoryIDs() ids, err := u.GetRepositoryIDs(units...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
ids2, err := u.GetOrgRepositoryIDs() ids2, err := u.GetOrgRepositoryIDs(units...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -927,7 +956,7 @@ func deleteUser(e *xorm.Session, u *User) error {
Where("watch.user_id = ?", u.ID).Find(&watchedRepoIDs); err != nil { Where("watch.user_id = ?", u.ID).Find(&watchedRepoIDs); err != nil {
return fmt.Errorf("get all watches: %v", err) return fmt.Errorf("get all watches: %v", err)
} }
if _, err = e.Decr("num_watches").In("id", watchedRepoIDs).Update(new(Repository)); err != nil { if _, err = e.Decr("num_watches").In("id", watchedRepoIDs).NoAutoTime().Update(new(Repository)); err != nil {
return fmt.Errorf("decrease repository num_watches: %v", err) return fmt.Errorf("decrease repository num_watches: %v", err)
} }
// ***** END: Watch ***** // ***** END: Watch *****
@ -937,7 +966,7 @@ func deleteUser(e *xorm.Session, u *User) error {
if err = e.Table("star").Cols("star.repo_id"). if err = e.Table("star").Cols("star.repo_id").
Where("star.uid = ?", u.ID).Find(&starredRepoIDs); err != nil { Where("star.uid = ?", u.ID).Find(&starredRepoIDs); err != nil {
return fmt.Errorf("get all stars: %v", err) return fmt.Errorf("get all stars: %v", err)
} else if _, err = e.Decr("num_stars").In("id", starredRepoIDs).Update(new(Repository)); err != nil { } else if _, err = e.Decr("num_stars").In("id", starredRepoIDs).NoAutoTime().Update(new(Repository)); err != nil {
return fmt.Errorf("decrease repository num_stars: %v", err) return fmt.Errorf("decrease repository num_stars: %v", err)
} }
// ***** END: Star ***** // ***** END: Star *****

View File

@ -159,3 +159,25 @@ func BenchmarkHashPassword(b *testing.B) {
u.HashPassword(pass) u.HashPassword(pass)
} }
} }
func TestGetOrgRepositoryIDs(t *testing.T) {
assert.NoError(t, PrepareTestDatabase())
user2 := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
user4 := AssertExistsAndLoadBean(t, &User{ID: 4}).(*User)
user5 := AssertExistsAndLoadBean(t, &User{ID: 5}).(*User)
accessibleRepos, err := user2.GetOrgRepositoryIDs()
assert.NoError(t, err)
// User 2's team has access to private repos 3, 5, repo 32 is a public repo of the organization
assert.Equal(t, []int64{3, 5, 32}, accessibleRepos)
accessibleRepos, err = user4.GetOrgRepositoryIDs()
assert.NoError(t, err)
// User 4's team has access to private repo 3, repo 32 is a public repo of the organization
assert.Equal(t, []int64{3, 32}, accessibleRepos)
accessibleRepos, err = user5.GetOrgRepositoryIDs()
assert.NoError(t, err)
// User 5's team has no access to any repo
assert.Len(t, accessibleRepos, 0)
}

View File

@ -163,7 +163,7 @@ func createProvider(providerName, providerType, clientID, clientSecret, openIDCo
profileURL = customURLMapping.ProfileURL profileURL = customURLMapping.ProfileURL
} }
} }
provider = gitlab.NewCustomisedURL(clientID, clientSecret, callbackURL, authURL, tokenURL, profileURL) provider = gitlab.NewCustomisedURL(clientID, clientSecret, callbackURL, authURL, tokenURL, profileURL, "read_user")
case "gplus": case "gplus":
provider = gplus.New(clientID, clientSecret, callbackURL, "email") provider = gplus.New(clientID, clientSecret, callbackURL, "email")
case "openidConnect": case "openidConnect":

View File

@ -113,6 +113,7 @@ type RepoSettingForm struct {
PullsAllowSquash bool PullsAllowSquash bool
EnableTimetracker bool EnableTimetracker bool
AllowOnlyContributorsToTrackTime bool AllowOnlyContributorsToTrackTime bool
EnableIssueDependencies bool
// Admin settings // Admin settings
EnableHealthCheck bool EnableHealthCheck bool

View File

@ -76,6 +76,7 @@ type RegisterForm struct {
Email string `binding:"Required;Email;MaxSize(254)"` Email string `binding:"Required;Email;MaxSize(254)"`
Password string `binding:"Required;MaxSize(255)"` Password string `binding:"Required;MaxSize(255)"`
Retype string Retype string
GRecaptchaResponse string `form:"g-recaptcha-response"`
} }
// Validate valideates the fields // Validate valideates the fields

View File

@ -24,6 +24,7 @@ func (f *SignInOpenIDForm) Validate(ctx *macaron.Context, errs binding.Errors) b
type SignUpOpenIDForm struct { type SignUpOpenIDForm struct {
UserName string `binding:"Required;AlphaDashDot;MaxSize(35)"` UserName string `binding:"Required;AlphaDashDot;MaxSize(35)"`
Email string `binding:"Required;Email;MaxSize(254)"` Email string `binding:"Required;Email;MaxSize(254)"`
GRecaptchaResponse string `form:"g-recaptcha-response"`
} }
// Validate valideates the fields // Validate valideates the fields

View File

@ -105,6 +105,11 @@ func (r *Repository) CanUseTimetracker(issue *models.Issue, user *models.User) b
r.IsWriter() || issue.IsPoster(user.ID) || isAssigned) r.IsWriter() || issue.IsPoster(user.ID) || isAssigned)
} }
// CanCreateIssueDependencies returns whether or not a user can create dependencies.
func (r *Repository) CanCreateIssueDependencies(user *models.User) bool {
return r.Repository.IsDependenciesEnabled() && r.IsWriter()
}
// GetCommitsCount returns cached commit count for current view // GetCommitsCount returns cached commit count for current view
func (r *Repository) GetCommitsCount() (int64, error) { func (r *Repository) GetCommitsCount() (int64, error) {
var contextName string var contextName string

View File

@ -85,9 +85,12 @@ type link struct {
var oidRegExp = regexp.MustCompile(`^[A-Fa-f0-9]+$`) var oidRegExp = regexp.MustCompile(`^[A-Fa-f0-9]+$`)
func isOidValid(oid string) bool {
return oidRegExp.MatchString(oid)
}
// ObjectOidHandler is the main request routing entry point into LFS server functions // ObjectOidHandler is the main request routing entry point into LFS server functions
func ObjectOidHandler(ctx *context.Context) { func ObjectOidHandler(ctx *context.Context) {
if !setting.LFS.StartServer { if !setting.LFS.StartServer {
writeStatus(ctx, 404) writeStatus(ctx, 404)
return return
@ -110,6 +113,11 @@ func ObjectOidHandler(ctx *context.Context) {
} }
func getAuthenticatedRepoAndMeta(ctx *context.Context, rv *RequestVars, requireWrite bool) (*models.LFSMetaObject, *models.Repository) { func getAuthenticatedRepoAndMeta(ctx *context.Context, rv *RequestVars, requireWrite bool) (*models.LFSMetaObject, *models.Repository) {
if !isOidValid(rv.Oid) {
writeStatus(ctx, 404)
return nil, nil
}
repository, err := models.GetRepositoryByOwnerAndName(rv.User, rv.Repo) repository, err := models.GetRepositoryByOwnerAndName(rv.User, rv.Repo)
if err != nil { if err != nil {
log.Debug("Could not find repository: %s/%s - %s", rv.User, rv.Repo, err) log.Debug("Could not find repository: %s/%s - %s", rv.User, rv.Repo, err)
@ -222,7 +230,7 @@ func PostHandler(ctx *context.Context) {
return return
} }
if !oidRegExp.MatchString(rv.Oid) { if !isOidValid(rv.Oid) {
writeStatus(ctx, 404) writeStatus(ctx, 404)
return return
} }
@ -249,7 +257,6 @@ func PostHandler(ctx *context.Context) {
// BatchHandler provides the batch api // BatchHandler provides the batch api
func BatchHandler(ctx *context.Context) { func BatchHandler(ctx *context.Context) {
if !setting.LFS.StartServer { if !setting.LFS.StartServer {
writeStatus(ctx, 404) writeStatus(ctx, 404)
return return
@ -266,6 +273,10 @@ func BatchHandler(ctx *context.Context) {
// Create a response object // Create a response object
for _, object := range bv.Objects { for _, object := range bv.Objects {
if !isOidValid(object.Oid) {
continue
}
repository, err := models.GetRepositoryByOwnerAndName(object.User, object.Repo) repository, err := models.GetRepositoryByOwnerAndName(object.User, object.Repo)
if err != nil { if err != nil {
@ -292,14 +303,12 @@ func BatchHandler(ctx *context.Context) {
continue continue
} }
if oidRegExp.MatchString(object.Oid) {
// Object is not found // Object is not found
meta, err = models.NewLFSMetaObject(&models.LFSMetaObject{Oid: object.Oid, Size: object.Size, RepositoryID: repository.ID}) meta, err = models.NewLFSMetaObject(&models.LFSMetaObject{Oid: object.Oid, Size: object.Size, RepositoryID: repository.ID})
if err == nil { if err == nil {
responseObjects = append(responseObjects, Represent(object, meta, meta.Existing, !contentStore.Exists(meta))) responseObjects = append(responseObjects, Represent(object, meta, meta.Existing, !contentStore.Exists(meta)))
} }
} }
}
ctx.Resp.Header().Set("Content-Type", metaMediaType) ctx.Resp.Header().Set("Content-Type", metaMediaType)

58
modules/markup/csv/csv.go Normal file
View File

@ -0,0 +1,58 @@
// Copyright 2018 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package markup
import (
"bytes"
"encoding/csv"
"html"
"io"
"code.gitea.io/gitea/modules/markup"
)
func init() {
markup.RegisterParser(Parser{})
}
// Parser implements markup.Parser for orgmode
type Parser struct {
}
// Name implements markup.Parser
func (Parser) Name() string {
return "csv"
}
// Extensions implements markup.Parser
func (Parser) Extensions() []string {
return []string{".csv"}
}
// Render implements markup.Parser
func (Parser) Render(rawBytes []byte, urlPrefix string, metas map[string]string, isWiki bool) []byte {
rd := csv.NewReader(bytes.NewReader(rawBytes))
var tmpBlock bytes.Buffer
tmpBlock.WriteString(`<table class="table">`)
for {
fields, err := rd.Read()
if err == io.EOF {
break
}
if err != nil {
continue
}
tmpBlock.WriteString("<tr>")
for _, field := range fields {
tmpBlock.WriteString("<td>")
tmpBlock.WriteString(html.EscapeString(field))
tmpBlock.WriteString("</td>")
}
tmpBlock.WriteString("<tr>")
}
tmpBlock.WriteString("</table>")
return tmpBlock.Bytes()
}

View File

@ -0,0 +1,25 @@
// Copyright 2018 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package markup
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestRenderCSV(t *testing.T) {
var parser Parser
var kases = map[string]string{
"a": "<table class=\"table\"><tr><td>a</td><tr></table>",
"1,2": "<table class=\"table\"><tr><td>1</td><td>2</td><tr></table>",
"<br/>": "<table class=\"table\"><tr><td>&lt;br/&gt;</td><tr></table>",
}
for k, v := range kases {
res := parser.Render([]byte(k), "", nil, false)
assert.EqualValues(t, v, string(res))
}
}

View File

@ -101,7 +101,7 @@ var (
func (r *Renderer) Image(out *bytes.Buffer, link []byte, title []byte, alt []byte) { func (r *Renderer) Image(out *bytes.Buffer, link []byte, title []byte, alt []byte) {
prefix := r.URLPrefix prefix := r.URLPrefix
if r.IsWiki { if r.IsWiki {
prefix = util.URLJoin(prefix, "wiki", "src") prefix = util.URLJoin(prefix, "wiki", "raw")
} }
prefix = strings.Replace(prefix, "/src/", "/raw/", 1) prefix = strings.Replace(prefix, "/src/", "/raw/", 1)
if len(link) > 0 { if len(link) > 0 {

View File

@ -0,0 +1,47 @@
// Copyright 2018 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package recaptcha
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"time"
"code.gitea.io/gitea/modules/setting"
)
// Response is the structure of JSON returned from API
type Response struct {
Success bool `json:"success"`
ChallengeTS time.Time `json:"challenge_ts"`
Hostname string `json:"hostname"`
ErrorCodes []string `json:"error-codes"`
}
const apiURL = "https://www.google.com/recaptcha/api/siteverify"
// Verify calls Google Recaptcha API to verify token
func Verify(response string) (bool, error) {
resp, err := http.PostForm(apiURL,
url.Values{"secret": {setting.Service.RecaptchaSecret}, "response": {response}})
if err != nil {
return false, fmt.Errorf("Failed to send CAPTCHA response: %s", err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return false, fmt.Errorf("Failed to read CAPTCHA response: %s", err)
}
var jsonResponse Response
err = json.Unmarshal(body, &jsonResponse)
if err != nil {
return false, fmt.Errorf("Failed to parse CAPTCHA response: %s", err)
}
return jsonResponse.Success, nil
}

View File

@ -75,6 +75,12 @@ const (
RepoCreatingPublic = "public" RepoCreatingPublic = "public"
) )
// enumerates all the types of captchas
const (
ImageCaptcha = "image"
ReCaptcha = "recaptcha"
)
// settings // settings
var ( var (
// AppVer settings // AppVer settings
@ -274,6 +280,7 @@ var (
ThemeColorMetaTag string ThemeColorMetaTag string
MaxDisplayFileSize int64 MaxDisplayFileSize int64
ShowUserEmail bool ShowUserEmail bool
DefaultTheme string
Admin struct { Admin struct {
UserPagingNum int UserPagingNum int
@ -297,6 +304,7 @@ var (
ReactionMaxUserNum: 10, ReactionMaxUserNum: 10,
ThemeColorMetaTag: `#6cc644`, ThemeColorMetaTag: `#6cc644`,
MaxDisplayFileSize: 8388608, MaxDisplayFileSize: 8388608,
DefaultTheme: `gitea`,
Admin: struct { Admin: struct {
UserPagingNum int UserPagingNum int
RepoPagingNum int RepoPagingNum int
@ -341,6 +349,8 @@ var (
// Picture settings // Picture settings
AvatarUploadPath string AvatarUploadPath string
AvatarMaxWidth int
AvatarMaxHeight int
GravatarSource string GravatarSource string
GravatarSourceURL *url.URL GravatarSourceURL *url.URL
DisableGravatar bool DisableGravatar bool
@ -1024,6 +1034,8 @@ func NewContext() {
if !filepath.IsAbs(AvatarUploadPath) { if !filepath.IsAbs(AvatarUploadPath) {
AvatarUploadPath = path.Join(AppWorkPath, AvatarUploadPath) AvatarUploadPath = path.Join(AppWorkPath, AvatarUploadPath)
} }
AvatarMaxWidth = sec.Key("AVATAR_MAX_WIDTH").MustInt(4096)
AvatarMaxHeight = sec.Key("AVATAR_MAX_HEIGHT").MustInt(3072)
switch source := sec.Key("GRAVATAR_SOURCE").MustString("gravatar"); source { switch source := sec.Key("GRAVATAR_SOURCE").MustString("gravatar"); source {
case "duoshuo": case "duoshuo":
GravatarSource = "http://gravatar.duoshuo.com/avatar/" GravatarSource = "http://gravatar.duoshuo.com/avatar/"
@ -1161,10 +1173,14 @@ var Service struct {
EnableReverseProxyAuth bool EnableReverseProxyAuth bool
EnableReverseProxyAutoRegister bool EnableReverseProxyAutoRegister bool
EnableCaptcha bool EnableCaptcha bool
CaptchaType string
RecaptchaSecret string
RecaptchaSitekey string
DefaultKeepEmailPrivate bool DefaultKeepEmailPrivate bool
DefaultAllowCreateOrganization bool DefaultAllowCreateOrganization bool
EnableTimetracking bool EnableTimetracking bool
DefaultEnableTimetracking bool DefaultEnableTimetracking bool
DefaultEnableDependencies bool
DefaultAllowOnlyContributorsToTrackTime bool DefaultAllowOnlyContributorsToTrackTime bool
NoReplyAddress string NoReplyAddress string
@ -1185,13 +1201,17 @@ func newService() {
Service.RequireSignInView = sec.Key("REQUIRE_SIGNIN_VIEW").MustBool() Service.RequireSignInView = sec.Key("REQUIRE_SIGNIN_VIEW").MustBool()
Service.EnableReverseProxyAuth = sec.Key("ENABLE_REVERSE_PROXY_AUTHENTICATION").MustBool() Service.EnableReverseProxyAuth = sec.Key("ENABLE_REVERSE_PROXY_AUTHENTICATION").MustBool()
Service.EnableReverseProxyAutoRegister = sec.Key("ENABLE_REVERSE_PROXY_AUTO_REGISTRATION").MustBool() Service.EnableReverseProxyAutoRegister = sec.Key("ENABLE_REVERSE_PROXY_AUTO_REGISTRATION").MustBool()
Service.EnableCaptcha = sec.Key("ENABLE_CAPTCHA").MustBool() Service.EnableCaptcha = sec.Key("ENABLE_CAPTCHA").MustBool(false)
Service.CaptchaType = sec.Key("CAPTCHA_TYPE").MustString(ImageCaptcha)
Service.RecaptchaSecret = sec.Key("RECAPTCHA_SECRET").MustString("")
Service.RecaptchaSitekey = sec.Key("RECAPTCHA_SITEKEY").MustString("")
Service.DefaultKeepEmailPrivate = sec.Key("DEFAULT_KEEP_EMAIL_PRIVATE").MustBool() Service.DefaultKeepEmailPrivate = sec.Key("DEFAULT_KEEP_EMAIL_PRIVATE").MustBool()
Service.DefaultAllowCreateOrganization = sec.Key("DEFAULT_ALLOW_CREATE_ORGANIZATION").MustBool(true) Service.DefaultAllowCreateOrganization = sec.Key("DEFAULT_ALLOW_CREATE_ORGANIZATION").MustBool(true)
Service.EnableTimetracking = sec.Key("ENABLE_TIMETRACKING").MustBool(true) Service.EnableTimetracking = sec.Key("ENABLE_TIMETRACKING").MustBool(true)
if Service.EnableTimetracking { if Service.EnableTimetracking {
Service.DefaultEnableTimetracking = sec.Key("DEFAULT_ENABLE_TIMETRACKING").MustBool(true) Service.DefaultEnableTimetracking = sec.Key("DEFAULT_ENABLE_TIMETRACKING").MustBool(true)
} }
Service.DefaultEnableDependencies = sec.Key("DEFAULT_ENABLE_DEPENDENCIES").MustBool(true)
Service.DefaultAllowOnlyContributorsToTrackTime = sec.Key("DEFAULT_ALLOW_ONLY_CONTRIBUTORS_TO_TRACK_TIME").MustBool(true) Service.DefaultAllowOnlyContributorsToTrackTime = sec.Key("DEFAULT_ALLOW_ONLY_CONTRIBUTORS_TO_TRACK_TIME").MustBool(true)
Service.NoReplyAddress = sec.Key("NO_REPLY_ADDRESS").MustString("noreply.example.org") Service.NoReplyAddress = sec.Key("NO_REPLY_ADDRESS").MustString("noreply.example.org")

View File

@ -186,6 +186,9 @@ func NewFuncMap() []template.FuncMap {
"ParseDeadline": func(deadline string) []string { "ParseDeadline": func(deadline string) []string {
return strings.Split(deadline, "|") return strings.Split(deadline, "|")
}, },
"DefaultTheme": func() string {
return setting.UI.DefaultTheme
},
}} }}
} }

View File

@ -10,6 +10,7 @@ import (
"strings" "strings"
"code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
) )
// OptionalBool a boolean that can be "null" // OptionalBool a boolean that can be "null"
@ -78,6 +79,18 @@ func URLJoin(base string, elems ...string) string {
return joinedURL return joinedURL
} }
// IsExternalURL checks if rawURL points to an external URL like http://example.com
func IsExternalURL(rawURL string) bool {
parsed, err := url.Parse(rawURL)
if err != nil {
return true
}
if len(parsed.Host) != 0 && strings.Replace(parsed.Host, "www.", "", 1) != strings.Replace(setting.Domain, "www.", "", 1) {
return true
}
return false
}
// Min min of two ints // Min min of two ints
func Min(a, b int) int { func Min(a, b int) int {
if a > b { if a > b {

View File

@ -7,6 +7,8 @@ package util
import ( import (
"testing" "testing"
"code.gitea.io/gitea/modules/setting"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
@ -42,3 +44,36 @@ func TestURLJoin(t *testing.T) {
assert.Equal(t, test.Expected, URLJoin(test.Base, test.Elements...)) assert.Equal(t, test.Expected, URLJoin(test.Base, test.Elements...))
} }
} }
func TestIsExternalURL(t *testing.T) {
setting.Domain = "try.gitea.io"
type test struct {
Expected bool
RawURL string
}
newTest := func(expected bool, rawURL string) test {
return test{Expected: expected, RawURL: rawURL}
}
for _, test := range []test{
newTest(false,
"https://try.gitea.io"),
newTest(true,
"https://example.com/"),
newTest(true,
"//example.com"),
newTest(true,
"http://example.com"),
newTest(false,
"a/"),
newTest(false,
"https://try.gitea.io/test?param=false"),
newTest(false,
"test?param=false"),
newTest(false,
"//try.gitea.io/test?param=false"),
newTest(false,
"/hey/hey/hey#3244"),
} {
assert.Equal(t, test.Expected, IsExternalURL(test.RawURL))
}
}

View File

@ -27,6 +27,7 @@ Enrico Testori hypertesto AT gmail DOT com
Ezequiel Gonzalez Rial <gonrial AT gmail DOT com> Ezequiel Gonzalez Rial <gonrial AT gmail DOT com>
Gabriel Dugny <gabriel DOT dugny AT gmail DOT com> Gabriel Dugny <gabriel DOT dugny AT gmail DOT com>
Gregor Santner <gdev AT live DOT de> Gregor Santner <gdev AT live DOT de>
Guilhem Marion <gmarion AT netc DOT fr>
Halil Kaya <halil AT halilkaya DOT net> Halil Kaya <halil AT halilkaya DOT net>
Hamid Feizabadi <hamidfzm AT gmail DOT com> Hamid Feizabadi <hamidfzm AT gmail DOT com>
Hilton Wichwski Silva <hilton AT hiltonws DOT com DOT br> Hilton Wichwski Silva <hilton AT hiltonws DOT com DOT br>
@ -55,6 +56,7 @@ Morten Sørensen <klim8d AT gmail DOT com>
Muhammad Fawwaz Orabi <mfawwaz93 AT gmail DOT com> Muhammad Fawwaz Orabi <mfawwaz93 AT gmail DOT com>
Nakao Takamasa <at.mattenn AT gmail DOT com> Nakao Takamasa <at.mattenn AT gmail DOT com>
Natan Albuquerque <natanalbuquerque5 AT gmail DOT com> Natan Albuquerque <natanalbuquerque5 AT gmail DOT com>
Niclas Kroon <niclas DOT kroon AT gmail DOT com>
Odilon Junior <odilon DOT junior93 AT gmail DOT com> Odilon Junior <odilon DOT junior93 AT gmail DOT com>
Pablo Saavedra <psaavedra AT igalia DOT com> Pablo Saavedra <psaavedra AT igalia DOT com>
Richard Bukovansky <richard DOT bukovansky @ gmail DOT com> Richard Bukovansky <richard DOT bukovansky @ gmail DOT com>

View File

@ -11,6 +11,7 @@ version=Версия
page=Страница page=Страница
template=Шаблон template=Шаблон
language=Език language=Език
notifications=Известия
signed_in_as=Вписан като signed_in_as=Вписан като
username=Потребител username=Потребител
@ -28,6 +29,9 @@ manage_org=Управление на организации
account_settings=Настройки на профила account_settings=Настройки на профила
settings=Настройки settings=Настройки
all=Всичко
sources=Източници
mirrors=Огледала
activities=Активности activities=Активности
pull_requests=Заявки за сливане pull_requests=Заявки за сливане
@ -69,7 +73,9 @@ issues.in_your_repos=Във Вашите хранилища
[explore] [explore]
repos=Хранилища repos=Хранилища
users=Потребители users=Потребители
organizations=Организации
search=Търсене search=Търсене
code=Код
[auth] [auth]
register_helper_msg=Вече имате профил? Впишете се сега! register_helper_msg=Вече имате профил? Впишете се сега!
@ -79,11 +85,14 @@ has_unconfirmed_mail=Здравейте %s, имате непотвърден а
resend_mail=Щракнете тук, за да се изпрати ново писмо за потвърждение resend_mail=Щракнете тук, за да се изпрати ново писмо за потвърждение
reset_password=Нулиране на паролата reset_password=Нулиране на паролата
reset_password_helper=Щракнете тук, за да нулирате паролата си reset_password_helper=Щракнете тук, за да нулирате паролата си
openid_connect_submit=Свързване
[mail] [mail]
activate_account=Моля активирайте Вашия профил activate_account=Моля активирайте Вашия профил
activate_email=Провери адрес на ел. поща activate_email=Провери адрес на ел. поща
reset_password=Нулиране на паролата reset_password=Нулиране на паролата
register_success=Успешна регистрация
register_notify=Добре дошли в Gitea
[modal] [modal]
yes=Да yes=Да
@ -117,6 +126,7 @@ url_error=` не е валиден URL адрес.`
include_error=` трябва да съдържа текст '%s'.` include_error=` трябва да съдържа текст '%s'.`
unknown_error=Неизвестна грешка: unknown_error=Неизвестна грешка:
user_not_exist=Потребителят не съществува.
auth_failed=Неуспешно удостоверяване: %v auth_failed=Неуспешно удостоверяване: %v
@ -136,9 +146,11 @@ unfollow=Не следвай
[settings] [settings]
profile=Профил profile=Профил
password=Парола password=Парола
security=Сигурност
avatar=Аватар avatar=Аватар
social=Социални профили social=Социални профили
delete=Изтрий профил delete=Изтрий профил
twofa=Двуфакторно удостоверяване
uid=UID uid=UID
public_profile=Публичен профил public_profile=Публичен профил
@ -169,6 +181,8 @@ key_content=Съдържание
add_on=Добавен на add_on=Добавен на
last_used=Последно използван на last_used=Последно използван на
no_activity=Няма скорошна дейност no_activity=Няма скорошна дейност
show_openid=Показване в профила
hide_openid=Скриване от профила
manage_social=Управление на свързани профили в социалните мрежи manage_social=Управление на свързани профили в социалните мрежи
@ -239,6 +253,7 @@ file_view_raw=Виж директен файл
file_permalink=Постоянна връзка file_permalink=Постоянна връзка
editor.preview_changes=Преглед на промени editor.preview_changes=Преглед на промени
editor.name_your_file=Име на файла ви…
editor.or=или editor.or=или
editor.commit_changes=Промени в ревизия editor.commit_changes=Промени в ревизия
editor.add_tmpl=Добави '%s/<filename>' editor.add_tmpl=Добави '%s/<filename>'
@ -247,6 +262,7 @@ editor.update=Модифицирай '%s'
editor.delete=Изтрий '%s' editor.delete=Изтрий '%s'
editor.commit_directly_to_this_branch=Запази ревизия директно в клон <strong class="branch-name">%s</strong>. editor.commit_directly_to_this_branch=Запази ревизия директно в клон <strong class="branch-name">%s</strong>.
editor.create_new_branch=Създай <strong>нов клон</strong> от тази ревизия и изпрати заявки за сливане. editor.create_new_branch=Създай <strong>нов клон</strong> от тази ревизия и изпрати заявки за сливане.
editor.new_branch_name_desc=Име на новия клон…
editor.cancel=Отказ editor.cancel=Отказ
editor.branch_already_exists=Клон '%s' вече съществува в това хранилище. editor.branch_already_exists=Клон '%s' вече съществува в това хранилище.
editor.no_changes_to_show=Няма промени. editor.no_changes_to_show=Няма промени.
@ -255,6 +271,7 @@ editor.unable_to_upload_files=Невъзможно качване на файл
editor.upload_files_to_dir=Качи файлове в '%s' editor.upload_files_to_dir=Качи файлове в '%s'
commits.commits=Ревизии commits.commits=Ревизии
commits.find=Търсене
commits.author=Автор commits.author=Автор
commits.message=Съобщение commits.message=Съобщение
commits.date=Дата commits.date=Дата
@ -277,6 +294,7 @@ issues.create_label=Създай етикет
issues.label_templates.title=Зареждане на предварително зададен набор от етикети issues.label_templates.title=Зареждане на предварително зададен набор от етикети
issues.label_templates.helper=Изберете набор етикети issues.label_templates.helper=Изберете набор етикети
issues.label_templates.fail_to_load_file=Неуспешно зареждане на шаблон с етикети '%s': %v issues.label_templates.fail_to_load_file=Неуспешно зареждане на шаблон с етикети '%s': %v
issues.deleted_milestone=`(изтрито)`
issues.open_tab=%d отворени issues.open_tab=%d отворени
issues.close_tab=%d затворени issues.close_tab=%d затворени
issues.filter_label=Етикет issues.filter_label=Етикет
@ -294,6 +312,11 @@ issues.filter_sort.recentupdate=Последно променени
issues.filter_sort.leastupdate=Отдавна променени issues.filter_sort.leastupdate=Отдавна променени
issues.filter_sort.mostcomment=Най-много коментирани issues.filter_sort.mostcomment=Най-много коментирани
issues.filter_sort.leastcomment=Най-малко коментирани issues.filter_sort.leastcomment=Най-малко коментирани
issues.action_open=Отваряне
issues.action_close=Затваряне
issues.action_label=Етикет
issues.action_milestone=Етап
issues.action_milestone_no_select=Няма етап
issues.opened_by=отворен %[1]s от <a href="%[2]s">%[3]s</a> issues.opened_by=отворен %[1]s от <a href="%[2]s">%[3]s</a>
issues.opened_by_fake=отворен %[1]s от %[2]s issues.opened_by_fake=отворен %[1]s от %[2]s
issues.previous=Предишна issues.previous=Предишна
@ -323,9 +346,17 @@ issues.label_count=%d етикети
issues.label_open_issues=%d отворени задачи issues.label_open_issues=%d отворени задачи
issues.label_edit=Редакция issues.label_edit=Редакция
issues.label_delete=Изтрий issues.label_delete=Изтрий
issues.label.filter_sort.alphabetically=По азбучен ред
issues.label.filter_sort.by_size=Големина
issues.num_participants=%d участника issues.num_participants=%d участника
issues.attachment.open_tab=`Щракнете за да прегледате "%s" в нов раздел` issues.attachment.open_tab=`Щракнете за да прегледате "%s" в нов раздел`
issues.attachment.download=`Щракнете за да изтеглите "%s"` issues.attachment.download=`Щракнете за да изтеглите "%s"`
issues.start_tracking_short=Начало
issues.stop_tracking=Спиране
issues.add_time_cancel=Отказ
issues.add_time_hours=Часа
issues.add_time_minutes=Минути
issues.cancel_tracking=Отказ
pulls.new=Нова заявка за сливане pulls.new=Нова заявка за сливане
pulls.filter_branch=Филтър по клон pulls.filter_branch=Филтър по клон
@ -367,7 +398,19 @@ wiki.page_already_exists=Страница със същото име вече с
wiki.pages=Страници wiki.pages=Страници
wiki.last_updated=Последна модификация на %s wiki.last_updated=Последна модификация на %s
activity.period.filter_label=Период:
activity.period.daily=1 ден
activity.period.halfweekly=3 дни
activity.period.weekly=1 седмица
activity.period.monthly=1 месец
activity.title.user_1=%d потребител
activity.title.user_n=%d потребителя
activity.closed_issue_label=Затворено
activity.new_issue_label=Отворено
activity.unresolved_conv_label=Отваряне
activity.published_release_label=Публикувано
search=Търсене
settings=Настройки settings=Настройки
settings.collaboration.write=За писане settings.collaboration.write=За писане
@ -389,6 +432,7 @@ settings.transfer=Прехвърли притежание
settings.delete=Изтрий това хранилище settings.delete=Изтрий това хранилище
settings.delete_notices_1=- Тази операция <strong>НЕ МОЖЕ</strong> да бъде отменена в последствие. settings.delete_notices_1=- Тази операция <strong>НЕ МОЖЕ</strong> да бъде отменена в последствие.
settings.transfer_owner=Нов притежател settings.transfer_owner=Нов притежател
settings.search_user_placeholder=Търсене на потребител…
settings.add_webhook=Добави уеб-кука settings.add_webhook=Добави уеб-кука
settings.webhook.test_delivery=Тестово изпращане settings.webhook.test_delivery=Тестово изпращане
settings.webhook.request=Заявка settings.webhook.request=Заявка
@ -402,6 +446,8 @@ settings.update_githook=Запази куката
settings.secret=Тайна settings.secret=Тайна
settings.slack_username=Потребителско име settings.slack_username=Потребителско име
settings.slack_icon_url=URL адрес на икона settings.slack_icon_url=URL адрес на икона
settings.discord_username=Потребителско име
settings.discord_icon_url=URL адрес на икона
settings.slack_color=Цвят settings.slack_color=Цвят
settings.event_create=Създаване settings.event_create=Създаване
settings.event_pull_request=Заявка за сливане settings.event_pull_request=Заявка за сливане
@ -416,6 +462,11 @@ settings.deploy_keys=Ключове за внедряване
settings.add_deploy_key=Добави ключ за внедряване settings.add_deploy_key=Добави ключ за внедряване
settings.title=Заглавие settings.title=Заглавие
settings.deploy_key_content=Съдържание settings.deploy_key_content=Съдържание
settings.branches=Клонове
settings.protected_branch=Защита на клона
settings.add_protected_branch=Включване на защита
settings.delete_protected_branch=Изключване на защита
settings.choose_branch=Изберете клон…
diff.browse_source=Преглед на файлове diff.browse_source=Преглед на файлове
diff.parent=родител diff.parent=родител
@ -424,6 +475,7 @@ diff.show_diff_stats=Покажи статистика за разликите
diff.show_split_view=Разделен изглед diff.show_split_view=Разделен изглед
diff.show_unified_view=Обединен изглед diff.show_unified_view=Обединен изглед
diff.stats_desc=променени са <strong>%d файла</strong>, в които са <strong>добавени %d</strong> реда и са <strong>изтрити %d</strong> реда diff.stats_desc=променени са <strong>%d файла</strong>, в които са <strong>добавени %d</strong> реда и са <strong>изтрити %d</strong> реда
diff.bin=Двоични данни
diff.view_file=Целия файл diff.view_file=Целия файл
diff.file_suppressed=Файловите разлики са ограничени, защото са твърде много diff.file_suppressed=Файловите разлики са ограничени, защото са твърде много
diff.too_many_files=Някои файлове не бяха показани, защото твърде много файлове са промени diff.too_many_files=Някои файлове не бяха показани, защото твърде много файлове са промени
@ -442,11 +494,17 @@ release.title=Заглавие
release.content=Съдържание release.content=Съдържание
release.write=Редактор release.write=Редактор
release.preview=Преглед release.preview=Преглед
release.loading=Зарежда се…
release.cancel=Отказ release.cancel=Отказ
release.publish=Публикувай версия release.publish=Публикувай версия
release.save_draft=Запис на чернова release.save_draft=Запис на чернова
release.downloads=Изтегляния release.downloads=Изтегляния
branch.search=Търсене на клонове
branch.delete_head=Изтриване
branch.delete_html=Изтриване на клон
branch.create_from=от '%s'
branch.deleted_by=Изтрито от %s
[org] [org]
@ -458,6 +516,8 @@ people=Участници
teams=Екипи teams=Екипи
lower_members=участници lower_members=участници
lower_repositories=хранилища lower_repositories=хранилища
create_new_team=Нов отбор
create_team=Създаване на отбор
org_desc=Описание org_desc=Описание
team_name=Име на екипа team_name=Име на екипа
team_desc=Описание team_desc=Описание
@ -509,7 +569,6 @@ total=Общо: %d
dashboard.operation_name=Име на операцията dashboard.operation_name=Име на операцията
dashboard.operation_switch=Превключи dashboard.operation_switch=Превключи
dashboard.operation_run=Изпълни dashboard.operation_run=Изпълни
dashboard.delete_inactivate_accounts=Изтрий всички неактивни профили
dashboard.server_uptime=Операционно време dashboard.server_uptime=Операционно време
dashboard.current_goroutine=Текущи Goroutines dashboard.current_goroutine=Текущи Goroutines
dashboard.current_memory_usage=Текущо използвана памет dashboard.current_memory_usage=Текущо използвана памет
@ -546,6 +605,7 @@ users.edit=Редакция
users.auth_source=Начин на удостоверяване users.auth_source=Начин на удостоверяване
users.local=Локално users.local=Локално
orgs.org_manage_panel=Управление на организацията
orgs.name=Име orgs.name=Име
orgs.teams=Екипи orgs.teams=Екипи
orgs.members=Участници orgs.members=Участници
@ -556,6 +616,7 @@ repos.private=Частно
repos.watches=Наблюдавания repos.watches=Наблюдавания
repos.stars=Харесвания repos.stars=Харесвания
repos.issues=Задачи repos.issues=Задачи
repos.size=Големина
auths.name=Име auths.name=Име
auths.type=Тип auths.type=Тип
@ -580,12 +641,15 @@ auths.allowed_domains=Разрешени домейни
auths.enable_tls=Включи TLS криптиране auths.enable_tls=Включи TLS криптиране
auths.skip_tls_verify=Пропусни проверка на TLS сертификат auths.skip_tls_verify=Пропусни проверка на TLS сертификат
auths.pam_service_name=Име на PAM услуга auths.pam_service_name=Име на PAM услуга
auths.oauth2_profileURL=URL адрес на профила
auths.oauth2_emailURL=Имейл адрес
auths.enable_auto_register=Включи автоматична регистрация auths.enable_auto_register=Включи автоматична регистрация
auths.tips=Съвети auths.tips=Съвети
config.server_config=Сървърни настройки config.server_config=Сървърни настройки
config.disable_router_log=Изключи журнал на маршрутизатора config.disable_router_log=Изключи журнал на маршрутизатора
config.run_mode=Режим на изпълнение config.run_mode=Режим на изпълнение
config.git_version=Версия на Git
config.repo_root_path=Основен път към хранилища config.repo_root_path=Основен път към хранилища
config.static_file_root_path=Път към статични файлове config.static_file_root_path=Път към статични файлове
config.script_type=Тип на скрипта config.script_type=Тип на скрипта
@ -700,6 +764,7 @@ push_tag=предаде маркер <a href="%s/src/%s">%[2]s</a> към <a hre
ago=преди %s ago=преди %s
from_now=след %s from_now=след %s
now=сега now=сега
future=в бъдеще
1s=1 секунда 1s=1 секунда
1m=1 минута 1m=1 минута
1h=1 час 1h=1 час
@ -721,6 +786,12 @@ raw_minutes=минути
remove_file=Премахни файл remove_file=Премахни файл
[notification] [notification]
notifications=Известия
unread=Непрочетенo
read=За четене
mark_as_read=Бележа като прочетено
mark_as_unread=Бележа като непрочетено
mark_all_as_read=Бележа всичко като прочетено
[gpg] [gpg]

View File

@ -508,7 +508,6 @@ total=Celkem: %d
dashboard.operation_name=Název operace dashboard.operation_name=Název operace
dashboard.operation_switch=Přepnout dashboard.operation_switch=Přepnout
dashboard.operation_run=Spustit dashboard.operation_run=Spustit
dashboard.delete_inactivate_accounts=Smazat všechny neaktivní účty
dashboard.server_uptime=Doba provozu serveru dashboard.server_uptime=Doba provozu serveru
dashboard.current_goroutine=Aktuální Goroutines dashboard.current_goroutine=Aktuální Goroutines
dashboard.current_memory_usage=Aktuální využití paměti dashboard.current_memory_usage=Aktuální využití paměti

File diff suppressed because it is too large Load Diff

View File

@ -32,16 +32,16 @@ twofa_scratch = Two-Factor Scratch Code
passcode = Passcode passcode = Passcode
u2f_insert_key = Insert your security key u2f_insert_key = Insert your security key
u2f_sign_in = Press the button on your security key. If you can't find a button, re-insert it. u2f_sign_in = Press the button on your security key. If your security key has no button, re-insert it.
u2f_press_button = Please press the button on your security key… u2f_press_button = Please press the button on your security key…
u2f_use_twofa = Use a two-factor code from your phone u2f_use_twofa = Use a two-factor code from your phone
u2f_error = We can't read your security key! u2f_error = Could not read your security key.
u2f_unsupported_browser = Your browser don't support U2F keys. Please try another browser. u2f_unsupported_browser = Your browser does not support U2F security keys.
u2f_error_1 = An unknown error occured. Please retry. u2f_error_1 = An unknown error occurred. Please retry.
u2f_error_2 = Please make sure that you're using an encrypted connection (https://) and visiting the correct URL. u2f_error_2 = Please make sure to use the correct, encrypted (https://) URL.
u2f_error_3 = The server could not proceed your request. u2f_error_3 = The server could not process your request.
u2f_error_4 = The presented key is not eligible for this request. If you try to register it, make sure that the key isn't already registered. u2f_error_4 = The security key is not permitted for this request. Please make sure that the key is not already registered.
u2f_error_5 = Timeout reached before your key could be read. Please reload to retry. u2f_error_5 = Timeout reached before your key could be read. Please reload this page and retry.
u2f_reload = Reload u2f_reload = Reload
repository = Repository repository = Repository
@ -75,7 +75,7 @@ cancel = Cancel
[install] [install]
install = Installation install = Installation
title = Initial Configuration title = Initial Configuration
docker_helper = If you run Gitea inside Docker, please read the <a target="_blank" rel="noopener" href="%s">documentation</a> before changing any settings. docker_helper = If you run Gitea inside Docker, please read the <a target="_blank" rel="noopener noreferrer" href="%s">documentation</a> before changing any settings.
requite_db_desc = Gitea requires MySQL, PostgreSQL, MSSQL, SQLite3 or TiDB. requite_db_desc = Gitea requires MySQL, PostgreSQL, MSSQL, SQLite3 or TiDB.
db_title = Database Settings db_title = Database Settings
db_type = Database Type db_type = Database Type
@ -130,7 +130,7 @@ federated_avatar_lookup = Enable Federated Avatars
federated_avatar_lookup_popup = Enable federated avatar lookup using Libravatar. federated_avatar_lookup_popup = Enable federated avatar lookup using Libravatar.
disable_registration = Disable Self-Registration disable_registration = Disable Self-Registration
disable_registration_popup = Disable user self-registration. Only administrators will be able to create new user accounts. disable_registration_popup = Disable user self-registration. Only administrators will be able to create new user accounts.
allow_only_external_registration_popup=Enable the registration only through external services. allow_only_external_registration_popup = Allow Registration Only Through External Services
openid_signin = Enable OpenID Sign-In openid_signin = Enable OpenID Sign-In
openid_signin_popup = Enable user sign-in via OpenID. openid_signin_popup = Enable user sign-in via OpenID.
openid_signup = Enable OpenID Self-Registration openid_signup = Enable OpenID Self-Registration
@ -463,13 +463,13 @@ then_enter_passcode = And enter the passcode shown in the application:
passcode_invalid = The passcode is incorrect. Try again. passcode_invalid = The passcode is incorrect. Try again.
twofa_enrolled = Your account has been enrolled into two-factor authentication. Store your scratch token (%s) in a safe place as it is only shown once! twofa_enrolled = Your account has been enrolled into two-factor authentication. Store your scratch token (%s) in a safe place as it is only shown once!
u2f_desc = Security keys are hardware devices containing cryptographic keys. They could be used for two factor authentication. The security key must support the <a href="https://fidoalliance.org/">FIDO U2F</a> standard. u2f_desc = Security keys are hardware devices containing cryptographic keys. They can be used for two-factor authentication. Security keys must support the <a rel="noreferrer" href="https://fidoalliance.org/">FIDO U2F</a> standard.
u2f_require_twofa = Two-Factor-Authentication must be enrolled in order to use security keys. u2f_require_twofa = Your account must be enrolled in two-factor authentication to use security keys.
u2f_register_key = Add Security Key u2f_register_key = Add Security Key
u2f_nickname = Nickname u2f_nickname = Nickname
u2f_press_button = Press the button on your security key to register it. u2f_press_button = Press the button on your security key to register it.
u2f_delete_key = Remove Security Key u2f_delete_key = Remove Security Key
u2f_delete_key_desc= If you remove a security key you cannot login with it anymore. Are you sure? u2f_delete_key_desc = If you remove a security key you can no longer sign in with it. Continue?
manage_account_links = Manage Linked Accounts manage_account_links = Manage Linked Accounts
manage_account_links_desc = These external accounts are linked to your Gitea account. manage_account_links_desc = These external accounts are linked to your Gitea account.
@ -492,13 +492,13 @@ owner = Owner
repo_name = Repository Name repo_name = Repository Name
repo_name_helper = Good repository names use short, memorable and unique keywords. repo_name_helper = Good repository names use short, memorable and unique keywords.
visibility = Visibility visibility = Visibility
visiblity_helper = Make Repository Private visibility_helper = Make Repository Private
visiblity_helper_forced = Your site administrator forces new repositories to be private. visibility_helper_forced = Your site administrator forces new repositories to be private.
visiblity_fork_helper = (Changing this will affect all forks.) visibility_fork_helper = (Changing this will affect all forks.)
clone_helper = Need help cloning? Visit <a target="_blank" rel="noopener" href="%s">Help</a>. clone_helper = Need help cloning? Visit <a target="_blank" rel="noopener noreferrer" href="%s">Help</a>.
fork_repo = Fork Repository fork_repo = Fork Repository
fork_from = Fork From fork_from = Fork From
fork_visiblity_helper = The visibility of a forked repository cannot be changed. fork_visibility_helper = The visibility of a forked repository cannot be changed.
repo_desc = Description repo_desc = Description
repo_lang = Language repo_lang = Language
repo_gitignore_helper = Select .gitignore templates. repo_gitignore_helper = Select .gitignore templates.
@ -613,7 +613,7 @@ editor.directory_is_a_file = Directory name '%s' is already used as a filename i
editor.file_is_a_symlink = '%s' is a symbolic link. Symbolic links cannot be edited in the web editor editor.file_is_a_symlink = '%s' is a symbolic link. Symbolic links cannot be edited in the web editor
editor.filename_is_a_directory = Filename '%s' is already used as a directory name in this repository. editor.filename_is_a_directory = Filename '%s' is already used as a directory name in this repository.
editor.file_editing_no_longer_exists = The file being edited, '%s', no longer exists in this repository. editor.file_editing_no_longer_exists = The file being edited, '%s', no longer exists in this repository.
editor.file_changed_while_editing = The file contents have changed since you started editing. <a target="_blank" rel="noopener" href="%s">Click here</a> to see them or <strong>Commit Changes again</strong> to overwrite them. editor.file_changed_while_editing = The file contents have changed since you started editing. <a target="_blank" rel="noopener noreferrer" href="%s">Click here</a> to see them or <strong>Commit Changes again</strong> to overwrite them.
editor.file_already_exists = A file named '%s' already exists in this repository. editor.file_already_exists = A file named '%s' already exists in this repository.
editor.no_changes_to_show = There are no changes to show. editor.no_changes_to_show = There are no changes to show.
editor.fail_to_update_file = Failed to update/create file '%s' with error: %v editor.fail_to_update_file = Failed to update/create file '%s' with error: %v
@ -650,7 +650,7 @@ issues.new.open_milestone = Open Milestones
issues.new.closed_milestone = Closed Milestones issues.new.closed_milestone = Closed Milestones
issues.new.assignees = Assignees issues.new.assignees = Assignees
issues.new.clear_assignees = Clear assignees issues.new.clear_assignees = Clear assignees
issues.new.no_assignees = Nobody assigned issues.new.no_assignees = No Assignees
issues.no_ref = No Branch/Tag Specified issues.no_ref = No Branch/Tag Specified
issues.create = Create Issue issues.create = Create Issue
issues.new_label = New Label issues.new_label = New Label
@ -781,6 +781,33 @@ issues.due_date_added = "added the due date %s %s"
issues.due_date_modified = "modified the due date to %s from %s %s" issues.due_date_modified = "modified the due date to %s from %s %s"
issues.due_date_remove = "removed the due date %s %s" issues.due_date_remove = "removed the due date %s %s"
issues.due_date_overdue = "Overdue" issues.due_date_overdue = "Overdue"
issues.due_date_invalid = "The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'."
issues.dependency.title = Dependencies
issues.dependency.issue_no_dependencies = This issue currently doesn't have any dependencies.
issues.dependency.pr_no_dependencies = This pull request currently doesn't have any dependencies.
issues.dependency.add = Add dependency...
issues.dependency.cancel = Cancel
issues.dependency.remove = Remove
issues.dependency.added_dependency = `<a href="%[1]s">%[2]s</a> added a new dependency %[3]s`
issues.dependency.removed_dependency = `<a href="%[1]s">%[2]s</a> removed a dependency %[3]s`
issues.dependency.issue_closing_blockedby = Closing this pull request is blocked by the following issues
issues.dependency.pr_closing_blockedby = Closing this issue is blocked by the following issues
issues.dependency.issue_close_blocks = This issue blocks closing of the following issues
issues.dependency.pr_close_blocks = This pull request blocks closing of the following issues
issues.dependency.issue_close_blocked = You need to close all issues blocking this issue before you can close it.
issues.dependency.pr_close_blocked = You need to close all issues blocking this pull request before you can merge it.
issues.dependency.blocks_short = Blocks
issues.dependency.blocked_by_short = Depends on
issues.dependency.remove_header = Remove Dependency
issues.dependency.issue_remove_text = This will remove the dependency from this issue. Continue?
issues.dependency.pr_remove_text = This will remove the dependency from this pull request. Continue?
issues.dependency.setting = Enable Dependencies For Issues and Pull Requests
issues.dependency.add_error_same_issue = You cannot make an issue depend on itself.
issues.dependency.add_error_dep_issue_not_exist = Dependent issue does not exist.
issues.dependency.add_error_dep_not_exist = Dependency does not exist.
issues.dependency.add_error_dep_exists = Dependency already exists.
issues.dependency.add_error_cannot_create_circular = You cannot create a dependency with two issues blocking each other.
issues.dependency.add_error_dep_not_same_repo = Both issues must be in the same repository.
pulls.desc = Enable merge requests and code reviews. pulls.desc = Enable merge requests and code reviews.
pulls.new = New Pull Request pulls.new = New Pull Request
@ -994,7 +1021,7 @@ settings.search_user_placeholder = Search user…
settings.org_not_allowed_to_be_collaborator = Organizations cannot be added as a collaborator. settings.org_not_allowed_to_be_collaborator = Organizations cannot be added as a collaborator.
settings.user_is_org_member = The user is an organization member who cannot be added as a collaborator. settings.user_is_org_member = The user is an organization member who cannot be added as a collaborator.
settings.add_webhook = Add Webhook settings.add_webhook = Add Webhook
settings.hooks_desc = Webhooks automatically make HTTP POST requests to a server when certain Gitea events trigger. Read more in the <a target="_blank" rel="noopener" href="%s">webhooks guide</a>. settings.hooks_desc = Webhooks automatically make HTTP POST requests to a server when certain Gitea events trigger. Read more in the <a target="_blank" rel="noopener noreferrer" href="%s">webhooks guide</a>.
settings.webhook_deletion = Remove Webhook settings.webhook_deletion = Remove Webhook
settings.webhook_deletion_desc = Removing a webhook deletes its settings and delivery history. Continue? settings.webhook_deletion_desc = Removing a webhook deletes its settings and delivery history. Continue?
settings.webhook_deletion_success = The webhook has been removed. settings.webhook_deletion_success = The webhook has been removed.
@ -1011,7 +1038,7 @@ settings.githook_edit_desc = If the hook is inactive, sample content will be pre
settings.githook_name = Hook Name settings.githook_name = Hook Name
settings.githook_content = Hook Content settings.githook_content = Hook Content
settings.update_githook = Update Hook settings.update_githook = Update Hook
settings.add_webhook_desc = Gitea will send <code>POST</code> requests with a specified content type to the target URL. Read more in the <a target="_blank" rel="noopener" href="%s">webhooks guide</a>. settings.add_webhook_desc = Gitea will send <code>POST</code> requests with a specified content type to the target URL. Read more in the <a target="_blank" rel="noopener noreferrer" href="%s">webhooks guide</a>.
settings.payload_url = Target URL settings.payload_url = Target URL
settings.content_type = POST Content Type settings.content_type = POST Content Type
settings.secret = Secret settings.secret = Secret
@ -1097,6 +1124,7 @@ settings.protected_branch_deletion_desc = Disabling branch protection allows use
settings.default_branch_desc = Select a default repository branch for pull requests and code commits: settings.default_branch_desc = Select a default repository branch for pull requests and code commits:
settings.choose_branch = Choose a branch… settings.choose_branch = Choose a branch…
settings.no_protected_branch = There are no protected branches. settings.no_protected_branch = There are no protected branches.
settings.edit_protected_branch = Edit
diff.browse_source = Browse Source diff.browse_source = Browse Source
diff.parent = parent diff.parent = parent
@ -1167,6 +1195,8 @@ branch.protected_deletion_failed = Branch '%s' is protected. It cannot be delete
topic.manage_topics = Manage Topics topic.manage_topics = Manage Topics
topic.done = Done topic.done = Done
topic.count_prompt = You can not select more than 25 topics
topic.format_prompt = Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
[org] [org]
org_name_holder = Organization Name org_name_holder = Organization Name
@ -1271,8 +1301,8 @@ dashboard.operation_switch = Switch
dashboard.operation_run = Run dashboard.operation_run = Run
dashboard.clean_unbind_oauth = Clean unbound OAuth connections dashboard.clean_unbind_oauth = Clean unbound OAuth connections
dashboard.clean_unbind_oauth_success = All unbound OAuth connections have been deleted. dashboard.clean_unbind_oauth_success = All unbound OAuth connections have been deleted.
dashboard.delete_inactivate_accounts = Delete all inactive accounts dashboard.delete_inactivate_accounts = Delete all unactivated accounts
dashboard.delete_inactivate_accounts_success = All inactive accounts have been deleted. dashboard.delete_inactivate_accounts_success = All unactivated accounts have been deleted.
dashboard.delete_repo_archives = Delete all repository archives dashboard.delete_repo_archives = Delete all repository archives
dashboard.delete_repo_archives_success = All repository archives have been deleted. dashboard.delete_repo_archives_success = All repository archives have been deleted.
dashboard.delete_missing_repos = Delete all repositories missing their Git files dashboard.delete_missing_repos = Delete all repositories missing their Git files
@ -1480,7 +1510,7 @@ config.db_path = Path
config.service_config = Service Configuration config.service_config = Service Configuration
config.register_email_confirm = Require Email Confirmation to Register config.register_email_confirm = Require Email Confirmation to Register
config.disable_register = Disable Self-Registration config.disable_register = Disable Self-Registration
config.allow_only_external_registration = Enable the registration only through external services config.allow_only_external_registration = Allow Registration Only Through External Services
config.enable_openid_signup = Enable OpenID Self-Registration config.enable_openid_signup = Enable OpenID Self-Registration
config.enable_openid_signin = Enable OpenID Sign-In config.enable_openid_signin = Enable OpenID Sign-In
config.show_registration_button = Show Register Button config.show_registration_button = Show Register Button
@ -1496,6 +1526,7 @@ config.enable_timetracking = Enable Time Tracking
config.default_enable_timetracking = Enable Time Tracking by Default config.default_enable_timetracking = Enable Time Tracking by Default
config.default_allow_only_contributors_to_track_time = Let Only Contributors Track Time config.default_allow_only_contributors_to_track_time = Let Only Contributors Track Time
config.no_reply_address = Hidden Email Domain config.no_reply_address = Hidden Email Domain
config.default_enable_dependencies = Enable Issue Dependencies by Default
config.webhook_config = Webhook Configuration config.webhook_config = Webhook Configuration
config.queue_length = Queue Length config.queue_length = Queue Length

View File

@ -1,11 +1,15 @@
app_desc=Un servicio de Git auto alojado y sin complicaciones
home=Inicio home=Inicio
dashboard=Panel de control dashboard=Panel de control
explore=Explorar explore=Explorar
help=Ayuda help=Ayuda
sign_in=Iniciar sesión sign_in=Iniciar sesión
sign_in_with=Iniciar sesión con
sign_out=Cerrar sesión sign_out=Cerrar sesión
sign_up=Registro
link_account=Vincular Cuenta link_account=Vincular Cuenta
link_account_signin_or_signup=Inicia sesión con credenciales existentes para vincular tu cuenta a esta cuenta. O registra una nueva.
register=Registro register=Registro
website=Página web website=Página web
version=Versión version=Versión
@ -13,12 +17,22 @@ page=Página
template=Plantilla template=Plantilla
language=Idioma language=Idioma
notifications=Notificaciones notifications=Notificaciones
create_new=Crear…
user_profile_and_more=Perfil y ajustes…
signed_in_as=Identificado como signed_in_as=Identificado como
enable_javascript=Este sitio web funciona mejor con JavaScript.
username=Nombre de usuario username=Nombre de usuario
email=Correo electrónico
password=Contraseña password=Contraseña
re_type=Vuelva a escribir la contraseña
captcha=CAPTCHA
twofa=Autenticación de dos factores
passcode=Contraseña passcode=Contraseña
u2f_insert_key=Inserte su clave de seguridad
u2f_use_twofa=Use un código de dos factores de su celular
u2f_reload=Recargar
repository=Repositorio repository=Repositorio
organization=Organización organization=Organización
@ -31,6 +45,9 @@ new_org=Nueva organización
manage_org=Administrar organizaciones manage_org=Administrar organizaciones
account_settings=Configuraciones de la cuenta account_settings=Configuraciones de la cuenta
settings=Configuraciones settings=Configuraciones
your_profile=Perfil
your_starred=Destacado
your_settings=Configuración
all=Todos all=Todos
sources=Fuentes sources=Fuentes
@ -46,29 +63,63 @@ cancel=Cancelar
[install] [install]
install=Instalación install=Instalación
title=Configuración inicial
requite_db_desc=Gitea requiere una base de datos MySQL, PostgreSQL, MSSQL, SQLite3 o TiDB.
db_title=Configuración de base de datos db_title=Configuración de base de datos
db_type=Tipo de base de datos db_type=Tipo de base de datos
host=Servidor host=Servidor
user=Nombre de usuario
password=Contraseña password=Contraseña
db_name=Nombre de la base de datos db_name=Nombre de la base de datos
db_helper=Nota para usuarios de la base de datos MySQL: por favor use el motor InnoDB y el esquema de caracteres 'utf8_general_ci'.
ssl_mode=SSL
path=Ruta path=Ruta
general_title=Configuración general
app_name=Título del Sitio
app_name_helper=Puedes colocar aquí el nombre de tu empresa.
repo_path=Ruta del repositorio de Raiz (Root) repo_path=Ruta del repositorio de Raiz (Root)
run_user=Ejecutar como usuario
domain=Dominio del servidor SSH
log_root_path=Ruta del registro log_root_path=Ruta del registro
optional_title=Configuración opcional optional_title=Configuración opcional
email_title=Configuración de Correo
smtp_host=Servidor SMTP smtp_host=Servidor SMTP
mailer_user=Nombre de usuario SMTP
mailer_password=Contraseña SMTP
offline_mode=Habilitar autenticación Local
disable_gravatar=Desactivar Gravatar
federated_avatar_lookup_popup=Habilitar búsqueda de avatares federador para usar el servicio federado de código abierto basado en libravatar. federated_avatar_lookup_popup=Habilitar búsqueda de avatares federador para usar el servicio federado de código abierto basado en libravatar.
enable_captcha=Activar CAPTCHA
enable_captcha_popup=Requerir CAPTCHA para auto-registro de usuario. enable_captcha_popup=Requerir CAPTCHA para auto-registro de usuario.
require_sign_in_view=Debes iniciar sesión para ver las páginas
admin_password=Contraseña admin_password=Contraseña
confirm_password=Confirmar Contraseña confirm_password=Confirmar Contraseña
admin_email=Correo electrónico
install_btn_confirm=Instalar Gitea install_btn_confirm=Instalar Gitea
test_git_failed=Fallo al probar el comando 'git': %v test_git_failed=Fallo al probar el comando 'git': %v
invalid_db_setting=La configuración de la base de datos no es válida: %v
invalid_repo_path=La ruta de la raíz del repositorio no es válida: %v
run_user_not_match=El nombre de usuario 'ejecutar como' no es el nombre actual de usuario: %s -> %s
save_config_failed=Error al guardar la configuración: %v save_config_failed=Error al guardar la configuración: %v
invalid_admin_setting=La configuración de la cuenta de administración no es válida: %v
install_success=¡Bienvenido! Gracias por elegir Gitea. ¡Diviértete y cuidate!
invalid_log_root_path=La ruta para los registros no es válida: %v
default_keep_email_private=Ocultar direcciones de correo electrónico por defecto
default_keep_email_private_popup=Ocultar direcciones de correo electrónico de nuevas cuentas de usuario por defecto.
default_allow_create_organization=Permitir la creación de organizaciones por defecto
default_allow_create_organization_popup=Permitir crear organizaciones a las nuevas cuentas de usuario de forma predeterminada.
default_enable_timetracking=Activar el seguimiento de tiempo por defecto
default_enable_timetracking_popup=Activar el seguimiento de tiempo para nuevos repositorios por defecto.
no_reply_address=Dominio de correos electrónicos ocultos
[home] [home]
uname_holder=Nombre de usuario o correo electrónico
password_holder=Contraseña password_holder=Contraseña
switch_dashboard_context=Cambiar el contexto del Dashboard switch_dashboard_context=Cambiar el contexto del Dashboard
my_repos=Repositorios
show_more_repos=Mostrar más repositorios…
collaborative_repos=Repositorios colaborativos collaborative_repos=Repositorios colaborativos
my_orgs=Mis organizaciones my_orgs=Mis organizaciones
my_mirrors=Mis réplicas my_mirrors=Mis réplicas
@ -81,28 +132,46 @@ repos=Repositorios
users=Usuarios users=Usuarios
organizations=Organizaciones organizations=Organizaciones
search=Buscar search=Buscar
code=Código
repo_no_results=No se ha encontrado ningún repositorio coincidente.
user_no_results=No se ha encontrado ningún usuario coincidente.
org_no_results=No se ha encontrado ninguna organización coincidente.
code_no_results=No se ha encontrado código de fuente que coincida con su término de búsqueda.
code_search_results=Resultados de búsqueda para '%s'
[auth] [auth]
create_new_account=Registrar una cuenta
register_helper_msg=¿Ya tienes una cuenta? ¡Inicia sesión! register_helper_msg=¿Ya tienes una cuenta? ¡Inicia sesión!
social_register_helper_msg=¿Ya tienes una cuenta? ¡Enlázala!
disable_register_prompt=Registro deshabilitado. Por favor, póngase en contacto con el administrador del sitio.
disable_register_mail=Correo electrónico de confirmación de registro deshabilitado.
remember_me=Recuérdame remember_me=Recuérdame
forgot_password_title=He olvidado mi contraseña forgot_password_title=He olvidado mi contraseña
forgot_password=¿Has olvidado tu contraseña? forgot_password=¿Has olvidado tu contraseña?
sign_up_now=¿Necesitas una cuenta? Regístrate ahora.
confirmation_mail_sent_prompt=Un nuevo correo de confirmación se ha enviado a <b>%s</b>. Comprueba tu bandeja de entrada en las siguientes %s para completar el registro. confirmation_mail_sent_prompt=Un nuevo correo de confirmación se ha enviado a <b>%s</b>. Comprueba tu bandeja de entrada en las siguientes %s para completar el registro.
reset_password_mail_sent_prompt=Un correo de confirmación se ha enviado a <b>%s</b>. Comprueba tu bandeja de entrada en las siguientes %s para completar el reinicio de contraseña. reset_password_mail_sent_prompt=Un correo de confirmación se ha enviado a <b>%s</b>. Comprueba tu bandeja de entrada en las siguientes %s para completar el reinicio de contraseña.
active_your_account=Activa tu cuenta active_your_account=Activa tu cuenta
prohibit_login=Ingreso prohibido
prohibit_login_desc=Su cuenta tiene prohibido ingresar al sistema. Por favor contacte con el administrador del sistema.
resent_limit_prompt=Ya ha solicitado recientemente un correo de activación. Por favor, espere 3 minutos y vuelva a intentarlo.
has_unconfirmed_mail=Hola %s, tu correo electrónico (<b>%s</b>) no está confirmado. Si no has recibido un correo de confirmación o necesitas que lo enviemos de nuevo, por favor, haz click en el siguiente botón. has_unconfirmed_mail=Hola %s, tu correo electrónico (<b>%s</b>) no está confirmado. Si no has recibido un correo de confirmación o necesitas que lo enviemos de nuevo, por favor, haz click en el siguiente botón.
resend_mail=Haz click aquí para reenviar tu correo electrónico de activación resend_mail=Haz click aquí para reenviar tu correo electrónico de activación
email_not_associate=Esta dirección de correo electrónico no esta asociada a ninguna cuenta. email_not_associate=Esta dirección de correo electrónico no esta asociada a ninguna cuenta.
send_reset_mail=Haz clic aquí para reenviar tu email de restauración de contraseña send_reset_mail=Haz clic aquí para reenviar tu email de restauración de contraseña
reset_password=Restablecer su contraseña reset_password=Restablecer su contraseña
invalid_code=Su código de confirmación no es válido o ha caducado.
reset_password_helper=Haga Clic aquí para restablecer su contraseña reset_password_helper=Haga Clic aquí para restablecer su contraseña
non_local_account=Los usuarios no locales no pueden actualizar su contraseña a través de la interfaz web de Gitea.
verify=Verificar verify=Verificar
twofa_scratch_used=Ya has utilizado el código. Has sido redirigido a la página de configuración de dos factores poder remover la inscripción del dispositivo o generar un nuevo código. twofa_scratch_used=Ya has utilizado el código. Has sido redirigido a la página de configuración de dos factores poder remover la inscripción del dispositivo o generar un nuevo código.
twofa_scratch_token_incorrect=El código cero es incorrecto. twofa_scratch_token_incorrect=El código cero es incorrecto.
login_userpass=Iniciar sesión
login_openid=OpenID login_openid=OpenID
openid_connect_submit=Conectar openid_connect_submit=Conectar
openid_connect_title=Accede con una cuenta existente openid_connect_title=Accede con una cuenta existente
openid_register_title=Crear una nueva cuenta openid_register_title=Crear una nueva cuenta
disable_forgot_password_mail=El restablecimiento de contraseña está desactivado. Por favor, contacte con el administrador del sitio.
[mail] [mail]
activate_account=Por favor, active su cuenta activate_account=Por favor, active su cuenta
@ -114,12 +183,14 @@ register_notify=¡Bienvenido a Gitea
[modal] [modal]
yes= yes=
no=No no=No
modify=Actualizar
[form] [form]
UserName=Nombre de usuario UserName=Nombre de usuario
RepoName=Nombre del repositorio RepoName=Nombre del repositorio
Email=Dirección de correo electrónico Email=Dirección de correo electrónico
Password=Contraseña Password=Contraseña
Retype=Vuelva a escribir la contraseña
SSHTitle=Nombre de la Clave de SSH SSHTitle=Nombre de la Clave de SSH
HttpsUrl=URL HTTPS HttpsUrl=URL HTTPS
PayloadUrl=URL de carga PayloadUrl=URL de carga
@ -135,6 +206,7 @@ TreeName=Ruta del archivo
Content=Contenido Content=Contenido
require_error=` no puede estar vacío.` require_error=` no puede estar vacío.`
alpha_dash_error=` solo debe contener caracteres alfanuméricos, guiones medios ('-') y guiones bajos ('_').`
size_error=` debe ser de tamaño %s.` size_error=` debe ser de tamaño %s.`
min_size_error=` debe contener al menos %s caracteres.` min_size_error=` debe contener al menos %s caracteres.`
max_size_error=` debe contener como máximo %s caracteres.` max_size_error=` debe contener como máximo %s caracteres.`
@ -142,7 +214,10 @@ email_error=` no es una dirección de correo válida.`
url_error=` no es una URL válida.` url_error=` no es una URL válida.`
include_error=` debe contener la subcadena '%s'.` include_error=` debe contener la subcadena '%s'.`
unknown_error=Error desconocido: unknown_error=Error desconocido:
captcha_incorrect=El código CAPTCHA no es correcto.
password_not_match=Las contraseñas no coinciden.
username_been_taken=El nombre de usuario ya está en uso.
user_not_exist=Este usuario no existe. user_not_exist=Este usuario no existe.
auth_failed=Autenticación fallo: %v auth_failed=Autenticación fallo: %v
@ -248,6 +323,7 @@ fork_from=Crear un Fork desde
repo_desc=Descripción repo_desc=Descripción
repo_lang=Idioma repo_lang=Idioma
license=Licencia license=Licencia
auto_init=Inicializar el repositorio (añade .gitignore, licencia y README)
create_repo=Crear repositorio create_repo=Crear repositorio
default_branch=Rama por defecto default_branch=Rama por defecto
mirror_prune=Purgar mirror_prune=Purgar
@ -343,8 +419,8 @@ issues.label_templates.helper=Seleccionar un conjunto de etiquetas
issues.label_templates.fail_to_load_file=Error al cargar el archivo de plantilla de etiqueta '%s': %v issues.label_templates.fail_to_load_file=Error al cargar el archivo de plantilla de etiqueta '%s': %v
issues.add_label_at=añadida la etiqueta <div class="ui label" style="color: %s\; background-color: %s">%s</div> %s issues.add_label_at=añadida la etiqueta <div class="ui label" style="color: %s\; background-color: %s">%s</div> %s
issues.remove_label_at=eliminada la etiqueta <div class="ui label" style="color: %s\; background-color: %s">%s</div> %s issues.remove_label_at=eliminada la etiqueta <div class="ui label" style="color: %s\; background-color: %s">%s</div> %s
issues.add_milestone_at=`agregado esto al <b>%s</b> hito %s ' issues.add_milestone_at=`ha añadido esto al hito <b>%s</b> %s '
issues.change_milestone_at=` modificó el hito de <b>%s</b> to <b>%s</b> %s` issues.change_milestone_at=`modificó el hito de <b>%s</b> a <b>%s</b> %s`
issues.remove_milestone_at=`eliminado esto del <b>%s</b> hito %s ' issues.remove_milestone_at=`eliminado esto del <b>%s</b> hito %s '
issues.deleted_milestone=`(eliminado)` issues.deleted_milestone=`(eliminado)`
issues.self_assign_at=`auto asignado este %s` issues.self_assign_at=`auto asignado este %s`
@ -411,6 +487,8 @@ issues.attachment.open_tab='Haga clic para ver "%s" en una pestaña nueva'
issues.attachment.download=`Haga clic para descargar "%s"` issues.attachment.download=`Haga clic para descargar "%s"`
issues.subscribe=Suscribir issues.subscribe=Suscribir
issues.unsubscribe=Desuscribirse issues.unsubscribe=Desuscribirse
issues.start_tracking_short=Iniciar
issues.start_tracking_history=`ha empezado a trabajar %s`
issues.tracking_already_started='Ya has comenzado el tiempo de seguimiento en este <a href="%s">tema</a>!' issues.tracking_already_started='Ya has comenzado el tiempo de seguimiento en este <a href="%s">tema</a>!'
issues.add_time_hours=Horas issues.add_time_hours=Horas
issues.add_time_minutes=Minutos issues.add_time_minutes=Minutos
@ -461,6 +539,8 @@ wiki.page_already_exists=Ya existe una página con el mismo nombre.
wiki.pages=Páginas wiki.pages=Páginas
wiki.last_updated=Última actualización %s wiki.last_updated=Última actualización %s
activity=Actividad
activity.period.filter_label=Periodo:
activity.period.daily=1 día activity.period.daily=1 día
activity.period.halfweekly=3 días activity.period.halfweekly=3 días
activity.period.weekly=1 semana activity.period.weekly=1 semana
@ -503,6 +583,7 @@ settings.new_owner_has_same_repo=El nuevo propietario tiene un repositorio con e
settings.transfer=Transferir la propiedad settings.transfer=Transferir la propiedad
settings.delete=Eliminar este repositorio settings.delete=Eliminar este repositorio
settings.delete_notices_1=- Esta operación <strong>NO PUEDE</strong> revertirse. settings.delete_notices_1=- Esta operación <strong>NO PUEDE</strong> revertirse.
settings.delete_notices_fork_1=Los forks de este repositorio serán independientes después de eliminarlo.
settings.transfer_owner=Nuevo Propietario settings.transfer_owner=Nuevo Propietario
settings.add_webhook=Añadir Webhook settings.add_webhook=Añadir Webhook
settings.webhook.test_delivery=Test de entrega settings.webhook.test_delivery=Test de entrega
@ -531,6 +612,7 @@ settings.deploy_keys=Claves de Despliegue
settings.add_deploy_key=Añadir Clave de Despliegue settings.add_deploy_key=Añadir Clave de Despliegue
settings.title=Título settings.title=Título
settings.deploy_key_content=Contenido settings.deploy_key_content=Contenido
settings.protect_merge_whitelist_committers_desc=Permitir a los usuarios o equipos de la lista a fusionar peticiones pull dentro de esta rama.
settings.add_protected_branch=Activar protección settings.add_protected_branch=Activar protección
settings.delete_protected_branch=Desactivar protección settings.delete_protected_branch=Desactivar protección
@ -574,6 +656,7 @@ branch.create_from=desde '%s'
branch.branch_already_exists=La rama '%s' ya existe en este repositorio. branch.branch_already_exists=La rama '%s' ya existe en este repositorio.
branch.deleted_by=Eliminada por %s branch.deleted_by=Eliminada por %s
topic.done=Hecho
[org] [org]
org_name_holder=Nombre de la organización org_name_holder=Nombre de la organización
@ -613,6 +696,7 @@ teams.join=Unirse
teams.leave=Abandonar teams.leave=Abandonar
teams.read_access=Acceso de Lectura teams.read_access=Acceso de Lectura
teams.write_access=Acceso de Escritura teams.write_access=Acceso de Escritura
teams.admin_access_helper=Los miembros pueden hacer pull y push a los repositorios del equipo y añadir colaboradores a ellos.
teams.no_desc=Este equipo no tiene descripción teams.no_desc=Este equipo no tiene descripción
teams.settings=Configuración teams.settings=Configuración
teams.members=Miembros del equipo teams.members=Miembros del equipo
@ -638,8 +722,7 @@ dashboard.operation_name=Nombre de la operación
dashboard.operation_switch=Interruptor dashboard.operation_switch=Interruptor
dashboard.operation_run=Ejecutar dashboard.operation_run=Ejecutar
dashboard.clean_unbind_oauth_success=Se han eliminado las conexiones de OAuth no vinculadas. dashboard.clean_unbind_oauth_success=Se han eliminado las conexiones de OAuth no vinculadas.
dashboard.delete_inactivate_accounts=Eliminar todas las cuentas inactivas dashboard.resync_all_sshkeys=Actualizar el archivo '.ssh/authorized_keys' con las claves SSH de Gitea (no es necesario para el servidor SSH incorporado).
dashboard.delete_inactivate_accounts_success=Todas las cuentas inactivas han sido eliminadas.
dashboard.reinit_missing_repos=Reiniciar todos los repositorios Git faltantes de los que existen registros dashboard.reinit_missing_repos=Reiniciar todos los repositorios Git faltantes de los que existen registros
dashboard.reinit_missing_repos_success=Todos los repositorios Git faltantes para los que existen registros se han reinicializado. dashboard.reinit_missing_repos_success=Todos los repositorios Git faltantes para los que existen registros se han reinicializado.
dashboard.server_uptime=Tiempo de actividad del servidor dashboard.server_uptime=Tiempo de actividad del servidor
@ -859,6 +942,7 @@ file_too_big=El tamaño del archivo ({{filesize}} MB) excede el tamaño máximo
remove_file=Eliminar archivo remove_file=Eliminar archivo
[notification] [notification]
notifications=Notificaciones
unread=Sin leer unread=Sin leer
read=Leídas read=Leídas
mark_as_read=Marcar como leído mark_as_read=Marcar como leído

View File

@ -1,10 +1,15 @@
app_desc=Ongelmaton, itsehostattu Git-palvelu
home=Etusivu home=Etusivu
dashboard=Kojelauta dashboard=Kojelauta
explore=Tutki explore=Tutki
help=Apua help=Apua
sign_in=Kirjaudu sisään sign_in=Kirjaudu sisään
sign_in_with=Kirjaudu sisään tunnuksilla
sign_out=Kirjaudu ulos sign_out=Kirjaudu ulos
sign_up=Rekisteröidy
link_account=Yhdistä tili
link_account_signin_or_signup=Kirjaudu sisään olemassaolevilla tunnuksilla yhdistääksesi tilisi käyttäjätunnukseen. Tai rekisteröi uusi käyttäjätunnus.
register=Rekisteröidy register=Rekisteröidy
website=Nettisivut website=Nettisivut
version=Versio version=Versio
@ -12,10 +17,18 @@ page=Sivu
template=Malli template=Malli
language=Kieli language=Kieli
notifications=Ilmoitukset notifications=Ilmoitukset
create_new=Luo…
user_profile_and_more=Profiili ja asetukset…
signed_in_as=Kirjautuneena käyttäjänä signed_in_as=Kirjautuneena käyttäjänä
enable_javascript=Tämä sivusto toimii paremmin JavaScriptillä.
username=Käyttäjätunnus username=Käyttäjätunnus
email=Sähköpostiosoite
password=Salasana password=Salasana
re_type=Kirjoita salasana uudelleen
captcha=CAPTCHA
twofa=Kaksivaiheinen todennus
twofa_scratch=Kaksivaiheinen kertakäyttöinen koodi
passcode=Tunnuskoodi passcode=Tunnuskoodi
@ -25,11 +38,21 @@ mirror=Peili
new_repo=Uusi repo new_repo=Uusi repo
new_migrate=Uusi migraatio new_migrate=Uusi migraatio
new_mirror=Uusi peilaus new_mirror=Uusi peilaus
new_fork=Uusi repositorio
new_org=Uusi organisaatio new_org=Uusi organisaatio
manage_org=Ylläpidä organisaatioita manage_org=Ylläpidä organisaatioita
admin_panel=Sivuston ylläpito
account_settings=Tilin asetukset account_settings=Tilin asetukset
settings=Asetukset settings=Asetukset
your_profile=Profiili
your_starred=Tähdelliset
your_settings=Asetukset
all=Kaikki
sources=Lähteet
mirrors=Peilit
collaborative=Yhteistyössä
forks=Haarat
activities=Toimet activities=Toimet
pull_requests=Pull requestit pull_requests=Pull requestit
@ -39,19 +62,59 @@ cancel=Peruuta
[install] [install]
install=Asennus install=Asennus
title=Alkuperäiset asetukset
requite_db_desc=Gitea tarvitsee toimiakseen MySQL-, PostgreSQL-, MSSQL-, SQLite3 tai TiDB-tietokannan.
db_title=Tietokanta asetukset db_title=Tietokanta asetukset
db_type=Tietokanta tyyppi db_type=Tietokanta tyyppi
host=Isäntä host=Isäntä
user=Käyttäjätunnus
password=Salasana password=Salasana
db_name=Tietokannan nimi db_name=Tietokannan nimi
db_helper=Huomio MySQL-käyttäjille: käytäthän InnoDB-kantamoottoria ja 'utf8_general_ci'-merkistöä.
ssl_mode=SSL
path=Polku path=Polku
sqlite_helper=Tiedostopolku SQLite3- tai TiDB-tietokantaan.<br>Kirjoita absoluuttinen polku, jos ajat Giteaa palveluna.
err_empty_db_path=SQLite3- tai TiDB-tietokantapolku ei voi olla tyhjä.
err_invalid_tidb_name=TiDB-tietokannan nimi ei voi sisältää '.'- tai '-'-merkkejä.
no_admin_and_disable_registration=Et voi kytkeä rekisteröintiä pois luomatta sitä ennen ylläpitotiliä.
err_empty_admin_password=Ylläpitäjän salasana ei voi olla tyhjä.
general_title=Yleiset asetukset
app_name=Sivuston otsikko
repo_path=Repon juuren polku repo_path=Repon juuren polku
repo_path_helper=Muualla olevat git-repositoriot tullaan tallentamaan tähän kansioon.
lfs_path=Git LFS -juuripolku
lfs_path_helper=Git LFS:n ylläpitämät tiedostot tullaan tallentamaan tähän hakemistoon. Jätä tyhjäksi kytkeäksesi toiminnon pois.
run_user=Aja käyttäjänä
run_user_helper=Anna käyttäjätunnus, jona Giteaa ajetaan. Käyttäjällä on oltava oikeudet repositorioiden juuripolkuun.
domain=SSH-palvelimen osoite (hostname)
domain_helper=Domain tai osoite SSH-klooniosoitteille.
ssh_port=SSH-palvelimen portti
ssh_port_helper=Porttinumero, jossa SSH-palvelimesi kuuntelee. Jätä tyhjäksi kytkeäksesi pois.
http_port=Gitean HTTP-kuunteluportti
http_port_helper=Portti, jossa Gitean web-palvelin kuuntelee.
app_url=Gitean juuriosoite
app_url_helper=Juuriosoite HTTP(S)-klooniosoitteille ja sähköpostimuistutuksille.
log_root_path=Lokin polku log_root_path=Lokin polku
log_root_path_helper=Lokitiedostot kirjoitetaan tähän kansioon.
optional_title=Valinnaiset asetukset optional_title=Valinnaiset asetukset
email_title=Sähköpostiasetukset
smtp_host=SMTP isäntä smtp_host=SMTP isäntä
smtp_from=Lähetä sähköpostit osoitteella
smtp_from_helper=Sähköpostiosoite, jota Gitea käyttää. Kirjoita osoite ”nimi” <email@example.com> -muodossa.
mailer_user=SMTP-käyttäjätunnus
mailer_password=SMTP-salasana
register_confirm=Vaadi sähköpostin vahvistaminen rekisteröintiin
mail_notify=Ota käyttöön sähköpostiilmoitukset
server_service_title=Palvelin ja kolmansien osapuolten palveluiden asetukset
offline_mode=Ota käyttöön lokaali tila
offline_mode_popup=Poista kolmannen osapuolen sisällöstä jakeluverkot ja tarjoa kaikki resurssit paikallisesti.
disable_gravatar=Poista Gravatar käytöstä
disable_gravatar_popup=Poista Gravatar ja kolmannen osapuolen avaratir käytöstä. Oletus-avatar näytetään, ellei käyttäjä ole ladannut omaansa.
federated_avatar_lookup=Käytä ulkopuolisia profiilikuvia
federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar.
disable_registration=Poista rekisteröinti käytöstä
enable_captcha_popup=Pakollinen captcha käyttäjän itse rekisteröityessä. enable_captcha_popup=Pakollinen captcha käyttäjän itse rekisteröityessä.
admin_password=Salasana admin_password=Salasana
confirm_password=Varmista salasana confirm_password=Varmista salasana
@ -73,32 +136,69 @@ repos=Repot
users=Käyttäjät users=Käyttäjät
organizations=Organisaatiot organizations=Organisaatiot
search=Hae search=Hae
code_no_results=Hakuehtoasi vastaavaa lähdekoodia ei löytynyt.
code_search_results=Hakutulokset: '%s '
[auth] [auth]
create_new_account=Rekisteröi tili
register_helper_msg=On jo tili? Kirjaudu sisään nyt! register_helper_msg=On jo tili? Kirjaudu sisään nyt!
social_register_helper_msg=Onko sinulla jo tili? Linkitä se nyt!
disable_register_prompt=Rekisteröinti on estetty. Ota yhteys ylläpitäjääsi.
disable_register_mail=Sähköpostivahvistus rekisteröinnille on estetty.
remember_me=Muista minut remember_me=Muista minut
forgot_password_title=Unohtuiko salasana
forgot_password=Unohtuiko salasana?
sign_up_now=Tarvitsetko tilin? Rekisteröidy nyt.
confirmation_mail_sent_prompt=Uusi varmistussähköposti on lähetetty osoitteeseen <b>%s</b>, ole hyvä ja tarkista saapuneet seuraavan %s tunnin sisällä saadaksesi rekisteröintiprosessin valmiiksi.
reset_password_mail_sent_prompt=Varmistussähköposti on lähetetty osoitteeseen <b>%s</b>, ole hyvä ja tarkista saapuneet seuraavan %s tunnin sisällä saadaksesi salasananvaihdon valmiiksi.
active_your_account=Aktivoi tilisi active_your_account=Aktivoi tilisi
prohibit_login=Kirjautuminen estetty
prohibit_login_desc=Käyttäjätilisi kirjautuminen on estetty. Ota yhteys sivuston ylläpitäjään.
resent_limit_prompt=Olet jo tilannut aktivointisähköpostin hetki sitten. Ole hyvä ja odota 3 minuuttia ja yritä sitten uudelleen.
has_unconfirmed_mail=Hei %s, sinulla on varmistamaton sähköposti osoite (<b>%s</b>). Jos et ole saanut varmistus sähköpostia tai tarvitset uudelleenlähetyksen, ole hyvä ja klikkaa allaolevaa painiketta. has_unconfirmed_mail=Hei %s, sinulla on varmistamaton sähköposti osoite (<b>%s</b>). Jos et ole saanut varmistus sähköpostia tai tarvitset uudelleenlähetyksen, ole hyvä ja klikkaa allaolevaa painiketta.
resend_mail=Klikkaa tästä uudelleenlähettääksesi aktivointi sähköpostisi resend_mail=Klikkaa tästä uudelleenlähettääksesi aktivointi sähköpostisi
email_not_associate=Tätä sähköpostiosoitetta ei ole liitetty mihinkään tiliin.
send_reset_mail=Klikkaa tästä (uudelleen) lähettääksesi salasanan nollaussähköpostin
reset_password=Nollaa salasanasi reset_password=Nollaa salasanasi
invalid_code=Vahvistusavain on virheellinen tai vanhentunut.
reset_password_helper=Klikkaa tästä nollataksesi salasanasi reset_password_helper=Klikkaa tästä nollataksesi salasanasi
non_local_account=Ei-lokaalit käyttäjät eivät voi päivittää salasanojaan Gitean web-käyttöliittymän kautta.
verify=Vahvista verify=Vahvista
scratch_code=Kertakäyttökoodi
use_scratch_code=Käytä kertakäyttökoodia
twofa_scratch_used=Olet käyttänyt kertakäyttökoodisi. Sinut on uudelleenohjattu kaksivaiheisen kirjautumisen asetussivulle, jotta voit kytkeä sen pois tai luoda uuden kertakäyttökoodin.
twofa_passcode_incorrect=Salasanasi on väärä. Jos olet hukannut laitteesi, käytäthän kertakäyttökoodia sisäänkirjautumiseen.
twofa_scratch_token_incorrect=Kertakäyttökoodisi on virheellinen.
login_userpass=Kirjaudu sisään
login_openid=OpenID
openid_connect_submit=Connect
openid_connect_title=Yhdistä olemassaolevaan tiliin
openid_connect_desc=Valittu OpenID-osoite on tuntematon. Liitä se uuteen tiliin täällä.
openid_register_title=Luo uusi tili
openid_register_desc=Valittu OpenID-osoite on tuntematon. Liitä se uuteen tiliin täällä.
openid_signin_desc=Anna OpenID-osoitteesi. Esimerkiksi: https://anne.me, bob.openid.org.cn tai gnusocial.net/carry.
disable_forgot_password_mail=Salasanan nollaus on estetty. Ota yhteys ylläpitäjääsi.
[mail] [mail]
activate_account=Ole hyvä ja aktivoi tilisi activate_account=Ole hyvä ja aktivoi tilisi
activate_email=Vahvista sähköpostiosoitteesi activate_email=Vahvista sähköpostiosoitteesi
reset_password=Tyhjennä salasana reset_password=Tyhjennä salasana
register_success=Rekisteröinti onnistui
register_notify=Tervetuloa Giteaan
[modal] [modal]
yes=Kyllä yes=Kyllä
no=Ei no=Ei
modify=Päivitys
[form] [form]
UserName=Käyttäjätunnus UserName=Käyttäjätunnus
RepoName=Repon nimi RepoName=Repon nimi
Email=Sähköposti osoite Email=Sähköposti osoite
Password=Salasana Password=Salasana
Retype=Kirjoita salasana uudelleen
SSHTitle=SSH avain nimi SSHTitle=SSH avain nimi
HttpsUrl=HTTPS-osoite
TeamName=Tiimin nimi TeamName=Tiimin nimi
AuthName=Luvan nimi AuthName=Luvan nimi
AdminEmail=Ylläpito sähköposti AdminEmail=Ylläpito sähköposti
@ -488,7 +588,6 @@ total=Yhteensä: %d
dashboard.operation_name=Toiminnon nimi dashboard.operation_name=Toiminnon nimi
dashboard.operation_switch=Vaihda dashboard.operation_switch=Vaihda
dashboard.operation_run=Suorita dashboard.operation_run=Suorita
dashboard.delete_inactivate_accounts=Poista kaikki passiiviset tunnukset
dashboard.server_uptime=Palvelimen Uptime dashboard.server_uptime=Palvelimen Uptime
dashboard.current_goroutine=Nykyiset Goroutinet dashboard.current_goroutine=Nykyiset Goroutinet
dashboard.current_memory_usage=Nykyinen muistinkäyttö dashboard.current_memory_usage=Nykyinen muistinkäyttö

File diff suppressed because it is too large Load Diff

View File

@ -708,8 +708,6 @@ dashboard.operation_switch=Váltás
dashboard.operation_run=Futtatás dashboard.operation_run=Futtatás
dashboard.clean_unbind_oauth=Megszüntetett OAuth kapcsolatok törlése dashboard.clean_unbind_oauth=Megszüntetett OAuth kapcsolatok törlése
dashboard.clean_unbind_oauth_success=Az összes megszüntetett OAuth kapcsolat törölve. dashboard.clean_unbind_oauth_success=Az összes megszüntetett OAuth kapcsolat törölve.
dashboard.delete_inactivate_accounts=Minden inaktív fiók törlése
dashboard.delete_inactivate_accounts_success=Minden inaktív fiók törölve.
dashboard.reinit_missing_repos=Az összes Git tároló újra-inicializálása amihez léteznek bejegyzések dashboard.reinit_missing_repos=Az összes Git tároló újra-inicializálása amihez léteznek bejegyzések
dashboard.reinit_missing_repos_success=Az összes Git tároló amihez létezett bejegyzés újra lett iniciaizálva. dashboard.reinit_missing_repos_success=Az összes Git tároló amihez létezett bejegyzés újra lett iniciaizálva.
dashboard.sync_external_users=Külső felhasználói adatok szinkronizálása dashboard.sync_external_users=Külső felhasználói adatok szinkronizálása

View File

@ -1,11 +1,15 @@
app_desc=Sebuah layanan Git hosting pribadi yang mudah
home=Beranda home=Beranda
dashboard=Dasbor dashboard=Dasbor
explore=Jelajahi explore=Jelajahi
help=Bantuan help=Bantuan
sign_in=Masuk sign_in=Masuk
sign_in_with=Masuk Dengan
sign_out=Keluar sign_out=Keluar
sign_up=Daftar
link_account=Tautan Akun link_account=Tautan Akun
link_account_signin_or_signup=Masuk dengan kredensial yang ada untuk menautkan akun anda yang ada ke akun ini atau daftar akun yang baru.
register=Daftar register=Daftar
website=Situs Web website=Situs Web
version=Versi version=Versi
@ -13,12 +17,24 @@ page=Halaman
template=Contoh template=Contoh
language=Bahasa language=Bahasa
notifications=Notifikasi notifications=Notifikasi
create_new=Buat…
user_profile_and_more=Profil dan Pengaturan…
signed_in_as=Masuk sebagai signed_in_as=Masuk sebagai
enable_javascript=Situs web ini bekerja lebih baik dengan JavaScript.
username=Nama Pengguna username=Nama Pengguna
email=Alamat Email
password=Kata Sandi password=Kata Sandi
re_type=Ketik Ulang Kata Sandi
captcha=CAPTCHA
twofa=Otentikasi Dua Faktor
twofa_scratch=Kode Awal Dua Faktor
passcode=Kode Akses passcode=Kode Akses
u2f_insert_key=Masukkan kunci keamanan anda
u2f_press_button=Silahkan tekan tombol pada kunci keamanan anda…
u2f_use_twofa=Menggunakan kode dua faktor dari telepon anda
u2f_reload=Muat Ulang
repository=Repositori repository=Repositori
organization=Organisasi organization=Organisasi
@ -29,8 +45,12 @@ new_mirror=Duplikat Baru
new_fork=Fork Repositori Baru new_fork=Fork Repositori Baru
new_org=Organisasi Baru new_org=Organisasi Baru
manage_org=Mengelola Organisasi manage_org=Mengelola Organisasi
admin_panel=Administrasi Situs
account_settings=Pengaturan Akun account_settings=Pengaturan Akun
settings=Pengaturan settings=Pengaturan
your_profile=Profil
your_starred=Dibintangi
your_settings=Pengaturan
all=Semua all=Semua
sources=Sumber sources=Sumber
@ -46,34 +66,85 @@ cancel=Batal
[install] [install]
install=Pemasangan install=Pemasangan
title=Konfigurasi Awal
requite_db_desc=Gitea memerlukan MySQL, PostgreSQL, MSSQL, SQLite3 atau TiDB.
db_title=Pengaturan Basis Data db_title=Pengaturan Basis Data
db_type=Tipe Basis Data db_type=Tipe Basis Data
host=Host host=Host
user=Nama Pengguna
password=Kata Sandi password=Kata Sandi
db_name=Nama Basis Data db_name=Nama Basis Data
db_helper=Catatan untuk pengguna MySQL: Gunakan mesin penyimpanan InnoDB dan karakter set 'utf8_general_ci'.
ssl_mode=SSL
path=Jalur path=Jalur
sqlite_helper=Path berkas untuk basis data SQLite3 atau TiDB.<br>Masukkan path absolut jika anda menjalankan Gitea sebagai layanan.
err_empty_db_path=Path basis data SQLite3 atau TiDB tidak boleh kosong.
err_invalid_tidb_name=Nama basis data TiDB tidak boleh berisi karakter '.' dan '-'.
no_admin_and_disable_registration=Anda tidak dapat menonaktifkan pendaftaran tanpa membuat akun admin.
err_empty_admin_password=Sandi administrator tidak boleh kosong.
general_title=Pengaturan Umum
app_name=Judul Situs
app_name_helper=Anda dapat memasukkan nama perusahaan anda di sini.
repo_path=Path Root Repositori repo_path=Path Root Repositori
repo_path_helper=Repositori Git remote akan disimpan ke direktori ini.
lfs_path=Path Akar Git LFS
lfs_path_helper=Berkas yang tersimpan dengan Git LFS akan disimpan ke direktori ini. Biarkan kosong untuk menonaktifkan LFS.
run_user=Jalankan Sebagai Nama Pengguna
run_user_helper=Masukkan nama pengguna sistem operasi yang menjalankan Gitea. Perhatikan bahwa pengguna ini harus memiliki akses ke path akar dari repositori.
domain=SSH Server Domain
domain_helper=Alamat domain atau host untuk URL klon SSH.
ssh_port=Port Server SSH
ssh_port_helper=Nomor port server SSH anda. Biarkan kosong untuk menonaktifkan.
http_port=Port HTTP Gitea
http_port_helper=Nomor port web server dimana Gitea akan berjalan.
app_url=URL Dasar Gitea
app_url_helper=Alamat dasar untuk klon URL HTTP(S) dan pemberitahuan lewat surel.
log_root_path=Path Log log_root_path=Path Log
log_root_path_helper=Berkas log akan ditulis ke direktori ini.
optional_title=Pengaturan Opsional optional_title=Pengaturan Opsional
email_title=Pengaturan Surel
smtp_host=Host SMTP smtp_host=Host SMTP
smtp_from=Kirim Surel sebagai
smtp_from_helper=Alamat surel Gitea akan digunakan. Masukkan alamat surel atau gunakan fomat "Nama" <email@example.com>.
mailer_user=Nama Pengguna SMTP
mailer_password=Sandi SMTP
register_confirm=Memerlukan Konfirmasi Surel Untuk Mendaftar
mail_notify=Aktifkan Pemberitahuan Surel
server_service_title=Server dan Pengaturan Layanan Pihak Ketiga
offline_mode=Aktifkan Mode Lokal
offline_mode_popup=Non-aktifkan jaringan pengiriman konten dari pihak ketiga dan layani semua sumber daya secara lokal.
disable_gravatar=Non-aktifkan Gravatar
federated_avatar_lookup_popup=Mengaktifkan pencarian avatar federasi menggunakan Libravatar. federated_avatar_lookup_popup=Mengaktifkan pencarian avatar federasi menggunakan Libravatar.
openid_signin=Aktifkan Login OpenID openid_signin=Aktifkan Login OpenID
openid_signup=Aktifkan Pendaftaran OpenID
openid_signup_popup=Aktifkan pendaftaran berdasarkan OpenID.
enable_captcha=Aktifkan CAPTCHA
enable_captcha_popup=Membutukan CAPTCHA untuk pendaftaran. enable_captcha_popup=Membutukan CAPTCHA untuk pendaftaran.
require_sign_in_view=Anda Harus Login untuk Melihat Halaman
admin_title=Pengaturan Akun Admin
admin_name=Nama Pengguna Admin
admin_password=Kata sandi admin_password=Kata sandi
confirm_password=Konfirmasi Kata Sandi confirm_password=Konfirmasi Kata Sandi
admin_email=Alamat Surel
install_btn_confirm=Memasang Gitea install_btn_confirm=Memasang Gitea
test_git_failed=Tidak dapat menguji perintah 'git': %v test_git_failed=Tidak dapat menguji perintah 'git': %v
sqlite3_not_available=Gitea versi ini tidak mendukung SQLite3, Silahkan untuh versi biner resmi dari %s (bukan versi 'gobuild').
invalid_db_setting=Pengaturan basis data tidak valid: %v
save_config_failed=Gagal menyimpan konfigurasi: %v save_config_failed=Gagal menyimpan konfigurasi: %v
[home] [home]
uname_holder=Nama Pengguna atau Alamat Surel
password_holder=Kata Sandi password_holder=Kata Sandi
switch_dashboard_context=Alihkan Dasbor Konteks switch_dashboard_context=Alihkan Dasbor Konteks
my_repos=Repositori
show_more_repos=Tampilkan repositori lainnya…
collaborative_repos=Repositori Kolaboratif collaborative_repos=Repositori Kolaboratif
my_orgs=Organisasi Saya my_orgs=Organisasi Saya
my_mirrors=Duplikat Saya my_mirrors=Duplikat Saya
view_home=Lihat %s view_home=Lihat %s
search_repos=Cari repositori…
issues.in_your_repos=Dalam repositori anda issues.in_your_repos=Dalam repositori anda
@ -82,9 +153,16 @@ repos=Repositori
users=Pengguna users=Pengguna
organizations=Organisasi organizations=Organisasi
search=Cari search=Cari
code=Kode
repo_no_results=Tidak ditemukan repositori yang cocok.
org_no_results=Tidak ada organisasi yang cocok ditemukan.
code_no_results=Tidak ada kode sumber yang cocok dengan istilah yang anda cari.
code_search_results=Hasil pencarian untuk '%s'
[auth] [auth]
create_new_account=Daftar Akun
register_helper_msg=Sudah memiliki akun? Masuk sekarang! register_helper_msg=Sudah memiliki akun? Masuk sekarang!
social_register_helper_msg=Sudah memiliki akun? Hubungkan sekarang!
remember_me=Ingat Saya remember_me=Ingat Saya
forgot_password_title=Lupa Kata Sandi forgot_password_title=Lupa Kata Sandi
forgot_password=Lupa kata sandi? forgot_password=Lupa kata sandi?
@ -306,14 +384,17 @@ file_permalink=Permalink
stored_lfs=Tersimpan dengan GIT LFS stored_lfs=Tersimpan dengan GIT LFS
editor.preview_changes=Tinjau Perubahan editor.preview_changes=Tinjau Perubahan
editor.name_your_file=Nama berkas…
editor.or=atau editor.or=atau
editor.commit_changes=Perubahan komitmen editor.commit_changes=Perubahan komitmen
editor.add_tmpl=Tambah '%s/<filename>' editor.add_tmpl=Tambah '%s/<filename>'
editor.add=Menambah '%s' editor.add=Menambah '%s'
editor.update=Memperbarui '%s' editor.update=Memperbarui '%s'
editor.delete=Menghapus '%s' editor.delete=Menghapus '%s'
editor.commit_message_desc=Tambahkan deskripsi opsional yang panjang…
editor.commit_directly_to_this_branch=Komitmen langsung ke <strong class="branch-name">%s</strong> cabang. editor.commit_directly_to_this_branch=Komitmen langsung ke <strong class="branch-name">%s</strong> cabang.
editor.create_new_branch=Membuat <strong>new branch</strong> untuk tarik komit ini mulai permintaan. editor.create_new_branch=Membuat <strong>new branch</strong> untuk tarik komit ini mulai permintaan.
editor.new_branch_name_desc=Nama branch baru…
editor.cancel=Membatalkan editor.cancel=Membatalkan
editor.branch_already_exists=Cabang '%s' sudah ada di repositori ini. editor.branch_already_exists=Cabang '%s' sudah ada di repositori ini.
editor.no_changes_to_show=Tidak ada perubahan untuk ditampilkan. editor.no_changes_to_show=Tidak ada perubahan untuk ditampilkan.
@ -406,6 +487,7 @@ issues.edit=Sunting
issues.cancel=Batal issues.cancel=Batal
issues.save=Simpan issues.save=Simpan
issues.label_title=Nama label issues.label_title=Nama label
issues.label_description=Keterangan label
issues.label_color=Warna label issues.label_color=Warna label
issues.label_count=%d label issues.label_count=%d label
issues.label_open_issues=%d masalah terbuka issues.label_open_issues=%d masalah terbuka
@ -547,6 +629,7 @@ settings.transfer=Transfer Kepemilikan
settings.delete=Menghapus Repositori Ini settings.delete=Menghapus Repositori Ini
settings.delete_notices_1=- Operasi ini <strong>TIDAK BISA</strong> dibatalkan. settings.delete_notices_1=- Operasi ini <strong>TIDAK BISA</strong> dibatalkan.
settings.transfer_owner=Pemilik Baru settings.transfer_owner=Pemilik Baru
settings.search_user_placeholder=Cari pengguna…
settings.add_webhook=Tambahkan Webhook settings.add_webhook=Tambahkan Webhook
settings.webhook.test_delivery=Percobaan Pengiriman settings.webhook.test_delivery=Percobaan Pengiriman
settings.webhook.request=Permintaan settings.webhook.request=Permintaan
@ -584,6 +667,7 @@ settings.protected_branch_can_push_yes=Anda dapat mendorong
settings.protected_branch_can_push_no=Anda tidak dapat mendorong settings.protected_branch_can_push_no=Anda tidak dapat mendorong
settings.add_protected_branch=Aktifkan perlindungan settings.add_protected_branch=Aktifkan perlindungan
settings.delete_protected_branch=Nonaktifkan perlindungan settings.delete_protected_branch=Nonaktifkan perlindungan
settings.choose_branch=Pilih branch…
diff.browse_source=Telusuri Sumber diff.browse_source=Telusuri Sumber
diff.parent=orang tua diff.parent=orang tua
@ -612,6 +696,7 @@ release.title=Judul
release.content=Konten release.content=Konten
release.write=Menulis release.write=Menulis
release.preview=Pratinjau release.preview=Pratinjau
release.loading=Memuat…
release.cancel=Membatalkan release.cancel=Membatalkan
release.publish=Mempublikasikan Rilis release.publish=Mempublikasikan Rilis
release.save_draft=Simpan Draft release.save_draft=Simpan Draft
@ -636,6 +721,8 @@ people=Orang
teams=Tim teams=Tim
lower_members=anggota lower_members=anggota
lower_repositories=repositori lower_repositories=repositori
create_new_team=Tim Baru
create_team=Buat Tim Baru
org_desc=Deskripsi org_desc=Deskripsi
team_name=Nama tim team_name=Nama tim
team_desc=Deskripsi team_desc=Deskripsi
@ -672,6 +759,7 @@ teams.update_settings=Memperbarui pengaturan
teams.add_team_member=Tambahkan Anggota Tim teams.add_team_member=Tambahkan Anggota Tim
teams.delete_team_success=Tim sudah di hapus. teams.delete_team_success=Tim sudah di hapus.
teams.repositories=Tim repositori teams.repositories=Tim repositori
teams.search_repo_placeholder=Cari repositori…
teams.add_team_repository=Tambahkan Tim Repositori teams.add_team_repository=Tambahkan Tim Repositori
teams.remove_repo=Menghapus teams.remove_repo=Menghapus
teams.add_nonexistent_repo=Repositori yang ingin Anda tambahkan tidak ada; Silahkan buat terlebih dahulu. teams.add_nonexistent_repo=Repositori yang ingin Anda tambahkan tidak ada; Silahkan buat terlebih dahulu.
@ -692,11 +780,10 @@ dashboard.operation_switch=Beralih
dashboard.operation_run=Lari dashboard.operation_run=Lari
dashboard.clean_unbind_oauth=Bersihkan koneksi OAuth yang tidak terikat dashboard.clean_unbind_oauth=Bersihkan koneksi OAuth yang tidak terikat
dashboard.clean_unbind_oauth_success=Semua koneksi OAuth yang tidak terikat telah dihapus. dashboard.clean_unbind_oauth_success=Semua koneksi OAuth yang tidak terikat telah dihapus.
dashboard.delete_inactivate_accounts=Hapus semua akun yang tidak aktif
dashboard.delete_inactivate_accounts_success=Semua akun yang tidak aktif telah dihapus.
dashboard.reinit_missing_repos=Menginstal kembali semua repositori Git yang hilang dimana ada catatan dashboard.reinit_missing_repos=Menginstal kembali semua repositori Git yang hilang dimana ada catatan
dashboard.reinit_missing_repos_success=Semua repositori Git yang hilang yang catatannya dan telah diinisialisasi ulang. dashboard.reinit_missing_repos_success=Semua repositori Git yang hilang yang catatannya dan telah diinisialisasi ulang.
dashboard.sync_external_users=Sinkronkan data pengguna eksternal dashboard.sync_external_users=Sinkronkan data pengguna eksternal
dashboard.git_fsck=Lakukan pemeriksaan kesehatan pada semua repositori
dashboard.server_uptime=Waktu tambahan server dashboard.server_uptime=Waktu tambahan server
dashboard.current_goroutine=Goroutin saat ini dashboard.current_goroutine=Goroutin saat ini
dashboard.current_memory_usage=Penggunaan memori saat ini dashboard.current_memory_usage=Penggunaan memori saat ini
@ -709,6 +796,8 @@ dashboard.heap_memory_idle=Tumpukan memori yang menganggur
dashboard.heap_memory_in_use=Tumpukan memori yang digunakan dashboard.heap_memory_in_use=Tumpukan memori yang digunakan
dashboard.heap_memory_released=Tumpukan memori dirilis dashboard.heap_memory_released=Tumpukan memori dirilis
dashboard.heap_objects=Benda tumpukan dashboard.heap_objects=Benda tumpukan
dashboard.bootstrap_stack_usage=Penggunaan bootstrap Stack
dashboard.stack_memory_obtained=Memori Stack Didapat
dashboard.mspan_structures_usage=Penggunaan struktur MSpan dashboard.mspan_structures_usage=Penggunaan struktur MSpan
dashboard.mspan_structures_obtained=Struktur MSpan didapatkan dashboard.mspan_structures_obtained=Struktur MSpan didapatkan
dashboard.mcache_structures_usage=Penggunaan struktur MCache dashboard.mcache_structures_usage=Penggunaan struktur MCache
@ -725,6 +814,7 @@ dashboard.gc_times=Waktu GC
users.activated=Diaktifkan users.activated=Diaktifkan
users.admin=Pengelola users.admin=Pengelola
users.repos=Repo
users.created=Dibuat users.created=Dibuat
users.edit=Edit users.edit=Edit
users.auth_source=Sumber Otentikasi users.auth_source=Sumber Otentikasi
@ -795,16 +885,24 @@ config.disable_router_log=Menonaktifkan router log
config.run_mode=Jalankan mode config.run_mode=Jalankan mode
config.git_version=Versi Git config.git_version=Versi Git
config.repo_root_path=Jalur akar repositori config.repo_root_path=Jalur akar repositori
config.lfs_root_path=Path Root LFS
config.static_file_root_path=Jalur akar berkas statis config.static_file_root_path=Jalur akar berkas statis
config.script_type=Jenis skrip config.script_type=Jenis skrip
config.reverse_auth_user=Mengembalikan pengguna otentikasi config.reverse_auth_user=Mengembalikan pengguna otentikasi
config.ssh_config=Konfigurasi SSH config.ssh_config=Konfigurasi SSH
config.ssh_enabled=Aktif config.ssh_enabled=Aktif
config.ssh_port=Port
config.ssh_listen_port=Listen Port
config.ssh_root_path=Path Induk
config.ssh_key_test_path=Path Key Test
config.ssh_keygen_path=Path Keygen ('ssh-keygen')
config.ssh_minimum_key_size_check=Periksa ukuran kunci minimum config.ssh_minimum_key_size_check=Periksa ukuran kunci minimum
config.ssh_minimum_key_sizes=Ukuran kunci minimum config.ssh_minimum_key_sizes=Ukuran kunci minimum
config.db_config=Konfigurasi basis data config.db_config=Konfigurasi basis data
config.db_type=Tipe
config.db_host=Host
config.db_name=Nama config.db_name=Nama
config.db_path=Jalur config.db_path=Jalur

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +1,11 @@
app_desc=痛みのない、自己ホスト型の Git サービス
home=ホーム home=ホーム
dashboard=ダッシュボード dashboard=ダッシュボード
explore=エクスプローラ explore=エクスプローラ
help=ヘルプ help=ヘルプ
sign_in=サインイン sign_in=サインイン
sign_in_with=サインインします。
sign_out=サインアウト sign_out=サインアウト
link_account=連携アカウント link_account=連携アカウント
register=登録 register=登録
@ -706,8 +708,6 @@ dashboard.operation_switch=スイッチ
dashboard.operation_run=実行 dashboard.operation_run=実行
dashboard.clean_unbind_oauth=関連付けられていないOAuth接続を削除 dashboard.clean_unbind_oauth=関連付けられていないOAuth接続を削除
dashboard.clean_unbind_oauth_success=すべての関連付けられていないOAuth接続は削除されました。 dashboard.clean_unbind_oauth_success=すべての関連付けられていないOAuth接続は削除されました。
dashboard.delete_inactivate_accounts=非アクティブのアカウントをすべて削除
dashboard.delete_inactivate_accounts_success=すべての非アクティブなアカウントは削除されました。
dashboard.reinit_missing_repos=レコードが存在するが見当たらないすべてのGitリポジトリを再初期化する dashboard.reinit_missing_repos=レコードが存在するが見当たらないすべてのGitリポジトリを再初期化する
dashboard.reinit_missing_repos_success=レコードが存在するが見当たらないすべてのGitリポジトリが再初期化されました。 dashboard.reinit_missing_repos_success=レコードが存在するが見当たらないすべてのGitリポジトリが再初期化されました。
dashboard.sync_external_users=外部ユーザーデータの同期 dashboard.sync_external_users=外部ユーザーデータの同期

View File

@ -591,7 +591,6 @@ total=총: %d
dashboard.operation_name=작업 명 dashboard.operation_name=작업 명
dashboard.operation_switch=스위치 dashboard.operation_switch=스위치
dashboard.operation_run=실행 dashboard.operation_run=실행
dashboard.delete_inactivate_accounts=활성화되지 않은 모든 계정을 삭제합니다.
dashboard.server_uptime=서버를 켠 시간 dashboard.server_uptime=서버를 켠 시간
dashboard.current_goroutine=현재 Go루틴 dashboard.current_goroutine=현재 Go루틴
dashboard.current_memory_usage=현재 메모리 사용율 dashboard.current_memory_usage=현재 메모리 사용율

File diff suppressed because it is too large Load Diff

View File

@ -61,11 +61,17 @@ smtp_host=SMTP-vert
admin_password=Passord admin_password=Passord
[home] [home]
password_holder=Passord
[explore] [explore]
users=Brukere
[auth] [auth]
register_helper_msg=Har du allerede en konto? Logg inn nå!
remember_me=Husk meg
forgot_password_title=Glemt passord
forgot_password=Glemt passord?
[mail] [mail]

View File

@ -1,11 +1,15 @@
app_desc=Een eenvoudige, self-hosted Git service
home=Beginscherm home=Beginscherm
dashboard=Overzicht dashboard=Overzicht
explore=Verkennen explore=Verkennen
help=Help help=Help
sign_in=Inloggen sign_in=Inloggen
sign_in_with=Inloggen met
sign_out=Uitloggen sign_out=Uitloggen
sign_up=Registreren
link_account=Account Koppelen link_account=Account Koppelen
link_account_signin_or_signup=Login met een bestaande gebruikersnaam/wachtwoord om een bestaand account te koppelen aan dit account, of maak een nieuw account aan.
register=Registreren register=Registreren
website=Website website=Website
version=Versie version=Versie
@ -14,12 +18,23 @@ template=Sjabloon
language=Taal language=Taal
notifications=Meldingen notifications=Meldingen
create_new=Maken… create_new=Maken…
user_profile_and_more=Profiel en instellingen…
signed_in_as=Aangemeld als signed_in_as=Aangemeld als
enable_javascript=Deze website werkt beter met JavaScript.
username=Gebruikersnaam username=Gebruikersnaam
email=E-mail adres
password=Wachtwoord password=Wachtwoord
re_type=Typ uw wachtwoord opnieuw in
captcha=CAPTCHA
twofa=Twee factor authenticatie
twofa_scratch=Eenmalige twee factor authenticatie code
passcode=PIN passcode=PIN
u2f_insert_key=Uw beveiligingssleutel invoegen
u2f_press_button=Druk op de knop op uw beveiligingssleutel…
u2f_use_twofa=Gebruik een twee-factor code van uw telefoon
u2f_reload=Herladen
repository=Repository repository=Repository
organization=Organisatie organization=Organisatie
@ -32,6 +47,8 @@ new_org=Nieuwe organisatie
manage_org=Beheer organisaties manage_org=Beheer organisaties
account_settings=Accountinstellingen account_settings=Accountinstellingen
settings=Instellingen settings=Instellingen
your_profile=Profiel
your_settings=Instellingen
all=Alles all=Alles
sources=Bronnen sources=Bronnen
@ -47,26 +64,43 @@ cancel=Annuleren
[install] [install]
install=Installatie install=Installatie
title=Initiële configuratie
requite_db_desc=Gitea vereist MySQL, PostgreSQL, MSSQL, SQLite3 of TiDB.
db_title=Database-instellingen db_title=Database-instellingen
db_type=Database-type db_type=Database-type
host=Server host=Server
user=Gebruikersnaam
password=Wachtwoord password=Wachtwoord
db_name=Database naam db_name=Database naam
ssl_mode=SSL
path=Pad path=Pad
err_empty_db_path=Het SQLite3 of TiDB database pad mag niet leeg zijn.
err_empty_admin_password=Het administrator-wachtwoord mag niet leeg zijn.
general_title=Algemene Instellingen
app_name=Naam site
repo_path=Repositories basis map repo_path=Repositories basis map
lfs_path=Git LFS root pad
app_url=Gitea base URL
log_root_path=Log-pad log_root_path=Log-pad
optional_title=Optionele instellingen optional_title=Optionele instellingen
email_title=E-mail instellingen
smtp_host=SMTP host smtp_host=SMTP host
smtp_from=E-mails versturen als
mailer_user=SMTP gebruikersnaam
mailer_password=SMTP wachtwoord
federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar.
openid_signin=OpenID-inloggen inschakelen openid_signin=OpenID-inloggen inschakelen
enable_captcha_popup=Vereis captcha validatie voor zelf-registratie van gebruiker. enable_captcha_popup=Vereis captcha validatie voor zelf-registratie van gebruiker.
admin_name=Admin gebruikersnaam
admin_password=Wachtwoord admin_password=Wachtwoord
confirm_password=Verifieer wachtwoord confirm_password=Verifieer wachtwoord
admin_email=E-mail adres
install_btn_confirm=Installeer Gitea install_btn_confirm=Installeer Gitea
test_git_failed=Git test niet gelukt: 'git' commando %v test_git_failed=Git test niet gelukt: 'git' commando %v
save_config_failed=Kan de configuratie niet opslaan: %v save_config_failed=Kan de configuratie niet opslaan: %v
invalid_log_root_path=Ongeldig log-pad: %v
[home] [home]
password_holder=Wachtwoord password_holder=Wachtwoord
@ -95,6 +129,8 @@ forgot_password=Wachtwoord vergeten?
confirmation_mail_sent_prompt=Een nieuwe bevestigingsmail is gestuurd naar <b>%s</b>. De mail moet binnen %s worden bevestigd om je registratie te voltooien. confirmation_mail_sent_prompt=Een nieuwe bevestigingsmail is gestuurd naar <b>%s</b>. De mail moet binnen %s worden bevestigd om je registratie te voltooien.
reset_password_mail_sent_prompt=Een bevestigingsmail is gestuurd naar <b>%s</b>. De mail moet binnen %s worden bevestigd om wachtwoord reset proces te voltooien. reset_password_mail_sent_prompt=Een bevestigingsmail is gestuurd naar <b>%s</b>. De mail moet binnen %s worden bevestigd om wachtwoord reset proces te voltooien.
active_your_account=Activeer uw account active_your_account=Activeer uw account
prohibit_login=Inloggen niet toegestaan
prohibit_login_desc=Je mag met dit account niet inloggen, neem contact op met de beheerder van de site.
has_unconfirmed_mail=Beste %s, u heeft een onbevestigd e-mailadres (<b>%s</b>). Als u nog geen bevestiging heeft ontvangen, of u een nieuwe aanvraag wilt doen, klik dan op de onderstaande knop. has_unconfirmed_mail=Beste %s, u heeft een onbevestigd e-mailadres (<b>%s</b>). Als u nog geen bevestiging heeft ontvangen, of u een nieuwe aanvraag wilt doen, klik dan op de onderstaande knop.
resend_mail=Klik hier om uw activatie mail nog een keer te verzenden resend_mail=Klik hier om uw activatie mail nog een keer te verzenden
email_not_associate=Dit emailadres is niet gekoppeld aan een account. email_not_associate=Dit emailadres is niet gekoppeld aan een account.
@ -106,6 +142,7 @@ scratch_code=Eenmalige code
use_scratch_code=Gebruik een eenmalige code use_scratch_code=Gebruik een eenmalige code
twofa_scratch_used=Je hebt je eenmalige code gebruikt. Je wordt omgeleid naar de tweeledige-authenticatie instellingen pagina zodat je de inschrijving van het apparaat kan verwijderen of een nieuwe eenmalige code kan genereren. twofa_scratch_used=Je hebt je eenmalige code gebruikt. Je wordt omgeleid naar de tweeledige-authenticatie instellingen pagina zodat je de inschrijving van het apparaat kan verwijderen of een nieuwe eenmalige code kan genereren.
twofa_scratch_token_incorrect=Je eenmalige code is onjuist. twofa_scratch_token_incorrect=Je eenmalige code is onjuist.
login_userpass=Inloggen
login_openid=OpenID login_openid=OpenID
openid_connect_submit=Verbinden openid_connect_submit=Verbinden
openid_connect_title=Verbind met een bestaand account openid_connect_title=Verbind met een bestaand account
@ -121,6 +158,7 @@ register_notify=Welkom bij Gitea
[modal] [modal]
yes=Ja yes=Ja
no=Nee no=Nee
modify=Update
[form] [form]
UserName=Gebruikersnaam UserName=Gebruikersnaam
@ -150,6 +188,8 @@ url_error=is niet een valide URL.
include_error=` moet substring '%s' bevatten.` include_error=` moet substring '%s' bevatten.`
unknown_error=Onbekende fout: unknown_error=Onbekende fout:
username_been_taken=Deze naam is al in gebruik.
username_password_incorrect=Gebruikersnaam of wachtwoord is onjuist.
user_not_exist=De gebruiker bestaat niet. user_not_exist=De gebruiker bestaat niet.
auth_failed=Verificatie mislukt: %v auth_failed=Verificatie mislukt: %v
@ -170,6 +210,7 @@ form.name_reserved=De gebruikersnaam '%s' is gereserveerd.
[settings] [settings]
profile=Profiel profile=Profiel
account=Account
password=Wachtwoord password=Wachtwoord
security=Beveiliging security=Beveiliging
avatar=Profielfoto avatar=Profielfoto
@ -178,6 +219,7 @@ social=Sociale netwerk-accounts
repos=Repositories repos=Repositories
delete=Verwijder account delete=Verwijder account
twofa=Twee factor authenticatie twofa=Twee factor authenticatie
organization=Orgranisaties
uid=uid uid=uid
public_profile=Openbaar profiel public_profile=Openbaar profiel
@ -186,20 +228,25 @@ website=Website
location=Locatie location=Locatie
update_profile=Profiel bijwerken update_profile=Profiel bijwerken
update_profile_success=Je profiel is bijgewerkt. update_profile_success=Je profiel is bijgewerkt.
change_username=Je gebruikersnaam is gewijzigd.
continue=Doorgaan continue=Doorgaan
cancel=Annuleren cancel=Annuleren
language=Taal
federated_avatar_lookup=Gefedereerde Avatars inschakelen federated_avatar_lookup=Gefedereerde Avatars inschakelen
enable_custom_avatar=Aangepaste avatar inschakelen enable_custom_avatar=Aangepaste avatar inschakelen
choose_new_avatar=Kies een nieuwe avatar choose_new_avatar=Kies een nieuwe avatar
update_avatar=Update Avatar
delete_current_avatar=Verwijder huidige avatar delete_current_avatar=Verwijder huidige avatar
change_password=Wachtwoord bijwerken
old_password=Huidige wachtwoord old_password=Huidige wachtwoord
new_password=Nieuw wachtwoord new_password=Nieuw wachtwoord
emails=E-mailadressen emails=E-mailadressen
email_desc=Uw primaire e-mailadres zal worden gebruikt voor meldingen en andere administratieve taken. email_desc=Uw primaire e-mailadres zal worden gebruikt voor meldingen en andere administratieve taken.
primary=Primair primary=Primair
delete_email=Verwijder
add_openid=Voeg OpenID URL toe add_openid=Voeg OpenID URL toe
manage_ssh_keys=Beheer SSH sleutels manage_ssh_keys=Beheer SSH sleutels
@ -213,6 +260,7 @@ subkeys=Subkeys
key_id=Key-ID key_id=Key-ID
key_name=Sleutel naam key_name=Sleutel naam
key_content=Inhoud key_content=Inhoud
delete_key=Verwijder
add_on=Toegevoegd op add_on=Toegevoegd op
valid_until=Geldig tot en met valid_until=Geldig tot en met
valid_forever=Voor altijd geldig valid_forever=Voor altijd geldig
@ -238,6 +286,7 @@ twofa_disabled=Two-factor authenticatie is uitgeschakeld.
scan_this_image=Scan deze afbeelding met je authenticatie applicatie: scan_this_image=Scan deze afbeelding met je authenticatie applicatie:
or_enter_secret=Of voer deze geheime code in: %s or_enter_secret=Of voer deze geheime code in: %s
u2f_nickname=Gebruikersnaam
orgs_none=U bent geen lid van een organisatie. orgs_none=U bent geen lid van een organisatie.
@ -308,10 +357,17 @@ file_history=Geschiedenis
file_view_raw=Weergave ruw bestand file_view_raw=Weergave ruw bestand
file_permalink=Permalink file_permalink=Permalink
stored_lfs=Opgeslagen met Git LFS stored_lfs=Opgeslagen met Git LFS
commit_graph=Commit grafiek
editor.new_file=Nieuw bestand
editor.upload_file=Upload bestand
editor.edit_file=Bewerk bestand
editor.preview_changes=Voorbeeld tonen editor.preview_changes=Voorbeeld tonen
editor.edit_this_file=Bewerk bestand
editor.delete_this_file=Verwijder bestand
editor.name_your_file=Bestandsnaam… editor.name_your_file=Bestandsnaam…
editor.or=of editor.or=of
editor.cancel_lower=Annuleer
editor.commit_changes=Wijzigingen doorvoeren editor.commit_changes=Wijzigingen doorvoeren
editor.add_tmpl='%s/<filename>' toevoegen editor.add_tmpl='%s/<filename>' toevoegen
editor.add='%s' toevoegen editor.add='%s' toevoegen
@ -327,7 +383,9 @@ editor.fail_to_update_file=Update/maken van bestand '%s' is mislukt: %v
editor.upload_files_to_dir=Bestanden uploaden naar '%s' editor.upload_files_to_dir=Bestanden uploaden naar '%s'
commits.commits=Commits commits.commits=Commits
commits.search=Zoek commits…
commits.find=Zoek commits.find=Zoek
commits.search_all=Alle branches
commits.author=Auteur commits.author=Auteur
commits.message=Bericht commits.message=Bericht
commits.date=Datum commits.date=Datum
@ -348,9 +406,12 @@ issues.new.closed_milestone=Gesloten mijlpalen
issues.no_ref=Geen Branch/Tag gespecificeerd issues.no_ref=Geen Branch/Tag gespecificeerd
issues.create=Maak probleem issues.create=Maak probleem
issues.new_label=Nieuw Label issues.new_label=Nieuw Label
issues.new_label_placeholder=Labelnaam
issues.new_label_desc_placeholder=Beschrijving
issues.create_label=Maak label issues.create_label=Maak label
issues.label_templates.title=Laad een vooraf gedefinieerde set labels issues.label_templates.title=Laad een vooraf gedefinieerde set labels
issues.label_templates.helper=Selecteer een labelset issues.label_templates.helper=Selecteer een labelset
issues.label_templates.use=Label Set gebruiken
issues.change_milestone_at='mijlpaal bewerkt van <b>%s</b> <b>%s</b> %s' issues.change_milestone_at='mijlpaal bewerkt van <b>%s</b> <b>%s</b> %s'
issues.remove_milestone_at=' %s is verwijderd uit de <b>%s</b> mijlpaal' issues.remove_milestone_at=' %s is verwijderd uit de <b>%s</b> mijlpaal'
issues.deleted_milestone=` (verwijderd)` issues.deleted_milestone=` (verwijderd)`
@ -359,6 +420,7 @@ issues.change_title_at='titel aangepast van <b>%s</b> naar <b>%s</b> %s'
issues.open_tab=%d Open issues.open_tab=%d Open
issues.close_tab=%d gesloten issues.close_tab=%d gesloten
issues.filter_label=Label issues.filter_label=Label
issues.filter_label_no_select=Alle labels
issues.filter_milestone=Mijlpaal issues.filter_milestone=Mijlpaal
issues.filter_assignee=Aangewezene issues.filter_assignee=Aangewezene
issues.filter_type=Type issues.filter_type=Type
@ -408,6 +470,8 @@ issues.label_count=%d labels
issues.label_open_issues=%d geopende problemen issues.label_open_issues=%d geopende problemen
issues.label_edit=Bewerken issues.label_edit=Bewerken
issues.label_delete=Verwijder issues.label_delete=Verwijder
issues.label_modify=Label bewerken
issues.label_deletion=Verwijder label
issues.label.filter_sort.alphabetically=Alfabetisch issues.label.filter_sort.alphabetically=Alfabetisch
issues.label.filter_sort.reverse_alphabetically=Omgekeerd alfabetisch issues.label.filter_sort.reverse_alphabetically=Omgekeerd alfabetisch
issues.label.filter_sort.by_size=Grootte issues.label.filter_sort.by_size=Grootte
@ -422,6 +486,7 @@ issues.start_tracking_history=`%s is begonnen`
issues.tracking_already_started=Je houd al tijd bij voor dit <a href="%s">issue</a>!` issues.tracking_already_started=Je houd al tijd bij voor dit <a href="%s">issue</a>!`
issues.stop_tracking=Stop issues.stop_tracking=Stop
issues.stop_tracking_history=`gestopt met werken aan %s` issues.stop_tracking_history=`gestopt met werken aan %s`
issues.add_time_short=Timer toevoegen
issues.add_time_cancel=Annuleren issues.add_time_cancel=Annuleren
issues.add_time_history=`heeft besteedde tijd toegevoegd: %s` issues.add_time_history=`heeft besteedde tijd toegevoegd: %s`
issues.add_time_hours=Uren issues.add_time_hours=Uren
@ -437,6 +502,7 @@ pulls.title_desc=wil %[1]d commits van <code>%[2]s</code> samenvoegen met <code>
pulls.merged_title_desc=heeft %[1]d commits samengevoegd van <code>%[2]s</code> naar <code>%[3]s</code> %[4]s pulls.merged_title_desc=heeft %[1]d commits samengevoegd van <code>%[2]s</code> naar <code>%[3]s</code> %[4]s
pulls.tab_conversation=Discussie pulls.tab_conversation=Discussie
pulls.tab_commits=Commits pulls.tab_commits=Commits
pulls.tab_files=Bestanden gewijzigd
pulls.reopen_to_merge=Heropen dit pull request aub om een een merge actie uit te voeren. pulls.reopen_to_merge=Heropen dit pull request aub om een een merge actie uit te voeren.
pulls.merged=Samengevoegd pulls.merged=Samengevoegd
pulls.can_auto_merge_desc=Dit pull-request kan automatisch samengevoegd worden. pulls.can_auto_merge_desc=Dit pull-request kan automatisch samengevoegd worden.
@ -467,6 +533,7 @@ milestones.filter_sort.least_issues=Minste problemen
wiki=Wiki wiki=Wiki
wiki.page=Pagina wiki.page=Pagina
wiki.filter_page=Filter pagina wiki.filter_page=Filter pagina
wiki.new_page=Pagina
wiki.default_commit_message=Schrijf een notitie over deze aanpassing (optioneel). wiki.default_commit_message=Schrijf een notitie over deze aanpassing (optioneel).
wiki.save_page=Pagina opslaan wiki.save_page=Pagina opslaan
wiki.last_commit_info=%s heeft deze pagina aangepast %s wiki.last_commit_info=%s heeft deze pagina aangepast %s
@ -515,6 +582,8 @@ search.search_repo=Zoek repository
search.results=Zoek resultaat voor "%s" in <a href="%s">%s</a> search.results=Zoek resultaat voor "%s" in <a href="%s">%s</a>
settings=Instellingen settings=Instellingen
settings.options=Repository
settings.collaboration.admin=Beheerder
settings.collaboration.write=Schrijf settings.collaboration.write=Schrijf
settings.collaboration.read=Lees settings.collaboration.read=Lees
settings.collaboration.undefined=Ongedefinieerd settings.collaboration.undefined=Ongedefinieerd
@ -522,6 +591,7 @@ settings.hooks=Webhooks
settings.githooks=Git-hooks settings.githooks=Git-hooks
settings.basic_settings=Basis instellingen settings.basic_settings=Basis instellingen
settings.mirror_settings=Kopie Settings settings.mirror_settings=Kopie Settings
settings.site=Website
settings.update_settings=Instellingen bewerken settings.update_settings=Instellingen bewerken
settings.advanced_settings=Geavanceerde opties settings.advanced_settings=Geavanceerde opties
settings.external_wiki_url=Externe wiki-URL settings.external_wiki_url=Externe wiki-URL
@ -534,24 +604,32 @@ settings.transfer=Eigendom overdragen
settings.delete=Verwijder deze repository settings.delete=Verwijder deze repository
settings.delete_notices_1=- Deze bewerking kan <strong>NIET</strong> ongedaan gemaakt worden. settings.delete_notices_1=- Deze bewerking kan <strong>NIET</strong> ongedaan gemaakt worden.
settings.transfer_owner=Nieuwe eigenaar settings.transfer_owner=Nieuwe eigenaar
settings.confirm_delete=Verwijder repository
settings.delete_collaborator=Verwijder
settings.search_user_placeholder=Zoek gebruiker… settings.search_user_placeholder=Zoek gebruiker…
settings.add_webhook=Webhook toevoegen settings.add_webhook=Webhook toevoegen
settings.webhook.test_delivery=Test-bezorging settings.webhook.test_delivery=Test-bezorging
settings.webhook.request=Verzoek settings.webhook.request=Verzoek
settings.webhook.response=Antwoord settings.webhook.response=Antwoord
settings.webhook.headers=Headers settings.webhook.headers=Headers
settings.webhook.payload=Inhoud
settings.webhook.body=Inhoud settings.webhook.body=Inhoud
settings.githook_edit_desc=Als haak niet actief is, zal monster inhoud worden gepresenteerd. Verlof inhoud leeg zal deze haak uitschakelen. settings.githook_edit_desc=Als haak niet actief is, zal monster inhoud worden gepresenteerd. Verlof inhoud leeg zal deze haak uitschakelen.
settings.githook_name=Haak naam settings.githook_name=Haak naam
settings.githook_content=Haak inhoud settings.githook_content=Haak inhoud
settings.update_githook=Haak bijwerken settings.update_githook=Haak bijwerken
settings.payload_url=Doel URL
settings.secret=Geheim settings.secret=Geheim
settings.slack_username=Gebruikersnaam settings.slack_username=Gebruikersnaam
settings.slack_icon_url=Icoon URL settings.slack_icon_url=Icoon URL
settings.discord_username=Gebruikersnaam settings.discord_username=Gebruikersnaam
settings.discord_icon_url=Icoon URL settings.discord_icon_url=Icoon URL
settings.slack_color=Kleur settings.slack_color=Kleur
settings.event_send_everything=Alle gebeurtenissen
settings.event_create=Creëer settings.event_create=Creëer
settings.event_delete=Verwijder
settings.event_fork=Fork
settings.event_release=Release
settings.event_pull_request=Pull request settings.event_pull_request=Pull request
settings.event_push=Push settings.event_push=Push
settings.event_repository=Repository settings.event_repository=Repository
@ -569,6 +647,8 @@ settings.branches=Branches
settings.protected_branch=Branch bescherming settings.protected_branch=Branch bescherming
settings.protected_branch_can_push=Push toestaan? settings.protected_branch_can_push=Push toestaan?
settings.protected_branch_can_push_no=U mag niet pushen settings.protected_branch_can_push_no=U mag niet pushen
settings.protect_whitelist_search_users=Zoek gebruiker…
settings.protect_whitelist_search_teams=Zoek teams…
settings.add_protected_branch=Bescherming aanzetten settings.add_protected_branch=Bescherming aanzetten
settings.delete_protected_branch=Bescherming uitzetten settings.delete_protected_branch=Bescherming uitzetten
settings.choose_branch=Kies een branch… settings.choose_branch=Kies een branch…
@ -603,8 +683,10 @@ release.loading=Laden…
release.cancel=Annuleren release.cancel=Annuleren
release.publish=Release publiceren release.publish=Release publiceren
release.save_draft=Concept opslaan release.save_draft=Concept opslaan
release.deletion=Verwijder release
release.downloads=Downloads release.downloads=Downloads
branch.name=Branch naam
branch.search=Zoek branches branch.search=Zoek branches
branch.delete_head=Verwijder branch.delete_head=Verwijder
branch.delete_html=Verwijder branch branch.delete_html=Verwijder branch
@ -612,6 +694,8 @@ branch.create_branch=Maak branch <strong>%s</strong>
branch.create_from=van '%s' branch.create_from=van '%s'
branch.deleted_by=Verwijderd door %s branch.deleted_by=Verwijderd door %s
topic.manage_topics=Beheer topics
topic.done=Klaar
[org] [org]
org_name_holder=Organisatienaam org_name_holder=Organisatienaam
@ -627,9 +711,11 @@ create_team=Maak team
org_desc=Omschrijving org_desc=Omschrijving
team_name=Teamnaam team_name=Teamnaam
team_desc=Omschrijving team_desc=Omschrijving
team_permission_desc=Machtiging
settings=Instellingen settings=Instellingen
settings.options=Organisatie
settings.full_name=Volledige naam settings.full_name=Volledige naam
settings.website=Website settings.website=Website
settings.location=Locatie settings.location=Locatie
@ -640,6 +726,9 @@ settings.delete_account=Verwijder deze organisatie
settings.confirm_delete_account=Bevestig verwijdering settings.confirm_delete_account=Bevestig verwijdering
members.membership_visibility=Zichtbaarheid lidmaatschap: members.membership_visibility=Zichtbaarheid lidmaatschap:
members.public=Zichtbaar
members.private=Verborgen
members.private_helper=maak zichtbaar
members.member_role=Rol van lid: members.member_role=Rol van lid:
members.owner=Eigenaar members.owner=Eigenaar
members.member=Lid members.member=Lid
@ -656,7 +745,9 @@ teams.no_desc=Dit team heeft geen omschrijving
teams.settings=Instellingen teams.settings=Instellingen
teams.members=Team leden teams.members=Team leden
teams.update_settings=Instellingen bijwerken teams.update_settings=Instellingen bijwerken
teams.delete_team=Verwijder team
teams.add_team_member=Nieuwe team lid aanmaken teams.add_team_member=Nieuwe team lid aanmaken
teams.delete_team_title=Verwijder team
teams.delete_team_success=Het team is verwijderd. teams.delete_team_success=Het team is verwijderd.
teams.repositories=Teamrepositories teams.repositories=Teamrepositories
teams.search_repo_placeholder=Repository zoeken… teams.search_repo_placeholder=Repository zoeken…
@ -666,6 +757,7 @@ teams.add_nonexistent_repo=De opslagplaats die u probeert toe te voegen bestaat
[admin] [admin]
dashboard=Overzicht dashboard=Overzicht
users=Gebruikersacount
organizations=Organisaties organizations=Organisaties
repositories=Repositories repositories=Repositories
config=Configuratie config=Configuratie
@ -675,11 +767,11 @@ first_page=Eerste
last_page=Laatste last_page=Laatste
total=Totaal: %d total=Totaal: %d
dashboard.statistic=Overzicht
dashboard.system_status=Systeemtatus
dashboard.operation_name=Bewerking naam dashboard.operation_name=Bewerking naam
dashboard.operation_switch=Omschakelen dashboard.operation_switch=Omschakelen
dashboard.operation_run=Uitvoeren dashboard.operation_run=Uitvoeren
dashboard.delete_inactivate_accounts=Verwijder alle inactieve accounts
dashboard.delete_inactivate_accounts_success=Alle inactieve accounts zijn verwijderd.
dashboard.sync_external_users=Externe gebruikersgegevens synchroniseren dashboard.sync_external_users=Externe gebruikersgegevens synchroniseren
dashboard.server_uptime=Uptime server dashboard.server_uptime=Uptime server
dashboard.current_goroutine=Huidige Goroutines dashboard.current_goroutine=Huidige Goroutines
@ -709,10 +801,12 @@ dashboard.total_gc_pause=Totaal GC verwerkingstijd
dashboard.last_gc_pause=Laatste GC verwerkingstijd dashboard.last_gc_pause=Laatste GC verwerkingstijd
dashboard.gc_times=GC verwerkingen dashboard.gc_times=GC verwerkingen
users.name=Gebruikersnaam
users.activated=Geactiveerd users.activated=Geactiveerd
users.admin=Beheerder users.admin=Beheerder
users.repos=Repos users.repos=Repos
users.created=Aangemaakt users.created=Aangemaakt
users.last_login=Laatste keer ingelogd
users.edit=Bewerken users.edit=Bewerken
users.auth_source=Authenticatiebron users.auth_source=Authenticatiebron
users.local=Lokaal users.local=Lokaal
@ -728,6 +822,7 @@ repos.name=Naam
repos.private=Prive repos.private=Prive
repos.watches=Volgers repos.watches=Volgers
repos.stars=Sterren repos.stars=Sterren
repos.forks=Forks
repos.issues=Kwesties repos.issues=Kwesties
repos.size=Grootte repos.size=Grootte
@ -743,6 +838,7 @@ auths.host=Host
auths.port=Poort auths.port=Poort
auths.bind_dn=Binden DN auths.bind_dn=Binden DN
auths.bind_password=Bind wachtwoord auths.bind_password=Bind wachtwoord
auths.search_page_size=Paginagrootte
auths.filter=Gebruikersfilter auths.filter=Gebruikersfilter
auths.admin_filter=Beheerdersfilter auths.admin_filter=Beheerdersfilter
auths.smtp_auth=SMTP-authenticatietype auths.smtp_auth=SMTP-authenticatietype
@ -760,12 +856,16 @@ auths.enable_auto_register=Activeer automatische registratie
auths.tips=Tips auths.tips=Tips
config.server_config=Serverconfiguratie config.server_config=Serverconfiguratie
config.app_name=Naam site
config.app_ver=Gitea versie
config.app_url=Gitea basis URL
config.disable_router_log=Router-log uitschakelen config.disable_router_log=Router-log uitschakelen
config.run_mode=Uitvoer modus config.run_mode=Uitvoer modus
config.git_version=Git versie config.git_version=Git versie
config.repo_root_path=Repository basis pad config.repo_root_path=Repository basis pad
config.lfs_root_path=LFS rootpad config.lfs_root_path=LFS rootpad
config.static_file_root_path=Statische bestanden basis pad config.static_file_root_path=Statische bestanden basis pad
config.log_file_root_path=Log-pad
config.script_type=Script type config.script_type=Script type
config.reverse_auth_user=Omgekeerde verificatie gebruiker config.reverse_auth_user=Omgekeerde verificatie gebruiker
@ -783,6 +883,8 @@ config.db_config=Databaseconfiguratie
config.db_type=Type config.db_type=Type
config.db_host=Host config.db_host=Host
config.db_name=Naam config.db_name=Naam
config.db_user=Gebruikersnaam
config.db_ssl_mode=SSL
config.db_path=Pad config.db_path=Pad
config.service_config=Serviceconfiguratie config.service_config=Serviceconfiguratie

View File

@ -1,10 +1,13 @@
app_desc=Bezbolesna usługa Git na własnym serwerze
home=Strona główna home=Strona główna
dashboard=Pulpit dashboard=Pulpit
explore=Odkrywaj explore=Odkrywaj
help=Pomoc help=Pomoc
sign_in=Zaloguj się sign_in=Zaloguj się
sign_in_with=Zaloguj się za pomocą
sign_out=Wyloguj sign_out=Wyloguj
sign_up=Zarejestruj
link_account=Powiąż konto link_account=Powiąż konto
register=Zarejestruj się register=Zarejestruj się
website=Strona website=Strona
@ -13,12 +16,21 @@ page=Strona
template=Szablon template=Szablon
language=Język language=Język
notifications=Powiadomienia notifications=Powiadomienia
create_new=Utwórz…
user_profile_and_more=Profil i ustawienia…
signed_in_as=Zalogowany jako signed_in_as=Zalogowany jako
enable_javascript=Strona działa najlepiej z włączonym JavaScript.
username=Nazwa użytkownika username=Nazwa użytkownika
email=Adres e-mail
password=Hasło password=Hasło
re_type=Wpisz ponownie hasło
captcha=CAPTCHA
twofa=Autoryzacja dwuskładnikowa
twofa_scratch=Kod jednorazowy weryfikacji dwuetapowej
passcode=Kod dostępu passcode=Kod dostępu
u2f_reload=Odśwież
repository=Repozytorium repository=Repozytorium
organization=Organizacja organization=Organizacja
@ -29,8 +41,12 @@ new_mirror=Nowa kopia lustrzana
new_fork=Nowy fork repozytorium new_fork=Nowy fork repozytorium
new_org=Nowa organizacja new_org=Nowa organizacja
manage_org=Zarządzaj organizacjami manage_org=Zarządzaj organizacjami
admin_panel=Administracja stron
account_settings=Ustawienia konta account_settings=Ustawienia konta
settings=Ustawienia settings=Ustawienia
your_profile=Profil
your_starred=Z gwiazdką
your_settings=Ustawienia
all=Wszystko all=Wszystko
sources=Źródła sources=Źródła
@ -46,34 +62,61 @@ cancel=Anuluj
[install] [install]
install=Instalacja install=Instalacja
title=Wstępna konfiguracja
db_title=Ustawienia bazy danych db_title=Ustawienia bazy danych
db_type=Typ bazy danych db_type=Typ bazy danych
host=Serwer host=Serwer
user=Nazwa użytkownika
password=Hasło password=Hasło
db_name=Nazwa bazy danych db_name=Nazwa bazy danych
ssl_mode=SSL
path=Ścieżka path=Ścieżka
err_empty_db_path=Ścieżka do bazy danych SQLite3 lub TiDB nie może być pusta.
err_empty_admin_password=Hasło administratora nie może być puste.
general_title=Ustawienia ogólne
app_name=Tytuł witryny
app_name_helper=Wprowadź nazwę firmy.
repo_path=Katalog repozytoriów repo_path=Katalog repozytoriów
lfs_path=Ścieżka główna Git LFS
run_user=Uruchom jako nazwa użytkownika
domain=Domena serwera SSH
ssh_port=Port serwera SSH
app_url=Podstawowy adres URL Gitea
log_root_path=Ścieżka dla logów log_root_path=Ścieżka dla logów
optional_title=Ustawienia opcjonalne optional_title=Ustawienia opcjonalne
email_title=Ustawienia e-mail
smtp_host=Serwer SMTP smtp_host=Serwer SMTP
smtp_from=Wyślij e-mail jako
mailer_user=Nazwa użytkownika SMTP
mailer_password=Hasło SMTP
register_confirm=Wymagają potwierdzenia e-mail przy rejestracji
mail_notify=Włącz powiadomienia e-mail
disable_gravatar=Wyłącz Gravatar
federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar.
disable_registration=Wyłącz rejestrację dwuskładnikową
openid_signin=Włącz logowanie za pomocą OpenID openid_signin=Włącz logowanie za pomocą OpenID
enable_captcha=Włącz CAPTCHA
enable_captcha_popup=Wymagaj walidacji CAPTCHA przy samodzielnej rejestracji użytkownika. enable_captcha_popup=Wymagaj walidacji CAPTCHA przy samodzielnej rejestracji użytkownika.
admin_password=Hasło admin_password=Hasło
confirm_password=Potwierdź hasło confirm_password=Potwierdź hasło
admin_email=Adres e-mail
install_btn_confirm=Zainstaluj Gitea install_btn_confirm=Zainstaluj Gitea
test_git_failed=Nie udało się przetestować polecenia „git”: %v test_git_failed=Nie udało się przetestować polecenia „git”: %v
save_config_failed=Nie udało się zapisać konfiguracji: %v save_config_failed=Nie udało się zapisać konfiguracji: %v
[home] [home]
uname_holder=Nazwa użytkownika lub adres email
password_holder=Hasło password_holder=Hasło
switch_dashboard_context=Przełącz kontekst pulpitu switch_dashboard_context=Przełącz kontekst pulpitu
my_repos=Repozytoria
show_more_repos=Pokaż więcej repozytoriów…
collaborative_repos=Wspólne repozytoria collaborative_repos=Wspólne repozytoria
my_orgs=Moje organizacje my_orgs=Moje organizacje
my_mirrors=Moje kopie lustrzane my_mirrors=Moje kopie lustrzane
view_home=Zobacz %s view_home=Zobacz %s
search_repos=Znajdź repozytorium…
issues.in_your_repos=W Twoich repozytoriach issues.in_your_repos=W Twoich repozytoriach
@ -82,12 +125,20 @@ repos=Repozytoria
users=Użytkownicy users=Użytkownicy
organizations=Organizacje organizations=Organizacje
search=Wyszukiwanie search=Wyszukiwanie
code=Kod
repo_no_results=Nie znaleziono pasujących repozytoriów.
user_no_results=Nie znaleziono pasującego użytkowników.
org_no_results=Nie znaleziono pasujących organizacji.
code_search_results=Wyniki wyszukiwania dla '%s'
[auth] [auth]
create_new_account=Zarejestruj konto
register_helper_msg=Masz już konto? Zaloguj się teraz! register_helper_msg=Masz już konto? Zaloguj się teraz!
social_register_helper_msg=Masz już konto? Powiąż je teraz!
remember_me=Zapamiętaj mnie remember_me=Zapamiętaj mnie
forgot_password_title=Zapomniałem hasła forgot_password_title=Zapomniałem hasła
forgot_password=Zapomniałeś hasła? forgot_password=Zapomniałeś hasła?
sign_up_now=Potrzebujesz konta? Zarejestruj się teraz.
confirmation_mail_sent_prompt=Nowy email aktywacyjny został wysłany na adres <b>%s</b>. Sprawdź swoją skrzynkę odbiorczą w ciągu %s aby zakończyć proces rejestracji. confirmation_mail_sent_prompt=Nowy email aktywacyjny został wysłany na adres <b>%s</b>. Sprawdź swoją skrzynkę odbiorczą w ciągu %s aby zakończyć proces rejestracji.
reset_password_mail_sent_prompt=Email potwierdzający został wysłany na adres <b>%s</b>. Sprawdź swoją skrzynkę odbiorczą w ciągu %s aby zakończyć proces resetowania hasła. reset_password_mail_sent_prompt=Email potwierdzający został wysłany na adres <b>%s</b>. Sprawdź swoją skrzynkę odbiorczą w ciągu %s aby zakończyć proces resetowania hasła.
active_your_account=Aktywuj swoje konto active_your_account=Aktywuj swoje konto
@ -102,6 +153,7 @@ scratch_code=Kod jednorazowy
use_scratch_code=Użyj kodu jednorazowego use_scratch_code=Użyj kodu jednorazowego
twofa_scratch_used=Użyłeś/aś swojego kodu jednorazowego. Przekierowano Cię do strony z ustawieniami autoryzacji dwuetapowej, gdzie możesz usunąć swoje urządzenie lub wygenerować nowy kod jednorazowy. twofa_scratch_used=Użyłeś/aś swojego kodu jednorazowego. Przekierowano Cię do strony z ustawieniami autoryzacji dwuetapowej, gdzie możesz usunąć swoje urządzenie lub wygenerować nowy kod jednorazowy.
twofa_scratch_token_incorrect=Twój kod jednorazowy jest niepoprawny. twofa_scratch_token_incorrect=Twój kod jednorazowy jest niepoprawny.
login_userpass=Zaloguj się
login_openid=OpenID login_openid=OpenID
openid_connect_submit=Połącz openid_connect_submit=Połącz
openid_connect_title=Połącz z istniejącym kontem openid_connect_title=Połącz z istniejącym kontem
@ -117,12 +169,14 @@ register_notify=Witamy w Gitea
[modal] [modal]
yes=Tak yes=Tak
no=Nie no=Nie
modify=Aktualizuj
[form] [form]
UserName=Nazwa użytkownika UserName=Nazwa użytkownika
RepoName=Nazwa repozytorium RepoName=Nazwa repozytorium
Email=Adres e-mail Email=Adres e-mail
Password=Hasło Password=Hasło
Retype=Wpisz ponownie hasło
SSHTitle=Nazwa klucza SSH SSHTitle=Nazwa klucza SSH
HttpsUrl=HTTPS URL HttpsUrl=HTTPS URL
PayloadUrl=URL do wywołania PayloadUrl=URL do wywołania
@ -145,7 +199,13 @@ email_error=` nie jest poprawnym adresem e-mail.`
url_error=` nie jest poprawnym adresem URL.` url_error=` nie jest poprawnym adresem URL.`
include_error=`musi zawierać tekst '%s'.` include_error=`musi zawierać tekst '%s'.`
unknown_error=Nieznany błąd: unknown_error=Nieznany błąd:
captcha_incorrect=Kod CAPTCHA jest nieprawidłowy.
password_not_match=Hasła nie są identyczne.
username_been_taken=Ta nazwa użytkownika jest już zajęta.
repo_name_been_taken=Nazwa repozytorium jest już zajęta.
org_name_been_taken=Nazwa organizacji jest już zajęta.
team_name_been_taken=Nazwa zespołu jest już zajęta.
user_not_exist=Użytkownik nie istnieje. user_not_exist=Użytkownik nie istnieje.
auth_failed=Uwierzytelnienie się nie powiodło: %v auth_failed=Uwierzytelnienie się nie powiodło: %v
@ -154,6 +214,7 @@ auth_failed=Uwierzytelnienie się nie powiodło: %v
target_branch_not_exist=Gałąź docelowa nie istnieje. target_branch_not_exist=Gałąź docelowa nie istnieje.
[user] [user]
change_avatar=Zmień swój awatar…
join_on=Dołączył join_on=Dołączył
repositories=Repozytoria repositories=Repozytoria
activity=Publiczna aktywność activity=Publiczna aktywność
@ -166,15 +227,21 @@ form.name_reserved=Nazwa użytkownika '%s' jest zarezerwowana.
[settings] [settings]
profile=Profil profile=Profil
account=Konto
password=Hasło password=Hasło
security=Bezpieczeństwo security=Bezpieczeństwo
avatar=Awatar avatar=Awatar
ssh_gpg_keys=Klucze SSH / GPG ssh_gpg_keys=Klucze SSH / GPG
social=Konta społecznościowe social=Konta społecznościowe
applications=Aplikacje
orgs=Zarządzaj organizacjami
repos=Repozytoria repos=Repozytoria
delete=Usuń konto delete=Usuń konto
twofa=Autoryzacja dwuetapowa twofa=Autoryzacja dwuetapowa
account_link=Powiązane Konta
organization=Organizacje
uid=UID uid=UID
u2f=Klucze bezpieczeństwa
public_profile=Profil publiczny public_profile=Profil publiczny
full_name=Imię i nazwisko full_name=Imię i nazwisko
@ -182,20 +249,33 @@ website=Strona
location=Lokalizacja location=Lokalizacja
update_profile=Zaktualizuj profil update_profile=Zaktualizuj profil
update_profile_success=Twój profil został zaktualizowany. update_profile_success=Twój profil został zaktualizowany.
change_username=Twój nick został zmieniony.
continue=Kontynuuj continue=Kontynuuj
cancel=Anuluj cancel=Anuluj
language=Język
federated_avatar_lookup=Wyszukiwanie zewnętrznych awatarów federated_avatar_lookup=Wyszukiwanie zewnętrznych awatarów
enable_custom_avatar=Włącz niestandardowe awatary enable_custom_avatar=Włącz niestandardowe awatary
choose_new_avatar=Wybierz nowy avatar choose_new_avatar=Wybierz nowy avatar
update_avatar=Aktualizuj awatar
delete_current_avatar=Usuń obecny Avatar delete_current_avatar=Usuń obecny Avatar
uploaded_avatar_not_a_image=Załadowany plik nie jest obrazem.
update_avatar_success=Twój awatar został zmieniony.
change_password=Aktualizuj hasło
old_password=Aktualne hasło old_password=Aktualne hasło
new_password=Nowe hasło new_password=Nowe hasło
retype_new_password=Powtórz nowe hasło
password_incorrect=Bieżące hasło nie jest prawidłowe.
emails=Adresy e-mail emails=Adresy e-mail
manage_emails=Zarządzaj adresami e-mail
email_desc=Twój podstawowy adres e-mail będzie używany do powiadomień i innych działań. email_desc=Twój podstawowy adres e-mail będzie używany do powiadomień i innych działań.
primary=Podstawowy primary=Podstawowy
delete_email=Usuń
email_deletion=Usuń adres email
add_new_email=Dodaj nowy e-mail
add_email=Dodaj adres e-mail
add_openid=Dodaj OpenID URI add_openid=Dodaj OpenID URI
manage_ssh_keys=Zarządzaj kluczami SSH manage_ssh_keys=Zarządzaj kluczami SSH
@ -209,6 +289,11 @@ subkeys=Podklucze
key_id=ID klucza key_id=ID klucza
key_name=Nazwa klucza key_name=Nazwa klucza
key_content=Treść key_content=Treść
delete_key=Usuń
ssh_key_deletion=Usuń klucz SSH
gpg_key_deletion=Usuń klucz GPG
ssh_key_deletion_success=Klucz SSH został usunięty.
gpg_key_deletion_success=Klucz GPG został usunięty.
add_on=Dodano add_on=Dodano
valid_until=Ważne do valid_until=Ważne do
valid_forever=Ważne bezterminowo valid_forever=Ważne bezterminowo
@ -220,8 +305,10 @@ key_state_desc=Ten klucz był użyty w ciągu ostatnich 7 dni
token_state_desc=Ten token był użyty w ciągu ostatnich 7 dni token_state_desc=Ten token był użyty w ciągu ostatnich 7 dni
show_openid=Pokaż w profilu show_openid=Pokaż w profilu
hide_openid=Ukryj w profilu hide_openid=Ukryj w profilu
ssh_disabled=SSH jest wyłączony
manage_social=Zarządzaj powiązanymi kontami społecznościowymi manage_social=Zarządzaj powiązanymi kontami społecznościowymi
unbind=Rozłącz
generate_new_token=Wygeneruj nowy token generate_new_token=Wygeneruj nowy token
token_name=Nazwa tokena token_name=Nazwa tokena
@ -230,6 +317,7 @@ delete_token=Usuń
twofa_is_enrolled=Twoje konto ma obecnie <strong>włączoną</strong> autoryzację dwuetapową. twofa_is_enrolled=Twoje konto ma obecnie <strong>włączoną</strong> autoryzację dwuetapową.
twofa_not_enrolled=Twoje konto obecnie nie ma włączonej autoryzacji dwuetapowej. twofa_not_enrolled=Twoje konto obecnie nie ma włączonej autoryzacji dwuetapowej.
twofa_disable=Wyłącz weryfikację dwuetapową
twofa_disabled=Dwuetapowa autoryzacja została wyłączona. twofa_disabled=Dwuetapowa autoryzacja została wyłączona.
scan_this_image=Zeskanuj ten obraz za pomocą swojej aplikacji uwierzytelniającej: scan_this_image=Zeskanuj ten obraz za pomocą swojej aplikacji uwierzytelniającej:
or_enter_secret=Lub wprowadź sekret: %s or_enter_secret=Lub wprowadź sekret: %s
@ -241,6 +329,7 @@ repos_none=Nie posiadasz żadnych repozytoriów
delete_account=Usuń swoje konto delete_account=Usuń swoje konto
confirm_delete_account=Potwierdź usunięcie confirm_delete_account=Potwierdź usunięcie
delete_account_title=Usuń swoje konto
[repo] [repo]
owner=Właściciel owner=Właściciel
@ -250,7 +339,10 @@ fork_repo=Sforkowane
fork_from=Forkuj z fork_from=Forkuj z
repo_desc=Opis repo_desc=Opis
repo_lang=Język repo_lang=Język
repo_gitignore_helper=Wybierz szablony pliku .gitignore.
license=Licencja license=Licencja
license_helper=Wybierz plik licencji.
readme=README
create_repo=Utwórz repozytorium create_repo=Utwórz repozytorium
default_branch=Domyślna gałąź default_branch=Domyślna gałąź
mirror_prune=Wyczyść mirror_prune=Wyczyść
@ -272,12 +364,14 @@ migrate.failed=Migracja nie powiodła się: %v
mirror_from=kopia lustrzana mirror_from=kopia lustrzana
forked_from=sklonowany z forked_from=sklonowany z
copy_link=Kopiuj copy_link=Kopiuj
copy_link_success=Link został skopiowany
copied=Skopiowano copied=Skopiowano
unwatch=Przestań obserwować unwatch=Przestań obserwować
watch=Obserwuj watch=Obserwuj
unstar=Usuń gwiazdkę unstar=Usuń gwiazdkę
star=Gwiazdka star=Gwiazdka
fork=Forkuj fork=Forkuj
download_archive=Pobierz repozytorium
no_desc=Brak opisu no_desc=Brak opisu
quick_guide=Skrócona instrukcja quick_guide=Skrócona instrukcja
@ -305,30 +399,45 @@ file_view_raw=Zobacz czysty
file_permalink=Bezpośredni odnośnik file_permalink=Bezpośredni odnośnik
stored_lfs=Przechowane za pomocą Git LFS stored_lfs=Przechowane za pomocą Git LFS
editor.new_file=Nowy plik
editor.upload_file=Wyślik plik
editor.edit_file=Edytuj plik
editor.preview_changes=Podgląd zmian editor.preview_changes=Podgląd zmian
editor.edit_this_file=Edytuj plik
editor.delete_this_file=Usuń plik
editor.file_delete_success=Plik %s został usunięty.
editor.name_your_file=Nazwij plik…
editor.or=lub editor.or=lub
editor.cancel_lower=Anuluj
editor.commit_changes=Zatwierdź zmiany editor.commit_changes=Zatwierdź zmiany
editor.add_tmpl=Dodaj '%s/<filename>' editor.add_tmpl=Dodaj '%s/<filename>'
editor.add=Dodaj '%s' editor.add=Dodaj '%s'
editor.update=Zaktualizuj '%s' editor.update=Zaktualizuj '%s'
editor.delete=Usuń '%s' editor.delete=Usuń '%s'
editor.commit_message_desc=Dodaj dodatkowy rozszerzony opis…
editor.commit_directly_to_this_branch=Zmieniaj bezpośrednio gałąź <strong class="branch-name">%s</strong>. editor.commit_directly_to_this_branch=Zmieniaj bezpośrednio gałąź <strong class="branch-name">%s</strong>.
editor.create_new_branch=Stwórz <strong>nową gałąź</strong> dla tego commita i rozpocznij pull request. editor.create_new_branch=Stwórz <strong>nową gałąź</strong> dla tego commita i rozpocznij pull request.
editor.new_branch_name_desc=Nazwa nowej gałęzi…
editor.cancel=Anuluj editor.cancel=Anuluj
editor.filename_cannot_be_empty=Nazwa pliku nie może być pusta.
editor.branch_already_exists=Gałąź '%s' już istnieje w tym repozytorium. editor.branch_already_exists=Gałąź '%s' już istnieje w tym repozytorium.
editor.no_changes_to_show=Brak zmian do pokazania. editor.no_changes_to_show=Brak zmian do pokazania.
editor.fail_to_update_file=Tworzenie/aktualizacja pliku '%s' nie powiodła się z błędem: %v editor.fail_to_update_file=Tworzenie/aktualizacja pliku '%s' nie powiodła się z błędem: %v
editor.add_subdir=Dodaj katalog…
editor.unable_to_upload_files=Wysyłanie plików do '%s' nie powiodło się z błędem: %v editor.unable_to_upload_files=Wysyłanie plików do '%s' nie powiodło się z błędem: %v
editor.upload_files_to_dir=Prześlij pliki do '%s' editor.upload_files_to_dir=Prześlij pliki do '%s'
commits.commits=Commity commits.commits=Commity
commits.search=Przeszukaj commity…
commits.find=Szukaj commits.find=Szukaj
commits.search_all=Wszystkie gałęzie
commits.author=Autor commits.author=Autor
commits.message=Wiadomość commits.message=Wiadomość
commits.date=Data commits.date=Data
commits.older=Starsze commits.older=Starsze
commits.newer=Nowsze commits.newer=Nowsze
commits.signed_by=Podpisane przez commits.signed_by=Podpisane przez
commits.gpg_key_id=ID klucza GPG
issues.new=Nowy problem issues.new=Nowy problem
@ -343,6 +452,8 @@ issues.new.closed_milestone=Zamknięte kamienie milowe
issues.no_ref=Nie określono gałęzi/etykiety issues.no_ref=Nie określono gałęzi/etykiety
issues.create=Utwórz problem issues.create=Utwórz problem
issues.new_label=Nowa etykieta issues.new_label=Nowa etykieta
issues.new_label_placeholder=Nazwa etykiety
issues.new_label_desc_placeholder=Opis
issues.create_label=Utwórz etykietę issues.create_label=Utwórz etykietę
issues.label_templates.title=Załaduj wstępnie przygotowany zestaw etykiet issues.label_templates.title=Załaduj wstępnie przygotowany zestaw etykiet
issues.label_templates.helper=Wybierz zestaw etykiet issues.label_templates.helper=Wybierz zestaw etykiet
@ -361,6 +472,7 @@ issues.delete_branch_at=`usunął gałąź <b>%s</b> %s`
issues.open_tab=Otwarte %d issues.open_tab=Otwarte %d
issues.close_tab=Zamknięte %d issues.close_tab=Zamknięte %d
issues.filter_label=Etykieta issues.filter_label=Etykieta
issues.filter_label_no_select=Wszystkie etykiety
issues.filter_milestone=Kamień milowy issues.filter_milestone=Kamień milowy
issues.filter_assignee=Przypisany issues.filter_assignee=Przypisany
issues.filter_type=Typ issues.filter_type=Typ
@ -411,6 +523,8 @@ issues.label_count=Etykiety %d
issues.label_open_issues=Otwarte problemy %d issues.label_open_issues=Otwarte problemy %d
issues.label_edit=Edytuj issues.label_edit=Edytuj
issues.label_delete=Usuń issues.label_delete=Usuń
issues.label_modify=Edytuj etykietę
issues.label_deletion=Usuń etykietę
issues.label.filter_sort.alphabetically=Alfabetycznie issues.label.filter_sort.alphabetically=Alfabetycznie
issues.label.filter_sort.reverse_alphabetically=Alfabetycznie odwrotnie issues.label.filter_sort.reverse_alphabetically=Alfabetycznie odwrotnie
issues.label.filter_sort.by_size=Rozmiar issues.label.filter_sort.by_size=Rozmiar
@ -420,17 +534,20 @@ issues.attachment.open_tab=`Kliknij, aby zobaczyć „%s” w nowej karcie`
issues.attachment.download=`Kliknij, aby pobrać „%s”` issues.attachment.download=`Kliknij, aby pobrać „%s”`
issues.subscribe=Subskrybuj issues.subscribe=Subskrybuj
issues.unsubscribe=Anuluj subskrypcję issues.unsubscribe=Anuluj subskrypcję
issues.tracker=Śledzenie czasu
issues.start_tracking_short=Rozpocznij issues.start_tracking_short=Rozpocznij
issues.start_tracking_history=`rozpoczął pracę nad %s` issues.start_tracking_history=`rozpoczął pracę nad %s`
issues.tracking_already_started=`Już śledzisz czas pracy nad tą <a href="%s">sprawą</a>!` issues.tracking_already_started=`Już śledzisz czas pracy nad tą <a href="%s">sprawą</a>!`
issues.stop_tracking=Zatrzymaj issues.stop_tracking=Zatrzymaj
issues.stop_tracking_history=`zakończył pracę nad %s` issues.stop_tracking_history=`zakończył pracę nad %s`
issues.add_time_short=Dodaj czas
issues.add_time_cancel=Anuluj issues.add_time_cancel=Anuluj
issues.add_time_history=`dodano spędzony czas %s` issues.add_time_history=`dodano spędzony czas %s`
issues.add_time_hours=Godziny issues.add_time_hours=Godziny
issues.add_time_minutes=Minuty issues.add_time_minutes=Minuty
issues.cancel_tracking=Anuluj issues.cancel_tracking=Anuluj
issues.cancel_tracking_history=`anulowanie śledzenie czasu %s` issues.cancel_tracking_history=`anulowanie śledzenie czasu %s`
issues.due_date_form=yyyy-mm-dd
pulls.new=Nowy pull request pulls.new=Nowy pull request
pulls.filter_branch=Filtruj branch pulls.filter_branch=Filtruj branch
@ -471,6 +588,7 @@ milestones.filter_sort.least_issues=Najmniej problemów
wiki=Wiki wiki=Wiki
wiki.page=Strona wiki.page=Strona
wiki.filter_page=Filtruj stronę wiki.filter_page=Filtruj stronę
wiki.new_page=Strona
wiki.default_commit_message=Opisz tę zmianę (opcjonalne). wiki.default_commit_message=Opisz tę zmianę (opcjonalne).
wiki.save_page=Zapisz stronę wiki.save_page=Zapisz stronę
wiki.last_commit_info=%s edytuje tę stronę %s wiki.last_commit_info=%s edytuje tę stronę %s
@ -526,6 +644,7 @@ search.results=Wyniki wyszukiwania dla "%s" w <a href="%s">%s</a>
settings=Ustawienia settings=Ustawienia
settings.desc=Ustawienia to miejsce, w którym możesz zmieniać parametry repozytorium settings.desc=Ustawienia to miejsce, w którym możesz zmieniać parametry repozytorium
settings.options=Repozytorium
settings.collaboration.write=Zapis settings.collaboration.write=Zapis
settings.collaboration.read=Odczyt settings.collaboration.read=Odczyt
settings.collaboration.undefined=Niezdefiniowany settings.collaboration.undefined=Niezdefiniowany
@ -533,6 +652,8 @@ settings.hooks=Webhooki
settings.githooks=Hooki Git settings.githooks=Hooki Git
settings.basic_settings=Ustawienia podstawowe settings.basic_settings=Ustawienia podstawowe
settings.mirror_settings=Kopia lustrzana ustawień settings.mirror_settings=Kopia lustrzana ustawień
settings.sync_mirror=Synchronizuj teraz
settings.site=Strona
settings.update_settings=Aktualizuj ustawienia settings.update_settings=Aktualizuj ustawienia
settings.advanced_settings=Ustawienia zaawansowane settings.advanced_settings=Ustawienia zaawansowane
settings.external_wiki_url=Adres URL zewnętrznego Wiki settings.external_wiki_url=Adres URL zewnętrznego Wiki
@ -546,11 +667,15 @@ settings.transfer=Przeniesienie własności
settings.delete=Usuń to repozytorium settings.delete=Usuń to repozytorium
settings.delete_notices_1=- Ta operacja <strong>NIE MOŻE</strong> zostać cofnięta. settings.delete_notices_1=- Ta operacja <strong>NIE MOŻE</strong> zostać cofnięta.
settings.transfer_owner=Nowy właściciel settings.transfer_owner=Nowy właściciel
settings.confirm_delete=Usuń repozytorium
settings.delete_collaborator=Usuń
settings.search_user_placeholder=Szukaj użytkownika…
settings.add_webhook=Dodaj webhooka settings.add_webhook=Dodaj webhooka
settings.webhook.test_delivery=Testuj dostawę settings.webhook.test_delivery=Testuj dostawę
settings.webhook.request=Żądanie settings.webhook.request=Żądanie
settings.webhook.response=Odpowiedź settings.webhook.response=Odpowiedź
settings.webhook.headers=Nagłówki settings.webhook.headers=Nagłówki
settings.webhook.payload=Zawartość
settings.webhook.body=Treść settings.webhook.body=Treść
settings.githook_edit_desc=Jeśli hook jest nieaktywny, zaprezentowana zostanie przykładowa treść. Pozostawienie pustej wartości wyłączy ten hook. settings.githook_edit_desc=Jeśli hook jest nieaktywny, zaprezentowana zostanie przykładowa treść. Pozostawienie pustej wartości wyłączy ten hook.
settings.githook_name=Nazwa hooka settings.githook_name=Nazwa hooka
@ -583,6 +708,7 @@ settings.protected_branch_can_push_yes=Możesz wysyłać
settings.protected_branch_can_push_no=Nie możesz wysyłać settings.protected_branch_can_push_no=Nie możesz wysyłać
settings.add_protected_branch=Włącz ochronę settings.add_protected_branch=Włącz ochronę
settings.delete_protected_branch=Wyłącz ochronę settings.delete_protected_branch=Wyłącz ochronę
settings.choose_branch=Wybierz gałąź…
diff.browse_source=Przeglądaj źródła diff.browse_source=Przeglądaj źródła
diff.parent=rodzic diff.parent=rodzic
@ -611,6 +737,7 @@ release.title=Tytuł
release.content=Treść release.content=Treść
release.write=Napisz release.write=Napisz
release.preview=Podgląd release.preview=Podgląd
release.loading=Ładowanie…
release.cancel=Anuluj release.cancel=Anuluj
release.publish=Publikuj wersję release.publish=Publikuj wersję
release.save_draft=Zapisz szkic release.save_draft=Zapisz szkic
@ -625,6 +752,7 @@ branch.create_from=z '%s'
branch.branch_already_exists=Gałąź '%s' już istnieje w tym repozytorium. branch.branch_already_exists=Gałąź '%s' już istnieje w tym repozytorium.
branch.deleted_by=Usunięta przez %s branch.deleted_by=Usunięta przez %s
topic.done=Gotowe
[org] [org]
org_name_holder=Nazwa organizacji org_name_holder=Nazwa organizacji
@ -635,12 +763,16 @@ people=Ludzie
teams=Zespoły teams=Zespoły
lower_members=członkowie lower_members=członkowie
lower_repositories=repozytoria lower_repositories=repozytoria
create_new_team=Nowy zespół
create_team=Utwórz zespół
org_desc=Opis org_desc=Opis
team_name=Nazwa zespołu team_name=Nazwa zespołu
team_desc=Opis team_desc=Opis
team_permission_desc=Uprawnienie
settings=Ustawienia settings=Ustawienia
settings.options=Organizacja
settings.full_name=Imię i nazwisko settings.full_name=Imię i nazwisko
settings.website=Strona settings.website=Strona
settings.location=Lokalizacja settings.location=Lokalizacja
@ -649,9 +781,12 @@ settings.update_setting_success=Ustawienia organizacji zostały zaktualizowane.
settings.delete=Usuń organizację settings.delete=Usuń organizację
settings.delete_account=Usuń tą organizację settings.delete_account=Usuń tą organizację
settings.confirm_delete_account=Potwierdź usunięcie settings.confirm_delete_account=Potwierdź usunięcie
settings.delete_org_title=Usuń organizację
settings.hooks_desc=Dodaj webhooki, uruchamiane dla <strong>wszystkich repozytoriów</strong> w tej organizacji. settings.hooks_desc=Dodaj webhooki, uruchamiane dla <strong>wszystkich repozytoriów</strong> w tej organizacji.
members.membership_visibility=Widoczność członkostwa: members.membership_visibility=Widoczność członkostwa:
members.public=Widoczny
members.private=Ukryty
members.member_role=Rola: members.member_role=Rola:
members.owner=Właściciel members.owner=Właściciel
members.member=Członek members.member=Członek
@ -668,15 +803,19 @@ teams.no_desc=Ten zespół nie ma opisu
teams.settings=Ustawienia teams.settings=Ustawienia
teams.members=Członkowie zespołu teams.members=Członkowie zespołu
teams.update_settings=Aktualizuj ustawienia teams.update_settings=Aktualizuj ustawienia
teams.delete_team=Usuń zespół
teams.add_team_member=Dodaj członka zespołu teams.add_team_member=Dodaj członka zespołu
teams.delete_team_title=Usuń zespół
teams.delete_team_success=Zespół został usunięty. teams.delete_team_success=Zespół został usunięty.
teams.repositories=Repozytoria zespołu teams.repositories=Repozytoria zespołu
teams.search_repo_placeholder=Szukaj repozytorium…
teams.add_team_repository=Dodaj repozytorium zespołu teams.add_team_repository=Dodaj repozytorium zespołu
teams.remove_repo=Usuń teams.remove_repo=Usuń
teams.add_nonexistent_repo=Repozytorium, które próbujesz dodać, nie istnieje. Proszę je najpierw utworzyć. teams.add_nonexistent_repo=Repozytorium, które próbujesz dodać, nie istnieje. Proszę je najpierw utworzyć.
[admin] [admin]
dashboard=Pulpit dashboard=Pulpit
users=Konta użytkownika
organizations=Organizacje organizations=Organizacje
repositories=Repozytoria repositories=Repozytoria
config=Konfiguracja config=Konfiguracja
@ -686,13 +825,13 @@ first_page=Pierwsza
last_page=Ostatnia last_page=Ostatnia
total=Ogółem: %d total=Ogółem: %d
dashboard.statistic=Podsumowanie
dashboard.system_status=Status strony
dashboard.operation_name=Nazwa operacji dashboard.operation_name=Nazwa operacji
dashboard.operation_switch=Przełącz dashboard.operation_switch=Przełącz
dashboard.operation_run=Uruchom dashboard.operation_run=Uruchom
dashboard.clean_unbind_oauth=Usuń wychodzące połączenia OAuth dashboard.clean_unbind_oauth=Usuń wychodzące połączenia OAuth
dashboard.clean_unbind_oauth_success=Wszystkie połączenia wychodzące OAuth zostały usunięte. dashboard.clean_unbind_oauth_success=Wszystkie połączenia wychodzące OAuth zostały usunięte.
dashboard.delete_inactivate_accounts=Usuń wszystkie nieaktywne konta
dashboard.delete_inactivate_accounts_success=Wszystkie nieaktywne konta zostały usunięte.
dashboard.reinit_missing_repos=Ponownie zainicjalizuj wszystkie brakujące repozytoria Git, dla których istnieją rekordy dashboard.reinit_missing_repos=Ponownie zainicjalizuj wszystkie brakujące repozytoria Git, dla których istnieją rekordy
dashboard.reinit_missing_repos_success=Wszystkie brakujące repozytoria Git, dla których istnieją rekordy, zostały zainicjalizowane. dashboard.reinit_missing_repos_success=Wszystkie brakujące repozytoria Git, dla których istnieją rekordy, zostały zainicjalizowane.
dashboard.sync_external_users=Synchronizuj zewnętrzne dane użytkownika dashboard.sync_external_users=Synchronizuj zewnętrzne dane użytkownika
@ -724,6 +863,7 @@ dashboard.total_gc_pause=Sumaryczny czas wstrzymania przez GC
dashboard.last_gc_pause=Ostatnie wstrzymanie przez GC dashboard.last_gc_pause=Ostatnie wstrzymanie przez GC
dashboard.gc_times=Ilość wywołań GC dashboard.gc_times=Ilość wywołań GC
users.name=Nazwa użytkownika
users.activated=Aktywowany users.activated=Aktywowany
users.admin=Administrator users.admin=Administrator
users.repos=Repozytoria users.repos=Repozytoria
@ -731,11 +871,14 @@ users.created=Utworzony
users.edit=Edytuj users.edit=Edytuj
users.auth_source=Źródło uwierzytelniania users.auth_source=Źródło uwierzytelniania
users.local=Lokalny users.local=Lokalny
users.update_profile=Zaktualizuj konto użytkownika
users.delete_account=Usuń konto użytkownika
orgs.org_manage_panel=Zarządzanie organizacją orgs.org_manage_panel=Zarządzanie organizacją
orgs.name=Nazwa orgs.name=Nazwa
orgs.teams=Zespoły orgs.teams=Zespoły
orgs.members=Członkowie orgs.members=Członkowie
orgs.new_orga=Nowa organizacja
repos.repo_manage_panel=Zarządzanie repozytoriami repos.repo_manage_panel=Zarządzanie repozytoriami
repos.owner=Właściciel repos.owner=Właściciel
@ -760,6 +903,7 @@ auths.bind_dn=DN powiązania
auths.bind_password=Hasło Bind auths.bind_password=Hasło Bind
auths.user_base=Baza wyszukiwania auths.user_base=Baza wyszukiwania
auths.user_dn=DN użytkownika auths.user_dn=DN użytkownika
auths.search_page_size=Rozmiar strony
auths.filter=Filtr użytkownika auths.filter=Filtr użytkownika
auths.admin_filter=Filtr administratora auths.admin_filter=Filtr administratora
auths.ms_ad_sa=Atrybuty wyszukiwania MS AD auths.ms_ad_sa=Atrybuty wyszukiwania MS AD
@ -791,6 +935,8 @@ auths.new_success=Uwierzytelnienie '%s' zostało dodane.
auths.delete_auth_title=Usuń źródło uwierzytelniania auths.delete_auth_title=Usuń źródło uwierzytelniania
config.server_config=Konfiguracja serwera config.server_config=Konfiguracja serwera
config.app_name=Tytuł strony
config.app_ver=Wersja Gitea
config.custom_conf=Ścieżka do pliku konfiguracyjnego config.custom_conf=Ścieżka do pliku konfiguracyjnego
config.disable_router_log=Wyłącz dziennik routera config.disable_router_log=Wyłącz dziennik routera
config.run_mode=Tryb uruchamienia config.run_mode=Tryb uruchamienia
@ -798,11 +944,13 @@ config.git_version=Wersja Git
config.repo_root_path=Ścieżka główna repozytoriów config.repo_root_path=Ścieżka główna repozytoriów
config.lfs_root_path=Ścieżka główna katalogu LFS config.lfs_root_path=Ścieżka główna katalogu LFS
config.static_file_root_path=Ścieżka główna plików statycznych config.static_file_root_path=Ścieżka główna plików statycznych
config.log_file_root_path=Ścieżka dla logów
config.script_type=Typ skryptu config.script_type=Typ skryptu
config.reverse_auth_user=Użytkownik odwrotnego proxy config.reverse_auth_user=Użytkownik odwrotnego proxy
config.ssh_config=Konfiguracja SSH config.ssh_config=Konfiguracja SSH
config.ssh_enabled=Włączone config.ssh_enabled=Włączone
config.ssh_domain=Domena serwera
config.ssh_port=Port config.ssh_port=Port
config.ssh_listen_port=Port nasłuchiwania config.ssh_listen_port=Port nasłuchiwania
config.ssh_root_path=Ścieżka do katalogu głównego config.ssh_root_path=Ścieżka do katalogu głównego
@ -815,11 +963,13 @@ config.db_config=Konfiguracja bazy danych
config.db_type=Typ config.db_type=Typ
config.db_host=Serwer config.db_host=Serwer
config.db_name=Nazwa config.db_name=Nazwa
config.db_ssl_mode=SSL
config.db_path=Ścieżka config.db_path=Ścieżka
config.service_config=Konfiguracja usługi config.service_config=Konfiguracja usługi
config.show_registration_button=Pokazuj przycisk rejestracji config.show_registration_button=Pokazuj przycisk rejestracji
config.disable_key_size_check=Wyłącz sprawdzanie minimalnego rozmiaru klucza config.disable_key_size_check=Wyłącz sprawdzanie minimalnego rozmiaru klucza
config.enable_captcha=Włącz CAPTCHA
config.active_code_lives=Ważność kodów aktywacyjnych config.active_code_lives=Ważność kodów aktywacyjnych
config.reset_password_code_lives=Czas wygaśnięcia kodu resetowania hasła config.reset_password_code_lives=Czas wygaśnięcia kodu resetowania hasła

View File

@ -32,16 +32,16 @@ twofa_scratch=Código de backup da autenticação de dois fatores
passcode=Senha passcode=Senha
u2f_insert_key=Insira sua chave de segurança u2f_insert_key=Insira sua chave de segurança
u2f_sign_in=Pressione o botão na sua chave de segurança. Se você não encontrar um botão, insira-o novamente. u2f_sign_in=Pressione o botão na sua chave de segurança. Se a sua chave de segurança não tiver um botão, insira-a novamente.
u2f_press_button=Por favor, pressione o botão na sua chave de segurança... u2f_press_button=Por favor, pressione o botão na sua chave de segurança...
u2f_use_twofa=Use um código de dois fatores no seu telefone u2f_use_twofa=Use um código de dois fatores no seu telefone
u2f_error=Não conseguimos ler sua chave de segurança! u2f_error=Não foi possível ler sua chave de segurança.
u2f_unsupported_browser=Seu navegador não suporta chaves U2F. Por favor, tente outro navegador. u2f_unsupported_browser=Seu navegador não suporta chaves de segurança U2F.
u2f_error_1=Ocorreu um erro desconhecido. Por favor, tente novamente. u2f_error_1=Ocorreu um erro desconhecido. Por favor, tente novamente.
u2f_error_2=Por favor, certifique-se de que você está usando uma conexão criptografada (https://) e visite a URL correta. u2f_error_2=Por favor, certifique-se de usar a URL correto, criptografado (https://).
u2f_error_3=O servidor não pôde prosseguir com sua solicitação. u2f_error_3=O servidor não pôde processar sua solicitação.
u2f_error_4=A chave apresentada não é elegível para esta solicitação. Se você tentar registrá-la, certifique-se de que a chave já não é registrada. u2f_error_4=A chave de segurança não é permitida para esta solicitação. Por favor, certifique-se que a chave já não está registrada.
u2f_error_5=Tempo limite atingido antes de sua chave poder ser lida. Por favor, recarregue para tentar novamente. u2f_error_5=Tempo limite atingido antes de sua chave poder ser lida. Por favor, recarregue esta página e tente novamente.
u2f_reload=Recarregar u2f_reload=Recarregar
repository=Repositório repository=Repositório
@ -53,7 +53,7 @@ new_mirror=Novo mirror
new_fork=Novo Fork de Repositório new_fork=Novo Fork de Repositório
new_org=Nova organização new_org=Nova organização
manage_org=Gerenciar organizações manage_org=Gerenciar organizações
admin_panel=Administração do site admin_panel=Administração geral
account_settings=Configurações da conta account_settings=Configurações da conta
settings=Configurações settings=Configurações
your_profile=Perfil your_profile=Perfil
@ -75,7 +75,7 @@ cancel=Cancelar
[install] [install]
install=Instalação install=Instalação
title=Configuração inicial title=Configuração inicial
docker_helper=Se você está rodando o Gitea dentro do Docker, por favor leia a <a target="_blank" rel="noopener" href="%s">documentação</a> cuidadosamente antes de alterar qualquer coisa nesta página. docker_helper=Se você está rodando o Gitea dentro do Docker, por favor leia a <a target="_blank" rel="noopener noreferrer" href="%s">documentação</a> cuidadosamente antes de alterar qualquer coisa nesta página.
requite_db_desc=Gitea requer MySQL, PostgreSQL, MSSQL, SQLite3 ou TiDB. requite_db_desc=Gitea requer MySQL, PostgreSQL, MSSQL, SQLite3 ou TiDB.
db_title=Configurações de banco de dados db_title=Configurações de banco de dados
db_type=Tipo de banco de dados db_type=Tipo de banco de dados
@ -93,7 +93,7 @@ no_admin_and_disable_registration=Você não pode desabilitar o auto-cadastro do
err_empty_admin_password=A senha do administrador não pode ser em branco. err_empty_admin_password=A senha do administrador não pode ser em branco.
general_title=Configurações gerais general_title=Configurações gerais
app_name=Título do site app_name=Nome do servidor
app_name_helper=Você pode inserir o nome da empresa aqui. app_name_helper=Você pode inserir o nome da empresa aqui.
repo_path=Caminho raíz do repositório repo_path=Caminho raíz do repositório
repo_path_helper=Todos os repositórios remotos do Git serão salvos neste diretório. repo_path_helper=Todos os repositórios remotos do Git serão salvos neste diretório.
@ -130,7 +130,7 @@ federated_avatar_lookup=Habilitar avatares federativos
federated_avatar_lookup_popup=Habilitar a busca federativa de avatares a usar o serviço federativo de código aberto baseado no libravatar. federated_avatar_lookup_popup=Habilitar a busca federativa de avatares a usar o serviço federativo de código aberto baseado no libravatar.
disable_registration=Desabilitar auto-cadastro disable_registration=Desabilitar auto-cadastro
disable_registration_popup=Desabilitar auto-cadastro de usuário. Somente os administradores serão capazes de criar novas contas de usuário. disable_registration_popup=Desabilitar auto-cadastro de usuário. Somente os administradores serão capazes de criar novas contas de usuário.
allow_only_external_registration_popup=Habilitar o cadastro apenas por meio de serviços externos. allow_only_external_registration_popup=Permitir cadastro somente por meio de serviços externos
openid_signin=Habilitar acesso via OpenID openid_signin=Habilitar acesso via OpenID
openid_signin_popup=Habilitar o acesso de usuários via OpenID. openid_signin_popup=Habilitar o acesso de usuários via OpenID.
openid_signup=Habilitar o auto-cadastro via OpenID openid_signup=Habilitar o auto-cadastro via OpenID
@ -463,13 +463,13 @@ then_enter_passcode=E insira a senha mostrada no aplicativo:
passcode_invalid=Esse código de acesso é inválido. Tente novamente. passcode_invalid=Esse código de acesso é inválido. Tente novamente.
twofa_enrolled=Sua conta foi inscrita na autenticação de dois fatores. Armazene seu token de backup (%s) em um local seguro, pois ele é exibido apenas uma vez! twofa_enrolled=Sua conta foi inscrita na autenticação de dois fatores. Armazene seu token de backup (%s) em um local seguro, pois ele é exibido apenas uma vez!
u2f_desc=Chaves de segurança são dispositivos de hardware que contém chaves de criptografia. Elas podem ser usadas para autenticação de dois fatores. A chave de segurança deve suportar o padrão <a href="https://fidoalliance.org/">FIDO U2F</a>. u2f_desc=Chaves de segurança são dispositivos de hardware contendo chaves criptográficas. Eles podem ser usados para autenticação de dois fatores. As chaves de segurança devem suportar o padrão <a rel="noreferrer" href="https://fidoalliance.org/">FIDO U2F</a>.
u2f_require_twofa=Autenticação de dois fatores deve estar inscrita para usar chaves de segurança. u2f_require_twofa=Sua conta deve estar inscrita na autenticação de dois fatores para usar as chaves de segurança.
u2f_register_key=Adicionar chave de segurança u2f_register_key=Adicionar chave de segurança
u2f_nickname=Apelido u2f_nickname=Apelido
u2f_press_button=Pressione o botão na sua chave de segurança para registrá-la. u2f_press_button=Pressione o botão na sua chave de segurança para registrá-la.
u2f_delete_key=Remover chave de segurança u2f_delete_key=Remover chave de segurança
u2f_delete_key_desc=Se você remover uma chave de segurança você não poderá mais acessar com ela. Tem certeza? u2f_delete_key_desc=Se você remover uma chave de segurança, não poderá mais entrar com ela. Continuar?
manage_account_links=Gerenciar contas vinculadas manage_account_links=Gerenciar contas vinculadas
manage_account_links_desc=Estas contas externas estão vinculadas a sua conta de Gitea. manage_account_links_desc=Estas contas externas estão vinculadas a sua conta de Gitea.
@ -492,13 +492,13 @@ owner=Proprietário
repo_name=Nome do repositório repo_name=Nome do repositório
repo_name_helper=Um bom nome de repositório é composto por palavras curtas, memorizáveis e únicas. repo_name_helper=Um bom nome de repositório é composto por palavras curtas, memorizáveis e únicas.
visibility=Visibilidade visibility=Visibilidade
visiblity_helper=Tornar este repositório privado visibility_helper=Tornar este repositório privado
visiblity_helper_forced=O administrador do site força novos repositórios a serem privados. visibility_helper_forced=O administrador do site força novos repositórios a serem privados.
visiblity_fork_helper=(Esta alteração irá afetar todos os forks.) visibility_fork_helper=(Esta alteração irá afetar todos os forks.)
clone_helper=Precisa de ajuda com o clone? Visite a <a target="_blank" rel="noopener" href="%s">Ajuda</a>. clone_helper=Precisa de ajuda com o clone? Visite a <a target="_blank" rel="noopener noreferrer" href="%s">Ajuda</a>.
fork_repo=Fork do repositório fork_repo=Fork do repositório
fork_from=Fork de fork_from=Fork de
fork_visiblity_helper=A visibilidade do fork de um repositório não pode ser alterada. fork_visibility_helper=A visibilidade do fork de um repositório não pode ser alterada.
repo_desc=Descrição repo_desc=Descrição
repo_lang=Linguagem repo_lang=Linguagem
repo_gitignore_helper=Selecione modelos do .gitignore. repo_gitignore_helper=Selecione modelos do .gitignore.
@ -597,7 +597,7 @@ editor.name_your_file=Nomeie o seu arquivo…
editor.filename_help=Adicione um diretório digitando seu nome seguido por uma barra ('/'). Remova um diretório digitando o backspace no início do campo de entrada. editor.filename_help=Adicione um diretório digitando seu nome seguido por uma barra ('/'). Remova um diretório digitando o backspace no início do campo de entrada.
editor.or=ou editor.or=ou
editor.cancel_lower=Cancelar editor.cancel_lower=Cancelar
editor.commit_changes=Confirmar alterações editor.commit_changes=Realizar commit das alterações
editor.add_tmpl=Adicionar '%s/<filename>' editor.add_tmpl=Adicionar '%s/<filename>'
editor.add=Adicionar '%s' editor.add=Adicionar '%s'
editor.update=Atualizar '%s' editor.update=Atualizar '%s'
@ -613,7 +613,7 @@ editor.directory_is_a_file=O nome do diretório '%s' já é usado como um nome d
editor.file_is_a_symlink='%s' é um link simbólico. Links simbólicos não podem ser editados no editor da web editor.file_is_a_symlink='%s' é um link simbólico. Links simbólicos não podem ser editados no editor da web
editor.filename_is_a_directory=O nome do arquivo '%s' já é usado como um nome de diretório neste repositório. editor.filename_is_a_directory=O nome do arquivo '%s' já é usado como um nome de diretório neste repositório.
editor.file_editing_no_longer_exists=O arquivo que está sendo editado, '%s', não existe mais neste repositório. editor.file_editing_no_longer_exists=O arquivo que está sendo editado, '%s', não existe mais neste repositório.
editor.file_changed_while_editing=O conteúdo do arquivo mudou desde que você começou a editar. <a target="_blank" rel="noopener" href="%s">Clique aqui</a> para ver o que foi editado ou <strong>clique em Commit novamemente</strong> para sobreescrever essas mudanças. editor.file_changed_while_editing=O conteúdo do arquivo mudou desde que você começou a editar. <a target="_blank" rel="noopener noreferrer" href="%s">Clique aqui</a> para ver o que foi editado ou <strong>clique em Commit novamemente</strong> para sobreescrever essas mudanças.
editor.file_already_exists=Um arquivo com nome '%s' já existe neste repositório. editor.file_already_exists=Um arquivo com nome '%s' já existe neste repositório.
editor.no_changes_to_show=Nenhuma alteração a mostrar. editor.no_changes_to_show=Nenhuma alteração a mostrar.
editor.fail_to_update_file=Houve erro ao criar ou atualizar arquivo '%s': %v editor.fail_to_update_file=Houve erro ao criar ou atualizar arquivo '%s': %v
@ -650,7 +650,7 @@ issues.new.open_milestone=Marcos abertos
issues.new.closed_milestone=Marcos fechados issues.new.closed_milestone=Marcos fechados
issues.new.assignees=Responsáveis issues.new.assignees=Responsáveis
issues.new.clear_assignees=Limpar responsáveis issues.new.clear_assignees=Limpar responsáveis
issues.new.no_assignees=Nenhum responsável issues.new.no_assignees=Sem responsável
issues.no_ref=Nenhum branch/tag especificado issues.no_ref=Nenhum branch/tag especificado
issues.create=Criar issue issues.create=Criar issue
issues.new_label=Nova etiqueta issues.new_label=Nova etiqueta
@ -682,7 +682,7 @@ issues.filter_milestone_no_select=Todos os marcos
issues.filter_assignee=Atribuído issues.filter_assignee=Atribuído
issues.filter_assginee_no_select=Todos os responsáveis issues.filter_assginee_no_select=Todos os responsáveis
issues.filter_type=Tipo issues.filter_type=Tipo
issues.filter_type.all_issues=Todos os issues issues.filter_type.all_issues=Todas as issues
issues.filter_type.assigned_to_you=Atribuídos a você issues.filter_type.assigned_to_you=Atribuídos a você
issues.filter_type.created_by_you=Criado por você issues.filter_type.created_by_you=Criado por você
issues.filter_type.mentioning_you=Mencionando você issues.filter_type.mentioning_you=Mencionando você
@ -781,6 +781,33 @@ issues.due_date_added=adicionou a data limite %s %s
issues.due_date_modified=modificou a data limite para %s ao invés de %s %s issues.due_date_modified=modificou a data limite para %s ao invés de %s %s
issues.due_date_remove=removeu a data limite %s %s issues.due_date_remove=removeu a data limite %s %s
issues.due_date_overdue=Em atraso issues.due_date_overdue=Em atraso
issues.due_date_invalid=A data limite é inválida ou está fora do intervalo. Por favor, use o formato 'dd/mm/aaaa'.
issues.dependency.title=Dependências
issues.dependency.issue_no_dependencies=Esta issue atualmente não tem dependências.
issues.dependency.pr_no_dependencies=Este pull request atualmente não tem dependências.
issues.dependency.add=Adicione...
issues.dependency.cancel=Cancelar
issues.dependency.remove=Remover
issues.dependency.added_dependency=`<a href="%[1]s">%[2]s</a> adicionou uma nova dependência %[3]s`
issues.dependency.removed_dependency=`<a href="%[1]s">%[2]s</a> removeu uma dependência %[3]s`
issues.dependency.issue_closing_blockedby=Fechamento deste pull request está bloqueado pelas seguintes issues
issues.dependency.pr_closing_blockedby=Fechamento desta issue está bloqueado pelas seguintes issues
issues.dependency.issue_close_blocks=Esta issue bloqueia o fechamento das seguintes issues
issues.dependency.pr_close_blocks=Este pull request bloqueia o fechamento das seguintes issues
issues.dependency.issue_close_blocked=Você precisa fechar todas as issues que bloqueiam esta issue antes de poder fechá-la.
issues.dependency.pr_close_blocked=Você precisa fechar todas issues que bloqueiam este pull request antes de poder fazer o merge.
issues.dependency.blocks_short=Bloqueia
issues.dependency.blocked_by_short=Depende de
issues.dependency.remove_header=Remover dependência
issues.dependency.issue_remove_text=Isto removerá a dependência desta issue. Continuar?
issues.dependency.pr_remove_text=Isto removerá a dependência deste pull request. Continuar?
issues.dependency.setting=Habilitar dependências para issues e pull requests
issues.dependency.add_error_same_issue=Você não pode fazer uma issue depender de si mesma.
issues.dependency.add_error_dep_issue_not_exist=Issue dependente não existe.
issues.dependency.add_error_dep_not_exist=Dependência não existe.
issues.dependency.add_error_dep_exists=Dependência já existe.
issues.dependency.add_error_cannot_create_circular=Você não pode criar uma dependência com duas issues bloqueando uma a outra.
issues.dependency.add_error_dep_not_same_repo=Ambas as issues devem estar no mesmo repositório.
pulls.desc=Habilitar solicitações de merge e revisões de código. pulls.desc=Habilitar solicitações de merge e revisões de código.
pulls.new=Novo pull request pulls.new=Novo pull request
@ -793,7 +820,7 @@ pulls.no_results=Nada encontrado.
pulls.nothing_to_compare=Estes branches são iguais. Não há nenhuma necessidade para criar um pull request. pulls.nothing_to_compare=Estes branches são iguais. Não há nenhuma necessidade para criar um pull request.
pulls.has_pull_request=`Um pull request entre esses branches já existe: <a href="%[1]s/pulls/%[3]d">%[2]s#%[3]d</a>` pulls.has_pull_request=`Um pull request entre esses branches já existe: <a href="%[1]s/pulls/%[3]d">%[2]s#%[3]d</a>`
pulls.create=Criar pull request pulls.create=Criar pull request
pulls.title_desc=quer mesclar %[1]d commits de <code>%[2]s</code> em <code>%[3]s</code> pulls.title_desc=quer realizar o merge de %[1]d commits de <code>%[2]s</code> em <code>%[3]s</code>
pulls.merged_title_desc=fez merge dos %[1]d commits de <code>%[2]s</code> em <code>%[3]s</code> %[4]s pulls.merged_title_desc=fez merge dos %[1]d commits de <code>%[2]s</code> em <code>%[3]s</code> %[4]s
pulls.tab_conversation=Conversação pulls.tab_conversation=Conversação
pulls.tab_commits=Commits pulls.tab_commits=Commits
@ -818,14 +845,14 @@ milestones.new=Novo marco
milestones.open_tab=%d Aberto milestones.open_tab=%d Aberto
milestones.close_tab=%d Fechado milestones.close_tab=%d Fechado
milestones.closed=Fechado %s milestones.closed=Fechado %s
milestones.no_due_date=Sem prazo milestones.no_due_date=Sem data limite
milestones.open=Reabrir milestones.open=Reabrir
milestones.close=Fechar milestones.close=Fechar
milestones.new_subheader=Marcos organizam as issues e acompanham o progresso. milestones.new_subheader=Marcos organizam as issues e acompanham o progresso.
milestones.create=Criar marco milestones.create=Criar marco
milestones.title=Título milestones.title=Título
milestones.desc=Descrição milestones.desc=Descrição
milestones.due_date=Prazo (opcional) milestones.due_date=Data limite (opcional)
milestones.clear=Limpar milestones.clear=Limpar
milestones.invalid_due_date_format=Formato da data limite deve ser 'dd/mm/aaaa'. milestones.invalid_due_date_format=Formato da data limite deve ser 'dd/mm/aaaa'.
milestones.create_success=O marco '%s' foi criado. milestones.create_success=O marco '%s' foi criado.
@ -837,8 +864,8 @@ milestones.edit_success=O marco '%s' foi atualizado.
milestones.deletion=Excluir marco milestones.deletion=Excluir marco
milestones.deletion_desc=A exclusão deste marco irá removê-lo de todas as issues. Tem certeza que deseja continuar? milestones.deletion_desc=A exclusão deste marco irá removê-lo de todas as issues. Tem certeza que deseja continuar?
milestones.deletion_success=O marco foi excluído. milestones.deletion_success=O marco foi excluído.
milestones.filter_sort.closest_due_date=Prazo mais próximo milestones.filter_sort.closest_due_date=Data limite mais próxima
milestones.filter_sort.furthest_due_date=Prazo mais longe milestones.filter_sort.furthest_due_date=Data limite mais distante
milestones.filter_sort.least_complete=Menos completo milestones.filter_sort.least_complete=Menos completo
milestones.filter_sort.most_complete=Mais completo milestones.filter_sort.most_complete=Mais completo
milestones.filter_sort.most_issues=Com mais issues milestones.filter_sort.most_issues=Com mais issues
@ -894,15 +921,15 @@ activity.closed_issues_count_1=Issue fechada
activity.closed_issues_count_n=Issues fechadas activity.closed_issues_count_n=Issues fechadas
activity.title.issues_1=+%d Issue activity.title.issues_1=+%d Issue
activity.title.issues_n=+%d Issues activity.title.issues_n=+%d Issues
activity.title.issues_closed_by=%s fechado por %s activity.title.issues_closed_by=%s fechada por %s
activity.title.issues_created_by=%s criado por %s activity.title.issues_created_by=%s criada por %s
activity.closed_issue_label=Fechado activity.closed_issue_label=Fechado
activity.new_issues_count_1=Nova issue activity.new_issues_count_1=Nova issue
activity.new_issues_count_n=Novas issues activity.new_issues_count_n=Novas issues
activity.new_issue_label=Aberto activity.new_issue_label=Aberto
activity.title.unresolved_conv_1=%d conversa não resolvida activity.title.unresolved_conv_1=%d conversa não resolvida
activity.title.unresolved_conv_n=%d conversas não resolvidas activity.title.unresolved_conv_n=%d conversas não resolvidas
activity.unresolved_conv_desc=Estes problemas foram recentemente alterados e pull requests ainda não foram resolvidos. activity.unresolved_conv_desc=Estas issues foram recentemente alteradas e pull requests ainda não foram resolvidos.
activity.unresolved_conv_label=Abrir activity.unresolved_conv_label=Abrir
activity.title.releases_1=%d Versão activity.title.releases_1=%d Versão
activity.title.releases_n=%d Versões activity.title.releases_n=%d Versões
@ -994,7 +1021,7 @@ settings.search_user_placeholder=Pesquisar usuário...
settings.org_not_allowed_to_be_collaborator=Organizações não podem ser adicionadas como um colaborador. settings.org_not_allowed_to_be_collaborator=Organizações não podem ser adicionadas como um colaborador.
settings.user_is_org_member=O usuário é um membro da organização e não pode ser adicionado como um colaborador. settings.user_is_org_member=O usuário é um membro da organização e não pode ser adicionado como um colaborador.
settings.add_webhook=Adicionar webhook settings.add_webhook=Adicionar webhook
settings.hooks_desc=Webhooks automaticamente fazem requisições de HTTP POST para um servidor quando acionados determinados eventos de Gitea. Leia mais no <a target="_blank" rel="noopener" href="%s">guia de webhooks</a>. settings.hooks_desc=Webhooks automaticamente fazem requisições de HTTP POST para um servidor quando acionados determinados eventos de Gitea. Leia mais no <a target="_blank" rel="noopener noreferrer" href="%s">guia de webhooks</a>.
settings.webhook_deletion=Remover webhook settings.webhook_deletion=Remover webhook
settings.webhook_deletion_desc=A exclusão de um webhook exclui suas configurações e o histórico de entrega. Continuar? settings.webhook_deletion_desc=A exclusão de um webhook exclui suas configurações e o histórico de entrega. Continuar?
settings.webhook_deletion_success=O webhook foi removido. settings.webhook_deletion_success=O webhook foi removido.
@ -1011,7 +1038,7 @@ settings.githook_edit_desc=Se o hook não estiver ativo, o conteúdo de exemplo
settings.githook_name=Nome do Hook settings.githook_name=Nome do Hook
settings.githook_content=Conteúdo do Hook settings.githook_content=Conteúdo do Hook
settings.update_githook=Atualizar Hook settings.update_githook=Atualizar Hook
settings.add_webhook_desc=Gitea enviará requisições <code>POST</code> com um tipo de conteúdo especificado para a URL de destino. Leia mais no <a target="_blank" rel="noopener" href="%s">guia de webhooks</a>. settings.add_webhook_desc=Gitea enviará requisições <code>POST</code> com um tipo de conteúdo especificado para a URL de destino. Leia mais no <a target="_blank" rel="noopener noreferrer" href="%s">guia de webhooks</a>.
settings.payload_url=URL de destino settings.payload_url=URL de destino
settings.content_type=Tipo de conteúdo POST settings.content_type=Tipo de conteúdo POST
settings.secret=Senha settings.secret=Senha
@ -1078,16 +1105,16 @@ settings.protected_branch_can_push_no=Você não pode fazer push
settings.branch_protection=Proteção de branch para '<b>%s</b>' settings.branch_protection=Proteção de branch para '<b>%s</b>'
settings.protect_this_branch=Habilitar proteção de branch settings.protect_this_branch=Habilitar proteção de branch
settings.protect_this_branch_desc=Evitar exclusão e desabilitar Git force pushing para o branch. settings.protect_this_branch_desc=Evitar exclusão e desabilitar Git force pushing para o branch.
settings.protect_whitelist_committers=Habilitar lista branca de push settings.protect_whitelist_committers=Habilitar controle de permissão de push
settings.protect_whitelist_committers_desc=Permitir que usuários ou equipes da lista branca possam contornar restrições de push. settings.protect_whitelist_committers_desc=Permitir que determinados usuários ou equipes possam realizar push.
settings.protect_whitelist_users=Usuários da lista branca permitidos para realizar push: settings.protect_whitelist_users=Usuários com permissão para realizar push:
settings.protect_whitelist_search_users=Pesquisar usuários... settings.protect_whitelist_search_users=Pesquisar usuários...
settings.protect_whitelist_teams=Equipes da lista branca permitidos para realizar push: settings.protect_whitelist_teams=Equipes com permissão para realizar push:
settings.protect_whitelist_search_teams=Pesquisar equipes... settings.protect_whitelist_search_teams=Pesquisar equipes...
settings.protect_merge_whitelist_committers=Habilitar lista branca de merge settings.protect_merge_whitelist_committers=Habilitar controle de permissão de merge
settings.protect_merge_whitelist_committers_desc=Permitir que somente usuários ou equipes que estão na lista branca façam merge de pull requests neste branch. settings.protect_merge_whitelist_committers_desc=Permitir que determinados usuários ou equipes possam realizar merge de pull requests neste branch.
settings.protect_merge_whitelist_users=Usuários da lista branca permitidos para realizar merge: settings.protect_merge_whitelist_users=Usuários com permissão para realizar merge:
settings.protect_merge_whitelist_teams=Times da lista branca permitidos para realizar merge: settings.protect_merge_whitelist_teams=Equipes com permissão para realizar merge:
settings.add_protected_branch=Habilitar proteção settings.add_protected_branch=Habilitar proteção
settings.delete_protected_branch=Desabilitar proteção settings.delete_protected_branch=Desabilitar proteção
settings.update_protect_branch_success=Proteção do branch '%s' foi atualizada. settings.update_protect_branch_success=Proteção do branch '%s' foi atualizada.
@ -1097,6 +1124,7 @@ settings.protected_branch_deletion_desc=Desabilitar a proteção de branch permi
settings.default_branch_desc=Selecione um branch padrão para pull requests e commits de código: settings.default_branch_desc=Selecione um branch padrão para pull requests e commits de código:
settings.choose_branch=Escolha um branch... settings.choose_branch=Escolha um branch...
settings.no_protected_branch=Não há branches protegidos. settings.no_protected_branch=Não há branches protegidos.
settings.edit_protected_branch=Editar
diff.browse_source=Ver código fonte diff.browse_source=Ver código fonte
diff.parent=pai diff.parent=pai
@ -1167,6 +1195,8 @@ branch.protected_deletion_failed=A branch '%s' está protegida. Ela não pode se
topic.manage_topics=Gerenciar Tópicos topic.manage_topics=Gerenciar Tópicos
topic.done=Feito topic.done=Feito
topic.count_prompt=Você não pode selecionar mais de 25 tópicos
topic.format_prompt=Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
[org] [org]
org_name_holder=Nome da organização org_name_holder=Nome da organização
@ -1271,8 +1301,8 @@ dashboard.operation_switch=Trocar
dashboard.operation_run=Executar dashboard.operation_run=Executar
dashboard.clean_unbind_oauth=Limpar conexões OAuth não vinculadas dashboard.clean_unbind_oauth=Limpar conexões OAuth não vinculadas
dashboard.clean_unbind_oauth_success=Todas as conexões de OAuth não vinculadas foram excluídas. dashboard.clean_unbind_oauth_success=Todas as conexões de OAuth não vinculadas foram excluídas.
dashboard.delete_inactivate_accounts=Excluir todas as contas inativas dashboard.delete_inactivate_accounts=Excluir todas as contas não ativadas
dashboard.delete_inactivate_accounts_success=Todas as contas inativas foram excluídas. dashboard.delete_inactivate_accounts_success=Todas as contas não ativadas foram excluídas.
dashboard.delete_repo_archives=Excluir todos os arquivos do repositório dashboard.delete_repo_archives=Excluir todos os arquivos do repositório
dashboard.delete_repo_archives_success=Todos os arquivos do repositório foram excluídos. dashboard.delete_repo_archives_success=Todos os arquivos do repositório foram excluídos.
dashboard.delete_missing_repos=Excluir todos os repositórios que não possuem seus arquivos Git dashboard.delete_missing_repos=Excluir todos os repositórios que não possuem seus arquivos Git
@ -1440,7 +1470,7 @@ auths.deletion_success=A fonte de autenticação foi excluída.
auths.login_source_exist=A fonte de autenticação '%s' já existe. auths.login_source_exist=A fonte de autenticação '%s' já existe.
config.server_config=Configuração do servidor config.server_config=Configuração do servidor
config.app_name=Título do site config.app_name=Nome do servidor
config.app_ver=Versão do Gitea config.app_ver=Versão do Gitea
config.app_url=URL base do Gitea config.app_url=URL base do Gitea
config.custom_conf=Caminho do Arquivo de Configuração config.custom_conf=Caminho do Arquivo de Configuração
@ -1480,7 +1510,7 @@ config.db_path=Caminho
config.service_config=Configuração do serviço config.service_config=Configuração do serviço
config.register_email_confirm=Exigir confirmação de e-mail para se cadastrar config.register_email_confirm=Exigir confirmação de e-mail para se cadastrar
config.disable_register=Desabilitar auto-cadastro config.disable_register=Desabilitar auto-cadastro
config.allow_only_external_registration=Habilitar o cadastro apenas por meio de serviços externos config.allow_only_external_registration=Permitir cadastro somente por meio de serviços externos
config.enable_openid_signup=Habilitar o auto-cadastro via OpenID config.enable_openid_signup=Habilitar o auto-cadastro via OpenID
config.enable_openid_signin=Habilitar acesso via OpenID config.enable_openid_signin=Habilitar acesso via OpenID
config.show_registration_button=Mostrar botão de cadastro config.show_registration_button=Mostrar botão de cadastro
@ -1496,6 +1526,7 @@ config.enable_timetracking=Habilitar contador de tempo
config.default_enable_timetracking=Habilitar o contador de tempo por padrão config.default_enable_timetracking=Habilitar o contador de tempo por padrão
config.default_allow_only_contributors_to_track_time=Permitir que apenas os colaboradores acompanhem o contador de tempo 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.no_reply_address=Ocultar domínio de e-mail
config.default_enable_dependencies=Habilitar dependências de issue por padrão
config.webhook_config=Configuração de Hook da Web config.webhook_config=Configuração de Hook da Web
config.queue_length=Tamanho da fila config.queue_length=Tamanho da fila
@ -1583,7 +1614,7 @@ create_repo=criou o repositório <a href="%s">%s</a>
rename_repo=renomeou o repositório <code>%[1]s</code> para <a href="%[2]s">%[3]s</a> rename_repo=renomeou o repositório <code>%[1]s</code> para <a href="%[2]s">%[3]s</a>
commit_repo=fez push para <a href="%[1]s/src/%[2]s">%[3]s</a> em <a href="%[1]s">%[4]s</a> commit_repo=fez push para <a href="%[1]s/src/%[2]s">%[3]s</a> em <a href="%[1]s">%[4]s</a>
create_issue=`abriu a issue <a href="%s/issues/%s">%s#%[2]s</a>` create_issue=`abriu a issue <a href="%s/issues/%s">%s#%[2]s</a>`
close_issue=`fechou issue <a href="%s/issues/%s">%s#%[2]s</a>` close_issue=`fechou a issue <a href="%s/issues/%s">%s#%[2]s</a>`
reopen_issue=`reabriu a issue <a href="%s/issues/%s">%s#%[2]s</a>` reopen_issue=`reabriu a issue <a href="%s/issues/%s">%s#%[2]s</a>`
create_pull_request=`criou o pull request <a href="%s/pulls/%s">%s#%[2]s</a>` create_pull_request=`criou o pull request <a href="%s/pulls/%s">%s#%[2]s</a>`
close_pull_request=`fechou o pull request <a href="%s/pulls/%s">%s#%[2]s</a>` close_pull_request=`fechou o pull request <a href="%s/pulls/%s">%s#%[2]s</a>`

View File

@ -32,16 +32,8 @@ twofa_scratch=Двухфакторный scratch-код
passcode=Пароль passcode=Пароль
u2f_insert_key=Вставьте ключ безопасности u2f_insert_key=Вставьте ключ безопасности
u2f_sign_in=Нажмите кнопку на ключе безопасности. Если вы не можете найти кнопку, вставьте его снова.
u2f_press_button=Пожалуйста нажмите кнопку на вашем ключе безопасности… u2f_press_button=Пожалуйста нажмите кнопку на вашем ключе безопасности…
u2f_use_twofa=Используйте двухфакторный код с телефона u2f_use_twofa=Используйте двухфакторный код с телефона
u2f_error=Мы не можем прочитать ваш ключ безопасности!
u2f_unsupported_browser=Ваш браузер не поддерживает U2F ключи. Попробуйте другой браузер.
u2f_error_1=Произошла неизвестная ошибка. Повторите попытку.
u2f_error_2=Пожалуйста, убедитесь, что вы используете зашифрованное соединение (https://) и используете правильный URL.
u2f_error_3=Серверу не удалось обработать ваш запрос.
u2f_error_4=Представленный ключ не подходит для этого запроса. Если вы пытаетесь зарегистрировать его, убедитесь, что ключ еще не зарегистрирован.
u2f_error_5=Таймаут достигнут до того, как ваш ключ был прочитан. Перезагрузите, чтобы повторить попытку.
u2f_reload=Обновить u2f_reload=Обновить
repository=Репозиторий repository=Репозиторий
@ -75,7 +67,7 @@ cancel=Отмена
[install] [install]
install=Установка install=Установка
title=Начальная конфигурация title=Начальная конфигурация
docker_helper=Если вы запускаете Gitea внутри Docker, пожалуйста внимательно прочтите <a target="_blank" rel="noopener" href="%s">документацию</a> перед тем, как что-либо изменить на этой странице. docker_helper=Если вы запускаете Gitea внутри Docker, пожалуйста внимательно прочтите <a target="_blank" rel="noopener noreferrer" href="%s">документацию</a> перед тем, как изменить любые настройки.
requite_db_desc=Gitea требует MySQL, PostgreSQL, MSSQL, SQLite3 или TiDB. requite_db_desc=Gitea требует MySQL, PostgreSQL, MSSQL, SQLite3 или TiDB.
db_title=Настройки базы данных db_title=Настройки базы данных
db_type=Тип базы данных db_type=Тип базы данных
@ -130,7 +122,6 @@ federated_avatar_lookup=Включить федеративные аватары
federated_avatar_lookup_popup=Включите поиск федеративного аватара для использования службы с открытым исходным кодом на основе libravatar. federated_avatar_lookup_popup=Включите поиск федеративного аватара для использования службы с открытым исходным кодом на основе libravatar.
disable_registration=Отключить самостоятельную регистрацию disable_registration=Отключить самостоятельную регистрацию
disable_registration_popup=Запретить самостоятельную регистрацию. Только администраторы смогут создавать новые учетные записи пользователей. disable_registration_popup=Запретить самостоятельную регистрацию. Только администраторы смогут создавать новые учетные записи пользователей.
allow_only_external_registration_popup=Включить регистрацию только через сторонние сервисы.
openid_signin=Включение входа через OpenID openid_signin=Включение входа через OpenID
openid_signin_popup=Включение входа через OpenID. openid_signin_popup=Включение входа через OpenID.
openid_signup=Включить саморегистрацию OpenID openid_signup=Включить саморегистрацию OpenID
@ -463,13 +454,10 @@ then_enter_passcode=И введите пароль, показанный в пр
passcode_invalid=Неверный пароль. попробуйте снова. passcode_invalid=Неверный пароль. попробуйте снова.
twofa_enrolled=Для вашего аккаунта была включена двухфакторная аутентификация. Сохраните ваш scratch-токен (%s), он не сохраняется на сервере! twofa_enrolled=Для вашего аккаунта была включена двухфакторная аутентификация. Сохраните ваш scratch-токен (%s), он не сохраняется на сервере!
u2f_desc=Ключами безопасности являются аппаратные устройства, содержащие криптографические ключи. Они могут использоваться для двухфакторной аутентификации. Ключ безопасности должен поддерживать стандарт <a href="https://fidoalliance.org/">FIDO U2F</a>.
u2f_require_twofa=Для использования ключей безопасности необходимо включить двухфакторную аутентификацию.
u2f_register_key=Добавить ключ безопасности u2f_register_key=Добавить ключ безопасности
u2f_nickname=Имя пользователя u2f_nickname=Имя пользователя
u2f_press_button=Нажмите кнопку на ключе безопасности, чтобы зарегистрировать его. u2f_press_button=Нажмите кнопку на ключе безопасности, чтобы зарегистрировать его.
u2f_delete_key=Удалить ключ безопасности u2f_delete_key=Удалить ключ безопасности
u2f_delete_key_desc=Если вы удалите ключ безопасности, вы не сможете использовать его для входа. Вы уверены?
manage_account_links=Управление привязанными аккаунтами manage_account_links=Управление привязанными аккаунтами
manage_account_links_desc=Эти внешние аккаунты привязаны к вашему аккаунту Gitea. manage_account_links_desc=Эти внешние аккаунты привязаны к вашему аккаунту Gitea.
@ -492,13 +480,13 @@ owner=Владелец
repo_name=Имя репозитория repo_name=Имя репозитория
repo_name_helper=Лучшие названия репозиториев состоят из коротких, легко запоминаемых и уникальных ключевых слов. repo_name_helper=Лучшие названия репозиториев состоят из коротких, легко запоминаемых и уникальных ключевых слов.
visibility=Видимость visibility=Видимость
visiblity_helper=Сделать репозиторий приватным visibility_helper=Сделать репозиторий приватным
visiblity_helper_forced=Администратор сайта настроил параметр видимости новых репозиториев. Репозиторий приватный по умолчанию. visibility_helper_forced=Администратор сайта настроил параметр видимости новых репозиториев. Репозиторий приватный по умолчанию.
visiblity_fork_helper=(Изменение этого повлияет на все форки.) visibility_fork_helper=(Изменение этого повлияет на все форки.)
clone_helper=Нужна помощь в клонировании? Посетите страницу <a target="_blank" rel="noopener" href="%s">справки</a>. clone_helper=Нужна помощь в клонировании? Посетите страницу <a target="_blank" rel="noopener noreferrer" href="%s">помощи</a>.
fork_repo=Форкнуть репозиторий fork_repo=Форкнуть репозиторий
fork_from=Форк от fork_from=Форк от
fork_visiblity_helper=Видимость форкнутого репозитория изменить нельзя. fork_visibility_helper=Видимость форкнутого репозитория изменить нельзя.
repo_desc=Описание repo_desc=Описание
repo_lang=Язык repo_lang=Язык
repo_gitignore_helper=Выберите шаблон .gitignore. repo_gitignore_helper=Выберите шаблон .gitignore.
@ -613,7 +601,7 @@ editor.directory_is_a_file=Имя каталога '%s' уже использу
editor.file_is_a_symlink='%s' является символической ссылкой. Символические ссылки нельзя редактировать в веб-редакторе editor.file_is_a_symlink='%s' является символической ссылкой. Символические ссылки нельзя редактировать в веб-редакторе
editor.filename_is_a_directory=Имя файла '%s' уже используется в качестве имени каталога в этом репозитории. editor.filename_is_a_directory=Имя файла '%s' уже используется в качестве имени каталога в этом репозитории.
editor.file_editing_no_longer_exists=Редактируемый файл '%s' больше не существует в этом репозитории. editor.file_editing_no_longer_exists=Редактируемый файл '%s' больше не существует в этом репозитории.
editor.file_changed_while_editing=Содержимое файла изменилось с момента начала редактирования. <a target="_blank" rel="noopener" href="%s">Нажмите здесь</a>, чтобы увидеть, что было изменено, или <strong>Зафиксировать изменения снова</strong>, чтобы заменить их. editor.file_changed_while_editing=Содержимое файла изменилось с момента начала редактирования. <a target="_blank" rel="noopener noreferrer" href="%s">Нажмите здесь</a>, чтобы увидеть, что было изменено, или <strong>Зафиксировать изменения снова</strong>, чтобы заменить их.
editor.file_already_exists=Файл с именем '%s' уже существует в репозитории. editor.file_already_exists=Файл с именем '%s' уже существует в репозитории.
editor.no_changes_to_show=Нет изменений. editor.no_changes_to_show=Нет изменений.
editor.fail_to_update_file=Не удалось обновить/создать файл «%s» из-за ошибки: %v editor.fail_to_update_file=Не удалось обновить/создать файл «%s» из-за ошибки: %v
@ -650,7 +638,6 @@ issues.new.open_milestone=Открыть этап
issues.new.closed_milestone=Завершенные этапы issues.new.closed_milestone=Завершенные этапы
issues.new.assignees=Назначенные issues.new.assignees=Назначенные
issues.new.clear_assignees=Убрать ответственных issues.new.clear_assignees=Убрать ответственных
issues.new.no_assignees=Никто не назначен
issues.no_ref=Не указана ветка или тэг issues.no_ref=Не указана ветка или тэг
issues.create=Добавить задачу issues.create=Добавить задачу
issues.new_label=Новая метка issues.new_label=Новая метка
@ -994,7 +981,7 @@ settings.search_user_placeholder=Поиск пользователя…
settings.org_not_allowed_to_be_collaborator=Организации не могут быть добавлены как соавторы. settings.org_not_allowed_to_be_collaborator=Организации не могут быть добавлены как соавторы.
settings.user_is_org_member=Пользователь является членом организации, члены которой не могут быть добавлены в качестве соавтора. settings.user_is_org_member=Пользователь является членом организации, члены которой не могут быть добавлены в качестве соавтора.
settings.add_webhook=Добавить Webhook settings.add_webhook=Добавить Webhook
settings.hooks_desc=Webhooks позволяют внешним службам получать уведомления при возникновении определенных событий на Gitea. При возникновении указанных событий мы отправим запрос POST на каждый заданный вами URL. Узнать больше можно в нашем <a target="_blank" rel="noopener" href="%s">руководстве по webhooks</a>. settings.hooks_desc=Webhooks позволяют внешним службам получать уведомления при возникновении определенных событий на Gitea. При возникновении указанных событий мы отправим запрос POST на каждый заданный вами URL. Узнать больше можно в нашем <a target="_blank" rel="noopener noreferrer" href="%s">руководстве по webhooks</a>.
settings.webhook_deletion=Удалить Webhook settings.webhook_deletion=Удалить Webhook
settings.webhook_deletion_desc=Удаление этого веб-хука приведет к удалению всей связанной с ним информации, включая историю. Хотите продолжить? settings.webhook_deletion_desc=Удаление этого веб-хука приведет к удалению всей связанной с ним информации, включая историю. Хотите продолжить?
settings.webhook_deletion_success=Webhook был удалён. settings.webhook_deletion_success=Webhook был удалён.
@ -1011,7 +998,7 @@ settings.githook_edit_desc=Если хук не активен, будет по
settings.githook_name=Название Hook'a settings.githook_name=Название Hook'a
settings.githook_content=Перехватить содержание settings.githook_content=Перехватить содержание
settings.update_githook=Обновить Hook settings.update_githook=Обновить Hook
settings.add_webhook_desc=Gitea будет оправлять <code>POST</code> запросы на указанный URL адрес, с информацией о происходящих событиях. Вы также можете указать формат данных (JSON, x-www-form-urlencoded, XML и т.д.). Подробности на странице <a target="_blank" rel="noopener" href="%s">инструкции по использованию webhooks</a>. settings.add_webhook_desc=Gitea будет оправлять <code>POST</code> запросы на указанный URL адрес, с информацией о происходящих событиях. Подробности на странице <a target="_blank" rel="noopener noreferrer" href="%s">инструкции по использованию webhooks</a>.
settings.payload_url=URL обработчика settings.payload_url=URL обработчика
settings.content_type=Тип содержимого settings.content_type=Тип содержимого
settings.secret=Секретный ключ settings.secret=Секретный ключ
@ -1097,6 +1084,7 @@ settings.protected_branch_deletion_desc=Любой пользователь с
settings.default_branch_desc=Главная ветка является "базовой" для вашего репозитория, на которую по умолчанию направлены все Pull Request'ы и которая является лицом вашего репозитория. Первое, что увидит посетитель — это содержимое главной ветки. Выберите её из уже существующих: settings.default_branch_desc=Главная ветка является "базовой" для вашего репозитория, на которую по умолчанию направлены все Pull Request'ы и которая является лицом вашего репозитория. Первое, что увидит посетитель — это содержимое главной ветки. Выберите её из уже существующих:
settings.choose_branch=Выберите ветку… settings.choose_branch=Выберите ветку…
settings.no_protected_branch=Нет защищённых веток. settings.no_protected_branch=Нет защищённых веток.
settings.edit_protected_branch=Редактировать
diff.browse_source=Просмотр исходного кода diff.browse_source=Просмотр исходного кода
diff.parent=Родитель diff.parent=Родитель
@ -1271,8 +1259,6 @@ dashboard.operation_switch=Переключить
dashboard.operation_run=Запуск dashboard.operation_run=Запуск
dashboard.clean_unbind_oauth=Очистить список незавершённых авторизаций OAuth dashboard.clean_unbind_oauth=Очистить список незавершённых авторизаций OAuth
dashboard.clean_unbind_oauth_success=Все незавершённые связи OAuth были удалены. dashboard.clean_unbind_oauth_success=Все незавершённые связи OAuth были удалены.
dashboard.delete_inactivate_accounts=Удалить все неактивированные учетные записи
dashboard.delete_inactivate_accounts_success=Все неактивные учётные записи удалены.
dashboard.delete_repo_archives=Удаление всех архивов репозиториев dashboard.delete_repo_archives=Удаление всех архивов репозиториев
dashboard.delete_repo_archives_success=Все архивы репозиториев удалены. dashboard.delete_repo_archives_success=Все архивы репозиториев удалены.
dashboard.delete_missing_repos=Удалить все записи о репозиториях с отсутствующими файлами Git dashboard.delete_missing_repos=Удалить все записи о репозиториях с отсутствующими файлами Git
@ -1480,7 +1466,6 @@ config.db_path=Путь
config.service_config=Сервисная конфигурация config.service_config=Сервисная конфигурация
config.register_email_confirm=Требуется подтверждение по электронной почте config.register_email_confirm=Требуется подтверждение по электронной почте
config.disable_register=Отключить самостоятельную регистрацию config.disable_register=Отключить самостоятельную регистрацию
config.allow_only_external_registration=Включить регистрацию только через сторонние сервисы
config.enable_openid_signup=Включить cамостоятельную регистрацию OpenID config.enable_openid_signup=Включить cамостоятельную регистрацию OpenID
config.enable_openid_signin=Включение входа через OpenID config.enable_openid_signin=Включение входа через OpenID
config.show_registration_button=Показать кнопку регистрации config.show_registration_button=Показать кнопку регистрации

Some files were not shown because too many files have changed in this diff Show More