Merge branch 'master' of https://github.com/go-gitea/gitea into feat/approval-new
This commit is contained in:
commit
b4e43d6ce0
15
.drone.yml
15
.drone.yml
|
@ -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
|
||||
|
|
75
CHANGELOG.md
75
CHANGELOG.md
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
176
Gopkg.lock
generated
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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)
|
||||
|
|
7
Makefile
7
Makefile
|
@ -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 \
|
||||
|
|
23
README.md
23
README.md
|
@ -12,13 +12,6 @@
|
|||
[](https://www.codetriage.com/go-gitea/gitea)
|
||||
[](https://opencollective.com/gitea)
|
||||
|
||||
| | | |
|
||||
|:---:|:---:|:---:|
|
||||
||||
|
||||
||||
|
||||
||||
|
||||
||||
|
||||
|
||||
## 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!
|
||||
|
||||
| | | |
|
||||
|:---:|:---:|:---:|
|
||||
||||
|
||||
||||
|
||||
||||
|
||||
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
46
contrib/init/sunos/gitea.xml
Normal file
46
contrib/init/sunos/gitea.xml
Normal 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>
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
###
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
75
docs/content/doc/advanced/api-usage.en-us.md
Normal file
75
docs/content/doc/advanced/api-usage.en-us.md
Normal 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":"..."}]
|
||||
```
|
|
@ -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`)
|
||||
|
||||
|
|
|
@ -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 | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
60
docs/content/doc/usage/backup-and-restore.zh-cn.md
Normal file
60
docs/content/doc/usage/backup-and-restore.zh-cn.md
Normal 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
|
||||
```
|
|
@ -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`
|
||||
|
|
46
docs/content/doc/usage/https-support.md
Normal file
46
docs/content/doc/usage/https-support.md
Normal 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]`.
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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]'
|
|
@ -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
|
||||
|
|
209
models/fixtures/team_unit.yml
Normal file
209
models/fixtures/team_unit.yml
Normal 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
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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),
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
213
models/migrations/v68.go
Normal 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
80
models/migrations/v69.go
Normal 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
1
models/migrations/v70.go
Normal file
|
@ -0,0 +1 @@
|
|||
package migrations
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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")
|
||||
}
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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"))
|
||||
}
|
||||
|
|
|
@ -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 *****
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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":
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 + "/")
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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>`)
|
||||
}
|
||||
|
|
47
modules/recaptcha/recaptcha.go
Normal file
47
modules/recaptcha/recaptcha.go
Normal 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
|
||||
}
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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-_\\./]")
|
||||
)
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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]
|
||||
|
||||
|
|
|
@ -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
|
@ -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
|
||||
|
|
|
@ -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=Sí
|
||||
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
|
||||
|
|
|
@ -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
|
@ -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
|
||||
|
|
|
@ -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
|
@ -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=登録ボタンを表示します。
|
||||
|
|
|
@ -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=등록 버튼을 표시
|
||||
|
|
|
@ -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
|
@ -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]
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
@ -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
Loading…
Reference in New Issue
Block a user