Merge branch 'master' of https://github.com/go-gitea/gitea into feat/approval-new

This commit is contained in:
Jonas Franz 2018-07-05 20:35:31 +02:00
commit b4e43d6ce0
No known key found for this signature in database
GPG Key ID: 506AEEBE80BEDECD
591 changed files with 9178 additions and 168707 deletions

View File

@ -4,7 +4,7 @@ workspace:
clone:
git:
image: plugins/git:1
image: plugins/git:next
depth: 50
tags: true
@ -75,6 +75,7 @@ pipeline:
- make lint
- make fmt-check
- make swagger-check
- make swagger-validate
- make misspell-check
- make test-vendor
- make build
@ -254,6 +255,18 @@ pipeline:
when:
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:
image: plugins/s3:1
pull: true

View File

@ -4,6 +4,81 @@ 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
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
* BUGFIXES
* Adjust z-index for floating labels (#3939) (#3950)
* Add missing token validation on application settings page (#3976) #3978
* Webhook and hook_task clean up (#4006)
* Fix webhook bug of response info is not displayed in UI (#4023)
* Fix writer cannot read bare repo guide (#4033) (#4039)
* Don't force due date to current time (#3830) (#4057)
* Fix wiki redirects (#3919) (#4065)
* Fix attachment ENABLED (#4064) (#4066)
* Added deletion of an empty line at the end of file (#4054) (#4074)
* Use ResolveReference instead of path.Join (#4073)
* Fix #4081 Check for leading / in base before removing it (#4083)
* Respository's home page not updated after first push (#4075)
## [1.4.1](https://github.com/go-gitea/gitea/releases/tag/v1.4.1) - 2018-05-03
* BREAKING
* Add "error" as reserved username (#3882) (#3886)

View File

@ -201,6 +201,10 @@ an advisor has time to code review, we will gladly welcome them back
to the maintainers team. If a maintainer is inactive for more than 3
months and forgets to leave the maintainers team, the owners may move
him or her from the maintainers team to the advisors team.
For security reasons, Maintainers should use 2FA for their accounts and
if possible provide gpg signed commits.
https://help.github.com/articles/securing-your-account-with-two-factor-authentication-2fa/
https://help.github.com/articles/signing-commits-with-gpg/
## Owners
@ -211,6 +215,9 @@ be the main owner, and the other two the assistant owners. When the new
owners have been elected, the old owners will give up ownership to the
newly elected owners. If an owner is unable to do so, the other owners
will assist in ceding ownership to the newly elected owners.
For security reasons, Owners or any account with write access (like a bot)
must use 2FA.
https://help.github.com/articles/securing-your-account-with-two-factor-authentication-2fa/
After the election, the new owners should proactively agree
with our [CONTRIBUTING](CONTRIBUTING.md) requirements in the

View File

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

176
Gopkg.lock generated
View File

@ -143,17 +143,6 @@
packages = ["."]
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]]
branch = "master"
name = "github.com/couchbase/vellum"
@ -294,7 +283,7 @@
[[projects]]
name = "github.com/go-sql-driver/mysql"
packages = ["."]
revision = "ce924a41eea897745442daaa1739089b0f3f561d"
revision = "d523deb1b23d913de5bdada721a6071e71283618"
[[projects]]
name = "github.com/go-xorm/builder"
@ -306,11 +295,6 @@
packages = ["."]
revision = "cb1d0ca71f42d3ee1bf4aba7daa16099bc31a7e9"
[[projects]]
name = "github.com/go-xorm/tidb"
packages = ["."]
revision = "21e49190ce47a766fa741cf7edc831a30c12c6ac"
[[projects]]
name = "github.com/go-xorm/xorm"
packages = ["."]
@ -370,11 +354,6 @@
packages = ["."]
revision = "8fb95d837f7d6db1913fecfd7bcc5333e6499596"
[[projects]]
name = "github.com/juju/errors"
packages = ["."]
revision = "b2c7a7da5b2995941048f60146e67702a292e468"
[[projects]]
name = "github.com/kballard/go-shellquote"
packages = ["."]
@ -497,134 +476,12 @@
packages = ["."]
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]]
name = "github.com/philhofer/fwd"
packages = ["."]
revision = "bb6d471dc95d4fe11e432687f8b70ff496cf3136"
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]]
name = "github.com/pmezard/go-difflib"
packages = ["difflib"]
@ -673,24 +530,6 @@
revision = "12b6f73e6084dad08a7c6e575284b177ecafbc71"
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]]
branch = "master"
name = "github.com/tinylib/msgp"
@ -703,17 +542,6 @@
packages = ["."]
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]]
name = "github.com/urfave/cli"
packages = ["."]
@ -873,6 +701,6 @@
[solve-meta]
analyzer-name = "dep"
analyzer-version = 1
inputs-digest = "036b8c882671cf8d2c5e2fdbe53b1bdfbd39f7ebd7765bd50276c7c4ecf16687"
inputs-digest = "59451a3ad1d449f75c5e9035daf542a377c5c4a397e219bebec0aa0007ab9c39"
solver-name = "gps-cdcl"
solver-version = 1

View File

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

View File

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

View File

@ -100,6 +100,13 @@ swagger-check: generate-swagger
exit 1; \
fi;
.PHONY: swagger-validate
swagger-validate:
@hash swagger > /dev/null 2>&1; if [ $$? -ne 0 ]; then \
$(GO) get -u github.com/go-swagger/go-swagger/cmd/swagger; \
fi
swagger validate ./public/swagger.v1.json
.PHONY: errcheck
errcheck:
@hash errcheck > /dev/null 2>&1; if [ $$? -ne 0 ]; then \

View File

@ -12,13 +12,6 @@
[![Help Contribute to Open Source](https://www.codetriage.com/go-gitea/gitea/badges/users.svg)](https://www.codetriage.com/go-gitea/gitea)
[![Become a backer/sponsor of gitea](https://opencollective.com/gitea/tiers/backer/badge.svg?label=backer&color=brightgreen)](https://opencollective.com/gitea)
| | | |
|:---:|:---:|:---:|
|![Dashboard](https://image.ibb.co/dms6DG/1.png)|![Repository](https://image.ibb.co/m6MSLw/2.png)|![Commits History](https://image.ibb.co/cjrSLw/3.png)|
|![Branches](https://image.ibb.co/e6vbDG/4.png)|![Issues](https://image.ibb.co/bJTJSb/5.png)|![Pull Request View](https://image.ibb.co/e02dSb/6.png)|
|![Releases](https://image.ibb.co/cUzgfw/7.png)|![Activity](https://image.ibb.co/eZgGDG/8.png)|![Wiki](https://image.ibb.co/dYV9YG/9.png)|
|![Diff](https://image.ibb.co/ewA9YG/10.png)|![Organization](https://image.ibb.co/ceOwDG/11.png)|![Profile](https://image.ibb.co/c44Q7b/12.png)|
## Purpose
The goal of this project is to make the easiest, fastest, and most
@ -91,8 +84,24 @@ Support this project by becoming a sponsor. Your logo will show up here with a l
<a href="https://opencollective.com/gitea/sponsor/8/website" target="_blank"><img src="https://opencollective.com/gitea/sponsor/8/avatar.svg"></a>
<a href="https://opencollective.com/gitea/sponsor/9/website" target="_blank"><img src="https://opencollective.com/gitea/sponsor/9/avatar.svg"></a>
## FAQ
**How do you pronounce Gitea?**
Gitea is pronounced [/ɡɪti:/](https://youtu.be/EM71-2uDAoY) as in "gi-tea" with a hard g.
## License
This project is licensed under the MIT License.
See the [LICENSE](https://github.com/go-gitea/gitea/blob/master/LICENSE) file
for the full license text.
## Screenshots
Looking for an overview of the interface? Check it out!
| | | |
|:---:|:---:|:---:|
|![Dashboard](https://image.ibb.co/dms6DG/1.png)|![Repository](https://image.ibb.co/m6MSLw/2.png)|![Commits History](https://image.ibb.co/cjrSLw/3.png)|
|![Branches](https://image.ibb.co/e6vbDG/4.png)|![Issues](https://image.ibb.co/bJTJSb/5.png)|![Pull Request View](https://image.ibb.co/e02dSb/6.png)|
|![Releases](https://image.ibb.co/cUzgfw/7.png)|![Activity](https://image.ibb.co/eZgGDG/8.png)|![Wiki](https://image.ibb.co/dYV9YG/9.png)|
|![Diff](https://image.ibb.co/ewA9YG/10.png)|![Organization](https://image.ibb.co/ceOwDG/11.png)|![Profile](https://image.ibb.co/c44Q7b/12.png)|

View File

@ -73,6 +73,11 @@ var (
Value: "",
Usage: "New password to set for user",
},
cli.StringFlag{
Name: "config, c",
Value: "custom/conf/app.ini",
Usage: "Custom configuration file path",
},
},
}
@ -123,6 +128,10 @@ func runChangePassword(c *cli.Context) error {
return err
}
if c.IsSet("config") {
setting.CustomConf = c.String("config")
}
if err := initDB(); err != nil {
return err
}

View File

@ -24,8 +24,8 @@
# Default values
NAME=gitea
GITEA_HOME=/home/git/gitea
GITEA_PATH=${GITEA_HOME}/$NAME
GITEA_HOME=/var/lib/${NAME}
GITEA_PATH=/usr/local/bin/${NAME}
GITEA_USER=git
SERVICENAME="Gitea - Git with a cup of tea"
LOCKFILE=/var/lock/subsys/gitea
@ -49,11 +49,11 @@ DAEMON_OPTS="--check $NAME"
start() {
cd ${GITEA_HOME}
echo -n "Starting ${SERVICENAME}: "
daemon $DAEMON_OPTS "${GITEA_PATH} web > ${LOGFILE} 2>&1 &"
daemon $DAEMON_OPTS "${GITEA_PATH} web -c /etc/${NAME}/app.ini > ${LOGFILE} 2>&1 &"
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch ${LOCKFILE}
return $RETVAL
}
@ -63,7 +63,7 @@ stop() {
killproc ${NAME}
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f ${LOCKFILE}
[ $RETVAL = 0 ] && rm -f ${LOCKFILE}
}
case "$1" in

View File

@ -14,17 +14,20 @@
# Do NOT "set -e"
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Git with a cup of tea"
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
DESC="Gitea - Git with a cup of tea"
NAME=gitea
SERVICEVERBOSE=yes
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
WORKINGDIR=/home/git/gitea
DAEMON=$WORKINGDIR/$NAME
DAEMON_ARGS="web"
WORKINGDIR=/var/lib/$NAME
DAEMON=/usr/local/bin/$NAME
DAEMON_ARGS="web -c /etc/$NAME/app.ini"
USER=git
USERBIND="setcap cap_net_bind_service=+ep"
USERBIND=""
# If you want to bind Gitea to a port below 1024 uncomment
# the line below
#USERBIND="setcap cap_net_bind_service=+ep"
STOP_SCHEDULE="${STOP_SCHEDULE:-QUIT/5/TERM/1/KILL/5}"
# Read configuration variable file if it is present
@ -36,7 +39,7 @@ STOP_SCHEDULE="${STOP_SCHEDULE:-QUIT/5/TERM/1/KILL/5}"
do_start()
{
$USERBIND $DAEMON
sh -c "USER=$USER start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile \\
sh -c "USER=$USER HOME=/home/$USER GITEA_WORK_DIR=$WORKINGDIR start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile \\
--background --chdir $WORKINGDIR --chuid $USER \\
--exec $DAEMON -- $DAEMON_ARGS"
}

View File

@ -19,9 +19,9 @@ load_rc_config $name
: ${gitea_user:="git"}
: ${gitea_enable:="NO"}
: ${gitea_directory:="/home/git"}
: ${gitea_directory:="/var/lib/gitea"}
command="${gitea_directory}/gitea web"
command="/usr/local/bin/gitea web -c /etc/gitea/app.ini"
procname="$(echo $command |cut -d' ' -f1)"
pidfile="${gitea_directory}/${name}.pid"
@ -33,6 +33,7 @@ gitea_start() {
cd ${gitea_directory}
export USER=${gitea_user}
export HOME=/usr/home/${gitea_user}
export GITEA_WORK_DIR=${gitea_directory}
/usr/sbin/daemon -f -u ${gitea_user} -p ${pidfile} $command
}

View File

@ -1,11 +1,11 @@
#!/sbin/openrc-run
DIR=/home/git/gitea
DIR=/var/lib/gitea
USER=git
start_stop_daemon_args="--user ${USER} --chdir ${DIR}"
command="${DIR}/gitea"
command_args="web"
command="/usr/local/bin/gitea"
command_args="web -c /etc/gitea/app.ini"
command_background=yes
pidfile=/var/run/gitea.pid

View File

@ -2,11 +2,11 @@
#
# $OpenBSD$
daemon="/home/git/gitea/gitea"
daemon="/usr/local/bin/gitea"
daemon_user="git"
daemon_flags="web"
daemon_flags="web -c /etc/gitea/app.ini"
gitea_directory="/home/git/gitea"
gitea_directory="/var/lib/gitea"
rc_bg=YES

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

@ -18,10 +18,10 @@
# Default values
NAME=gitea
GITEA_HOME=/home/git/gitea
GITEA_PATH=${GITEA_HOME}/$NAME
GITEA_HOME=/var/lib/$NAME
GITEA_PATH=/usr/local/bin/$NAME
GITEA_USER=git
SERVICENAME="Git - with a cup of tea"
SERVICENAME="Gitea - Git with a cup of tea"
LOCKFILE=/var/lock/subsys/gitea
LOGPATH=${GITEA_HOME}/log
LOGFILE=${LOGPATH}/error.log
@ -58,7 +58,7 @@ case "$1" in
# return skipped as service is already running
(exit 5)
else
su - ${GITEA_USER} -c "USER=${GITEA_USER} ${GITEA_PATH} web 2>&1 >>${LOGFILE} &"
su - ${GITEA_USER} -c "USER=${GITEA_USER} GITEA_WORK_DIR=${GITEA_HOME} ${GITEA_PATH} web -c /etc/${NAME}/app.ini 2>&1 >>${LOGFILE} &"
fi
# Remember status and be verbose

View File

@ -18,10 +18,10 @@ RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/home/git/gitea
ExecStart=/home/git/gitea/gitea web
WorkingDirectory=/var/lib/gitea/
ExecStart=/usr/local/bin/gitea web -c /etc/gitea/app.ini
Restart=always
Environment=USER=git HOME=/home/git
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea
# If you want to bind Gitea to a port below 1024 uncomment
# the two values below
###

View File

@ -303,7 +303,13 @@ ENABLE_NOTIFY_MAIL = false
ENABLE_REVERSE_PROXY_AUTHENTICATION = false
ENABLE_REVERSE_PROXY_AUTO_REGISTRATION = false
; 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
; Each new user will get the value of this setting copied into their profile
DEFAULT_KEEP_EMAIL_PRIVATE = false
@ -404,6 +410,10 @@ SESSION_LIFE_TIME = 86400
[picture]
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"
; or a custom avatar source, like: http://cn.gravatar.com/avatar/
GRAVATAR_SOURCE = gravatar
@ -603,9 +613,9 @@ ko-KR = ko
[U2F]
; Two Factor authentication with security keys
; 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
TRUSTED_FACETS = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s
TRUSTED_FACETS = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s/
; Extension mapping to highlight class
; e.g. .toml=ini

View File

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

View File

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

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

@ -177,7 +177,10 @@ Values containing `#` or `;` must be quoted using `` ` `` or `"""`.
- `ENABLE_REVERSE_PROXY_AUTHENTICATION`: **false**: Enable this to allow reverse proxy authentication.
- `ENABLE_REVERSE_PROXY_AUTO_REGISTRATION`: **false**: Enable this to allow auto-registration
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
## Webhook (`webhook`)

View File

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

View File

@ -20,8 +20,8 @@ embedded assets. This can be different for older releases. Choose the file match
the destination platform from the [downloads page](https://dl.gitea.io/gitea), copy
the URL and replace the URL within the commands below:
```
wget -O gitea https://dl.gitea.io/gitea/1.3.2/gitea-1.3.2-linux-amd64
```sh
wget -O gitea https://dl.gitea.io/gitea/1.4.2/gitea-1.4.2-linux-amd64
chmod +x gitea
```
@ -34,6 +34,54 @@ location. When launched manually, Gitea can be killed using `Ctrl+C`.
./gitea web
```
## Recommended server configuration
### Prepare environment
Check that git is installed on the server, if it is not install it first.
```sh
git --version
```
Create user to run gitea (ex. `git`)
```sh
adduser \
--system \
--shell /bin/bash \
--gecos 'Git Version Control' \
--group \
--disabled-password \
--home /home/git \
git
```
### Create required directory structure
```sh
mkdir -p /var/lib/gitea/{custom,data,indexers,public,log}
chown git:git /var/lib/gitea/{data,indexers,log}
chmod 750 /var/lib/gitea/{data,indexers,log}
mkdir /etc/gitea
chown root:git /etc/gitea
chmod 770 /etc/gitea
```
**NOTE:** `/etc/gitea` is temporary set with write rights for user `git` so that Web installer could write configuration file. After installation is done it is recommended to set rights to read-only using:
```
chmod 750 /etc/gitea
chmod 644 /etc/gitea/app.ini
```
### Copy gitea binary to global location
```
cp gitea /usr/local/bin/gitea
```
### Create service file to start gitea automatically
See how to create [Linux service]({{< relref "run-as-service-in-ubuntu.en-us.md" >}})
## Troubleshooting
### Old glibc versions

View File

@ -17,16 +17,13 @@ menu:
## Debian
The only distribution that has any "official" package of Gitea is Debian. This is currently
in Debian's [contrib](https://wiki.debian.org/SourcesList). This is (currently) only available
in Debian testing and unstable (but should be installable/functional on stable).
Although there is a package of Gitea in Debian's [contrib](https://wiki.debian.org/SourcesList),
it is not supported directly by us.
- Edit /etc/apt/sourced.list
- Add "contrib" to "deb http://deb.debian.org/debian unstable main contrib"
- apt-get update
- apt-get install gitea
Unfortunately the package is not maintained anymore and broken because of missing sources.
Please follow the [deployment from binary]({{< relref "from-binary.en-us.md" >}}) guide instead.
For other distributions, see the [deployment from binary]({{< relref "from-binary.en-us.md" >}}) guide.
Should the packages get updated and fixed, we will provide up-to-date installation instructions here.
## Windows

View File

@ -231,7 +231,7 @@ You can configure some of Gitea's settings via environment variables:
* `APP_NAME`: **"Gitea: Git with a cup of tea"**: Application name, used in the page title.
* `RUN_MODE`: **dev**: For performance and other purposes, change this to `prod` when deployed to a production environment.
* `SSH_DOMAIN`: **localhost**: Domain name of this server, used for displayed clone UR in Gitea's UI.
* `SSH_DOMAIN`: **localhost**: Domain name of this server, used for the displayed clone URL in Gitea's UI.
* `SSH_PORT`: **22**: SSH port displayed in clone URL.
* `DISABLE_SSH`: **false**: Disable SSH feature when it's not available.
* `HTTP_PORT`: **3000**: HTTP listen port.
@ -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`.
* `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.
* `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

View File

@ -20,7 +20,7 @@ file can be unpacked and used to restore an instance.
## Backup Command (`dump`)
Switch to the user running gitea: `su git`. Run `./gitea dump` in the gitea installation
Switch to the user running gitea: `su git`. Run `./gitea dump -c /path/to/app.ini` in the gitea installation
directory. There should be some output similar to the following:
```
@ -34,7 +34,8 @@ directory. There should be some output similar to the following:
Inside the `gitea-dump-1482906742.zip` file, will be the following:
* `custom/conf/app.ini` - Server config.
* `custom` - All config or customerize files in `custom/`.
* `data` - Data directory in <GITEA_WORK_DIR>, except sessions if you are using file session. This directory includes `attachments`, `avatars`, `lfs`, `indexers`, sqlite file if you are using sqlite.
* `gitea-db.sql` - SQL dump of database
* `gitea-repo.zip` - Complete copy of the repository directory.
* `log/` - Various logs. They are not needed for a recovery or migration.

View File

@ -0,0 +1,60 @@
---
date: "2018-06-06T09:33:00+08:00"
title: "使用: 备份与恢复"
slug: "backup-and-restore"
weight: 11
toc: true
draft: false
menu:
sidebar:
parent: "usage"
name: "备份与恢复"
weight: 11
identifier: "backup-and-restore"
---
# 备份与恢复
Gitea 已经实现了 `dump` 命令可以用来备份所有需要的文件到一个zip压缩文件。该压缩文件可以被用来进行数据恢复。
## 备份命令 (`dump`)
先转到git用户的权限: `su git`. 再Gitea目录运行 `./gitea dump`。一般会显示类似如下的输出:
```
2016/12/27 22:32:09 Creating tmp work dir: /tmp/gitea-dump-417443001
2016/12/27 22:32:09 Dumping local repositories.../home/git/gitea-repositories
2016/12/27 22:32:22 Dumping database...
2016/12/27 22:32:22 Packing dump files...
2016/12/27 22:32:34 Removing tmp work dir: /tmp/gitea-dump-417443001
2016/12/27 22:32:34 Finish dumping in file gitea-dump-1482906742.zip
```
最后生成的 `gitea-dump-1482906742.zip` 文件将会包含如下内容:
* `custom` - 所有保存在 `custom/` 目录下的配置和自定义的文件。
* `data` - 数据目录下的所有内容不包含使用文件session的文件。该目录包含 `attachments`, `avatars`, `lfs`, `indexers`, 如果使用sqlite 还会包含 sqlite 数据库文件。
* `gitea-db.sql` - 数据库dump出来的 SQL。
* `gitea-repo.zip` - Git仓库压缩文件。
* `log/` - Logs文件如果用作迁移不是必须的。
中间备份文件将会在临时目录进行创建,如果您要重新指定临时目录,可以用 `--tempdir` 参数,或者用 `TMPDIR` 环境变量。
## Restore Command (`restore`)
当前还没有恢复命令,恢复需要人工进行。主要是把文件和数据库进行恢复。
例如:
```
apt-get install gitea
unzip gitea-dump-1482906742.zip
cd gitea-dump-1482906742
mv custom/conf/app.ini /etc/gitea/conf/app.ini
unzip gitea-repo.zip
mv gitea-repo/* /var/lib/gitea/repositories/
chown -R gitea:gitea /etc/gitea/conf/app.ini /var/lib/gitea/repositories/
mysql -u$USER -p$PASS $DATABASE <gitea-db.sql
# or sqlite3 $DATABASE_PATH <gitea-db.sql
service gitea restart
```

View File

@ -62,6 +62,7 @@ Admin operations:
- Options:
- `--username value`, `-u value`: Username. Required.
- `--password value`, `-p value`: New password. Required.
- `--config path`: Gitea configuration file path. Optional. (default: custom/conf/app.ini).
- Examples:
- `gitea admin change-password --username myname --password asecurepassword`
- `regenerate`

View File

@ -0,0 +1,46 @@
---
date: "2018-06-02T11:00:00+02:00"
title: "Usage: HTTPS setup"
slug: "https-setup"
weight: 12
toc: true
draft: false
menu:
sidebar:
parent: "usage"
name: "HTTPS setup"
weight: 12
identifier: "https-setup"
---
# HTTPS setup to encrypt connections to Gitea
## Using built-in server
Before you enable HTTPS make sure that you have valid SSL/TLS certificates.
You could use self-generated certificates for evaluation and testing. Please run `gitea cert --host [HOST]` to generate a self signed certificate.
To use Gitea's built-in HTTPS support you must change your `app.ini` file:
```ini
[server]
PROTOCOL=https
ROOT_URL = `https://git.example.com:3000/`
HTTP_PORT = 3000
CERT_FILE = cert.pem
KEY_FILE = key.pem
```
To learn more about the config values, please checkout the [Config Cheat Sheet](../config-cheat-sheet#server).
## Using reverse proxy
Setup up your reverse proxy like shown in the [reverse proxy guide](../reverse-proxies).
After that, enable HTTPS by following one of these guides:
* [nginx](https://nginx.org/en/docs/http/configuring_https_servers.html)
* [apache2/httpd](https://httpd.apache.org/docs/2.4/ssl/ssl_howto.html)
* [caddy](https://caddyserver.com/docs/tls)
Note: You connection between your reverse proxy and gitea might be unencrypted. To encrypt it too follow the [built-in server guide](#using-built-in-server) and change
the proxy url to `https://[URL]`.

View File

@ -13,7 +13,7 @@ Make sure to perform a clean build before running tests:
## Run all tests via local drone
```
drone exec --local --build.event "pull_request"
drone exec --local --build-event "pull_request"
```
## Run sqlite integrations tests

View File

@ -67,9 +67,9 @@ func TestAPISearchRepo(t *testing.T) {
expectedResults
}{
{name: "RepositoriesMax50", requestURL: "/api/v1/repos/search?limit=50", expectedResults: expectedResults{
nil: {count: 15},
user: {count: 15},
user2: {count: 15}},
nil: {count: 16},
user: {count: 16},
user2: {count: 16}},
},
{name: "RepositoriesMax10", requestURL: "/api/v1/repos/search?limit=10", expectedResults: expectedResults{
nil: {count: 10},
@ -235,3 +235,53 @@ func TestAPIGetRepoByIDUnauthorized(t *testing.T) {
req := NewRequestf(t, "GET", "/api/v1/repositories/2")
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

@ -68,3 +68,25 @@ func TestSettingShowUserEmailProfile(t *testing.T) {
setting.UI.ShowUserEmail = showUserEmail
}
func TestSettingLandingPage(t *testing.T) {
prepareTestEnv(t)
landingPage := setting.LandingPageURL
setting.LandingPageURL = setting.LandingPageHome
req := NewRequest(t, "GET", "/")
MakeRequest(t, req, http.StatusOK)
setting.LandingPageURL = setting.LandingPageExplore
req = NewRequest(t, "GET", "/")
resp := MakeRequest(t, req, http.StatusFound)
assert.Equal(t, "/explore", resp.Header().Get("Location"))
setting.LandingPageURL = setting.LandingPageOrganizations
req = NewRequest(t, "GET", "/")
resp = MakeRequest(t, req, http.StatusFound)
assert.Equal(t, "/explore/organizations", resp.Header().Get("Location"))
setting.LandingPageURL = landingPage
}

View File

@ -22,8 +22,12 @@ func TestAccessLevel(t *testing.T) {
user1 := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
user2 := AssertExistsAndLoadBean(t, &User{ID: 5}).(*User)
repo1 := AssertExistsAndLoadBean(t, &Repository{OwnerID: 2, IsPrivate: false}).(*Repository)
repo2 := AssertExistsAndLoadBean(t, &Repository{OwnerID: 3, IsPrivate: true}).(*Repository)
// A public repository owned by User 2
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)
assert.NoError(t, err)
@ -47,8 +51,12 @@ func TestHasAccess(t *testing.T) {
user1 := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
user2 := AssertExistsAndLoadBean(t, &User{ID: 5}).(*User)
repo1 := AssertExistsAndLoadBean(t, &Repository{OwnerID: 2, IsPrivate: false}).(*Repository)
repo2 := AssertExistsAndLoadBean(t, &Repository{OwnerID: 3, IsPrivate: true}).(*Repository)
// A public repository owned by User 2
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 {
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.
func (a *Action) GetActUserName() string {
a.loadActUser()

View File

@ -102,7 +102,7 @@ func IsErrEmailAlreadyUsed(err error) bool {
}
func (err ErrEmailAlreadyUsed) Error() string {
return fmt.Sprintf("e-mail has been used [email: %s]", err.Email)
return fmt.Sprintf("e-mail already in use [email: %s]", err.Email)
}
// ErrOpenIDAlreadyUsed represents a "OpenIDAlreadyUsed" kind of error.
@ -117,7 +117,7 @@ func IsErrOpenIDAlreadyUsed(err error) bool {
}
func (err ErrOpenIDAlreadyUsed) Error() string {
return fmt.Sprintf("OpenID has been used [oid: %s]", err.OpenID)
return fmt.Sprintf("OpenID already in use [oid: %s]", err.OpenID)
}
// ErrUserOwnRepos represents a "UserOwnRepos" kind of error.

View File

@ -351,7 +351,7 @@
is_mirror: true
num_forks: 1
is_fork: false
-
id: 29
fork_id: 27
@ -365,7 +365,7 @@
num_closed_pulls: 0
is_mirror: false
is_fork: true
-
id: 30
fork_id: 28
@ -389,3 +389,14 @@
num_forks: 0
num_issues: 0
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
name: Owners
authorize: 4 # owner
num_repos: 2
num_repos: 3
num_members: 1
unit_types: '[1,2,3,4,5,6,7]'
-
id: 2
@ -16,7 +15,6 @@
authorize: 2 # write
num_repos: 1
num_members: 2
unit_types: '[1,2,3,4,5,6,7]'
-
id: 3
@ -26,7 +24,6 @@
authorize: 4 # owner
num_repos: 0
num_members: 1
unit_types: '[1,2,3,4,5,6,7]'
-
id: 4
@ -36,7 +33,6 @@
authorize: 4 # owner
num_repos: 0
num_members: 1
unit_types: '[1,2,3,4,5,6,7]'
-
id: 5
@ -46,7 +42,6 @@
authorize: 4 # owner
num_repos: 2
num_members: 2
unit_types: '[1,2,3,4,5,6,7]'
-
id: 6
@ -56,4 +51,3 @@
authorize: 4 # owner
num_repos: 2
num_members: 1
unit_types: '[1,2,3,4,5,6,7]'

View File

@ -33,9 +33,15 @@
org_id: 19
team_id: 6
repo_id: 27
-
id: 7
org_id: 19
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
avatar: avatar3
avatar_email: user3@example.com
num_repos: 2
num_repos: 3
num_members: 2
num_teams: 2

View File

@ -163,6 +163,10 @@ func (c *Comment) AfterLoad(session *xorm.Session) {
// AfterDelete is invoked from XORM after the object is deleted.
func (c *Comment) AfterDelete() {
if c.ID <= 0 {
return
}
_, err := DeleteAttachmentsByComment(c.ID, true)
if err != nil {

View File

@ -71,3 +71,15 @@ func getIssueWatchers(e Engine, issueID int64) (watches []*IssueWatch, err error
Find(&watches)
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

@ -187,6 +187,12 @@ var migrations = []Migration{
// v66 -> v67
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 review", addReview),
}

View File

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

View File

@ -5,27 +5,154 @@
package migrations
import (
"fmt"
"code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/modules/setting"
"github.com/go-xorm/xorm"
)
func addReview(x *xorm.Engine) error {
// Review see models/review.go
type Review struct {
ID int64 `xorm:"pk autoincr"`
Type string
ReviewerID int64 `xorm:"index"`
IssueID int64 `xorm:"index"`
Content string
CreatedUnix util.TimeStamp `xorm:"INDEX created"`
UpdatedUnix util.TimeStamp `xorm:"INDEX updated"`
func removeStaleWatches(x *xorm.Engine) error {
type Watch struct {
ID int64
UserID int64
RepoID int64
}
if err := x.Sync2(new(Review)); err != nil {
return fmt.Errorf("Sync2: %v", err)
type IssueWatch struct {
ID int64
UserID int64
RepoID int64
IsWatching bool
}
return nil
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
}

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

@ -0,0 +1,80 @@
// 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)
}
}
}
if err := dropTableColumns(sess, "team", "unit_types"); err != nil {
return err
}
return sess.Commit()
}

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

@ -0,0 +1 @@
package migrations

View File

@ -1,4 +1,5 @@
// 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
// license that can be found in the LICENSE file.
@ -121,6 +122,7 @@ func init() {
new(Reaction),
new(IssueAssignees),
new(U2FRegistration),
new(TeamUnit),
new(Review),
)
@ -185,6 +187,18 @@ func parsePostgreSQLHostPort(info string) (string, string) {
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) {
host, port := "127.0.0.1", "1433"
if strings.Contains(info, ":") {
@ -215,14 +229,7 @@ func getEngine() (*xorm.Engine, error) {
DbCfg.User, DbCfg.Passwd, DbCfg.Host, DbCfg.Name, Param)
}
case "postgres":
host, port := parsePostgreSQLHostPort(DbCfg.Host)
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)
}
connStr = getPostgreSQLConnectionString(DbCfg.Host, DbCfg.User, DbCfg.Passwd, DbCfg.Name, Param, DbCfg.SSLMode)
case "mssql":
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)

View File

@ -1,4 +1,5 @@
// 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
// 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)
}
}
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 {
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 {
return err
}

View File

@ -154,12 +154,26 @@ func CreateOrganization(org, owner *User) (err error) {
Name: ownerTeamName,
Authorize: AccessModeOwner,
NumMembers: 1,
UnitTypes: allRepUnitTypes,
}
if _, err = sess.Insert(t); err != nil {
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{
UID: owner.ID,
OrgID: org.ID,
@ -238,6 +252,7 @@ func deleteOrg(e *xorm.Session, u *User) error {
&Team{OrgID: u.ID},
&OrgUser{OrgID: u.ID},
&TeamUser{OrgID: u.ID},
&TeamUnit{OrgID: u.ID},
); err != nil {
return fmt.Errorf("deleteBeans: %v", err)
}

View File

@ -1,3 +1,4 @@
// Copyright 2018 The Gitea Authors. All rights reserved.
// Copyright 2016 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.
@ -10,7 +11,6 @@ import (
"strings"
"code.gitea.io/gitea/modules/log"
"github.com/go-xorm/xorm"
)
@ -28,15 +28,16 @@ type Team struct {
Members []*User `xorm:"-"`
NumRepos 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) GetUnitTypes() []UnitType {
if len(t.UnitTypes) == 0 {
return allRepUnitTypes
func (t *Team) getUnits(e Engine) (err error) {
if t.Units != nil {
return nil
}
return t.UnitTypes
t.Units, err = getUnitsByTeamID(e, t.ID)
return err
}
// 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 {
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
@ -209,11 +215,12 @@ func (t *Team) RemoveRepository(repoID int64) error {
// UnitEnabled returns if the team has the given unit type enabled
func (t *Team) UnitEnabled(tp UnitType) bool {
if len(t.UnitTypes) == 0 {
return true
if err := t.getUnits(x); err != nil {
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
}
}
@ -270,6 +277,17 @@ func NewTeam(t *Team) (err error) {
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.
if _, err = sess.Exec("UPDATE `user` SET num_teams=num_teams+1 WHERE id = ?", t.OrgID); err != nil {
sess.Rollback()
@ -374,11 +392,34 @@ func DeleteTeam(t *Team) error {
return err
}
if err := t.getMembers(sess); err != nil {
return err
}
// Delete all accesses.
for _, repo := range t.Repos {
if err := repo.recalculateTeamAccesses(sess, t.ID); err != nil {
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
@ -396,6 +437,13 @@ func DeleteTeam(t *Team) error {
return err
}
// Delete team-unit.
if _, err := sess.
Where("team_id=?", t.ID).
Delete(new(TeamUnit)); err != nil {
return err
}
// Delete team.
if _, err := sess.ID(t.ID).Delete(new(Team)); err != nil {
return err
@ -518,6 +566,10 @@ func AddTeamMember(team *Team, userID int64) error {
if err := repo.recalculateTeamAccesses(sess, 0); err != nil {
return err
}
if err = watchRepo(sess, userID, repo.ID, true); err != nil {
return err
}
}
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 {
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.
@ -646,3 +715,47 @@ func GetTeamsWithAccessToRepo(orgID, repoID int64, mode AccessMode) ([]*Team, er
And("team_repo.repo_id = ?", repoID).
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.EqualValues(t, expectedCount, count)
}
testSuccess(2, 2)
testSuccess(4, 1)
testSuccess(2, 3)
testSuccess(4, 2)
}
func TestAccessibleReposEnv_RepoIDs(t *testing.T) {
@ -503,8 +503,8 @@ func TestAccessibleReposEnv_RepoIDs(t *testing.T) {
assert.NoError(t, err)
assert.Equal(t, expectedRepoIDs, repoIDs)
}
testSuccess(2, 1, 100, []int64{3, 5})
testSuccess(4, 0, 100, []int64{3})
testSuccess(2, 1, 100, []int64{3, 5, 32})
testSuccess(4, 0, 100, []int64{3, 32})
}
func TestAccessibleReposEnv_Repos(t *testing.T) {
@ -522,8 +522,8 @@ func TestAccessibleReposEnv_Repos(t *testing.T) {
}
assert.Equal(t, expectedRepos, repos)
}
testSuccess(2, []int64{3, 5})
testSuccess(4, []int64{3})
testSuccess(2, []int64{3, 5, 32})
testSuccess(4, []int64{3, 32})
}
func TestAccessibleReposEnv_MirrorRepos(t *testing.T) {

View File

@ -448,6 +448,11 @@ func DeleteReleaseByID(id int64, u *User, delTag bool) error {
}
}
rel.Repo = repo
if err = rel.LoadAttributes(); err != nil {
return fmt.Errorf("LoadAttributes: %v", err)
}
mode, _ := accessLevel(x, u.ID, rel.Repo)
if err := PrepareWebhooks(rel.Repo, HookEventRelease, &api.ReleasePayload{
Action: api.HookReleaseDeleted,

View File

@ -365,22 +365,14 @@ func (repo *Repository) getUnitsByUserID(e Engine, userID int64, isAdmin bool) (
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
var newRepoUnits = make([]*RepoUnit, 0, len(repo.Units))
for _, u := range repo.Units {
if _, ok := allTypes[u.Type]; ok {
newRepoUnits = append(newRepoUnits, u)
for _, team := range teams {
if team.UnitEnabled(u.Type) {
newRepoUnits = append(newRepoUnits, u)
break
}
}
}
@ -789,7 +781,7 @@ var (
// DescriptionHTML does special handles to description and return HTML string.
func (repo *Repository) DescriptionHTML() template.HTML {
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))
}
@ -1355,6 +1347,12 @@ func createRepository(e *xorm.Session, doer, u *User, repo *Repository) (err err
Type: tp,
Config: &IssuesConfig{EnableTimetracker: setting.Service.DefaultEnableTimetracking, AllowOnlyContributorsToTrackTime: setting.Service.DefaultAllowOnlyContributorsToTrackTime},
})
} else if tp == UnitTypePullRequests {
units = append(units, RepoUnit{
RepoID: repo.ID,
Type: tp,
Config: &PullRequestsConfig{AllowMerge: true, AllowRebase: true, AllowSquash: true},
})
} else {
units = append(units, RepoUnit{
RepoID: repo.ID,
@ -1848,6 +1846,12 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
if _, err = sess.In("issue_id", issueIDs).Delete(&IssueUser{}); err != nil {
return err
}
if _, err = sess.In("issue_id", issueIDs).Delete(&Reaction{}); err != nil {
return err
}
if _, err = sess.In("issue_id", issueIDs).Delete(&IssueWatch{}); err != nil {
return err
}
attachments := make([]*Attachment, 0, 5)
if err = sess.

View File

@ -172,5 +172,14 @@ func (repo *Repository) DeleteCollaboration(uid int64) (err error) {
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()
}

View File

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

View File

@ -109,6 +109,23 @@ func notifyWatchers(e Engine, act *Action) error {
act.ID = 0
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 {
return fmt.Errorf("insert new action: %v", err)
}

View File

@ -6,6 +6,7 @@ package models
import (
"fmt"
"regexp"
"strings"
"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
type Topic struct {
ID int64
Name string `xorm:"unique"`
Name string `xorm:"UNIQUE"`
RepoCount int
CreatedUnix util.TimeStamp `xorm:"INDEX created"`
UpdatedUnix util.TimeStamp `xorm:"INDEX updated"`
@ -31,8 +34,8 @@ type Topic struct {
// RepoTopic represents associated repositories and topics
type RepoTopic struct {
RepoID int64 `xorm:"unique(s)"`
TopicID int64 `xorm:"unique(s)"`
RepoID int64 `xorm:"UNIQUE(s)"`
TopicID int64 `xorm:"UNIQUE(s)"`
}
// 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)
}
// 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
func GetTopicByName(name string) (*Topic, error) {
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{
Topics: topicNames,
}); err != nil {

View File

@ -55,3 +55,16 @@ func TestAddTopic(t *testing.T) {
assert.NoError(t, err)
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

@ -433,6 +433,17 @@ func (u *User) IsPasswordSet() bool {
// UploadAvatar saves custom avatar for user.
// FIXME: split uploads to different subdirs in case we have massive users.
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))
if err != nil {
return fmt.Errorf("Decode: %v", err)
@ -546,28 +557,46 @@ func (u *User) GetRepositories(page, pageSize int) (err error) {
return err
}
// GetRepositoryIDs returns repositories IDs where user owned
func (u *User) GetRepositoryIDs() ([]int64, error) {
// GetRepositoryIDs returns repositories IDs where user owned and has unittypes
func (u *User) GetRepositoryIDs(units ...UnitType) ([]int64, error) {
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)
}
return ids, sess.Where("owner_id = ?", u.ID).Find(&ids)
}
// GetOrgRepositoryIDs returns repositories IDs where user's team owned
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
return ids, x.Table("repository").
sess := x.Table("repository").
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)
}
// GetAccessRepoIDs returns all repositories IDs where user's or user is a team member organizations
func (u *User) GetAccessRepoIDs() ([]int64, error) {
ids, err := u.GetRepositoryIDs()
func (u *User) GetAccessRepoIDs(units ...UnitType) ([]int64, error) {
ids, err := u.GetRepositoryIDs(units...)
if err != nil {
return nil, err
}
ids2, err := u.GetOrgRepositoryIDs()
ids2, err := u.GetOrgRepositoryIDs(units...)
if err != nil {
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 {
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)
}
// ***** END: Watch *****
@ -937,7 +966,7 @@ func deleteUser(e *xorm.Session, u *User) error {
if err = e.Table("star").Cols("star.repo_id").
Where("star.uid = ?", u.ID).Find(&starredRepoIDs); err != nil {
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)
}
// ***** END: Star *****

View File

@ -159,3 +159,25 @@ func BenchmarkHashPassword(b *testing.B) {
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
}
}
provider = gitlab.NewCustomisedURL(clientID, clientSecret, callbackURL, authURL, tokenURL, profileURL)
provider = gitlab.NewCustomisedURL(clientID, clientSecret, callbackURL, authURL, tokenURL, profileURL, "read_user")
case "gplus":
provider = gplus.New(clientID, clientSecret, callbackURL, "email")
case "openidConnect":

View File

@ -410,7 +410,7 @@ func (f SubmitReviewForm) ReviewType() models.ReviewType {
// NewReleaseForm form for creating release
type NewReleaseForm struct {
TagName string `binding:"Required"`
TagName string `binding:"Required;GitRefName"`
Target string `form:"tag_target" binding:"Required"`
Title string `binding:"Required"`
Content string

View File

@ -72,10 +72,11 @@ func (f *InstallForm) Validate(ctx *macaron.Context, errs binding.Errors) bindin
// RegisterForm form for registering
type RegisterForm struct {
UserName string `binding:"Required;AlphaDashDot;MaxSize(35)"`
Email string `binding:"Required;Email;MaxSize(254)"`
Password string `binding:"Required;MaxSize(255)"`
Retype string
UserName string `binding:"Required;AlphaDashDot;MaxSize(35)"`
Email string `binding:"Required;Email;MaxSize(254)"`
Password string `binding:"Required;MaxSize(255)"`
Retype string
GRecaptchaResponse string `form:"g-recaptcha-response"`
}
// Validate valideates the fields

View File

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

View File

@ -37,12 +37,6 @@ func Toggle(options *ToggleOptions) macaron.Handler {
return
}
// Check non-logged users landing page.
if !ctx.IsSigned && ctx.Req.RequestURI == "/" && setting.LandingPageURL != setting.LandingPageHome {
ctx.Redirect(setting.AppSubURL + string(setting.LandingPageURL))
return
}
// Redirect to dashboard if user tries to visit any non-login page.
if options.SignOutRequired && ctx.IsSigned && ctx.Req.RequestURI != "/" {
ctx.Redirect(setting.AppSubURL + "/")

View File

@ -469,6 +469,9 @@ func shortLinkProcessorFull(ctx *postProcessCtx, node *html.Node, noLink bool) {
} else {
link = strings.Replace(link, " ", "-", -1)
}
if !strings.Contains(link, "/") {
link = url.PathEscape(link)
}
}
urlPrefix := ctx.urlPrefix
if image {

View File

@ -82,12 +82,18 @@ func TestRender_ShortLinks(t *testing.T) {
rawtree := util.URLJoin(AppSubURL, "raw", "master")
url := util.URLJoin(tree, "Link")
otherURL := util.URLJoin(tree, "Other-Link")
encodedURL := util.URLJoin(tree, "Link%3F")
imgurl := util.URLJoin(rawtree, "Link.jpg")
otherImgurl := util.URLJoin(rawtree, "Link+Other.jpg")
encodedImgurl := util.URLJoin(rawtree, "Link+%23.jpg")
notencodedImgurl := util.URLJoin(rawtree, "some", "path", "Link+#.jpg")
urlWiki := util.URLJoin(AppSubURL, "wiki", "Link")
otherURLWiki := util.URLJoin(AppSubURL, "wiki", "Other-Link")
encodedURLWiki := util.URLJoin(AppSubURL, "wiki", "Link%3F")
imgurlWiki := util.URLJoin(AppSubURL, "wiki", "raw", "Link.jpg")
otherImgurlWiki := util.URLJoin(AppSubURL, "wiki", "raw", "Link+Other.jpg")
encodedImgurlWiki := util.URLJoin(AppSubURL, "wiki", "raw", "Link+%23.jpg")
notencodedImgurlWiki := util.URLJoin(AppSubURL, "wiki", "raw", "some", "path", "Link+#.jpg")
favicon := "http://google.com/favicon.ico"
test(
@ -134,4 +140,24 @@ func TestRender_ShortLinks(t *testing.T) {
"[[Link]] [[Other Link]]",
`<p><a href="`+url+`" rel="nofollow">Link</a> <a href="`+otherURL+`" rel="nofollow">Other Link</a></p>`,
`<p><a href="`+urlWiki+`" rel="nofollow">Link</a> <a href="`+otherURLWiki+`" rel="nofollow">Other Link</a></p>`)
test(
"[[Link?]]",
`<p><a href="`+encodedURL+`" rel="nofollow">Link?</a></p>`,
`<p><a href="`+encodedURLWiki+`" rel="nofollow">Link?</a></p>`)
test(
"[[Link]] [[Other Link]] [[Link?]]",
`<p><a href="`+url+`" rel="nofollow">Link</a> <a href="`+otherURL+`" rel="nofollow">Other Link</a> <a href="`+encodedURL+`" rel="nofollow">Link?</a></p>`,
`<p><a href="`+urlWiki+`" rel="nofollow">Link</a> <a href="`+otherURLWiki+`" rel="nofollow">Other Link</a> <a href="`+encodedURLWiki+`" rel="nofollow">Link?</a></p>`)
test(
"[[Link #.jpg]]",
`<p><a href="`+encodedImgurl+`" rel="nofollow"><img src="`+encodedImgurl+`"/></a></p>`,
`<p><a href="`+encodedImgurlWiki+`" rel="nofollow"><img src="`+encodedImgurlWiki+`"/></a></p>`)
test(
"[[Name|Link #.jpg|alt=\"AltName\"|title='Title']]",
`<p><a href="`+encodedImgurl+`" rel="nofollow"><img src="`+encodedImgurl+`" title="Title" alt="AltName"/></a></p>`,
`<p><a href="`+encodedImgurlWiki+`" rel="nofollow"><img src="`+encodedImgurlWiki+`" title="Title" alt="AltName"/></a></p>`)
test(
"[[some/path/Link #.jpg]]",
`<p><a href="`+notencodedImgurl+`" rel="nofollow"><img src="`+notencodedImgurl+`"/></a></p>`,
`<p><a href="`+notencodedImgurlWiki+`" rel="nofollow"><img src="`+notencodedImgurlWiki+`"/></a></p>`)
}

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"
)
// enumerates all the types of captchas
const (
ImageCaptcha = "image"
ReCaptcha = "recaptcha"
)
// settings
var (
// AppVer settings
@ -343,6 +349,8 @@ var (
// Picture settings
AvatarUploadPath string
AvatarMaxWidth int
AvatarMaxHeight int
GravatarSource string
GravatarSourceURL *url.URL
DisableGravatar bool
@ -831,7 +839,6 @@ func NewContext() {
LFS.ContentPath = filepath.Join(AppWorkPath, LFS.ContentPath)
}
sec = Cfg.Section("LFS")
LFS.HTTPAuthExpiry = sec.Key("LFS_HTTP_AUTH_EXPIRY").MustDuration(20 * time.Minute)
if LFS.StartServer {
@ -1027,6 +1034,8 @@ func NewContext() {
if !filepath.IsAbs(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 {
case "duoshuo":
GravatarSource = "http://gravatar.duoshuo.com/avatar/"
@ -1164,6 +1173,9 @@ var Service struct {
EnableReverseProxyAuth bool
EnableReverseProxyAutoRegister bool
EnableCaptcha bool
CaptchaType string
RecaptchaSecret string
RecaptchaSitekey string
DefaultKeepEmailPrivate bool
DefaultAllowCreateOrganization bool
EnableTimetracking bool
@ -1188,7 +1200,10 @@ func newService() {
Service.RequireSignInView = sec.Key("REQUIRE_SIGNIN_VIEW").MustBool()
Service.EnableReverseProxyAuth = sec.Key("ENABLE_REVERSE_PROXY_AUTHENTICATION").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.DefaultAllowCreateOrganization = sec.Key("DEFAULT_ALLOW_CREATE_ORGANIZATION").MustBool(true)
Service.EnableTimetracking = sec.Key("ENABLE_TIMETRACKING").MustBool(true)

View File

@ -354,7 +354,7 @@ func RenderCommitBody(msg, urlPrefix string, metas map[string]string) template.H
// IsMultilineCommitMessage checks to see if a commit message contains multiple lines.
func IsMultilineCommitMessage(msg string) bool {
return strings.Count(strings.TrimSpace(msg), "\n") > 1
return strings.Count(strings.TrimSpace(msg), "\n") >= 1
}
// Actioner describes an action

View File

@ -10,6 +10,7 @@ import (
"strings"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
)
// OptionalBool a boolean that can be "null"
@ -78,6 +79,18 @@ func URLJoin(base string, elems ...string) string {
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
func Min(a, b int) int {
if a > b {

View File

@ -7,6 +7,8 @@ package util
import (
"testing"
"code.gitea.io/gitea/modules/setting"
"github.com/stretchr/testify/assert"
)
@ -42,3 +44,36 @@ func TestURLJoin(t *testing.T) {
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

@ -19,7 +19,7 @@ const (
)
var (
// GitRefNamePattern is regular expression wirh unallowed characters in git reference name
// GitRefNamePattern is regular expression with unallowed characters in git reference name
GitRefNamePattern = regexp.MustCompile("[^\\d\\w-_\\./]")
)

View File

@ -27,6 +27,7 @@ Enrico Testori hypertesto AT gmail DOT com
Ezequiel Gonzalez Rial <gonrial AT gmail DOT com>
Gabriel Dugny <gabriel DOT dugny AT gmail DOT com>
Gregor Santner <gdev AT live DOT de>
Guilhem Marion <gmarion AT netc DOT fr>
Halil Kaya <halil AT halilkaya DOT net>
Hamid Feizabadi <hamidfzm AT gmail DOT com>
Hilton Wichwski Silva <hilton AT hiltonws DOT com DOT br>

View File

@ -11,6 +11,7 @@ version=Версия
page=Страница
template=Шаблон
language=Език
notifications=Известия
signed_in_as=Вписан като
username=Потребител
@ -28,6 +29,9 @@ manage_org=Управление на организации
account_settings=Настройки на профила
settings=Настройки
all=Всичко
sources=Източници
mirrors=Огледала
activities=Активности
pull_requests=Заявки за сливане
@ -69,7 +73,9 @@ issues.in_your_repos=Във Вашите хранилища
[explore]
repos=Хранилища
users=Потребители
organizations=Организации
search=Търсене
code=Код
[auth]
register_helper_msg=Вече имате профил? Впишете се сега!
@ -79,12 +85,14 @@ has_unconfirmed_mail=Здравейте %s, имате непотвърден а
resend_mail=Щракнете тук, за да се изпрати ново писмо за потвърждение
reset_password=Нулиране на паролата
reset_password_helper=Щракнете тук, за да нулирате паролата си
password_too_short=Размерът на паролата не може да бъде по-малък от %d знака.
openid_connect_submit=Свързване
[mail]
activate_account=Моля активирайте Вашия профил
activate_email=Провери адрес на ел. поща
reset_password=Нулиране на паролата
register_success=Успешна регистрация
register_notify=Добре дошли в Gitea
[modal]
yes=Да
@ -118,6 +126,7 @@ url_error=` не е валиден URL адрес.`
include_error=` трябва да съдържа текст '%s'.`
unknown_error=Неизвестна грешка:
user_not_exist=Потребителят не съществува.
auth_failed=Неуспешно удостоверяване: %v
@ -137,9 +146,11 @@ unfollow=Не следвай
[settings]
profile=Профил
password=Парола
security=Сигурност
avatar=Аватар
social=Социални профили
delete=Изтрий профил
twofa=Двуфакторно удостоверяване
uid=UID
public_profile=Публичен профил
@ -170,6 +181,8 @@ key_content=Съдържание
add_on=Добавен на
last_used=Последно използван на
no_activity=Няма скорошна дейност
show_openid=Показване в профила
hide_openid=Скриване от профила
manage_social=Управление на свързани профили в социалните мрежи
@ -240,6 +253,7 @@ file_view_raw=Виж директен файл
file_permalink=Постоянна връзка
editor.preview_changes=Преглед на промени
editor.name_your_file=Име на файла ви…
editor.or=или
editor.commit_changes=Промени в ревизия
editor.add_tmpl=Добави '%s/<filename>'
@ -248,6 +262,7 @@ editor.update=Модифицирай '%s'
editor.delete=Изтрий '%s'
editor.commit_directly_to_this_branch=Запази ревизия директно в клон <strong class="branch-name">%s</strong>.
editor.create_new_branch=Създай <strong>нов клон</strong> от тази ревизия и изпрати заявки за сливане.
editor.new_branch_name_desc=Име на новия клон…
editor.cancel=Отказ
editor.branch_already_exists=Клон '%s' вече съществува в това хранилище.
editor.no_changes_to_show=Няма промени.
@ -256,6 +271,7 @@ editor.unable_to_upload_files=Невъзможно качване на файл
editor.upload_files_to_dir=Качи файлове в '%s'
commits.commits=Ревизии
commits.find=Търсене
commits.author=Автор
commits.message=Съобщение
commits.date=Дата
@ -278,6 +294,7 @@ issues.create_label=Създай етикет
issues.label_templates.title=Зареждане на предварително зададен набор от етикети
issues.label_templates.helper=Изберете набор етикети
issues.label_templates.fail_to_load_file=Неуспешно зареждане на шаблон с етикети '%s': %v
issues.deleted_milestone=`(изтрито)`
issues.open_tab=%d отворени
issues.close_tab=%d затворени
issues.filter_label=Етикет
@ -295,6 +312,11 @@ issues.filter_sort.recentupdate=Последно променени
issues.filter_sort.leastupdate=Отдавна променени
issues.filter_sort.mostcomment=Най-много коментирани
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_fake=отворен %[1]s от %[2]s
issues.previous=Предишна
@ -324,9 +346,17 @@ issues.label_count=%d етикети
issues.label_open_issues=%d отворени задачи
issues.label_edit=Редакция
issues.label_delete=Изтрий
issues.label.filter_sort.alphabetically=По азбучен ред
issues.label.filter_sort.by_size=Големина
issues.num_participants=%d участника
issues.attachment.open_tab=`Щракнете за да прегледате "%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.filter_branch=Филтър по клон
@ -368,7 +398,19 @@ wiki.page_already_exists=Страница със същото име вече с
wiki.pages=Страници
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.collaboration.write=За писане
@ -390,6 +432,7 @@ settings.transfer=Прехвърли притежание
settings.delete=Изтрий това хранилище
settings.delete_notices_1=- Тази операция <strong>НЕ МОЖЕ</strong> да бъде отменена в последствие.
settings.transfer_owner=Нов притежател
settings.search_user_placeholder=Търсене на потребител…
settings.add_webhook=Добави уеб-кука
settings.webhook.test_delivery=Тестово изпращане
settings.webhook.request=Заявка
@ -403,6 +446,8 @@ settings.update_githook=Запази куката
settings.secret=Тайна
settings.slack_username=Потребителско име
settings.slack_icon_url=URL адрес на икона
settings.discord_username=Потребителско име
settings.discord_icon_url=URL адрес на икона
settings.slack_color=Цвят
settings.event_create=Създаване
settings.event_pull_request=Заявка за сливане
@ -417,6 +462,11 @@ settings.deploy_keys=Ключове за внедряване
settings.add_deploy_key=Добави ключ за внедряване
settings.title=Заглавие
settings.deploy_key_content=Съдържание
settings.branches=Клонове
settings.protected_branch=Защита на клона
settings.add_protected_branch=Включване на защита
settings.delete_protected_branch=Изключване на защита
settings.choose_branch=Изберете клон…
diff.browse_source=Преглед на файлове
diff.parent=родител
@ -425,6 +475,7 @@ diff.show_diff_stats=Покажи статистика за разликите
diff.show_split_view=Разделен изглед
diff.show_unified_view=Обединен изглед
diff.stats_desc=променени са <strong>%d файла</strong>, в които са <strong>добавени %d</strong> реда и са <strong>изтрити %d</strong> реда
diff.bin=Двоични данни
diff.view_file=Целия файл
diff.file_suppressed=Файловите разлики са ограничени, защото са твърде много
diff.too_many_files=Някои файлове не бяха показани, защото твърде много файлове са промени
@ -443,11 +494,17 @@ release.title=Заглавие
release.content=Съдържание
release.write=Редактор
release.preview=Преглед
release.loading=Зарежда се…
release.cancel=Отказ
release.publish=Публикувай версия
release.save_draft=Запис на чернова
release.downloads=Изтегляния
branch.search=Търсене на клонове
branch.delete_head=Изтриване
branch.delete_html=Изтриване на клон
branch.create_from=от '%s'
branch.deleted_by=Изтрито от %s
[org]
@ -459,6 +516,8 @@ people=Участници
teams=Екипи
lower_members=участници
lower_repositories=хранилища
create_new_team=Нов отбор
create_team=Създаване на отбор
org_desc=Описание
team_name=Име на екипа
team_desc=Описание
@ -510,7 +569,6 @@ total=Общо: %d
dashboard.operation_name=Име на операцията
dashboard.operation_switch=Превключи
dashboard.operation_run=Изпълни
dashboard.delete_inactivate_accounts=Изтрий всички неактивни профили
dashboard.server_uptime=Операционно време
dashboard.current_goroutine=Текущи Goroutines
dashboard.current_memory_usage=Текущо използвана памет
@ -547,6 +605,7 @@ users.edit=Редакция
users.auth_source=Начин на удостоверяване
users.local=Локално
orgs.org_manage_panel=Управление на организацията
orgs.name=Име
orgs.teams=Екипи
orgs.members=Участници
@ -557,6 +616,7 @@ repos.private=Частно
repos.watches=Наблюдавания
repos.stars=Харесвания
repos.issues=Задачи
repos.size=Големина
auths.name=Име
auths.type=Тип
@ -581,12 +641,15 @@ auths.allowed_domains=Разрешени домейни
auths.enable_tls=Включи TLS криптиране
auths.skip_tls_verify=Пропусни проверка на TLS сертификат
auths.pam_service_name=Име на PAM услуга
auths.oauth2_profileURL=URL адрес на профила
auths.oauth2_emailURL=Имейл адрес
auths.enable_auto_register=Включи автоматична регистрация
auths.tips=Съвети
config.server_config=Сървърни настройки
config.disable_router_log=Изключи журнал на маршрутизатора
config.run_mode=Режим на изпълнение
config.git_version=Версия на Git
config.repo_root_path=Основен път към хранилища
config.static_file_root_path=Път към статични файлове
config.script_type=Тип на скрипта
@ -606,9 +669,7 @@ config.db_config=Настройки на базата данни
config.db_type=Тип
config.db_host=Сървър
config.db_name=Име
config.db_ssl_mode_helper=(само за postgres)
config.db_path=Път
config.db_path_helper=(за "sqlite3" и "tidb")
config.service_config=Настройка на услугата
config.show_registration_button=Покажи бутон за регистрация
@ -703,6 +764,7 @@ push_tag=предаде маркер <a href="%s/src/%s">%[2]s</a> към <a hre
ago=преди %s
from_now=след %s
now=сега
future=в бъдеще
1s=1 секунда
1m=1 минута
1h=1 час
@ -724,6 +786,12 @@ raw_minutes=минути
remove_file=Премахни файл
[notification]
notifications=Известия
unread=Непрочетенo
read=За четене
mark_as_read=Бележа като прочетено
mark_as_unread=Бележа като непрочетено
mark_all_as_read=Бележа всичко като прочетено
[gpg]

View File

@ -79,7 +79,6 @@ has_unconfirmed_mail=Zdravím, %s, máte nepotvrzenou e-mailovou adresu (<b>%s</
resend_mail=Klikněte zde pro odeslání aktivačního e-mailu
reset_password=Obnova vašeho hesla
reset_password_helper=Klikněte zde pro obnovu vašeho hesla
password_too_short=Délka hesla musí být minimálně %d znaků.
[mail]
activate_account=Prosíme, aktivujte si váš účet
@ -509,7 +508,6 @@ total=Celkem: %d
dashboard.operation_name=Název operace
dashboard.operation_switch=Přepnout
dashboard.operation_run=Spustit
dashboard.delete_inactivate_accounts=Smazat všechny neaktivní účty
dashboard.server_uptime=Doba provozu serveru
dashboard.current_goroutine=Aktuální Goroutines
dashboard.current_memory_usage=Aktuální využití paměti
@ -603,9 +601,7 @@ config.db_config=Nastavení databáze
config.db_type=Typ
config.db_host=Server
config.db_name=Název
config.db_ssl_mode_helper=(pouze pro 'postgres')
config.db_path=Cesta
config.db_path_helper=(pro "sqlite3" a "tidb")
config.service_config=Nastavení služby
config.show_registration_button=Ukázat tlačítko registrace

File diff suppressed because it is too large Load Diff

View File

@ -79,7 +79,7 @@ loading = Loading…
[install]
install = Installation
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.
db_title = Database Settings
db_type = Database Type
@ -217,7 +217,7 @@ send_reset_mail = Click here to resend your password reset email
reset_password = Reset Your Password
invalid_code = Your confirmation code is invalid or has expired.
reset_password_helper = Click here to reset your password
password_too_short = Password length cannot be less then %d.
password_too_short = Password length cannot be less than %d characters.
non_local_account = Non-local users can not update their password through the Gitea web interface.
verify = Verify
scratch_code = Scratch code
@ -496,13 +496,13 @@ owner = Owner
repo_name = Repository Name
repo_name_helper = Good repository names use short, memorable and unique keywords.
visibility = Visibility
visiblity_helper = Make Repository Private
visiblity_helper_forced = Your site administrator forces new repositories to be private.
visiblity_fork_helper = (Changing this will affect all forks.)
clone_helper = Need help cloning? Visit <a target="_blank" rel="noopener" href="%s">Help</a>.
visibility_helper = Make Repository Private
visibility_helper_forced = Your site administrator forces new repositories to be private.
visibility_fork_helper = (Changing this will affect all forks.)
clone_helper = Need help cloning? Visit <a target="_blank" rel="noopener noreferrer" href="%s">Help</a>.
fork_repo = Fork Repository
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_lang = Language
repo_gitignore_helper = Select .gitignore templates.
@ -617,7 +617,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.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_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.no_changes_to_show = There are no changes to show.
editor.fail_to_update_file = Failed to update/create file '%s' with error: %v
@ -1005,7 +1005,7 @@ settings.search_user_placeholder = Search user…
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.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_desc = Removing a webhook deletes its settings and delivery history. Continue?
settings.webhook_deletion_success = The webhook has been removed.
@ -1022,7 +1022,7 @@ settings.githook_edit_desc = If the hook is inactive, sample content will be pre
settings.githook_name = Hook Name
settings.githook_content = Hook Content
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.content_type = POST Content Type
settings.secret = Secret
@ -1187,6 +1187,8 @@ branch.protected_deletion_failed = Branch '%s' is protected. It cannot be delete
topic.manage_topics = Manage Topics
topic.done = Done
topic.count_prompt = You can't select more than 25 topics
topic.format_prompt = Topics must start with a letter or number, can include hyphens(-) and must be no more than 35 characters long
[org]
org_name_holder = Organization Name
@ -1291,8 +1293,8 @@ dashboard.operation_switch = Switch
dashboard.operation_run = Run
dashboard.clean_unbind_oauth = Clean unbound OAuth connections
dashboard.clean_unbind_oauth_success = All unbound OAuth connections have been deleted.
dashboard.delete_inactivate_accounts = Delete all inactive accounts
dashboard.delete_inactivate_accounts_success = All inactive accounts have been deleted.
dashboard.delete_inactivate_accounts = Delete all not activated accounts
dashboard.delete_inactivate_accounts_success = All not activated accounts have been deleted.
dashboard.delete_repo_archives = Delete all repository archives
dashboard.delete_repo_archives_success = All repository archives have been deleted.
dashboard.delete_missing_repos = Delete all repositories missing their Git files
@ -1495,9 +1497,7 @@ config.db_host = Host
config.db_name = Name
config.db_user = Username
config.db_ssl_mode = SSL
config.db_ssl_mode_helper = (for "postgres" only)
config.db_path = Path
config.db_path_helper = (for "sqlite3" and "tidb")
config.service_config = Service Configuration
config.register_email_confirm = Require Email Confirmation to Register

View File

@ -1,11 +1,15 @@
app_desc=Un servicio de Git auto alojado y sin complicaciones
home=Inicio
dashboard=Panel de control
explore=Explorar
help=Ayuda
sign_in=Iniciar sesión
sign_in_with=Iniciar sesión con
sign_out=Cerrar sesión
sign_up=Registro
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
website=Página web
version=Versión
@ -13,12 +17,27 @@ page=Página
template=Plantilla
language=Idioma
notifications=Notificaciones
create_new=Crear…
user_profile_and_more=Perfil y ajustes…
signed_in_as=Identificado como
enable_javascript=Este sitio web funciona mejor con JavaScript.
username=Nombre de usuario
email=Correo electrónico
password=Contraseña
re_type=Vuelva a escribir la contraseña
captcha=CAPTCHA
twofa=Autenticación de dos factores
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_error=No podemos leer su llave de seguridad!
u2f_unsupported_browser=Su navegador no soporta llaves U2F. Por favor utilicé otro navegador.
u2f_error_1=Un error desconocido ha ocurrido. Por favor vuelva a intentarlo.
u2f_error_2=Por favor asegúrese de que está utilizando una conexión cifrada (https://) y que esta visitando la dirección URL correcta.
u2f_error_3=El servidor no pudo procesar su petición.
u2f_reload=Recargar
repository=Repositorio
organization=Organización
@ -31,6 +50,9 @@ new_org=Nueva organización
manage_org=Administrar organizaciones
account_settings=Configuraciones de la cuenta
settings=Configuraciones
your_profile=Perfil
your_starred=Destacado
your_settings=Configuración
all=Todos
sources=Fuentes
@ -46,29 +68,63 @@ cancel=Cancelar
[install]
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_type=Tipo de base de datos
host=Servidor
user=Nombre de usuario
password=Contraseña
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
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)
run_user=Ejecutar como usuario
domain=Dominio del servidor SSH
log_root_path=Ruta del registro
optional_title=Configuración opcional
email_title=Configuración de Correo
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.
enable_captcha=Activar CAPTCHA
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
confirm_password=Confirmar Contraseña
admin_email=Correo electrónico
install_btn_confirm=Instalar Gitea
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
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]
uname_holder=Nombre de usuario o correo electrónico
password_holder=Contraseña
switch_dashboard_context=Cambiar el contexto del Dashboard
my_repos=Repositorios
show_more_repos=Mostrar más repositorios…
collaborative_repos=Repositorios colaborativos
my_orgs=Mis organizaciones
my_mirrors=Mis réplicas
@ -81,29 +137,46 @@ repos=Repositorios
users=Usuarios
organizations=Organizaciones
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]
create_new_account=Registrar una cuenta
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
forgot_password_title=He olvidado mi 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.
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
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.
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.
send_reset_mail=Haz clic aquí para reenviar tu email de restauración de 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
password_too_short=La longitud de la contraseña no puede ser menor a %d.
non_local_account=Los usuarios no locales no pueden actualizar su contraseña a través de la interfaz web de Gitea.
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_token_incorrect=El código cero es incorrecto.
login_userpass=Iniciar sesión
login_openid=OpenID
openid_connect_submit=Conectar
openid_connect_title=Accede con una cuenta existente
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]
activate_account=Por favor, active su cuenta
@ -115,12 +188,14 @@ register_notify=¡Bienvenido a Gitea
[modal]
yes=
no=No
modify=Actualizar
[form]
UserName=Nombre de usuario
RepoName=Nombre del repositorio
Email=Dirección de correo electrónico
Password=Contraseña
Retype=Vuelva a escribir la contraseña
SSHTitle=Nombre de la Clave de SSH
HttpsUrl=URL HTTPS
PayloadUrl=URL de carga
@ -136,6 +211,7 @@ TreeName=Ruta del archivo
Content=Contenido
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.`
min_size_error=` debe contener al menos %s caracteres.`
max_size_error=` debe contener como máximo %s caracteres.`
@ -143,7 +219,10 @@ email_error=` no es una dirección de correo válida.`
url_error=` no es una URL válida.`
include_error=` debe contener la subcadena '%s'.`
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.
auth_failed=Autenticación fallo: %v
@ -249,6 +328,7 @@ fork_from=Crear un Fork desde
repo_desc=Descripción
repo_lang=Idioma
license=Licencia
auto_init=Inicializar el repositorio (añade .gitignore, licencia y README)
create_repo=Crear repositorio
default_branch=Rama por defecto
mirror_prune=Purgar
@ -344,8 +424,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.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.add_milestone_at=`agregado esto al <b>%s</b> hito %s '
issues.change_milestone_at=` modificó el hito de <b>%s</b> to <b>%s</b> %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> a <b>%s</b> %s`
issues.remove_milestone_at=`eliminado esto del <b>%s</b> hito %s '
issues.deleted_milestone=`(eliminado)`
issues.self_assign_at=`auto asignado este %s`
@ -412,6 +492,8 @@ issues.attachment.open_tab='Haga clic para ver "%s" en una pestaña nueva'
issues.attachment.download=`Haga clic para descargar "%s"`
issues.subscribe=Suscribir
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.add_time_hours=Horas
issues.add_time_minutes=Minutos
@ -462,6 +544,8 @@ wiki.page_already_exists=Ya existe una página con el mismo nombre.
wiki.pages=Páginas
wiki.last_updated=Última actualización %s
activity=Actividad
activity.period.filter_label=Periodo:
activity.period.daily=1 día
activity.period.halfweekly=3 días
activity.period.weekly=1 semana
@ -504,6 +588,7 @@ settings.new_owner_has_same_repo=El nuevo propietario tiene un repositorio con e
settings.transfer=Transferir la propiedad
settings.delete=Eliminar este repositorio
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.add_webhook=Añadir Webhook
settings.webhook.test_delivery=Test de entrega
@ -532,6 +617,7 @@ settings.deploy_keys=Claves de Despliegue
settings.add_deploy_key=Añadir Clave de Despliegue
settings.title=Título
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.delete_protected_branch=Desactivar protección
@ -575,6 +661,7 @@ branch.create_from=desde '%s'
branch.branch_already_exists=La rama '%s' ya existe en este repositorio.
branch.deleted_by=Eliminada por %s
topic.done=Hecho
[org]
org_name_holder=Nombre de la organización
@ -614,6 +701,7 @@ teams.join=Unirse
teams.leave=Abandonar
teams.read_access=Acceso de Lectura
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.settings=Configuración
teams.members=Miembros del equipo
@ -639,8 +727,7 @@ dashboard.operation_name=Nombre de la operación
dashboard.operation_switch=Interruptor
dashboard.operation_run=Ejecutar
dashboard.clean_unbind_oauth_success=Se han eliminado las conexiones de OAuth no vinculadas.
dashboard.delete_inactivate_accounts=Eliminar todas las cuentas inactivas
dashboard.delete_inactivate_accounts_success=Todas las cuentas inactivas han sido eliminadas.
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.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.server_uptime=Tiempo de actividad del servidor
@ -741,9 +828,7 @@ config.ssh_minimum_key_sizes=Tamaños de clave mínimos
config.db_config=Configuración de la Base de Datos
config.db_type=Tipo
config.db_name=Nombre
config.db_ssl_mode_helper=(sólo para "postgres")
config.db_path=Ruta
config.db_path_helper=(para "sqlite3" y "tidb")
config.service_config=Configuración del servicio
config.show_registration_button=Mostrar Botón de Registro
@ -862,6 +947,7 @@ file_too_big=El tamaño del archivo ({{filesize}} MB) excede el tamaño máximo
remove_file=Eliminar archivo
[notification]
notifications=Notificaciones
unread=Sin leer
read=Leídas
mark_as_read=Marcar como leído

View File

@ -1,10 +1,15 @@
app_desc=Ongelmaton, itsehostattu Git-palvelu
home=Etusivu
dashboard=Kojelauta
explore=Tutki
help=Apua
sign_in=Kirjaudu sisään
sign_in_with=Kirjaudu sisään tunnuksilla
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
website=Nettisivut
version=Versio
@ -12,10 +17,18 @@ page=Sivu
template=Malli
language=Kieli
notifications=Ilmoitukset
create_new=Luo…
user_profile_and_more=Profiili ja asetukset…
signed_in_as=Kirjautuneena käyttäjänä
enable_javascript=Tämä sivusto toimii paremmin JavaScriptillä.
username=Käyttäjätunnus
email=Sähköpostiosoite
password=Salasana
re_type=Kirjoita salasana uudelleen
captcha=CAPTCHA
twofa=Kaksivaiheinen todennus
twofa_scratch=Kaksivaiheinen kertakäyttöinen koodi
passcode=Tunnuskoodi
@ -25,11 +38,21 @@ mirror=Peili
new_repo=Uusi repo
new_migrate=Uusi migraatio
new_mirror=Uusi peilaus
new_fork=Uusi repositorio
new_org=Uusi organisaatio
manage_org=Ylläpidä organisaatioita
admin_panel=Sivuston ylläpito
account_settings=Tilin 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
pull_requests=Pull requestit
@ -39,19 +62,59 @@ cancel=Peruuta
[install]
install=Asennus
title=Alkuperäiset asetukset
requite_db_desc=Gitea tarvitsee toimiakseen MySQL-, PostgreSQL-, MSSQL-, SQLite3 tai TiDB-tietokannan.
db_title=Tietokanta asetukset
db_type=Tietokanta tyyppi
host=Isäntä
user=Käyttäjätunnus
password=Salasana
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
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_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_helper=Lokitiedostot kirjoitetaan tähän kansioon.
optional_title=Valinnaiset asetukset
email_title=Sähköpostiasetukset
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.
disable_registration=Poista rekisteröinti käytöstä
enable_captcha_popup=Pakollinen captcha käyttäjän itse rekisteröityessä.
admin_password=Salasana
confirm_password=Varmista salasana
@ -73,33 +136,69 @@ repos=Repot
users=Käyttäjät
organizations=Organisaatiot
search=Hae
code_no_results=Hakuehtoasi vastaavaa lähdekoodia ei löytynyt.
code_search_results=Hakutulokset: '%s '
[auth]
create_new_account=Rekisteröi tili
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
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
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.
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
invalid_code=Vahvistusavain on virheellinen tai vanhentunut.
reset_password_helper=Klikkaa tästä nollataksesi salasanasi
password_too_short=Salasanan pituus ei voi olla vähemmän kuin %d merkkiä.
non_local_account=Ei-lokaalit käyttäjät eivät voi päivittää salasanojaan Gitean web-käyttöliittymän kautta.
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]
activate_account=Ole hyvä ja aktivoi tilisi
activate_email=Vahvista sähköpostiosoitteesi
reset_password=Tyhjennä salasana
register_success=Rekisteröinti onnistui
register_notify=Tervetuloa Giteaan
[modal]
yes=Kyllä
no=Ei
modify=Päivitys
[form]
UserName=Käyttäjätunnus
RepoName=Repon nimi
Email=Sähköposti osoite
Password=Salasana
Retype=Kirjoita salasana uudelleen
SSHTitle=SSH avain nimi
HttpsUrl=HTTPS-osoite
TeamName=Tiimin nimi
AuthName=Luvan nimi
AdminEmail=Ylläpito sähköposti
@ -489,7 +588,6 @@ total=Yhteensä: %d
dashboard.operation_name=Toiminnon nimi
dashboard.operation_switch=Vaihda
dashboard.operation_run=Suorita
dashboard.delete_inactivate_accounts=Poista kaikki passiiviset tunnukset
dashboard.server_uptime=Palvelimen Uptime
dashboard.current_goroutine=Nykyiset Goroutinet
dashboard.current_memory_usage=Nykyinen muistinkäyttö
@ -585,9 +683,7 @@ config.db_config=Tietokannan asetukset
config.db_type=Tyyppi
config.db_host=Isäntä
config.db_name=Nimi
config.db_ssl_mode_helper=(vain "postgres")
config.db_path=Polku
config.db_path_helper=("sqlite3" ja "tidb")
config.service_config=Palvelu asetukset
config.show_registration_button=Näytä rekisteröidy painike

File diff suppressed because it is too large Load Diff

View File

@ -101,7 +101,6 @@ email_not_associate=Az email cím nincsen hozzárendelve egyetlen fiókhoz sem.
send_reset_mail=Kattints ide hogy újraküldd a jelszó visszaállító emailt
reset_password=Jelszó visszaállítása
reset_password_helper=Kattintson ide, hogy visszaállítsa a jelszavát
password_too_short=A jelszó nem lehet rövidebb, mint %d karakter.
verify=Ellenőrzés
scratch_code=Kaparós kód
use_scratch_code=Kaparós kód használata
@ -709,8 +708,6 @@ dashboard.operation_switch=Váltás
dashboard.operation_run=Futtatás
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.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_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
@ -835,9 +832,7 @@ config.db_config=Adatbázis Konfiguráció
config.db_type=Típus
config.db_host=Kiszolgáló
config.db_name=Név
config.db_ssl_mode_helper=(csak "postgres"-nek)
config.db_path=Elérési út
config.db_path_helper=("sqlite3" és "tidb"-nek)
config.service_config=Szolgáltatás konfiguráció
config.show_registration_button=Regisztráció gomb megjelenítése

View File

@ -1,11 +1,15 @@
app_desc=Sebuah layanan Git hosting pribadi yang mudah
home=Beranda
dashboard=Dasbor
explore=Jelajahi
help=Bantuan
sign_in=Masuk
sign_in_with=Masuk Dengan
sign_out=Keluar
sign_up=Daftar
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
website=Situs Web
version=Versi
@ -13,12 +17,32 @@ page=Halaman
template=Contoh
language=Bahasa
notifications=Notifikasi
create_new=Buat…
user_profile_and_more=Profil dan Pengaturan…
signed_in_as=Masuk sebagai
enable_javascript=Situs web ini bekerja lebih baik dengan JavaScript.
username=Nama Pengguna
email=Alamat Email
password=Kata Sandi
re_type=Ketik Ulang Kata Sandi
captcha=CAPTCHA
twofa=Otentikasi Dua Faktor
twofa_scratch=Kode Awal Dua Faktor
passcode=Kode Akses
u2f_insert_key=Masukkan kunci keamanan anda
u2f_sign_in=Tekan tombol pada kunci keamanan anda. Jika anda tidak menemukan tombol, masukkan kembali.
u2f_press_button=Silahkan tekan tombol pada kunci keamanan anda…
u2f_use_twofa=Menggunakan kode dua faktor dari telepon anda
u2f_error=Kami tidak bisa membaca kunci keamanan anda!
u2f_unsupported_browser=Browser anda tidak mendukung kunci U2F. Silakan mencoba browser lain.
u2f_error_1=Terdapat kesalahan yang tidak diketahui. Mohon coba lagi.
u2f_error_2=Pastikan bahwa anda menggunakan koneksi terenkripsi (https://) dan mengunjungi URL yang benar.
u2f_error_3=Server tidak bisa melanjutkan permintaan anda.
u2f_error_4=Kunci tidak layak untuk permintaan ini. Jika Anda mencoba untuk mendaftarkanya, pastikan bahwa kunci sudah tidak terdaftar.
u2f_error_5=Timeout tercapai sebelum kunci anda bisa terbaca. Silahkan muat ulang untuk mencoba kembali.
u2f_reload=Muat Ulang
repository=Repositori
organization=Organisasi
@ -29,8 +53,12 @@ new_mirror=Duplikat Baru
new_fork=Fork Repositori Baru
new_org=Organisasi Baru
manage_org=Mengelola Organisasi
admin_panel=Administrasi Situs
account_settings=Pengaturan Akun
settings=Pengaturan
your_profile=Profil
your_starred=Dibintangi
your_settings=Pengaturan
all=Semua
sources=Sumber
@ -46,34 +74,85 @@ cancel=Batal
[install]
install=Pemasangan
title=Konfigurasi Awal
requite_db_desc=Gitea memerlukan MySQL, PostgreSQL, MSSQL, SQLite3 atau TiDB.
db_title=Pengaturan Basis Data
db_type=Tipe Basis Data
host=Host
user=Nama Pengguna
password=Kata Sandi
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
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_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_helper=Berkas log akan ditulis ke direktori ini.
optional_title=Pengaturan Opsional
email_title=Pengaturan Surel
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.
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.
require_sign_in_view=Anda Harus Login untuk Melihat Halaman
admin_title=Pengaturan Akun Admin
admin_name=Nama Pengguna Admin
admin_password=Kata sandi
confirm_password=Konfirmasi Kata Sandi
admin_email=Alamat Surel
install_btn_confirm=Memasang Gitea
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
[home]
uname_holder=Nama Pengguna atau Alamat Surel
password_holder=Kata Sandi
switch_dashboard_context=Alihkan Dasbor Konteks
my_repos=Repositori
show_more_repos=Tampilkan repositori lainnya…
collaborative_repos=Repositori Kolaboratif
my_orgs=Organisasi Saya
my_mirrors=Duplikat Saya
view_home=Lihat %s
search_repos=Cari repositori…
issues.in_your_repos=Dalam repositori anda
@ -82,9 +161,16 @@ repos=Repositori
users=Pengguna
organizations=Organisasi
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]
create_new_account=Daftar Akun
register_helper_msg=Sudah memiliki akun? Masuk sekarang!
social_register_helper_msg=Sudah memiliki akun? Hubungkan sekarang!
remember_me=Ingat Saya
forgot_password_title=Lupa Kata Sandi
forgot_password=Lupa kata sandi?
@ -97,7 +183,6 @@ email_not_associate=Alamat surel tidak terhubung dengan akun apapun.
send_reset_mail=Klik di sini untuk mengirim ulang surel pengaturan ulang kata sandi
reset_password=Atur Ulang Kata Sandi Anda
reset_password_helper=Klik di sini untuk mengatur ulang kata sandi anda
password_too_short=Panjang kata sandi tidak boleh kurang dari %d.
verify=Verifikasi
scratch_code=Kode coretan
use_scratch_code=Gunakan kode coretan
@ -307,14 +392,17 @@ file_permalink=Permalink
stored_lfs=Tersimpan dengan GIT LFS
editor.preview_changes=Tinjau Perubahan
editor.name_your_file=Nama berkas…
editor.or=atau
editor.commit_changes=Perubahan komitmen
editor.add_tmpl=Tambah '%s/<filename>'
editor.add=Menambah '%s'
editor.update=Memperbarui '%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.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.branch_already_exists=Cabang '%s' sudah ada di repositori ini.
editor.no_changes_to_show=Tidak ada perubahan untuk ditampilkan.
@ -407,6 +495,7 @@ issues.edit=Sunting
issues.cancel=Batal
issues.save=Simpan
issues.label_title=Nama label
issues.label_description=Keterangan label
issues.label_color=Warna label
issues.label_count=%d label
issues.label_open_issues=%d masalah terbuka
@ -548,6 +637,7 @@ settings.transfer=Transfer Kepemilikan
settings.delete=Menghapus Repositori Ini
settings.delete_notices_1=- Operasi ini <strong>TIDAK BISA</strong> dibatalkan.
settings.transfer_owner=Pemilik Baru
settings.search_user_placeholder=Cari pengguna…
settings.add_webhook=Tambahkan Webhook
settings.webhook.test_delivery=Percobaan Pengiriman
settings.webhook.request=Permintaan
@ -585,6 +675,7 @@ settings.protected_branch_can_push_yes=Anda dapat mendorong
settings.protected_branch_can_push_no=Anda tidak dapat mendorong
settings.add_protected_branch=Aktifkan perlindungan
settings.delete_protected_branch=Nonaktifkan perlindungan
settings.choose_branch=Pilih branch…
diff.browse_source=Telusuri Sumber
diff.parent=orang tua
@ -613,6 +704,7 @@ release.title=Judul
release.content=Konten
release.write=Menulis
release.preview=Pratinjau
release.loading=Memuat…
release.cancel=Membatalkan
release.publish=Mempublikasikan Rilis
release.save_draft=Simpan Draft
@ -637,6 +729,8 @@ people=Orang
teams=Tim
lower_members=anggota
lower_repositories=repositori
create_new_team=Tim Baru
create_team=Buat Tim Baru
org_desc=Deskripsi
team_name=Nama tim
team_desc=Deskripsi
@ -673,6 +767,7 @@ teams.update_settings=Memperbarui pengaturan
teams.add_team_member=Tambahkan Anggota Tim
teams.delete_team_success=Tim sudah di hapus.
teams.repositories=Tim repositori
teams.search_repo_placeholder=Cari repositori…
teams.add_team_repository=Tambahkan Tim Repositori
teams.remove_repo=Menghapus
teams.add_nonexistent_repo=Repositori yang ingin Anda tambahkan tidak ada; Silahkan buat terlebih dahulu.
@ -693,11 +788,10 @@ dashboard.operation_switch=Beralih
dashboard.operation_run=Lari
dashboard.clean_unbind_oauth=Bersihkan koneksi OAuth yang tidak terikat
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_success=Semua repositori Git yang hilang yang catatannya dan telah diinisialisasi ulang.
dashboard.sync_external_users=Sinkronkan data pengguna eksternal
dashboard.git_fsck=Lakukan pemeriksaan kesehatan pada semua repositori
dashboard.server_uptime=Waktu tambahan server
dashboard.current_goroutine=Goroutin saat ini
dashboard.current_memory_usage=Penggunaan memori saat ini
@ -710,6 +804,8 @@ dashboard.heap_memory_idle=Tumpukan memori yang menganggur
dashboard.heap_memory_in_use=Tumpukan memori yang digunakan
dashboard.heap_memory_released=Tumpukan memori dirilis
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_obtained=Struktur MSpan didapatkan
dashboard.mcache_structures_usage=Penggunaan struktur MCache
@ -726,6 +822,7 @@ dashboard.gc_times=Waktu GC
users.activated=Diaktifkan
users.admin=Pengelola
users.repos=Repo
users.created=Dibuat
users.edit=Edit
users.auth_source=Sumber Otentikasi
@ -796,20 +893,26 @@ config.disable_router_log=Menonaktifkan router log
config.run_mode=Jalankan mode
config.git_version=Versi Git
config.repo_root_path=Jalur akar repositori
config.lfs_root_path=Path Root LFS
config.static_file_root_path=Jalur akar berkas statis
config.script_type=Jenis skrip
config.reverse_auth_user=Mengembalikan pengguna otentikasi
config.ssh_config=Konfigurasi SSH
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_sizes=Ukuran kunci minimum
config.db_config=Konfigurasi basis data
config.db_type=Tipe
config.db_host=Host
config.db_name=Nama
config.db_ssl_mode_helper=(untuk "postgres" saja)
config.db_path=Jalur
config.db_path_helper=(untuk "sqlite3 dan "tidb")
config.service_config=Konfigurasi layanan
config.show_registration_button=Tampilkan tombol mendaftar

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +1,11 @@
app_desc=痛みのない、自己ホスト型の Git サービス
home=ホーム
dashboard=ダッシュボード
explore=エクスプローラ
help=ヘルプ
sign_in=サインイン
sign_in_with=サインインします。
sign_out=サインアウト
link_account=連携アカウント
register=登録
@ -101,7 +103,6 @@ email_not_associate=このEメールアドレスは、どのアカウントに
send_reset_mail=パスワードリセットメールを再送するにはここをクリックしてください
reset_password=パスワードリセット
reset_password_helper=パスワードをリセットするにはここをクリック
password_too_short=%d文字未満のパスワードは設定できません。
verify=確認
scratch_code=スクラッチコード
use_scratch_code=スクラッチコードを使う
@ -707,8 +708,6 @@ dashboard.operation_switch=スイッチ
dashboard.operation_run=実行
dashboard.clean_unbind_oauth=関連付けられていない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_success=レコードが存在するが見当たらないすべてのGitリポジトリが再初期化されました。
dashboard.sync_external_users=外部ユーザーデータの同期
@ -833,9 +832,7 @@ config.db_config=データベースの構成
config.db_type=タイプ
config.db_host=ホスト
config.db_name=名前
config.db_ssl_mode_helper=(「postgres」のみ
config.db_path=パス
config.db_path_helper=("sqlite3"および"tidb"のみ)
config.service_config=サービスの構成
config.show_registration_button=登録ボタンを表示します。

View File

@ -97,7 +97,6 @@ email_not_associate=이 이메일 주소로 등록된 계정이 없습니다.
send_reset_mail=여기를 눌러 비밀번호 초기화 메일을 재전송
reset_password=비밀번호 초기화
reset_password_helper=이곳을 눌러 비밀번호를 재설정
password_too_short=비밀번호의 길이는 %d글자 미만일 수 없습니다.
verify=확인
scratch_code=스크래치 코드
use_scratch_code=스크래치 코드 사용
@ -592,7 +591,6 @@ total=총: %d
dashboard.operation_name=작업 명
dashboard.operation_switch=스위치
dashboard.operation_run=실행
dashboard.delete_inactivate_accounts=활성화되지 않은 모든 계정을 삭제합니다.
dashboard.server_uptime=서버를 켠 시간
dashboard.current_goroutine=현재 Go루틴
dashboard.current_memory_usage=현재 메모리 사용율
@ -687,9 +685,7 @@ config.db_config=데이터베이스 설정
config.db_type=유형
config.db_host=호스트
config.db_name=이름
config.db_ssl_mode_helper=("postgres" 전용)
config.db_path=경로
config.db_path_helper=("sqlite3" 및 "tidb"만)
config.service_config=서비스 설정
config.show_registration_button=등록 버튼을 표시

View File

@ -75,7 +75,6 @@ active_your_account=Aktyvinkite savo paskyrą
resend_mail=Spauskite čia norėdami persiųsti aktyvacijos laišką
reset_password=Atstatyti slaptažodį
reset_password_helper=Paspauskite čia norėdami pakeisti savo slaptažodį
password_too_short=Slaptažodis negali būti trumpesnis nei %d simbolių.
verify=Patikrinti
[mail]

File diff suppressed because it is too large Load Diff

View File

@ -61,11 +61,17 @@ smtp_host=SMTP-vert
admin_password=Passord
[home]
password_holder=Passord
[explore]
users=Brukere
[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]

View File

@ -1,11 +1,15 @@
app_desc=Een eenvoudige, self-hosted Git service
home=Beginscherm
dashboard=Overzicht
explore=Verkennen
help=Help
sign_in=Inloggen
sign_in_with=Inloggen met
sign_out=Uitloggen
sign_up=Registreren
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
website=Website
version=Versie
@ -14,12 +18,29 @@ template=Sjabloon
language=Taal
notifications=Meldingen
create_new=Maken…
user_profile_and_more=Profiel en instellingen…
signed_in_as=Aangemeld als
enable_javascript=Deze website werkt beter met JavaScript.
username=Gebruikersnaam
email=E-mail adres
password=Wachtwoord
re_type=Typ uw wachtwoord opnieuw in
captcha=CAPTCHA
twofa=Twee factor authenticatie
twofa_scratch=Eenmalige twee factor authenticatie code
passcode=PIN
u2f_insert_key=Uw beveiligingssleutel invoegen
u2f_sign_in=Druk op de knop op uw beveiligingssleutel. Als u een knop niet kunt vinden, deze opnieuw invoegen.
u2f_press_button=Druk op de knop op uw beveiligingssleutel…
u2f_use_twofa=Gebruik een twee-factor code van uw telefoon
u2f_error=Wij kunnen niet uw beveiligingssleutel lezen!
u2f_unsupported_browser=Uw browser geen ondersteund U2F keys. Probeer een andere browser.
u2f_error_1=Er is een onbekende fout opgetreden. Probeer het opnieuw.
u2f_error_2=Zorg voor een versleutelde verbinding (https://) en een bezoek aan de juiste URL.
u2f_error_3=De server kan uw aanvraag niet verhandelen.
u2f_reload=Herladen
repository=Repository
organization=Organisatie
@ -32,6 +53,8 @@ new_org=Nieuwe organisatie
manage_org=Beheer organisaties
account_settings=Accountinstellingen
settings=Instellingen
your_profile=Profiel
your_settings=Instellingen
all=Alles
sources=Bronnen
@ -47,21 +70,35 @@ cancel=Annuleren
[install]
install=Installatie
title=Initiële configuratie
requite_db_desc=Gitea vereist MySQL, PostgreSQL, MSSQL, SQLite3 of TiDB.
db_title=Database-instellingen
db_type=Database-type
host=Server
user=Gebruikersnaam
password=Wachtwoord
db_name=Database naam
ssl_mode=SSL
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
repo_path=Repositories basis map
lfs_path=Git LFS root pad
app_url=Gitea base URL
log_root_path=Log-pad
optional_title=Optionele instellingen
email_title=E-mail instellingen
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.
openid_signin=OpenID-inloggen inschakelen
enable_captcha_popup=Vereis captcha validatie voor zelf-registratie van gebruiker.
admin_name=Admin gebruikersnaam
admin_password=Wachtwoord
confirm_password=Verifieer wachtwoord
install_btn_confirm=Installeer Gitea
@ -95,13 +132,14 @@ 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.
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
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.
resend_mail=Klik hier om uw activatie mail nog een keer te verzenden
email_not_associate=Dit emailadres is niet gekoppeld aan een account.
send_reset_mail=Klik hier om de wachtwoord reset mail (nogmaals) te versturen
reset_password=Reset uw wachtwoord
reset_password_helper=Klik hier om uw wachtwoord opnieuw in te stellen.
password_too_short=De lengte van uw wachtwoord moet minimaal %d karakters zijn.
verify=Verifiëren
scratch_code=Eenmalige code
use_scratch_code=Gebruik een eenmalige code
@ -151,6 +189,8 @@ url_error=is niet een valide URL.
include_error=` moet substring '%s' bevatten.`
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.
auth_failed=Verificatie mislukt: %v
@ -187,6 +227,7 @@ website=Website
location=Locatie
update_profile=Profiel bijwerken
update_profile_success=Je profiel is bijgewerkt.
change_username=Je gebruikersnaam is gewijzigd.
continue=Doorgaan
cancel=Annuleren
@ -679,8 +720,6 @@ total=Totaal: %d
dashboard.operation_name=Bewerking naam
dashboard.operation_switch=Omschakelen
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.server_uptime=Uptime server
dashboard.current_goroutine=Huidige Goroutines
@ -710,6 +749,7 @@ dashboard.total_gc_pause=Totaal GC verwerkingstijd
dashboard.last_gc_pause=Laatste GC verwerkingstijd
dashboard.gc_times=GC verwerkingen
users.name=Gebruikersnaam
users.activated=Geactiveerd
users.admin=Beheerder
users.repos=Repos
@ -784,9 +824,8 @@ config.db_config=Databaseconfiguratie
config.db_type=Type
config.db_host=Host
config.db_name=Naam
config.db_ssl_mode_helper=(alleen voor "postgres")
config.db_user=Gebruikersnaam
config.db_path=Pad
config.db_path_helper=(voor "sqlite3" en "tidb")
config.service_config=Serviceconfiguratie
config.show_registration_button=Registeren knop weergeven

View File

@ -1,10 +1,13 @@
app_desc=Bezbolesna usługa Git na własnym serwerze
home=Strona główna
dashboard=Pulpit
explore=Odkrywaj
help=Pomoc
sign_in=Zaloguj się
sign_in_with=Zaloguj się za pomocą
sign_out=Wyloguj
sign_up=Zarejestruj
link_account=Powiąż konto
register=Zarejestruj się
website=Strona
@ -13,12 +16,21 @@ page=Strona
template=Szablon
language=Język
notifications=Powiadomienia
create_new=Utwórz…
user_profile_and_more=Profil i ustawienia…
signed_in_as=Zalogowany jako
enable_javascript=Strona działa najlepiej z włączonym JavaScript.
username=Nazwa użytkownika
email=Adres e-mail
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
u2f_reload=Odśwież
repository=Repozytorium
organization=Organizacja
@ -29,8 +41,12 @@ new_mirror=Nowa kopia lustrzana
new_fork=Nowy fork repozytorium
new_org=Nowa organizacja
manage_org=Zarządzaj organizacjami
admin_panel=Administracja stron
account_settings=Ustawienia konta
settings=Ustawienia
your_profile=Profil
your_starred=Z gwiazdką
your_settings=Ustawienia
all=Wszystko
sources=Źródła
@ -46,34 +62,61 @@ cancel=Anuluj
[install]
install=Instalacja
title=Wstępna konfiguracja
db_title=Ustawienia bazy danych
db_type=Typ bazy danych
host=Serwer
user=Nazwa użytkownika
password=Hasło
db_name=Nazwa bazy danych
ssl_mode=SSL
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
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
optional_title=Ustawienia opcjonalne
email_title=Ustawienia e-mail
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.
disable_registration=Wyłącz rejestrację dwuskładnikową
openid_signin=Włącz logowanie za pomocą OpenID
enable_captcha=Włącz CAPTCHA
enable_captcha_popup=Wymagaj walidacji CAPTCHA przy samodzielnej rejestracji użytkownika.
admin_password=Hasło
confirm_password=Potwierdź hasło
admin_email=Adres e-mail
install_btn_confirm=Zainstaluj Gitea
test_git_failed=Nie udało się przetestować polecenia „git”: %v
save_config_failed=Nie udało się zapisać konfiguracji: %v
[home]
uname_holder=Nazwa użytkownika lub adres email
password_holder=Hasło
switch_dashboard_context=Przełącz kontekst pulpitu
my_repos=Repozytoria
show_more_repos=Pokaż więcej repozytoriów…
collaborative_repos=Wspólne repozytoria
my_orgs=Moje organizacje
my_mirrors=Moje kopie lustrzane
view_home=Zobacz %s
search_repos=Znajdź repozytorium…
issues.in_your_repos=W Twoich repozytoriach
@ -82,12 +125,20 @@ repos=Repozytoria
users=Użytkownicy
organizations=Organizacje
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]
create_new_account=Zarejestruj konto
register_helper_msg=Masz już konto? Zaloguj się teraz!
social_register_helper_msg=Masz już konto? Powiąż je teraz!
remember_me=Zapamiętaj mnie
forgot_password_title=Zapomniałem 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.
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
@ -97,12 +148,12 @@ email_not_associate=Adres e-mail nie jest powiązany z żadnym kontem.
send_reset_mail=Kliknij tutaj, aby ponownie wysłać e-mail resetowania hasła
reset_password=Resetowanie hasła
reset_password_helper=Kliknij tutaj, aby zresetować hasło
password_too_short=Długość hasła nie może być mniejsza niż %d znaków.
verify=Potwierdź
scratch_code=Kod jednorazowy
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_token_incorrect=Twój kod jednorazowy jest niepoprawny.
login_userpass=Zaloguj się
login_openid=OpenID
openid_connect_submit=Połącz
openid_connect_title=Połącz z istniejącym kontem
@ -118,12 +169,14 @@ register_notify=Witamy w Gitea
[modal]
yes=Tak
no=Nie
modify=Aktualizuj
[form]
UserName=Nazwa użytkownika
RepoName=Nazwa repozytorium
Email=Adres e-mail
Password=Hasło
Retype=Wpisz ponownie hasło
SSHTitle=Nazwa klucza SSH
HttpsUrl=HTTPS URL
PayloadUrl=URL do wywołania
@ -146,7 +199,13 @@ email_error=` nie jest poprawnym adresem e-mail.`
url_error=` nie jest poprawnym adresem URL.`
include_error=`musi zawierać tekst '%s'.`
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.
auth_failed=Uwierzytelnienie się nie powiodło: %v
@ -155,6 +214,7 @@ auth_failed=Uwierzytelnienie się nie powiodło: %v
target_branch_not_exist=Gałąź docelowa nie istnieje.
[user]
change_avatar=Zmień swój awatar…
join_on=Dołączył
repositories=Repozytoria
activity=Publiczna aktywność
@ -167,15 +227,21 @@ form.name_reserved=Nazwa użytkownika '%s' jest zarezerwowana.
[settings]
profile=Profil
account=Konto
password=Hasło
security=Bezpieczeństwo
avatar=Awatar
ssh_gpg_keys=Klucze SSH / GPG
social=Konta społecznościowe
applications=Aplikacje
orgs=Zarządzaj organizacjami
repos=Repozytoria
delete=Usuń konto
twofa=Autoryzacja dwuetapowa
account_link=Powiązane Konta
organization=Organizacje
uid=UID
u2f=Klucze bezpieczeństwa
public_profile=Profil publiczny
full_name=Imię i nazwisko
@ -183,20 +249,33 @@ website=Strona
location=Lokalizacja
update_profile=Zaktualizuj profil
update_profile_success=Twój profil został zaktualizowany.
change_username=Twój nick został zmieniony.
continue=Kontynuuj
cancel=Anuluj
language=Język
federated_avatar_lookup=Wyszukiwanie zewnętrznych awatarów
enable_custom_avatar=Włącz niestandardowe awatary
choose_new_avatar=Wybierz nowy avatar
update_avatar=Aktualizuj awatar
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
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
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ń.
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
manage_ssh_keys=Zarządzaj kluczami SSH
@ -210,6 +289,11 @@ subkeys=Podklucze
key_id=ID klucza
key_name=Nazwa klucza
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
valid_until=Ważne do
valid_forever=Ważne bezterminowo
@ -221,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
show_openid=Pokaż w profilu
hide_openid=Ukryj w profilu
ssh_disabled=SSH jest wyłączony
manage_social=Zarządzaj powiązanymi kontami społecznościowymi
unbind=Rozłącz
generate_new_token=Wygeneruj nowy token
token_name=Nazwa tokena
@ -231,6 +317,7 @@ delete_token=Usuń
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_disable=Wyłącz weryfikację dwuetapową
twofa_disabled=Dwuetapowa autoryzacja została wyłączona.
scan_this_image=Zeskanuj ten obraz za pomocą swojej aplikacji uwierzytelniającej:
or_enter_secret=Lub wprowadź sekret: %s
@ -242,6 +329,7 @@ repos_none=Nie posiadasz żadnych repozytoriów
delete_account=Usuń swoje konto
confirm_delete_account=Potwierdź usunięcie
delete_account_title=Usuń swoje konto
[repo]
owner=Właściciel
@ -251,7 +339,10 @@ fork_repo=Sforkowane
fork_from=Forkuj z
repo_desc=Opis
repo_lang=Język
repo_gitignore_helper=Wybierz szablony pliku .gitignore.
license=Licencja
license_helper=Wybierz plik licencji.
readme=README
create_repo=Utwórz repozytorium
default_branch=Domyślna gałąź
mirror_prune=Wyczyść
@ -273,12 +364,14 @@ migrate.failed=Migracja nie powiodła się: %v
mirror_from=kopia lustrzana
forked_from=sklonowany z
copy_link=Kopiuj
copy_link_success=Link został skopiowany
copied=Skopiowano
unwatch=Przestań obserwować
watch=Obserwuj
unstar=Usuń gwiazdkę
star=Gwiazdka
fork=Forkuj
download_archive=Pobierz repozytorium
no_desc=Brak opisu
quick_guide=Skrócona instrukcja
@ -306,30 +399,45 @@ file_view_raw=Zobacz czysty
file_permalink=Bezpośredni odnośnik
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.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.cancel_lower=Anuluj
editor.commit_changes=Zatwierdź zmiany
editor.add_tmpl=Dodaj '%s/<filename>'
editor.add=Dodaj '%s'
editor.update=Zaktualizuj '%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.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.filename_cannot_be_empty=Nazwa pliku nie może być pusta.
editor.branch_already_exists=Gałąź '%s' już istnieje w tym repozytorium.
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.add_subdir=Dodaj katalog…
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'
commits.commits=Commity
commits.search=Przeszukaj commity…
commits.find=Szukaj
commits.search_all=Wszystkie gałęzie
commits.author=Autor
commits.message=Wiadomość
commits.date=Data
commits.older=Starsze
commits.newer=Nowsze
commits.signed_by=Podpisane przez
commits.gpg_key_id=ID klucza GPG
issues.new=Nowy problem
@ -344,6 +452,8 @@ issues.new.closed_milestone=Zamknięte kamienie milowe
issues.no_ref=Nie określono gałęzi/etykiety
issues.create=Utwórz problem
issues.new_label=Nowa etykieta
issues.new_label_placeholder=Nazwa etykiety
issues.new_label_desc_placeholder=Opis
issues.create_label=Utwórz etykietę
issues.label_templates.title=Załaduj wstępnie przygotowany zestaw etykiet
issues.label_templates.helper=Wybierz zestaw etykiet
@ -362,6 +472,7 @@ issues.delete_branch_at=`usunął gałąź <b>%s</b> %s`
issues.open_tab=Otwarte %d
issues.close_tab=Zamknięte %d
issues.filter_label=Etykieta
issues.filter_label_no_select=Wszystkie etykiety
issues.filter_milestone=Kamień milowy
issues.filter_assignee=Przypisany
issues.filter_type=Typ
@ -412,6 +523,8 @@ issues.label_count=Etykiety %d
issues.label_open_issues=Otwarte problemy %d
issues.label_edit=Edytuj
issues.label_delete=Usuń
issues.label_modify=Edytuj etykietę
issues.label_deletion=Usuń etykietę
issues.label.filter_sort.alphabetically=Alfabetycznie
issues.label.filter_sort.reverse_alphabetically=Alfabetycznie odwrotnie
issues.label.filter_sort.by_size=Rozmiar
@ -421,17 +534,20 @@ issues.attachment.open_tab=`Kliknij, aby zobaczyć „%s” w nowej karcie`
issues.attachment.download=`Kliknij, aby pobrać „%s”`
issues.subscribe=Subskrybuj
issues.unsubscribe=Anuluj subskrypcję
issues.tracker=Śledzenie czasu
issues.start_tracking_short=Rozpocznij
issues.start_tracking_history=`rozpoczął pracę nad %s`
issues.tracking_already_started=`Już śledzisz czas pracy nad tą <a href="%s">sprawą</a>!`
issues.stop_tracking=Zatrzymaj
issues.stop_tracking_history=`zakończył pracę nad %s`
issues.add_time_short=Dodaj czas
issues.add_time_cancel=Anuluj
issues.add_time_history=`dodano spędzony czas %s`
issues.add_time_hours=Godziny
issues.add_time_minutes=Minuty
issues.cancel_tracking=Anuluj
issues.cancel_tracking_history=`anulowanie śledzenie czasu %s`
issues.due_date_form=yyyy-mm-dd
pulls.new=Nowy pull request
pulls.filter_branch=Filtruj branch
@ -472,6 +588,7 @@ milestones.filter_sort.least_issues=Najmniej problemów
wiki=Wiki
wiki.page=Strona
wiki.filter_page=Filtruj stronę
wiki.new_page=Strona
wiki.default_commit_message=Opisz tę zmianę (opcjonalne).
wiki.save_page=Zapisz stronę
wiki.last_commit_info=%s edytuje tę stronę %s
@ -527,6 +644,7 @@ search.results=Wyniki wyszukiwania dla "%s" w <a href="%s">%s</a>
settings=Ustawienia
settings.desc=Ustawienia to miejsce, w którym możesz zmieniać parametry repozytorium
settings.options=Repozytorium
settings.collaboration.write=Zapis
settings.collaboration.read=Odczyt
settings.collaboration.undefined=Niezdefiniowany
@ -534,6 +652,8 @@ settings.hooks=Webhooki
settings.githooks=Hooki Git
settings.basic_settings=Ustawienia podstawowe
settings.mirror_settings=Kopia lustrzana ustawień
settings.sync_mirror=Synchronizuj teraz
settings.site=Strona
settings.update_settings=Aktualizuj ustawienia
settings.advanced_settings=Ustawienia zaawansowane
settings.external_wiki_url=Adres URL zewnętrznego Wiki
@ -547,11 +667,15 @@ settings.transfer=Przeniesienie własności
settings.delete=Usuń to repozytorium
settings.delete_notices_1=- Ta operacja <strong>NIE MOŻE</strong> zostać cofnięta.
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.webhook.test_delivery=Testuj dostawę
settings.webhook.request=Żądanie
settings.webhook.response=Odpowiedź
settings.webhook.headers=Nagłówki
settings.webhook.payload=Zawartość
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_name=Nazwa hooka
@ -584,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.add_protected_branch=Włącz ochronę
settings.delete_protected_branch=Wyłącz ochronę
settings.choose_branch=Wybierz gałąź…
diff.browse_source=Przeglądaj źródła
diff.parent=rodzic
@ -612,6 +737,7 @@ release.title=Tytuł
release.content=Treść
release.write=Napisz
release.preview=Podgląd
release.loading=Ładowanie…
release.cancel=Anuluj
release.publish=Publikuj wersję
release.save_draft=Zapisz szkic
@ -626,6 +752,7 @@ branch.create_from=z '%s'
branch.branch_already_exists=Gałąź '%s' już istnieje w tym repozytorium.
branch.deleted_by=Usunięta przez %s
topic.done=Gotowe
[org]
org_name_holder=Nazwa organizacji
@ -636,12 +763,16 @@ people=Ludzie
teams=Zespoły
lower_members=członkowie
lower_repositories=repozytoria
create_new_team=Nowy zespół
create_team=Utwórz zespół
org_desc=Opis
team_name=Nazwa zespołu
team_desc=Opis
team_permission_desc=Uprawnienie
settings=Ustawienia
settings.options=Organizacja
settings.full_name=Imię i nazwisko
settings.website=Strona
settings.location=Lokalizacja
@ -650,9 +781,12 @@ settings.update_setting_success=Ustawienia organizacji zostały zaktualizowane.
settings.delete=Usuń organizację
settings.delete_account=Usuń tą organizację
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.
members.membership_visibility=Widoczność członkostwa:
members.public=Widoczny
members.private=Ukryty
members.member_role=Rola:
members.owner=Właściciel
members.member=Członek
@ -669,15 +803,19 @@ teams.no_desc=Ten zespół nie ma opisu
teams.settings=Ustawienia
teams.members=Członkowie zespołu
teams.update_settings=Aktualizuj ustawienia
teams.delete_team=Usuń zespół
teams.add_team_member=Dodaj członka zespołu
teams.delete_team_title=Usuń zespół
teams.delete_team_success=Zespół został usunięty.
teams.repositories=Repozytoria zespołu
teams.search_repo_placeholder=Szukaj repozytorium…
teams.add_team_repository=Dodaj repozytorium zespołu
teams.remove_repo=Usuń
teams.add_nonexistent_repo=Repozytorium, które próbujesz dodać, nie istnieje. Proszę je najpierw utworzyć.
[admin]
dashboard=Pulpit
users=Konta użytkownika
organizations=Organizacje
repositories=Repozytoria
config=Konfiguracja
@ -687,13 +825,13 @@ first_page=Pierwsza
last_page=Ostatnia
total=Ogółem: %d
dashboard.statistic=Podsumowanie
dashboard.system_status=Status strony
dashboard.operation_name=Nazwa operacji
dashboard.operation_switch=Przełącz
dashboard.operation_run=Uruchom
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.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_success=Wszystkie brakujące repozytoria Git, dla których istnieją rekordy, zostały zainicjalizowane.
dashboard.sync_external_users=Synchronizuj zewnętrzne dane użytkownika
@ -725,6 +863,7 @@ dashboard.total_gc_pause=Sumaryczny czas wstrzymania przez GC
dashboard.last_gc_pause=Ostatnie wstrzymanie przez GC
dashboard.gc_times=Ilość wywołań GC
users.name=Nazwa użytkownika
users.activated=Aktywowany
users.admin=Administrator
users.repos=Repozytoria
@ -732,11 +871,14 @@ users.created=Utworzony
users.edit=Edytuj
users.auth_source=Źródło uwierzytelniania
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.name=Nazwa
orgs.teams=Zespoły
orgs.members=Członkowie
orgs.new_orga=Nowa organizacja
repos.repo_manage_panel=Zarządzanie repozytoriami
repos.owner=Właściciel
@ -761,6 +903,7 @@ auths.bind_dn=DN powiązania
auths.bind_password=Hasło Bind
auths.user_base=Baza wyszukiwania
auths.user_dn=DN użytkownika
auths.search_page_size=Rozmiar strony
auths.filter=Filtr użytkownika
auths.admin_filter=Filtr administratora
auths.ms_ad_sa=Atrybuty wyszukiwania MS AD
@ -792,6 +935,8 @@ auths.new_success=Uwierzytelnienie '%s' zostało dodane.
auths.delete_auth_title=Usuń źródło uwierzytelniania
config.server_config=Konfiguracja serwera
config.app_name=Tytuł strony
config.app_ver=Wersja Gitea
config.custom_conf=Ścieżka do pliku konfiguracyjnego
config.disable_router_log=Wyłącz dziennik routera
config.run_mode=Tryb uruchamienia
@ -799,11 +944,13 @@ config.git_version=Wersja Git
config.repo_root_path=Ścieżka główna repozytoriów
config.lfs_root_path=Ścieżka główna katalogu LFS
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.reverse_auth_user=Użytkownik odwrotnego proxy
config.ssh_config=Konfiguracja SSH
config.ssh_enabled=Włączone
config.ssh_domain=Domena serwera
config.ssh_port=Port
config.ssh_listen_port=Port nasłuchiwania
config.ssh_root_path=Ścieżka do katalogu głównego
@ -816,13 +963,13 @@ config.db_config=Konfiguracja bazy danych
config.db_type=Typ
config.db_host=Serwer
config.db_name=Nazwa
config.db_ssl_mode_helper=(tylko dla „postgres”)
config.db_ssl_mode=SSL
config.db_path=Ścieżka
config.db_path_helper=(dla „sqlite3” i „tidb”)
config.service_config=Konfiguracja usługi
config.show_registration_button=Pokazuj przycisk rejestracji
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.reset_password_code_lives=Czas wygaśnięcia kodu resetowania hasła

View File

@ -75,7 +75,7 @@ cancel=Cancelar
[install]
install=Instalação
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.
db_title=Configurações de banco de dados
db_type=Tipo de banco de dados
@ -213,7 +213,7 @@ send_reset_mail=Clique aqui para re-enviar seu e-mail de redefinição de senha
reset_password=Redefinir sua senha
invalid_code=Seu código de confirmação é inválido ou expirou.
reset_password_helper=Clique aqui para redefinir sua senha
password_too_short=O comprimento da senha não pode ser menor que %d.
password_too_short=A senha deve ter %d ou mais caracteres.
non_local_account=Usuários não-locais não podem atualizar sua senha através da interface web do Gitea.
verify=Verificar
scratch_code=Código de backup
@ -492,13 +492,13 @@ owner=Proprietário
repo_name=Nome do repositório
repo_name_helper=Um bom nome de repositório é composto por palavras curtas, memorizáveis e únicas.
visibility=Visibilidade
visiblity_helper=Tornar este repositório privado
visiblity_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.)
clone_helper=Precisa de ajuda com o clone? Visite a <a target="_blank" rel="noopener" href="%s">Ajuda</a>.
visibility_helper=Tornar este repositório privado
visibility_helper_forced=O administrador do site força novos repositórios a serem privados.
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 noreferrer" href="%s">Ajuda</a>.
fork_repo=Fork do repositório
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_lang=Linguagem
repo_gitignore_helper=Selecione modelos do .gitignore.
@ -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.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_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.no_changes_to_show=Nenhuma alteração a mostrar.
editor.fail_to_update_file=Houve erro ao criar ou atualizar arquivo '%s': %v
@ -994,7 +994,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.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.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_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.
@ -1011,7 +1011,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_content=Conteúdo do 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.content_type=Tipo de conteúdo POST
settings.secret=Senha
@ -1167,6 +1167,8 @@ branch.protected_deletion_failed=A branch '%s' está protegida. Ela não pode se
topic.manage_topics=Gerenciar Tópicos
topic.done=Feito
topic.count_prompt=Você não pode selecionar mais de 25 tópicos
topic.format_prompt=Tópicos devem começar com uma letra ou um número, podem incluir hífens (-) e não devem ter mais de 35 caracteres
[org]
org_name_holder=Nome da organização
@ -1271,8 +1273,8 @@ dashboard.operation_switch=Trocar
dashboard.operation_run=Executar
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.delete_inactivate_accounts=Excluir todas as contas inativas
dashboard.delete_inactivate_accounts_success=Todas as contas inativas foram excluídas.
dashboard.delete_inactivate_accounts=Excluir todas as contas não ativadas
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_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
@ -1475,9 +1477,7 @@ config.db_host=Servidor
config.db_name=Nome
config.db_user=Nome de usuário
config.db_ssl_mode=SSL
config.db_ssl_mode_helper=(apenas para "postgres")
config.db_path=Caminho
config.db_path_helper=(para "sqlite3" e "tidb")
config.service_config=Configuração do serviço
config.register_email_confirm=Exigir confirmação de e-mail para se cadastrar

File diff suppressed because it is too large Load Diff

View File

@ -79,7 +79,6 @@ has_unconfirmed_mail=Здраво, %s! Имате непотврђену адр
resend_mail=Кликните овде да поново пошаљете писмо
reset_password=Ресет лозинке
reset_password_helper=Кликните овде да ресетујете вашу лозинку
password_too_short=Лозинка неможе бити краћа од %d карактера.
[mail]
activate_account=Молимо вас активирајте ваш налог
@ -507,7 +506,6 @@ total=Укупно: %d
dashboard.operation_name=Име операције
dashboard.operation_switch=Пребаци
dashboard.operation_run=Покрени
dashboard.delete_inactivate_accounts=Уклони све неактивне налоге
dashboard.server_uptime=Време непрекидног рада сервера
dashboard.current_goroutine=Тренутнe Goroutine
dashboard.current_memory_usage=Тренутна употреба меморије
@ -601,9 +599,7 @@ config.db_config=Конфигурација базе података
config.db_type=Тип
config.db_host=Хост
config.db_name=Име
config.db_ssl_mode_helper=(само за postgres)
config.db_path=Пут
config.db_path_helper=(за "sqlite3" и "tidb")
config.service_config=Подешавања сервиса
config.show_registration_button=Прикажи дугме за регистрацију

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