diff --git a/.drone.yml b/.drone.yml index 011d4fefd..6ab40a39d 100644 --- a/.drone.yml +++ b/.drone.yml @@ -75,6 +75,7 @@ pipeline: - make lint - make fmt-check - make swagger-check + - make swagger-validate - make misspell-check - make test-vendor - make build diff --git a/CHANGELOG.md b/CHANGELOG.md index c1c8d4d30..373ce00e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,21 @@ 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.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) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d1b53e792..13f1ce41c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -69,7 +69,7 @@ and keep the compatibility on upgrade. To make sure you are running the test suite exactly like we do, you should install the CLI for [Drone CI](https://github.com/drone/drone), as we are using the server for continous testing, following [these -instructions](http://readme.drone.io/usage/getting-started-cli). After that, +instructions](http://docs.drone.io/cli-installation/). After that, you can simply call `drone exec --local --build-event "pull_request"` within your working directory and it will try to run the test suite locally. @@ -114,7 +114,7 @@ pull request workflow to do that. And, we also use [LGTM](http://lgtm.co) to ensure every PR is reviewed by at least 2 maintainers. Please try to make your pull request easy to review for us. And, please read -the *[How to get faster PR reviews](https://github.com/kubernetes/community/blob/master/contributors/devel/pull-requests.md#best-practices-for-faster-reviews)* guide; +the *[How to get faster PR reviews](https://github.com/kubernetes/community/blob/261cb0fd089b64002c91e8eddceebf032462ccd6/contributors/guide/pull-requests.md#best-practices-for-faster-reviews)* guide; it has lots of useful tips for any project you may want to contribute. Some of the key points: @@ -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 diff --git a/Gopkg.lock b/Gopkg.lock index 8bf9f8465..6551354a0 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -5,7 +5,7 @@ branch = "master" name = "code.gitea.io/git" packages = ["."] - revision = "0077debc17a58c821f4e62e815a54c1ab52da157" + revision = "31f4b8e8c805438ac6d8914b38accb1d8aaf695e" [[projects]] branch = "master" diff --git a/MAINTAINERS b/MAINTAINERS index 0150e8370..5deb40961 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -22,3 +22,4 @@ Peter Žeby (@morlinest) Matti Ranta (@techknowlogick) Michael Lustfield (@MTecknology) Jonas Franz (@JonasFranzDEV) +Flynn Lufmons (@flufmonster) diff --git a/Makefile b/Makefile index 2dea0a9ea..c052ebbb0 100644 --- a/Makefile +++ b/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 \ diff --git a/README.md b/README.md index bd84a888d..cf5c1df9b 100644 --- a/README.md +++ b/README.md @@ -12,13 +12,6 @@ [![Help Contribute to Open Source](https://www.codetriage.com/go-gitea/gitea/badges/users.svg)](https://www.codetriage.com/go-gitea/gitea) [![Become a backer/sponsor of gitea](https://opencollective.com/gitea/tiers/backer/badge.svg?label=backer&color=brightgreen)](https://opencollective.com/gitea) -| | | | -|:---:|:---:|:---:| -|![Dashboard](https://image.ibb.co/dms6DG/1.png)|![Repository](https://image.ibb.co/m6MSLw/2.png)|![Commits History](https://image.ibb.co/cjrSLw/3.png)| -|![Branches](https://image.ibb.co/e6vbDG/4.png)|![Issues](https://image.ibb.co/bJTJSb/5.png)|![Pull Request View](https://image.ibb.co/e02dSb/6.png)| -|![Releases](https://image.ibb.co/cUzgfw/7.png)|![Activity](https://image.ibb.co/eZgGDG/8.png)|![Wiki](https://image.ibb.co/dYV9YG/9.png)| -|![Diff](https://image.ibb.co/ewA9YG/10.png)|![Organization](https://image.ibb.co/ceOwDG/11.png)|![Profile](https://image.ibb.co/c44Q7b/12.png)| - ## Purpose The goal of this project is to make the easiest, fastest, and most @@ -91,8 +84,24 @@ Support this project by becoming a sponsor. Your logo will show up here with a l +## FAQ + +**How do you pronounce Gitea?** + +Gitea is pronounced [/ɡɪ’ti:/](https://youtu.be/EM71-2uDAoY) as in "gi-tea" with a hard g. + ## License This project is licensed under the MIT License. See the [LICENSE](https://github.com/go-gitea/gitea/blob/master/LICENSE) file for the full license text. + +## Screenshots +Looking for an overview of the interface? Check it out! + +| | | | +|:---:|:---:|:---:| +|![Dashboard](https://image.ibb.co/dms6DG/1.png)|![Repository](https://image.ibb.co/m6MSLw/2.png)|![Commits History](https://image.ibb.co/cjrSLw/3.png)| +|![Branches](https://image.ibb.co/e6vbDG/4.png)|![Issues](https://image.ibb.co/bJTJSb/5.png)|![Pull Request View](https://image.ibb.co/e02dSb/6.png)| +|![Releases](https://image.ibb.co/cUzgfw/7.png)|![Activity](https://image.ibb.co/eZgGDG/8.png)|![Wiki](https://image.ibb.co/dYV9YG/9.png)| +|![Diff](https://image.ibb.co/ewA9YG/10.png)|![Organization](https://image.ibb.co/ceOwDG/11.png)|![Profile](https://image.ibb.co/c44Q7b/12.png)| diff --git a/cmd/admin.go b/cmd/admin.go index 6c79141ea..4fb0810c6 100644 --- a/cmd/admin.go +++ b/cmd/admin.go @@ -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 } diff --git a/cmd/serv.go b/cmd/serv.go index 5d567e6d6..990355be9 100644 --- a/cmd/serv.go +++ b/cmd/serv.go @@ -268,7 +268,7 @@ func runServ(c *cli.Context) error { claims := jwt.MapClaims{ "repo": repo.ID, "op": lfsVerb, - "exp": now.Add(5 * time.Minute).Unix(), + "exp": now.Add(setting.LFS.HTTPAuthExpiry).Unix(), "nbf": now.Unix(), } if user != nil { diff --git a/contrib/init/centos/gitea b/contrib/init/centos/gitea index c24fc1f01..4f0d0d99b 100644 --- a/contrib/init/centos/gitea +++ b/contrib/init/centos/gitea @@ -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 diff --git a/contrib/init/debian/gitea b/contrib/init/debian/gitea index 1a371ba4a..b7911f106 100644 --- a/contrib/init/debian/gitea +++ b/contrib/init/debian/gitea @@ -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" } diff --git a/contrib/init/freebsd/gitea b/contrib/init/freebsd/gitea index 898606f35..2c034ce12 100644 --- a/contrib/init/freebsd/gitea +++ b/contrib/init/freebsd/gitea @@ -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 } diff --git a/contrib/init/gentoo/gitea b/contrib/init/gentoo/gitea index d8c150d41..c40fc93f5 100644 --- a/contrib/init/gentoo/gitea +++ b/contrib/init/gentoo/gitea @@ -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 diff --git a/contrib/init/openbsd/gitea b/contrib/init/openbsd/gitea index c43190b55..89d4f6803 100755 --- a/contrib/init/openbsd/gitea +++ b/contrib/init/openbsd/gitea @@ -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 diff --git a/contrib/init/suse/gitea b/contrib/init/suse/gitea index 77fb6689c..23178583f 100644 --- a/contrib/init/suse/gitea +++ b/contrib/init/suse/gitea @@ -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 diff --git a/contrib/systemd/gitea.service b/contrib/systemd/gitea.service index 8c627e7b5..387de14fa 100644 --- a/contrib/systemd/gitea.service +++ b/contrib/systemd/gitea.service @@ -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 ### diff --git a/custom/conf/app.ini.sample b/custom/conf/app.ini.sample index 8392576da..ef88e5c32 100644 --- a/custom/conf/app.ini.sample +++ b/custom/conf/app.ini.sample @@ -189,6 +189,8 @@ LFS_START_SERVER = false LFS_CONTENT_PATH = data/lfs ; LFS authentication secret, change this yourself LFS_JWT_SECRET = +; LFS authentication validity period (in time.Duration), pushes taking longer than this may fail. +LFS_HTTP_AUTH_EXPIRY = 20m ; Define allowed algorithms and their minimum key length (use -1 to disable a type) [ssh.minimum_key_sizes] @@ -412,7 +414,7 @@ ENABLE_FEDERATED_AVATAR = false [attachment] ; Whether attachments are enabled. Defaults to `true` -ENABLE = true +ENABLED = true ; Path for attachments. Defaults to `data/attachments` PATH = data/attachments ; One or more allowed types, e.g. image/jpeg|image/png diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md index 69f588ebe..3f8ebea61 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md +++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md @@ -115,6 +115,7 @@ Values containing `#` or `;` must be quoted using `` ` `` or `"""`. - `LFS_START_SERVER`: **false**: Enables git-lfs support. - `LFS_CONTENT_PATH`: **./data/lfs**: Where to store LFS files. - `LFS_JWT_SECRET`: **\**: LFS authentication secret, change this a unique string. +- `LFS_HTTP_AUTH_EXPIRY`: **20m**: LFS authentication validity period in time.Duration, pushes taking longer than this may fail. - `REDIRECT_OTHER_PORT`: **false**: If true and `PROTOCOL` is https, redirects http requests on another (https) port. - `PORT_TO_REDIRECT`: **80**: Port used when `REDIRECT_OTHER_PORT` is true. diff --git a/docs/content/doc/features/comparison.en-us.md b/docs/content/doc/features/comparison.en-us.md index 75553a89c..981365c71 100644 --- a/docs/content/doc/features/comparison.en-us.md +++ b/docs/content/doc/features/comparison.en-us.md @@ -37,6 +37,7 @@ _Symbols used in table:_ GitLab CE GitLab EE BitBucket + RhodeCode CE @@ -48,6 +49,7 @@ _Symbols used in table:_ ✓ ✘ ✘ + ✓ Issue tracker @@ -57,6 +59,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✘ Pull/Merge requests @@ -66,6 +69,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✓ Squash merging @@ -75,6 +79,7 @@ _Symbols used in table:_ ✘ ✓ ✓ + ✓ Rebase merging @@ -84,6 +89,7 @@ _Symbols used in table:_ ✘ ⁄ ✘ + ✓ Pull/Merge request inline comments @@ -93,6 +99,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✓ Pull/Merge request approval @@ -102,6 +109,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✓ Merge conflict resolution @@ -111,6 +119,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✘ Restrict push and merge access to certain users @@ -120,6 +129,7 @@ _Symbols used in table:_ ⁄ ✓ ✓ + ✓ Markdown support @@ -129,6 +139,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✓ Issues and pull/merge requests templates @@ -138,6 +149,7 @@ _Symbols used in table:_ ✓ ✓ ✘ + ✘ Revert specific commits or a merge request @@ -147,6 +159,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✘ Labels @@ -156,6 +169,7 @@ _Symbols used in table:_ ✓ ✓ ✘ + ✘ Time tracking @@ -165,6 +179,7 @@ _Symbols used in table:_ ✓ ✓ ✘ + ✘ Multiple assignees for issues @@ -174,6 +189,7 @@ _Symbols used in table:_ ✓ ✓ ✘ + ✘ Related issues @@ -183,6 +199,7 @@ _Symbols used in table:_ ✘ ✓ ✘ + ✘ Confidential issues @@ -192,6 +209,7 @@ _Symbols used in table:_ ✓ ✓ ✘ + ✘ Comment reactions @@ -201,6 +219,7 @@ _Symbols used in table:_ ✓ ✓ ✘ + ✘ Lock Discussion @@ -210,6 +229,7 @@ _Symbols used in table:_ ✓ ✓ ✘ + ✘ Batch issue handling @@ -219,6 +239,7 @@ _Symbols used in table:_ ✓ ✓ ✘ + ✘ Issue Boards @@ -228,6 +249,7 @@ _Symbols used in table:_ ✓ ✓ ✘ + ✘ Create new branches from issues @@ -237,6 +259,7 @@ _Symbols used in table:_ ✓ ✓ ✘ + ✘ Commit graph @@ -246,6 +269,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✓ Web code editor @@ -255,6 +279,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✓ Branch manager @@ -264,6 +289,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✓ Create new branches @@ -273,6 +299,7 @@ _Symbols used in table:_ ✓ ✓ ✘ + ✘ Repository topics @@ -282,6 +309,7 @@ _Symbols used in table:_ ✓ ✓ ✘ + ✘ Repository code search @@ -291,6 +319,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✓ Global code search @@ -300,6 +329,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✓ Issue search @@ -309,6 +339,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✘ Global issue search @@ -318,6 +349,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✘ Git LFS 2.0 @@ -327,6 +359,7 @@ _Symbols used in table:_ ✓ ✓ ⁄ + ✓ Integrated Git-powered wiki @@ -336,6 +369,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✘ Static Git-powered pages @@ -345,6 +379,7 @@ _Symbols used in table:_ ✓ ✓ ✘ + ✘ Group Milestones @@ -354,6 +389,7 @@ _Symbols used in table:_ ✓ ✓ ✘ + ✘ Granular user roles (Code, Issues, Wiki etc) @@ -363,6 +399,7 @@ _Symbols used in table:_ ✓ ✓ ✘ + ✘ Cherry-picking changes @@ -372,6 +409,7 @@ _Symbols used in table:_ ✓ ✓ ✘ + ✘ GPG Signed Commits @@ -381,6 +419,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✓ Reject unsigned commits @@ -390,6 +429,7 @@ _Symbols used in table:_ ✓ ✓ ✘ + ✓ Verified Committer @@ -399,6 +439,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✘ Subgroups: groups within groups @@ -408,6 +449,7 @@ _Symbols used in table:_ ✓ ✓ ✘ + ✓ Custom Git Hooks @@ -417,6 +459,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✓ Repository Activity page @@ -426,6 +469,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✓ Deploy Tokens @@ -435,6 +479,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✓ Repository Tokens with write rights @@ -444,6 +489,7 @@ _Symbols used in table:_ ✓ ✓ ✘ + ✓ Easy upgrade process @@ -453,6 +499,7 @@ _Symbols used in table:_ ✓ ✓ ✘ + ✓ Built-in Container Registry @@ -462,6 +509,7 @@ _Symbols used in table:_ ✓ ✓ ✘ + ✘ External git mirroring @@ -471,6 +519,7 @@ _Symbols used in table:_ ✘ ✓ ✓ + ✓ AD / LDAP integration @@ -480,6 +529,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✓ Multiple LDAP / AD server support @@ -489,6 +539,7 @@ _Symbols used in table:_ ✘ ✓ ✓ + ✓ LDAP user synchronization @@ -498,6 +549,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✓ OpenId Connect support @@ -507,6 +559,7 @@ _Symbols used in table:_ ✓ ✓ ? + ✘ OAuth 2.0 integration (external authorization) @@ -516,6 +569,7 @@ _Symbols used in table:_ ✓ ✓ ? + ✓ Act as OAuth 2.0 provider @@ -525,6 +579,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✘ Two factor authentication (2FA) @@ -534,6 +589,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✘ FIDO U2F (2FA) @@ -543,6 +599,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✘ Webhook support @@ -552,6 +609,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✓ Mattermost/Slack integration @@ -561,6 +619,7 @@ _Symbols used in table:_ ✓ ✓ ⁄ + ✓ Discord integration @@ -570,6 +629,7 @@ _Symbols used in table:_ ✘ ✘ ✘ + ✘ Built-in CI/CD @@ -579,6 +639,7 @@ _Symbols used in table:_ ✓ ✓ ✘ + ✘ External CI/CD status display @@ -588,6 +649,7 @@ _Symbols used in table:_ ✓ ✓ ✓ + ✓ Multiple database support @@ -597,6 +659,7 @@ _Symbols used in table:_ ⁄ ⁄ ✓ + ✓ Multiple OS support @@ -606,6 +669,7 @@ _Symbols used in table:_ ✘ ✘ ✘ + ✓ Low resource usage (RAM/CPU) @@ -615,6 +679,7 @@ _Symbols used in table:_ ✘ ✘ ✘ + ✘ diff --git a/docs/content/doc/installation/from-binary.en-us.md b/docs/content/doc/installation/from-binary.en-us.md index 91f81f73f..9c8859215 100644 --- a/docs/content/doc/installation/from-binary.en-us.md +++ b/docs/content/doc/installation/from-binary.en-us.md @@ -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 diff --git a/docs/content/doc/installation/from-package.en-us.md b/docs/content/doc/installation/from-package.en-us.md index 9fdf30d79..59661c1c4 100644 --- a/docs/content/doc/installation/from-package.en-us.md +++ b/docs/content/doc/installation/from-package.en-us.md @@ -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 diff --git a/docs/content/doc/installation/with-docker.en-us.md b/docs/content/doc/installation/with-docker.en-us.md index 8f393f16d..c672393cc 100644 --- a/docs/content/doc/installation/with-docker.en-us.md +++ b/docs/content/doc/installation/with-docker.en-us.md @@ -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. diff --git a/docs/content/doc/usage/backup-and-restore.en-us.md b/docs/content/doc/usage/backup-and-restore.en-us.md index aa1e4805d..a0816ebe4 100644 --- a/docs/content/doc/usage/backup-and-restore.en-us.md +++ b/docs/content/doc/usage/backup-and-restore.en-us.md @@ -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 , 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. diff --git a/docs/content/doc/usage/backup-and-restore.zh-cn.md b/docs/content/doc/usage/backup-and-restore.zh-cn.md new file mode 100644 index 000000000..8797d5772 --- /dev/null +++ b/docs/content/doc/usage/backup-and-restore.zh-cn.md @@ -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 %s%s resend_mail=Klikkaa tästä uudelleenlähettääksesi aktivointi sähköpostisi reset_password=Nollaa salasanasi reset_password_helper=Klikkaa tästä nollataksesi salasanasi -password_too_short=Salasanan pituus ei voi olla vähemmän kuin %d merkkiä. verify=Vahvista [mail] @@ -585,9 +584,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 diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index c22916dff..50e90b96f 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -97,7 +97,6 @@ email_not_associate=L'adresse e-mail n'est associée à aucun compte. send_reset_mail=Cliquez ici pour renvoyer le mail de réinitialisation de votre mot de passe reset_password=Réinitialiser le mot de passe reset_password_helper=Cliquez ici pour réinitialiser votre mot de passe -password_too_short=Le mot de passe doit contenir %d caractères minimum. verify=Vérifier scratch_code=Code de secours use_scratch_code=Utiliser un code de secours @@ -818,9 +817,7 @@ config.db_config=Configuration de la base de données config.db_type=Type config.db_host=Hôte config.db_name=Nom -config.db_ssl_mode_helper=("postgres" uniquement) config.db_path=Emplacement -config.db_path_helper=(pour « sqlite3 » et « TIDB ») config.service_config=Configuration du service config.show_registration_button=Afficher le bouton d'enregistrement diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini index 450ae826c..7693a4312 100644 --- a/options/locale/locale_hu-HU.ini +++ b/options/locale/locale_hu-HU.ini @@ -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 @@ -835,9 +834,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 diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini index fb2b261e3..56f14d771 100644 --- a/options/locale/locale_id-ID.ini +++ b/options/locale/locale_id-ID.ini @@ -97,7 +97,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 @@ -807,9 +806,7 @@ config.ssh_minimum_key_sizes=Ukuran kunci minimum config.db_config=Konfigurasi basis data 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 diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index af9acccaa..e3b752851 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -97,7 +97,6 @@ email_not_associate=L'indirizzo email non è associato ad alcuna conta. send_reset_mail=Clicca qui per inviare nuovamente la tua email di reimpostazione della password reset_password=Reimposta la tua Password reset_password_helper=Clicca qui per reimpostare la password -password_too_short=La lunghezza della password non può essere meno %d caratteri. verify=Verifica scratch_code=Codice Gratta e Vinci use_scratch_code=Utilizza un codice di zero @@ -638,9 +637,7 @@ config.ssh_minimum_key_sizes=Dimensioni minime della chiave config.db_config=Configurazione Database config.db_type=Tipo config.db_name=Nome -config.db_ssl_mode_helper=(solo per "postgres") config.db_path=Percorso -config.db_path_helper=(per "sqlite3" e "tidb") config.service_config=Configurazione Servizio config.show_registration_button=Mostra Pulsane Registrazione diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index 557110b1f..ea32ad3c3 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -101,7 +101,6 @@ email_not_associate=このEメールアドレスは、どのアカウントに send_reset_mail=パスワードリセットメールを再送するにはここをクリックしてください reset_password=パスワードリセット reset_password_helper=パスワードをリセットするにはここをクリック -password_too_short=%d文字未満のパスワードは設定できません。 verify=確認 scratch_code=スクラッチコード use_scratch_code=スクラッチコードを使う @@ -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=登録ボタンを表示します。 diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini index eb17fab5d..6497467f4 100644 --- a/options/locale/locale_ko-KR.ini +++ b/options/locale/locale_ko-KR.ini @@ -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=스크래치 코드 사용 @@ -687,9 +686,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=등록 버튼을 표시 diff --git a/options/locale/locale_lt-LT.ini b/options/locale/locale_lt-LT.ini index 8a9f067ab..e12afe377 100644 --- a/options/locale/locale_lt-LT.ini +++ b/options/locale/locale_lt-LT.ini @@ -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] diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index d2f34e08b..c2274b99a 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -101,7 +101,6 @@ email_not_associate=Šī e-pasta adrese nav saistīta ar nevienu kontu. send_reset_mail=Spiediet šeit, lai nosūtītu paroles maiņas vēstuli uz Jūsu e-pastu reset_password=Atjaunot savu paroli reset_password_helper=Nospiediet šeit, lai atjaunotu paroli -password_too_short=Paroles garums nedrīkst būt mazāks par %d. verify=Pārbaudīt scratch_code=Vienreizējais kods use_scratch_code=Izmantot vienreizējo kodu @@ -833,9 +832,7 @@ config.db_config=Datu bāzes konfigurācija config.db_type=Veids config.db_host=Resursdators config.db_name=Nosaukums -config.db_ssl_mode_helper=(tikai PostgreSQL datu bāzei) config.db_path=Ceļš -config.db_path_helper=(priekš "sqlite3" and "tidb") config.service_config=Pakalpojuma konfigurācija config.show_registration_button=Rādīt reģistrēšanās pogu diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index 6815ce6c3..64db50357 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -101,7 +101,6 @@ 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 @@ -784,9 +783,7 @@ 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_path=Pad -config.db_path_helper=(voor "sqlite3" en "tidb") config.service_config=Serviceconfiguratie config.show_registration_button=Registeren knop weergeven diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index 7ed8b4715..3dcb05082 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -97,7 +97,6 @@ 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 @@ -816,9 +815,7 @@ 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_path=Ścieżka -config.db_path_helper=(dla „sqlite3” i „tidb”) config.service_config=Konfiguracja usługi config.show_registration_button=Pokazuj przycisk rejestracji diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 62429100f..0df553778 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -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 @@ -1475,9 +1475,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 diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index bb6de1052..008895181 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -102,11 +102,13 @@ lfs_path_helper=В этой папке будут храниться файлы run_user=Запуск от имени пользователя run_user_helper=Введите имя пользователя операционной системы, под которым работает Gitea. Обратите внимание, что этот пользователь должен иметь доступ к корневому пути репозиториев. domain=Домен SSH сервера +domain_helper=Влияет на URL-адреса для клонирования по SSH. ssh_port=Порт SSH сервера ssh_port_helper=Номер порта, который использует SSH сервер. Оставьте пустым, чтобы отключить SSH. http_port=Gitea HTTP порт http_port_helper=Номер порта, который будет прослушиваться Gitea веб-сервером. app_url=Базовый URL-адрес Gitea +app_url_helper=Этот параметр влияет на URL для клонирования по HTTP/HTTPS и на некоторые уведомления по электронной почте. log_root_path=Путь к журналу log_root_path_helper=Файлы журнала будут записываться в этот каталог. @@ -124,6 +126,7 @@ offline_mode=Включить локальный режим offline_mode_popup=Отключить сторонние сети доставки контента и отдавать все ресурсы из их локальных копий. disable_gravatar=Отключить Gravatar disable_gravatar_popup=Отключить Gravatar и сторонние источники аватаров. Если пользователь не загрузит аватар локально, то по умолчанию будет использоваться стандартный аватар. +federated_avatar_lookup=Включить федеративные аватары federated_avatar_lookup_popup=Включите поиск федеративного аватара для использования службы с открытым исходным кодом на основе libravatar. disable_registration=Отключить самостоятельную регистрацию disable_registration_popup=Запретить самостоятельную регистрацию. Только администраторы смогут создавать новые учетные записи пользователей. @@ -136,6 +139,7 @@ enable_captcha=Включить CAPTCHA enable_captcha_popup=Запрашивать капчу при регистрации пользователя. require_sign_in_view=Требовать авторизации для просмотра страниц require_sign_in_view_popup=Ограничение доступа к страницам только для пользователей, выполнивших вход. Посетители увидят только страницы входа и регистрации. +admin_setting_desc=Создание учетной записи администратора необязательно. Первый зарегистрированный пользователь автоматически становится администратором. admin_title=Настройки учётной записи администратора admin_name=Логин администратора admin_password=Пароль @@ -146,6 +150,7 @@ test_git_failed=Не удалось проверить 'git' команду: %v sqlite3_not_available=Эта версия Gitea не поддерживает SQLite3. Пожалуйста, загрузите официальную бинарную версию из %s (не 'go build' версия). invalid_db_setting=Недопустимые параметры настройки базы данных: %v invalid_repo_path=Недопустимый путь к корню репозитория: %v +run_user_not_match=Текущий пользователь не является пользователем для запуска: %s -> %s save_config_failed=Не удалось сохранить конфигурацию: %v invalid_admin_setting=Указан недопустимый параметр учетной записи администратора: %v install_success=Добро пожаловать! Благодарим вас за выбор Gitea, пользуйтесь с удовольствием! @@ -157,11 +162,13 @@ default_allow_create_organization_popup=Разрешить новым учетн default_enable_timetracking=Включение отслеживания времени по умолчанию default_enable_timetracking_popup=Включить отслеживание времени для новых репозиториев по умолчанию. no_reply_address=Скрытый почтовый домен +no_reply_address_helper=Доменное имя для пользователей со скрытым адресом электронной почты. Например, имя пользователя 'joe' будет зарегистрировано в Git как 'joe@noreply.example.org' если скрытый домен электронной почты установлен как 'noreply.example.org'. [home] uname_holder=Имя пользователя / Email password_holder=Пароль switch_dashboard_context=Переключить контекст панели управления +my_repos=Репозитории show_more_repos=Показать больше репозиториев… collaborative_repos=Совместные репозитории my_orgs=Мои организации @@ -186,6 +193,7 @@ code_search_results=Результаты поиска для '%s' [auth] create_new_account=Регистрация аккаунта register_helper_msg=Уже есть аккаунт? Авторизуйтесь! +social_register_helper_msg=Уже есть аккаунт? Свяжите его сейчас! disable_register_prompt=Извините, возможность регистрации отключена. Пожалуйста, свяжитесь с администратором сайта. disable_register_mail=Подтверждение регистрации по электронной почте отключено. remember_me=Запомнить меня @@ -205,7 +213,7 @@ send_reset_mail=Нажмите сюда, чтобы отправить пись reset_password=Сброс пароля invalid_code=Этот код подтверждения недействителен или истек. reset_password_helper=Нажмите здесь, чтобы сбросить свой пароль -password_too_short=Длина пароля не менее %d символов. +password_too_short=Длина пароля не может быть меньше, чем %d символов. non_local_account=Нелокальные аккаунты не могут изменить пароль через Gitea. verify=Проверить scratch_code=Одноразовый пароль @@ -217,7 +225,9 @@ login_userpass=Вход login_openid=OpenID openid_connect_submit=Подключить openid_connect_title=Подключение к существующей учетной записи +openid_connect_desc=Выбранный OpenID URI неизвестен. Свяжите с новой учетной записью здесь. openid_register_title=Создать новый аккаунт +openid_register_desc=Выбранный OpenID URI неизвестен. Свяжите с новой учетной записью здесь. openid_signin_desc=Введите свой OpenID URI. Например: https://anne.me, bob.openid.org.cn или gnusocial.net/carry. disable_forgot_password_mail=К сожалению сброс пароля отключен. Пожалуйста, свяжитесь с администратором сайта. @@ -254,6 +264,8 @@ TreeName=Путь к файлу Content=Содержимое require_error=` не может быть пустым.` +alpha_dash_error=` должен содержать только буквенно-цифровые символы, тире (' - ') и подчеркивания ('_').` +alpha_dash_dot_error=` должен содержать только буквенно-цифровые символы, тире ('-'), подчеркивания ('_') и точки ('.').` git_ref_name_error=` должно быть правильным ссылочным именем Git.` size_error=` должен быть размер %s.` min_size_error=«должен содержать по крайней мере %s символов.» @@ -277,31 +289,43 @@ enterred_invalid_repo_name=Введенное вами имя репозитор enterred_invalid_owner_name=Имя нового владельца недоступно. enterred_invalid_password=Введенный пароль неверный. user_not_exist=Пользователь не существует. +last_org_owner=Вы не можете удалить последнего пользователя из команды 'владельцы'. В любой команде должен быть хотя бы один владелец. cannot_add_org_to_team=Организацию нельзя добавить в качестве члена команды. +invalid_ssh_key=Не удается проверить SSH ключ: %s +invalid_gpg_key=Не удается проверить GPG ключ: %s +unable_verify_ssh_key=Не удается проверить ключ SSH; дважды проверьте его на наличие ошибок. auth_failed=Ошибка аутентификации: %v +still_own_repo=Ваша учетная запись владеет одним или несколькими репозиториями; удалите или перенесите их в первую очередь. +still_has_org=Ваша учетная запись является членом одной или нескольких организаций; выйдите из них в первую очередь. +org_still_own_repo=Эта организация по-прежнему владеет одним или несколькими репозиториями; сначала удалите или перенесите их. target_branch_not_exist=Целевая ветка не существует [user] +change_avatar=Измените свой авататар… join_on=Присоединился repositories=Репозитории activity=Активность followers=Подписчики +starred=Избранные репозитории following=Подписан follow=Подписаться unfollow=Отписаться form.name_reserved=Имя пользователя '%s' зарезервировано. +form.name_pattern_not_allowed=Шаблон '%s' не допускается в имени пользователя. [settings] profile=Профиль +account=Аккаунт password=Пароль security=Безопасность avatar=Аватар ssh_gpg_keys=SSH / GPG ключи social=Учетные записи в соцсетях +applications=Приложения orgs=Управление организациями repos=Репозитории delete=Удалить аккаунт @@ -309,6 +333,7 @@ twofa=Двухфакторная аутентификация account_link=Привязанные аккаунты organization=Организации uid=UID +u2f=Ключи безопасности public_profile=Открытый профиль profile_desc=Ваш адрес электронной почты будет использован для уведомлений и других операций. @@ -319,10 +344,12 @@ location=Местоположение update_profile=Обновить профиль update_profile_success=Ваш профиль успешно обновлен. change_username=Ваше имя пользователя было изменено. +change_username_prompt=Примечание: изменения имени пользователя также изменяют URL-адрес учетной записи. continue=Далее cancel=Отмена language=Язык +lookup_avatar_by_mail=Найти аватар по адресу эл. почты federated_avatar_lookup=Найти внешний аватар enable_custom_avatar=Включить собственный аватар choose_new_avatar=Выбрать новый аватар @@ -350,19 +377,32 @@ email_deletion=Удалить адрес электронной почты email_deletion_desc=Адрес электронной почты и вся связанная с ним информация будет удалена из вашего аккаунта. Коммиты, сделанные от имени этого адреса электронной почты, не будут изменены. Продолжить? email_deletion_success=Ваш Email адрес был удален. openid_deletion=Удалить OpenID URI +openid_deletion_desc=После удаления адреса OpenID вы не сможете войти в вашу учётную запись с его помощью. Вы уверены? +openid_deletion_success=OpenID был удален. add_new_email=Добавить новый адрес электронной почты +add_new_openid=Добавить новый OpenID URI add_email=Добавить новый адрес электронной почты add_openid=Добавить адрес OpenID add_email_confirmation_sent=Письмо для подтверждения было отправлено на '%s'. Пожалуйста, проверьте ваш почтовый ящик в течение %s, чтобы завершить процесс подтверждения. +add_email_success=Добавлен новый адрес электронной почты. +add_openid_success=Добавлен новый адрес OpenID. +keep_email_private=Скрыть адрес электронной почты +keep_email_private_popup=Ваш адрес электронной почты будет скрыт от других пользователей. +openid_desc=OpenID позволяет делегировать проверку подлинности внешнему поставщику. manage_ssh_keys=Управление SSH ключами manage_gpg_keys=Управление GPG ключами add_key=Добавить ключ +ssh_desc=Эти открытые SSH ключи связаны с вашей учетной записью. Соответствующие закрытые ключи обеспечивают полный доступ к вашим хранилищам. +gpg_desc=Эти открытые GPG ключи связаны с вашей учетной записью. Храните закрытые ключи в безопасности, так как они позволяют проверять подлинности коммитов. ssh_helper=Нужна помощь? Ознакомьтесь с руководством GitHub по созданию SSH ключей или решению возникающих проблем при использовании SSH. gpg_helper=Нужна помощь? Взгляните на руководство GitHub по GPG. add_new_key=Добавить SSH ключ add_new_gpg_key=Добавить GPG ключ +ssh_key_been_used=Этот SSH ключ уже добавлен в вашу учетную запись. +ssh_key_name_used=SSH ключ с таким именем уже добавлен в вашу учетную запись. gpg_key_id_used=Публичный GPG ключ с таким же идентификатором уже существует. +gpg_no_key_email_found=Этот ключ GPG не может использоваться с любым адресом электронной почты, привязанной к вашей учетной записи. subkeys=Подключи key_id=ИД ключа key_name=Имя ключа @@ -370,6 +410,10 @@ key_content=Содержимое add_key_success=SSH ключ '%s' добавлен. add_gpg_key_success=GPG ключ '%s' добавлен. delete_key=Удалить +ssh_key_deletion=Удалить SSH ключ +gpg_key_deletion=Удалить GPG ключ +ssh_key_deletion_desc=Удаление SSH ключа аннулирует его доступ к вашей учетной записи. Продолжить? +gpg_key_deletion_desc=Удаление GPG ключа отменяет проверку подписанных им коммитов. Продолжить? ssh_key_deletion_success=SSH ключ был удален. gpg_key_deletion_success=GPG ключ был удален. add_on=Добавлено @@ -386,10 +430,14 @@ hide_openid=Скрыть из профиля ssh_disabled=SSH отключён manage_social=Управление привязанными учетными записями в соцсетях +social_desc=Эти социальные сети связаны с вашим аккаунтом Gitea. Их можно использовать для входа в учетную запись Gitea, поэтому необходимо быть уверенным в том, что никаких посторонних аккаунтов не подключено. unbind=Удалить связь unbind_success=Связанная внешняя учётная запись была удалена. +manage_access_token=Управление токенами generate_new_token=Создать новый токен +tokens_desc=Эти токены предоставляют доступ к вашей учетной записи с помощью Gitea API. +new_token_desc=Приложения, использующие токен, имеют полный доступ к вашей учетной записи. token_name=Имя токена generate_token=Генерировать токен generate_token_success=Новый токен создан. Скопируйте и сохраните его сейчас, так как он не будет показан снова. @@ -413,29 +461,41 @@ scan_this_image=Сканируйте это изображение вашим п or_enter_secret=Или введите кодовое слово: %s then_enter_passcode=И введите пароль, показанный в приложении: passcode_invalid=Неверный пароль. попробуйте снова. +twofa_enrolled=Для вашего аккаунта была включена двухфакторная аутентификация. Сохраните ваш scratch-токен (%s), он не сохраняется на сервере! +u2f_desc=Ключами безопасности являются аппаратные устройства, содержащие криптографические ключи. Они могут использоваться для двухфакторной аутентификации. Ключ безопасности должен поддерживать стандарт FIDO U2F. +u2f_require_twofa=Для использования ключей безопасности необходимо включить двухфакторную аутентификацию. u2f_register_key=Добавить ключ безопасности u2f_nickname=Имя пользователя u2f_press_button=Нажмите кнопку на ключе безопасности, чтобы зарегистрировать его. u2f_delete_key=Удалить ключ безопасности u2f_delete_key_desc=Если вы удалите ключ безопасности, вы не сможете использовать его для входа. Вы уверены? +manage_account_links=Управление привязанными аккаунтами manage_account_links_desc=Эти внешние аккаунты привязаны к вашему аккаунту Gitea. account_links_not_available=В настоящее время нет внешних аккаунтов, привязанных к вашему аккаунту Gitea. +remove_account_link=Удалить привязанный аккаунт +remove_account_link_desc=Удаление привязанной учетной записи отменит её доступ к вашей учетной записи Gitea. Продолжить? +remove_account_link_success=Привязанная учетная запись удалена. orgs_none=Вы не состоите ни в одной организации. repos_none=Вы не владеете репозиториями delete_account=Удалить свой аккаунт +delete_prompt=Эта операция навсегда удалит вашу учетную запись. Это НЕВОЗМОЖНО будет отменить. confirm_delete_account=Подтвердите удаление +delete_account_title=Удалить аккаунт +delete_account_desc=Вы уверены, что хотите навсегда удалить этот аккаунт? [repo] owner=Владелец repo_name=Имя репозитория -repo_name_helper=Лучшие названия репозиториев состоят их коротких, легко запоминаемых и уникальных ключевых слов. +repo_name_helper=Лучшие названия репозиториев состоят из коротких, легко запоминаемых и уникальных ключевых слов. visibility=Видимость visiblity_helper=Сделать репозиторий приватным +visiblity_helper_forced=Администратор сайта настроил параметр видимости новых репозиториев. Репозиторий приватный по умолчанию. visiblity_fork_helper=(Изменение этого повлияет на все форки.) +clone_helper=Нужна помощь в клонировании? Посетите страницу справки. fork_repo=Форкнуть репозиторий fork_from=Форк от fork_visiblity_helper=Видимость форкнутого репозитория изменить нельзя. @@ -450,8 +510,11 @@ auto_init=Инициализировать репозиторий (Добавл create_repo=Создать репозиторий default_branch=Ветка по умолчанию mirror_prune=Очистить +mirror_prune_desc=Удаление устаревших отслеживаемых ссылок mirror_interval=Интервал зеркалирования (допустимы единицы времени 'h', 'm', 's') mirror_interval_invalid=Недопустимый интервал зеркалирования. +mirror_address=Клонировать по URL +mirror_address_desc=Укажите необходимые учетные данные в адресе. mirror_last_synced=Последняя синхронизация watchers=Наблюдатели stargazers=Звездочеты @@ -461,10 +524,14 @@ reactions_more=и ещё %d form.reach_limit_of_creation=Вы уже достигли ваш предел %d репозиториев. form.name_reserved=Имя репозитория '%s' зарезервировано. +form.name_pattern_not_allowed=Шаблон имени репозитория '%s' не допускается. +need_auth=Требуется авторизация migrate_type=Тип миграции migrate_type_helper=Этот репозиторий будет зеркалом migrate_repo=Перенос репозитория +migrate.clone_address=Перенос / Клонирование по URL +migrate.clone_address_desc=Это может быть HTTP/HTTPS/GIT адрес или локальный путь существующего репозитория на сервере. migrate.clone_local_path=или путь к локальному серверу migrate.permission_denied=У вас нет прав на импорт локальных репозиториев. migrate.invalid_local_path=Недопустимый локальный путь. Возможно он не существует или не является папкой. @@ -510,8 +577,10 @@ file_raw=Исходник file_history=История file_view_raw=Посмотреть исходник file_permalink=Постоянная ссылка +file_too_large=Этот файл слишком большой, поэтому он не может быть отображён. video_not_supported_in_browser=Ваш браузер не поддерживает HTML5 'video' тэг. stored_lfs=Хранится Git LFS +commit_graph=Граф коммитов editor.new_file=Новый файл editor.upload_file=Загрузить файл @@ -519,9 +588,13 @@ editor.edit_file=Редактировать файл editor.preview_changes=Просмотр изменений editor.cannot_edit_non_text_files=Двоичные файлы нельзя редактировать в веб-интерфейсе. editor.edit_this_file=Редактировать файл +editor.must_be_on_a_branch=Чтобы внести или предложить изменения этого файла, необходимо выбрать ветку. +editor.fork_before_edit=Необходимо сделать форк этого репозитория, чтобы внести или предложить изменения этого файла. editor.delete_this_file=Удалить файл +editor.must_have_write_access=Вам необходимо иметь права на запись, чтобы вносить или предлагать изменения этого файла. editor.file_delete_success=Файл '%s' удалён. editor.name_your_file=Назовите свой файл… +editor.filename_help=Чтобы добавить каталог, просто наберите название и нажмите /. Чтобы удалить каталог, перейдите к началу поля и нажмите клавишу backspace. editor.or=или editor.cancel_lower=Отменить editor.commit_changes=Сохранить правки @@ -536,12 +609,22 @@ editor.new_branch_name_desc=Новое название ветки… editor.cancel=Отмена editor.filename_cannot_be_empty=Имя файла не может быть пустым. editor.branch_already_exists=Ветка «%s» уже существует в этом репозитории. +editor.directory_is_a_file=Имя каталога '%s' уже используется в качестве имени файла в этом репозитории. +editor.file_is_a_symlink='%s' является символической ссылкой. Символические ссылки нельзя редактировать в веб-редакторе +editor.filename_is_a_directory=Имя файла '%s' уже используется в качестве имени каталога в этом репозитории. +editor.file_editing_no_longer_exists=Редактируемый файл '%s' больше не существует в этом репозитории. +editor.file_changed_while_editing=Содержимое файла изменилось с момента начала редактирования. Нажмите здесь, чтобы увидеть, что было изменено, или Зафиксировать изменения снова, чтобы заменить их. +editor.file_already_exists=Файл с именем '%s' уже существует в репозитории. editor.no_changes_to_show=Нет изменений. editor.fail_to_update_file=Не удалось обновить/создать файл «%s» из-за ошибки: %v +editor.add_subdir=Добавить каталог… editor.unable_to_upload_files=Не удалось загрузить файлы в «%s» из-за ошибки: %v editor.upload_files_to_dir=Загрузить файлы '%s' +editor.cannot_commit_to_protected_branch=Нельзя коммитить в защищённую ветку '%s'. +commits.desc=Просмотр истории изменений исходного кода. commits.commits=Коммиты +commits.search=Поиск коммитов… commits.find=Поиск commits.search_all=Все ветки commits.author=Автор @@ -550,8 +633,12 @@ commits.date=Дата commits.older=Раньше commits.newer=Новее commits.signed_by=Подписано +commits.gpg_key_id=Идентификатор GPG ключа +ext_issues=Внешние задачи +ext_issues.desc=Ссылка на внешнюю систему отслеживания ошибок. +issues.desc=Организация отчетов об ошибках, задач и этапов. issues.new=Новая задача issues.new.labels=Метки issues.new.no_label=Нет меток @@ -561,12 +648,19 @@ issues.new.no_milestone=Нет этапа issues.new.clear_milestone=Очистить этап issues.new.open_milestone=Открыть этап issues.new.closed_milestone=Завершенные этапы +issues.new.assignees=Назначенные +issues.new.clear_assignees=Убрать ответственных +issues.new.no_assignees=Никто не назначен issues.no_ref=Не указана ветка или тэг issues.create=Добавить задачу issues.new_label=Новая метка +issues.new_label_placeholder=Имя метки +issues.new_label_desc_placeholder=Описание issues.create_label=Добавить метку issues.label_templates.title=Загрузить набор предопределённых меток +issues.label_templates.info=Меток пока не существует. Создайте метку или используйте набор меток: issues.label_templates.helper=Выберите метку +issues.label_templates.use=Использовать набор меток issues.label_templates.fail_to_load_file=Не удалось загрузить файл шаблона метки «%s»: %v issues.add_label_at=добавил(а) метку
%s
%s issues.remove_label_at=убрал(а) метку
%s
%s @@ -586,6 +680,7 @@ issues.filter_label_no_select=Все метки issues.filter_milestone=Этап issues.filter_milestone_no_select=Все этапы issues.filter_assignee=Назначено +issues.filter_assginee_no_select=Все назначения issues.filter_type=Тип issues.filter_type.all_issues=Все задачи issues.filter_type.assigned_to_you=Назначено вам @@ -596,8 +691,12 @@ issues.filter_sort.latest=Новейшие issues.filter_sort.oldest=Старейшие issues.filter_sort.recentupdate=Недавно обновленные issues.filter_sort.leastupdate=Давно обновленные -issues.filter_sort.mostcomment=Большего комментариев +issues.filter_sort.mostcomment=Больше комментариев issues.filter_sort.leastcomment=Меньше комментариев +issues.filter_sort.moststars=Больше звезд +issues.filter_sort.feweststars=Меньше звезд +issues.filter_sort.mostforks=Больше форков +issues.filter_sort.fewestforks=Меньше форков issues.action_open=Открыть issues.action_close=Закрыть issues.action_label=Метка @@ -616,7 +715,9 @@ issues.commented_at=`прокомментировал %s` issues.delete_comment_confirm=Вы уверены, что хотите удалить этот комментарий? issues.no_content=Пока нет содержимого. issues.close_issue=Закрыть +issues.close_comment_issue=Прокомментировать и закрыть issues.reopen_issue=Открыть снова +issues.reopen_comment_issue=Прокомментировать и открыть снова issues.create_comment=Комментировать issues.closed_at=`закрыл %[2]s` issues.reopened_at=`открыл снова %[2]s` @@ -637,6 +738,8 @@ issues.label_edit=Редактировать issues.label_delete=Удалить issues.label_modify=Изменить метку issues.label_deletion=Удалить метку +issues.label_deletion_desc=Удаление метки удаляет ее из всех обсуждений. Продолжить? +issues.label_deletion_success=Метка была удалена. issues.label.filter_sort.alphabetically=По алфавиту issues.label.filter_sort.reverse_alphabetically=С конца алфавита issues.label.filter_sort.by_size=Размер @@ -646,23 +749,49 @@ issues.attachment.open_tab=`Нажмите, чтобы увидеть "%s" в н issues.attachment.download=`Нажмите, чтобы скачать "%s"` issues.subscribe=Подписаться issues.unsubscribe=Отказаться от подписки +issues.tracker=Отслеживание времени issues.start_tracking_short=Начать +issues.start_tracking=Начать отслеживание времени issues.start_tracking_history=`начал работать %s` issues.tracking_already_started=`Вы уже начали отслеживать время для этой задачи!` issues.stop_tracking=Остановить issues.stop_tracking_history=`перестал работать %s` +issues.add_time=Вручную добавить время +issues.add_time_short=Добавить время issues.add_time_cancel=Отмена issues.add_time_history=`добавил потраченное время %s` issues.add_time_hours=Часы issues.add_time_minutes=Минуты +issues.add_time_sum_to_small=Время не было введено. issues.cancel_tracking=Отмена issues.cancel_tracking_history=`отменил отслеживание %s` +issues.time_spent_total=Общее затраченное время +issues.time_spent_from_all_authors=`Общее затраченное время: %s` +issues.due_date=Срок выполнения +issues.invalid_due_date_format=Дата окончания должна быть в формате 'гггг-мм-дд'. +issues.error_modifying_due_date=Не удалось изменить срок выполнения. +issues.error_removing_due_date=Не удалось убрать срок выполнения. +issues.due_date_form=гггг-мм-дд +issues.due_date_form_add=Добавить срок выполнения +issues.due_date_form_update=Обновить срок выполнения +issues.due_date_form_remove=Удалить срок выполнения +issues.due_date_not_writer=Для обновления срока выполнения необходим доступ на запись в репозиторий. +issues.due_date_not_set=Срок выполнения не установлен. +issues.due_date_added=добавлено в срок выполнения %s %s +issues.due_date_modified=срок изменён c %s %s на %s +issues.due_date_remove=удалён срок выполнения %s %s +issues.due_date_overdue=Просроченные pulls.desc=Включить Pull Request'ы и интерфейс согласования правок. pulls.new=Новый Pull Request pulls.compare_changes=Новый Pull Request +pulls.compare_changes_desc=Сравнить две ветки и создать запрос на слияние для изменений. +pulls.compare_base=родительская ветка +pulls.compare_compare=сравнить pulls.filter_branch=Фильтр по ветке pulls.no_results=Результатов не найдено. +pulls.nothing_to_compare=Нечего сравнивать, родительская и текущая ветка одинаковые. +pulls.has_pull_request=`Уже существует запрос на слияние между двумя целями: %[2]s#%[3]d` pulls.create=Создать Pull Request pulls.title_desc=хочет смерджить %[1]d коммит(ов) из %[2]s в %[3]s pulls.merged_title_desc=слито %[1]d коммит(ов) из %[2]s в %[3]s %[4]s @@ -671,10 +800,19 @@ pulls.tab_commits=Коммиты pulls.tab_files=Измененные файлы pulls.reopen_to_merge=Пожалуйста, переоткройте этот Pull Request для выполнения слияния. pulls.merged=Слито +pulls.has_merged=Слияние этого запроса успешно завершено. +pulls.data_broken=Содержимое этого запроса было нарушено вследствие удаления информации форка. +pulls.is_checking=Продолжается проверка конфликтов, пожалуйста обновите страницу несколько позже. pulls.can_auto_merge_desc=Этот Pull Request может быть объединён автоматически. +pulls.cannot_auto_merge_desc=Этот запрос на слияние не может быть объединён автоматически. +pulls.cannot_auto_merge_helper=Пожалуйста, совершите слияние вручную для урегулирования конфликтов. +pulls.no_merge_desc=Pull Request не может быть принят, так как запрещены все методы организации рабочего потока. +pulls.no_merge_helper=Включите опции слияния в настройках репозитория или совершите слияние Pull Request'а вручную. pulls.merge_pull_request=Принять Pull Request pulls.rebase_merge_pull_request=Выполнить rebase и принять PR pulls.squash_merge_pull_request=Объединить и принять PR +pulls.invalid_merge_option=Этот параметр слияния нельзя использовать для этого Pull Request'а. +pulls.open_unmerged_pull_exists=`Вы не можете снова открыть, поскольку уже существует запрос на слияние (#%d) из того же репозитория с той же информацией о слиянии и ожидающий слияния.` milestones.new=Новый этап milestones.open_tab=%d открыты @@ -683,13 +821,22 @@ milestones.closed=Закрыт %s milestones.no_due_date=Срок не указан milestones.open=Открыть milestones.close=Закрыть +milestones.new_subheader=Создавайте этапы для организации ваших задач. milestones.create=Создать этап milestones.title=Заголовок milestones.desc=Описание milestones.due_date=Дата окончания (опционально) milestones.clear=Очистить +milestones.invalid_due_date_format=Дата окончания должна быть в формате 'гггг-мм-дд'. +milestones.create_success=Этап '%s' создан. milestones.edit=Редактировать этап +milestones.edit_subheader=Используйте лучшее описание контрольной точки, во избежание непонимания со стороны других людей. milestones.cancel=Отмена +milestones.modify=Обновить этап +milestones.edit_success=Этап '%s' был обновлен. +milestones.deletion=Удалить этап +milestones.deletion_desc=Удаление этапа приведет к его удалению из всех связанных задач. Продолжить? +milestones.deletion_success=Контрольная точка успешно удалена. milestones.filter_sort.closest_due_date=Ближайшее по дате milestones.filter_sort.furthest_due_date=Дальнее по дате milestones.filter_sort.least_complete=Менее полное @@ -697,17 +844,26 @@ milestones.filter_sort.most_complete=Более полное milestones.filter_sort.most_issues=Большинство задач milestones.filter_sort.least_issues=Меньшинство задач +ext_wiki=Внешняя вики +ext_wiki.desc=Ссылка на внешнюю вики. wiki=Вики +wiki.welcome=Добро пожаловать в Вики. +wiki.welcome_desc=Вики позволяет писать и делиться документацией с сотрудниками. +wiki.desc=Вики - это место для хранения документации. +wiki.create_first_page=Создать первую страницу wiki.page=Страница wiki.filter_page=Фильтр страницы +wiki.new_page=Страница wiki.default_commit_message=Описание изменения вики-страницы (необязательно). wiki.save_page=Сохранить страницу wiki.last_commit_info=%s редактировал эту страницу %s wiki.edit_page_button=Редактировать wiki.new_page_button=Новая страница wiki.delete_page_button=Удалить страницу +wiki.delete_page_notice_1=Удаление вики-страницы '%s' не может быть отменено. Продолжить? wiki.page_already_exists=Вики-страница с таким именем уже существует. +wiki.reserved_page=Имя вики-страницы '%s' зарезервировано. wiki.pages=Страницы wiki.last_updated=Последнее обновление %s @@ -744,6 +900,9 @@ activity.closed_issue_label=Закрыто activity.new_issues_count_1=Новая задача activity.new_issues_count_n=Новых задач activity.new_issue_label=Открытые +activity.title.unresolved_conv_1=%d Незавершённое обсуждение +activity.title.unresolved_conv_n=%d Незавершённых обсуждений +activity.unresolved_conv_desc=Список всех старых тикетов и Pull Request'ов с недавней активностью, но ещё не закрытых либо принятых. activity.unresolved_conv_label=Открытые activity.title.releases_1=%d релиз activity.title.releases_n=%d релизов @@ -766,66 +925,178 @@ settings.hooks=Автоматическое обновление settings.githooks=Git хуки settings.basic_settings=Основные параметры settings.mirror_settings=Настройки зеркалирования +settings.sync_mirror=Синхронизировать +settings.mirror_sync_in_progress=Синхронизируются репозитории-зеркала. Подождите минуту и обновите страницу. settings.site=Сайт settings.update_settings=Обновить настройки settings.advanced_settings=Расширенные настройки +settings.wiki_desc=Включить Вики для репозитория +settings.use_internal_wiki=Использовать встроенную вики-систему +settings.use_external_wiki=Использовать внешнюю вики-систему settings.external_wiki_url=URL-адрес внешней Вики +settings.external_wiki_url_error=URL внешней вики не является допустимым URL-адресом. +settings.external_wiki_url_desc=Посетители будут перенаправлены на URL-адрес, когда они кликнут по вкладке. +settings.issues_desc=Включить систему учёта задач репозитория +settings.use_internal_issue_tracker=Использовать встроенную систему учета задач +settings.use_external_issue_tracker=Использовать внешнюю систему учета задач settings.external_tracker_url=URL внешней системы отслеживания ошибок +settings.external_tracker_url_error=URL внешнего баг-трекера не является допустимым URL-адресом. +settings.external_tracker_url_desc=Посетители будут перенаправлены на URL-адрес, когда они кликнут по вкладке. settings.tracker_url_format=Внешний формат ссылки системы отслеживания ошибок. +settings.tracker_issue_style=Формат нумерации для внешней системы учета задач settings.tracker_issue_style.numeric=Цифровой settings.tracker_issue_style.alphanumeric=Буквенноцифровой +settings.tracker_url_format_desc=Вы можете использовать шаблоны {user}, {repo} и {index} для имени пользователя, репозитория и номера задачи. +settings.enable_timetracker=Включить отслеживание времени +settings.allow_only_contributors_to_track_time=Учитывать только участников разработки в подсчёте времени +settings.pulls_desc=Включить публичные запросы на слияние +settings.pulls.ignore_whitespace=Игнорировать незначащие изменения (пробелы, табуляция) при проверке на конфликты слияния +settings.pulls.allow_merge_commits=Разрешить коммиты слияния +settings.pulls.allow_rebase_merge=Разрешить rebase-слияние +settings.pulls.allow_squash_commits=Разрешить объединять коммиты перед слиянием (squash) settings.admin_settings=Настройки администратора +settings.admin_enable_health_check=Выполнять проверки целостности этого репозитория (git fsck) settings.danger_zone=Опасная зона settings.new_owner_has_same_repo=У нового владельца уже есть хранилище с таким названием. +settings.convert=Преобразовать в обычный репозиторий +settings.convert_desc=Это зеркало можно преобразовать в обычный репозиторий. Это не может быть отменено. +settings.convert_notices_1=Эта операция преобразует это зеркало в обычный репозиторий, и она не может быть отменена. +settings.convert_confirm=Подтвердите преобразование +settings.convert_succeed=Репозиторий успешно преобразован в обычный. settings.transfer=Передать права собственности +settings.transfer_desc=Передать репозиторий другому пользователю или организации где у вас есть права администратора. +settings.transfer_notices_1=- Вы можете потерять доступ, если новый владелец является отдельным пользователем. +settings.transfer_notices_2=- Вы сохраните доступ, если новым владельцем станет организация, владельцем которой вы являетесь. +settings.transfer_form_title=Введите сопутствующую информацию для подтверждения операции: +settings.wiki_delete=Стереть данные Вики +settings.wiki_delete_desc=Будьте внимательны! Как только вы удалите Вики — пути назад не будет. +settings.wiki_delete_notices_1=- Это навсегда удалит и отключит Вики для %s. +settings.confirm_wiki_delete=Стереть данные Вики +settings.wiki_deletion_success=Данные Вики успешно стерты. settings.delete=Удалить этот репозиторий +settings.delete_desc=Будьте внимательны! Как только вы удалите репозиторий — пути назад не будет. settings.delete_notices_1=- Эта операция НЕ МОЖЕТ быть отменена. +settings.delete_notices_2=- Эта операция навсегда удалит всё из репозитория %s, включая данные Git, связанные с ним задачи, комментарии и права доступа для сотрудников. +settings.delete_notices_fork_1=- Все форки станут независимыми репозиториями после удаления. +settings.deletion_success=Репозиторий удален. +settings.update_settings_success=Настройки репозитория обновлены. settings.transfer_owner=Новый владелец +settings.make_transfer=Выполнить передачу +settings.transfer_succeed=Репозиторий перенесён. +settings.confirm_delete=Удалить репозиторий +settings.add_collaborator=Добавить соавтора +settings.add_collaborator_success=Соавтор добавлен. +settings.delete_collaborator=Удалить +settings.collaborator_deletion=Удалить соавтора +settings.collaborator_deletion_desc=Этот пользователь больше не будет иметь доступа для совместной работы в этом репозитории после удаления. Вы хотите продолжить? +settings.remove_collaborator_success=Соавтор удалён. settings.search_user_placeholder=Поиск пользователя… +settings.org_not_allowed_to_be_collaborator=Организации не могут быть добавлены как соавторы. +settings.user_is_org_member=Пользователь является членом организации, члены которой не могут быть добавлены в качестве соавтора. settings.add_webhook=Добавить Webhook +settings.hooks_desc=Webhooks позволяют внешним службам получать уведомления при возникновении определенных событий на Gitea. При возникновении указанных событий мы отправим запрос POST на каждый заданный вами URL. Узнать больше можно в нашем руководстве по webhooks. +settings.webhook_deletion=Удалить Webhook +settings.webhook_deletion_desc=Удаление этого веб-хука приведет к удалению всей связанной с ним информации, включая историю. Хотите продолжить? +settings.webhook_deletion_success=Webhook был удалён. settings.webhook.test_delivery=Проверить доставку +settings.webhook.test_delivery_desc=Отправить тестовое событие для тестирования настройки веб-хука. +settings.webhook.test_delivery_success=Тест веб-хука была добавлен в очередь доставки. Это может занять несколько секунд, прежде чем он отобразится в истории доставки. settings.webhook.request=Запрос settings.webhook.response=Ответ settings.webhook.headers=Заголовки +settings.webhook.payload=Содержимое settings.webhook.body=Тело ответа +settings.githooks_desc=Git-хуки предоставляются Git самим по себе, вы можете изменять файлы поддерживаемых хуков из списка ниже чтобы выполнять внешние операции. settings.githook_edit_desc=Если хук не активен, будет подставлен пример содержимого. Пустое значение в этом поле приведет к отключению хука. settings.githook_name=Название Hook'a settings.githook_content=Перехватить содержание settings.update_githook=Обновить Hook +settings.add_webhook_desc=Gitea будет оправлять POST запросы на указанный URL адрес, с информацией о происходящих событиях. Вы также можете указать формат данных (JSON, x-www-form-urlencoded, XML и т.д.). Подробности на странице инструкции по использованию webhooks. +settings.payload_url=URL обработчика +settings.content_type=Тип содержимого settings.secret=Секретный ключ settings.slack_username=Имя пользователя settings.slack_icon_url=URL иконки settings.discord_username=Имя пользователя settings.discord_icon_url=URL иконки settings.slack_color=Цвет +settings.event_desc=На какие события этот webhook должен срабатывать? +settings.event_push_only=Просто push событие +settings.event_send_everything=Все события +settings.event_choose=Позвольте мне выбрать то, что нужно. settings.event_create=Создать +settings.event_create_desc=Ветка или тэг созданы. +settings.event_delete=Удалить +settings.event_delete_desc=Ветка или метка удалена settings.event_fork=Форкнуть +settings.event_fork_desc=Репозиторий склонирован settings.event_issues=Задачи +settings.event_issues_desc=Задача открыта, закрыта, переоткрыта, изменена, назначена, снята, метка обновлена, метка убрана, добавлена в этап или убрана из этапа. +settings.event_issue_comment=Комментарии в задаче +settings.event_issue_comment_desc=Комментарий создан, изменен или удален. +settings.event_release=Релиз +settings.event_release_desc=Релиз опубликован, обновлён или удалён из репозитория. settings.event_pull_request=Pull Request +settings.event_pull_request_desc=Запрос слияния открыт, закрыт, переоткрыт, изменён, назначен, снят, метка обновлена, метка убрана, или синхронизирован. settings.event_push=Push +settings.event_push_desc=Push в репозиторий. settings.event_repository=Репозиторий settings.event_repository_desc=Репозиторий создан или удален. +settings.active=Активен +settings.active_helper=Также будет отправлена информация о произошедшем событии. settings.add_hook_success=Webhook был добавлен. settings.update_webhook=Обновление Webhook settings.update_hook_success=Webhook был обновлен. +settings.delete_webhook=Удалить Webhook settings.recent_deliveries=Недавние рассылки settings.hook_type=Тип перехватчика +settings.add_slack_hook_desc=Добавить интеграцию с Slack в ваш репозиторий. settings.slack_token=Slack токен settings.slack_domain=Домен settings.slack_channel=Канал +settings.add_discord_hook_desc=Добавить уведомления о событиях через Discord. +settings.add_dingtalk_hook_desc=Добавить интеграцию с Dingtalk в ваш репозиторий. settings.deploy_keys=Ключи развертывания settings.add_deploy_key=Добавить ключ развертывания +settings.deploy_key_desc=Ключи развёртывания доступны только для чтения. Это не то же самое что и SSH-ключи аккаунта. settings.is_writable=Разрешить запись +settings.is_writable_info=Может ли этот ключ быть использован для выполнения push в репозиторий? Ключи развёртывания всегда имеют доступ на pull. +settings.no_deploy_keys=Вы не добавляли ключи развертывания. settings.title=Заголовок settings.deploy_key_content=Содержимое +settings.key_been_used=Содержимое ключа развертывания уже используется. +settings.key_name_used=Ключ развертывания с таким заголовком уже существует. +settings.add_key_success=Новый ключ развертывания '%s' успешно добавлен. +settings.deploy_key_deletion=Удалить ключ развертывания +settings.deploy_key_deletion_desc=Удаление ключа развёртки сделает невозможным доступ к репозиторию с его помощью. Вы уверены? +settings.deploy_key_deletion_success=Ключ развёртки был успешно удалён. settings.branches=Ветки settings.protected_branch=Защита веток settings.protected_branch_can_push=Разрешить push? settings.protected_branch_can_push_yes=Вы можете выполнять push settings.protected_branch_can_push_no=Вы не можете выполнять push +settings.branch_protection=Защита ветки %s +settings.protect_this_branch=Защитить эту ветку +settings.protect_this_branch_desc=Выключить принудительный push и защитить от удаления. +settings.protect_whitelist_committers=Белый список тех, кто может делать push в эту ветку +settings.protect_whitelist_committers_desc=Добавить пользователей или команды в белый список ветки. На них не будут распространяться обычные ограничения на push. +settings.protect_whitelist_users=Пользователи, которые могут делать push в эту ветку: +settings.protect_whitelist_search_users=Поиск пользователей… +settings.protect_whitelist_teams=Команды, члены которых могут делать push в эту ветку: +settings.protect_whitelist_search_teams=Поиск команд… +settings.protect_merge_whitelist_committers=Ограничить право на принятие Pull Request'ов в эту ветку списком +settings.protect_merge_whitelist_committers_desc=Вы можете добавлять пользователей или целые команды в "белый" список этой ветки. Только присутствующие в списке смогут принимать Pull Request'ы. В противном случае любой с правами на запись в репозиторий будет обладать такой возможностью. +settings.protect_merge_whitelist_users=Пользователи с правом на принятие Pull Request'ов в эту ветку: +settings.protect_merge_whitelist_teams=Команды, члены которых обладают правом на принятие Pull Request'ов в эту ветку: settings.add_protected_branch=Включить защиту settings.delete_protected_branch=Отключить защиту +settings.update_protect_branch_success=Настройки защиты ветки '%s' были успешно изменены. +settings.remove_protected_branch_success=Защита ветки '%s' была успешно отключена. +settings.protected_branch_deletion=Отключение защиты ветки +settings.protected_branch_deletion_desc=Любой пользователь с разрешениями на запись сможет выполнять push в эту ветку. Вы уверены? +settings.default_branch_desc=Главная ветка является "базовой" для вашего репозитория, на которую по умолчанию направлены все Pull Request'ы и которая является лицом вашего репозитория. Первое, что увидит посетитель — это содержимое главной ветки. Выберите её из уже существующих: settings.choose_branch=Выберите ветку… +settings.no_protected_branch=Нет защищённых веток. diff.browse_source=Просмотр исходного кода diff.parent=Родитель @@ -840,6 +1111,7 @@ diff.view_file=Просмотреть файл diff.file_suppressed=Разница между файлами не показана из-за своего большого размера diff.too_many_files=Некоторые файлы не были показаны из-за большого количества измененных файлов +releases.desc=Релизы позволяют организовать хранение готовых сборок проекта в строгом хронологически верном порядке. release.releases=Релизы release.new_release=Новый релиз release.draft=Черновик @@ -848,17 +1120,28 @@ release.stable=Стабильный release.edit=Редактировать release.ahead=%d коммитов %s начиная с этого релиза release.source_code=Исходный код +release.new_subheader=Публикация релизов поможет хранить чёткую историю развития вашего проекта. +release.edit_subheader=Подробный журнал изменений может помочь пользователям понять, что было изменено в очередной версии. release.tag_name=Имя тега release.target=Цель +release.tag_helper=Выберите существующий тег, или создайте новый. release.title=Заголовок release.content=Содержимое release.write=Редактирование release.preview=Предварительный просмотр release.loading=Загрузка… +release.prerelease_desc=Это предварительный релиз +release.prerelease_helper=Отдельно отметим, что этот релиз не готов к использованию в продакшене. release.cancel=Отменить release.publish=Опубликовать релиз release.save_draft=Сохранить черновик +release.edit_release=Редактировать релиз +release.delete_release=Удалить этот релиз +release.deletion=Удаление релиза +release.deletion_desc=Удаление релиза удаляет Git-тэг из репозитория. Содержимое хранилища и история останутся неизменными. Продолжить? release.deletion_success=Релиз был удалён. +release.tag_name_already_exist=Релиз с этим именем метки уже существует. +release.tag_name_invalid=Имя тега является не допустимым. release.downloads=Загрузки branch.name=Имя ветки @@ -867,10 +1150,20 @@ branch.already_exists=Ветка с именем '%s' уже существуе branch.delete_head=Удалить branch.delete=Удалить ветку '%s' branch.delete_html=Удалить ветку +branch.delete_desc=Удаление ветки НЕОБРАТИМО. Действие никак нельзя отменить. +branch.deletion_success=Ветка %s удалена. +branch.deletion_failed=Не удалось удалить ветку %s. +branch.delete_branch_has_new_commits=%s нельзя удалить, поскольку после слияния были добавлены новые коммиты. branch.create_branch=Создать ветку %s branch.create_from=из '%s' +branch.create_success=Ветка '%s' создана. branch.branch_already_exists=Ветка '%s' уже существует в репозитории. +branch.branch_name_conflict=Имя ветки '%s' конфликтует с уже существующей веткой '%s'. +branch.tag_collision=Ветка '%s' не может быть создана, так как уже существует тэг с таким именем. branch.deleted_by=Удалён %s +branch.restore_success=Ветка '%s' восстановлена. +branch.restore_failed=Не удалось восстановить ветку '%s'. +branch.protected_deletion_failed=Ветка '%s' защищена. Её нельзя удалить. topic.manage_topics=Редактировать тематические метки topic.done=Сохранить @@ -878,6 +1171,7 @@ topic.done=Сохранить [org] org_name_holder=Название организации org_full_name_holder=Полное название организации +org_name_helper=Лучшие названия организаций коротки и запоминаемы. create_org=Создать организацию repo_updated=Обновлено people=Люди @@ -889,9 +1183,14 @@ create_team=Создать команду org_desc=Описание team_name=Название команды team_desc=Описание +team_name_helper=Названия команд должны быть короткими и запоминающимися. +team_desc_helper=Что это за команда? team_permission_desc=Разрешение team_unit_desc=Разрешить доступ к разделам репозитория +form.name_reserved=Наименование организации '%s' зарезервированно. +form.name_pattern_not_allowed=Шаблон организации '%s' не допускается. +form.create_org_not_allowed=Этому пользователю не разрешено создавать организацию. settings=Настройки settings.options=Организация @@ -900,8 +1199,11 @@ settings.website=Сайт settings.location=Местоположение settings.update_settings=Обновить настройки settings.update_setting_success=Настройки организации обновлены. +settings.change_orgname_prompt=Это изменение изменит ссылки на организацию. +settings.update_avatar_success=Аватар организации обновлен. settings.delete=Удалить организацию settings.delete_account=Удалить эту организацию +settings.delete_prompt=Это действие БЕЗВОЗВРАТНО удалит эту организацию навсегда. settings.confirm_delete_account=Подтвердить удаление settings.delete_org_title=Удалить организацию settings.delete_org_desc=Эта организация будет безвозвратно удалена. Продолжить? @@ -930,12 +1232,17 @@ teams.admin_access=Доступ администратора teams.admin_access_helper=Участники могут выполнять pull, push в командные репозитории и добавлять соавторов в команду. teams.no_desc=Эта группа не имеет описания teams.settings=Настройки +teams.owners_permission_desc=Владельцы имеют полный доступ ко всем репозиториям и имеют права администратора организации. teams.members=Члены группы разработки teams.update_settings=Обновить настройки teams.delete_team=Удалить команду teams.add_team_member=Добавление члена группы разработки teams.delete_team_title=Удалить команду +teams.delete_team_desc=Удаление команды отменяет доступ к репозиторию для её членов. Продолжить? teams.delete_team_success=Команда удалена. +teams.read_permission_desc=Эта команда предоставляет доступ на Чтение: члены могут просматривать и клонировать репозитории команды. +teams.write_permission_desc=Эта команда предоставляет доступ на Запись: члены могут получать и выполнять push команды в репозитории. +teams.admin_permission_desc=Эта команда дает административный доступ: участники могут читать, пушить и добавлять соавторов к ее репозиториям. teams.repositories=Репозитории группы разработки teams.search_repo_placeholder=Поиск репозитория… teams.add_team_repository=Добавить репозиторий группы разработки @@ -944,8 +1251,10 @@ teams.add_nonexistent_repo=Вы добавляете в отсутствующи [admin] dashboard=Панель +users=Пользователи organizations=Организации repositories=Репозитории +authentication=Авторизация config=Конфигурация notices=Системные уведомления monitor=Мониторинг @@ -953,6 +1262,10 @@ first_page=Первая last_page=Последняя total=Всего: %d +dashboard.statistic=Статистика +dashboard.operations=Операции +dashboard.system_status=Статус системного монитора +dashboard.statistic_info=В базе данных Gitea записано %d пользователей, %d организаций, %d публичных ключей, %d репозиториев, %d подписок на репозитории, %d добавлений в избранное, %d действий, %d доступов, %d задач, %d комментариев, %d социальных учетных записей, %d подписок на пользователей, %d зеркал, %d релизов, %d источников входа, %d веб-хуков, %d этапов, %d меток, %d задач хуков, %d команд, %d задач по обновлению, %d присоединенных файлов. dashboard.operation_name=Имя операции dashboard.operation_switch=Переключить dashboard.operation_run=Запуск @@ -960,16 +1273,30 @@ dashboard.clean_unbind_oauth=Очистить список незавершён dashboard.clean_unbind_oauth_success=Все незавершённые связи OAuth были удалены. dashboard.delete_inactivate_accounts=Удалить все неактивированные учетные записи dashboard.delete_inactivate_accounts_success=Все неактивные учётные записи удалены. +dashboard.delete_repo_archives=Удаление всех архивов репозиториев +dashboard.delete_repo_archives_success=Все архивы репозиториев удалены. +dashboard.delete_missing_repos=Удалить все записи о репозиториях с отсутствующими файлами Git +dashboard.delete_missing_repos_success=Все записи о репозиториях с отсутствующими файлами Git удалены. +dashboard.git_gc_repos=Выполнить сборку мусора для всех репозиториев +dashboard.git_gc_repos_success=Сборка мусора выполнена для всех репозиториев. +dashboard.resync_all_sshkeys=Перезаписать файл '.ssh/authorized_keys' для SSH ключей Gitea. Не требуется для встроенного SSH сервера. +dashboard.resync_all_sshkeys_success=Все открытые ключи были перезаписаны. +dashboard.resync_all_hooks=Повторная синхронизация хуков pre-receive, update и post-receive во всех репозиториях. +dashboard.resync_all_hooks_success=Были пересинхронизированы все pre-receive, update и post-receive Git hook'и. dashboard.reinit_missing_repos=Переинициализировать все отсутствующие Git репозитории, для которых существуют записи dashboard.reinit_missing_repos_success=Все отсутствующие репозитории Git, для которых существуют записи были повторно инициализированы. dashboard.sync_external_users=Синхронизировать данные внешних пользователей +dashboard.sync_external_users_started=Запущена синхронизация внешних пользователей. dashboard.git_fsck=Запустить проверку данных всех репозиториев (git fsck) +dashboard.git_fsck_started=Проверка данных репозиториев запущена. dashboard.server_uptime=Время непрерывной работы сервера dashboard.current_goroutine=Текущее количество Goroutines dashboard.current_memory_usage=Текущее использование памяти dashboard.total_memory_allocated=Всего памяти выделено dashboard.memory_obtained=Памяти использовано dashboard.pointer_lookup_times=Запросов указателя +dashboard.memory_allocate_times=Выделений памяти +dashboard.memory_free_times=Освобождений памяти dashboard.current_heap_usage=Текущее использование кучи dashboard.heap_memory_obtained=Получено динамической памяти dashboard.heap_memory_idle=Не используется динамической памяти @@ -992,14 +1319,37 @@ dashboard.total_gc_pause=Итоговая задержка GC dashboard.last_gc_pause=Последняя пауза сборщика мусора dashboard.gc_times=Количество сборок мусора +users.user_manage_panel=Панель управления пользователями +users.new_account=Создать новый аккаунт users.name=Имя пользователя users.activated=Активирован users.admin=Администратор users.repos=Репозитории users.created=Создано +users.last_login=Последний вход +users.never_login=Никогда не входил +users.send_register_notify=Отправить пользователю уведомление о регистрации +users.new_success=Учетная запись '%s' создана. users.edit=Редактировать users.auth_source=Источник аутентификации users.local=Локальный +users.auth_login_name=Логин для авторизации +users.password_helper=Оставьте пустым, чтобы оставить без изменений. +users.update_profile_success=Профиль учетной записи обновлен успешно. +users.edit_account=Изменение учетной записи +users.max_repo_creation=Ограничение максимального количества создаваемых репозиториев +users.max_repo_creation_desc=(Установите -1 для использования стандартного глобального значения предела) +users.is_activated=Эта учетная запись активирована +users.prohibit_login=Этой учетной записи запрещен вход в систему +users.is_admin=У этой учетной записи есть права администратора +users.allow_git_hook=Эта учетная запись имеет разрешение на создание Git-хуков +users.allow_import_local=Пользователь имеет право импортировать локальные репозитории +users.allow_create_organization=Эта учетная запись имеет разрешения на создание организаций +users.update_profile=Обновить профиль учетной записи +users.delete_account=Удалить эту учетную запись +users.still_own_repo=На вашем аккаунте все еще остается один или более репозиториев, сначала вам нужно удалить или передать их. +users.still_has_org=Эта учетная запись все еще является членом одной или более организаций. Для продолжения, покиньте или удалите организации. +users.deletion_success=Учетная запись успешно удалена. orgs.org_manage_panel=Управление организациями orgs.name=Название @@ -1013,12 +1363,16 @@ repos.name=Название repos.private=Личный repos.watches=Следят repos.stars=Звезды +repos.forks=Форки repos.issues=Задачи repos.size=Размер +auths.auth_manage_panel=Управление аутентификацией +auths.new=Добавить новый источник auths.name=Имя auths.type=Тип auths.enabled=Включено +auths.syncenabled=Включить синхронизацию пользователей auths.updated=Обновлено auths.auth_type=Тип аутентификации auths.auth_name=Имя аутентификации @@ -1028,8 +1382,16 @@ auths.host=Сервер auths.port=Порт auths.bind_dn=Bind DN auths.bind_password=Привязать пароль +auths.bind_password_helper=Предупреждение: этот пароль хранится в виде простого текста. Используйте учетную запись только для чтения, если это возможно. auths.user_base=База для поиска пользователя auths.user_dn=DN пользователя +auths.attribute_username=Атрибут Username +auths.attribute_username_placeholder=Оставьте пустым, чтобы использовать имя пользователя для регистрации. +auths.attribute_name=Атрибут First Name +auths.attribute_surname=Атрибут Surname +auths.attribute_mail=Атрибут Email +auths.attribute_ssh_public_key=Атрибут Открытый SSH ключ +auths.attributes_in_bind=Извлекать атрибуты в контексте Bind DN auths.use_paged_search=Использовать постраничный поиск auths.search_page_size=Размер страницы auths.filter=Фильтр пользователя @@ -1039,6 +1401,7 @@ auths.smtp_auth=Тип аутентификации SMTP auths.smtphost=Узел SMTP auths.smtpport=SMTP-порт auths.allowed_domains=Разрешенные домены +auths.allowed_domains_helper=Оставьте пустым, чтобы разрешить все домены. Разделите несколько доменов запятой (','). auths.enable_tls=Включение шифрования TLS auths.skip_tls_verify=Пропустить проверку TLS auths.pam_service_name=Имя службы PAM @@ -1046,6 +1409,7 @@ auths.oauth2_provider=Поставщик OAuth2 auths.oauth2_clientID=ID клиента (ключ) auths.oauth2_clientSecret=Клиентский ключ auths.openIdConnectAutoDiscoveryURL=OpenID Connect URL для автоматизации входа +auths.oauth2_use_custom_url=Использовать пользовательские URL вместо URL по умолчанию auths.oauth2_tokenURL=URL токена auths.oauth2_authURL=URL авторизации auths.oauth2_profileURL=URL аккаунта @@ -1055,32 +1419,48 @@ auths.tips=Советы auths.tips.oauth2.general=OAuth2 аутентификация auths.tips.oauth2.general.tip=При добавлении нового OAuth2 провайдера, URL адрес переадресации по завершении аутентификации должен выглядеть так: /user/oauth2//callback auths.tip.oauth2_provider=Поставщик OAuth2 +auths.tip.bitbucket=Создайте OAuth URI на странице https://bitbucket.org/account/user/<имя пользователя>/oauth-consumers/new и добавьте права "Account" - "Read auths.tip.dropbox=Добавьте новое приложение на https://www.dropbox.com/developers/apps auths.tip.facebook=Создайте новое приложение на https://developers.facebook.com/apps и добавьте модуль "Facebook Login auths.tip.github=Добавьте OAuth приложение на https://github.com/settings/applications/new auths.tip.gitlab=Добавьте новое приложение на https://gitlab.com/profile/applications +auths.tip.google_plus=Получите учетные данные клиента OAuth2 в консоли Google API на странице https://console.developers.google.com/ auths.tip.openid_connect=Используйте OpenID Connect Discovery URL (/.well-known/openid-configuration) для автоматической настройки входа OAuth +auths.tip.twitter=Перейдите на https://dev.twitter.com/apps, создайте приложение и убедитесь, что включена опция «Разрешить это приложение для входа в систему с помощью Twitter» +auths.edit=Обновить параметры аутентификации +auths.activated=Эта аутентификация активирована auths.new_success=Метод аутентификации '%s' был добавлен. +auths.update_success=Параметры аутентификации обновлены. +auths.update=Обновить источник аутентификации +auths.delete=Удалить этот источник аутентификации auths.delete_auth_title=Удалить источник аутентификации +auths.delete_auth_desc=Этот источник аутентификации будет удален, вы уверены, что вы хотите продолжить? +auths.still_in_used=Эта проверка подлинности до сих пор используется некоторыми пользователями, удалите или преобразуйте этих пользователей в другой тип входа в систему. +auths.deletion_success=Канал аутентификации успешно удален! +auths.login_source_exist=Источник входа '%s' уже существует. config.server_config=Конфигурация сервера config.app_name=Название сайта config.app_ver=Версия Gitea config.app_url=Базовый URL-адрес Gitea config.custom_conf=Путь к файлу конфигурации +config.domain=Домен SSH сервера config.offline_mode=Локальный режим config.disable_router_log=Отключение журнала маршрутизатора +config.run_user=Запуск от имени пользователя config.run_mode=Режим выполнения config.git_version=Версия Git config.repo_root_path=Путь до папки репозиториев config.lfs_root_path=Корневой путь LFS config.static_file_root_path=Путь до папки со статичными файлами +config.log_file_root_path=Путь к журналу config.script_type=Тип скрипта config.reverse_auth_user=Имя пользователя для авторизации на reverse proxy config.ssh_config=Конфигурация SSH config.ssh_enabled=SSH включён config.ssh_start_builtin_server=Использовать встроенный сервер +config.ssh_domain=Домен config.ssh_port=Порт config.ssh_listen_port=Прослушиваемый порт config.ssh_root_path=Корневой путь @@ -1093,27 +1473,36 @@ config.db_config=Конфигурация базы данных config.db_type=Тип config.db_host=Сервер config.db_name=Имя +config.db_user=Пользователь config.db_ssl_mode=SSL -config.db_ssl_mode_helper=(только для "postgres") config.db_path=Путь -config.db_path_helper=(для "sqlite3" и "tidb") config.service_config=Сервисная конфигурация +config.register_email_confirm=Требуется подтверждение по электронной почте config.disable_register=Отключить самостоятельную регистрацию +config.allow_only_external_registration=Включить регистрацию только через сторонние сервисы +config.enable_openid_signup=Включить cамостоятельную регистрацию OpenID config.enable_openid_signin=Включение входа через OpenID config.show_registration_button=Показать кнопку регистрации +config.require_sign_in_view=Для просмотра необходима авторизация +config.mail_notify=Почтовые уведомления config.disable_key_size_check=Отключить проверку на минимальный размер ключа config.enable_captcha=Включить CAPTCHA config.active_code_lives=Время жизни кода для активации config.reset_password_code_lives=Время жизни кода на сброс пароля +config.default_keep_email_private=Скрывать адреса электронной почты по умолчанию +config.default_allow_create_organization=Разрешить создание организаций по умолчанию config.enable_timetracking=Включить отслеживание времени config.default_enable_timetracking=Включить отслеживание времени по умолчанию +config.default_allow_only_contributors_to_track_time=Учитывать только участников разработки в подсчёте времени +config.no_reply_address=No-reply адрес config.webhook_config=Конфигурация Webhooks config.queue_length=Длина очереди config.deliver_timeout=Задержка доставки config.skip_tls_verify=Пропустить проверку TLS +config.mailer_config=Настройки почты config.mailer_enabled=Почта включена config.mailer_disable_helo=Отключить HELO config.mailer_name=Имя @@ -1121,6 +1510,10 @@ config.mailer_host=Сервер config.mailer_user=Пользователь config.mailer_use_sendmail=Использовать Sendmail config.mailer_sendmail_path=Путь к Sendmail +config.mailer_sendmail_args=Дополнительные аргументы для Sendmail +config.send_test_mail=Отправить тестовое письмо +config.test_mail_failed=Не удалось отправить тестовое письмо на «%s»: %v +config.test_mail_sent=Тестовое письмо было отправлено «%s». config.oauth_config=Конфигурация OAuth config.oauth_enabled=OAuth включен @@ -1140,6 +1533,7 @@ config.session_life_time=Время жизни сессии config.https_only=Только HTTPS config.cookie_life_time=Время жизни файла cookie +config.picture_config=Настройка изображения config.picture_service=Сервис изображений config.disable_gravatar=Отключить Gravatar config.enable_federated_avatar=Включить внешние аватары @@ -1164,6 +1558,7 @@ monitor.name=Название monitor.schedule=Расписание monitor.next=Следующий раз monitor.previous=Предыдущий раз +monitor.execute_times=Количество выполнений monitor.process=Запущенные процессы monitor.desc=Описание monitor.start=Время начала @@ -1233,6 +1628,8 @@ remove_file=Удалить файл notifications=Уведомления unread=Непрочитанные read=Прочитанные +no_unread=У вас нет непрочитанных уведомлений. +no_read=У вас нет прочитанных уведомлений. pin=Прикрепить уведомление mark_as_read=Отметить как прочитанное mark_as_unread=Пометить как непрочитанное @@ -1241,9 +1638,12 @@ mark_all_as_read=Пометить все как прочитанные [gpg] error.extract_sign=Не удалось извлечь подпись error.generate_hash=Не удается создать хэш коммита +error.no_committer_account=Аккаунт пользователя с таким Email не найден error.no_gpg_keys_found=Не найден GPG ключ соответствующий данной подписи error.not_signed_commit=Неподписанный коммит +error.failed_retrieval_gpg_keys=Не удалось получить соответствующий GPG ключ пользователя [units] +error.no_unit_allowed_repo=У вас нет доступа ни к одному разделу этого репозитория. error.unit_not_allowed=У вас нет доступа к этому разделу репозитория. diff --git a/options/locale/locale_sr-SP.ini b/options/locale/locale_sr-SP.ini index fa8430e7a..e20c9ba91 100644 --- a/options/locale/locale_sr-SP.ini +++ b/options/locale/locale_sr-SP.ini @@ -79,7 +79,6 @@ has_unconfirmed_mail=Здраво, %s! Имате непотврђену адр resend_mail=Кликните овде да поново пошаљете писмо reset_password=Ресет лозинке reset_password_helper=Кликните овде да ресетујете вашу лозинку -password_too_short=Лозинка неможе бити краћа од %d карактера. [mail] activate_account=Молимо вас активирајте ваш налог @@ -601,9 +600,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=Прикажи дугме за регистрацију diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index b735943f6..ca3d703f1 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -97,7 +97,6 @@ email_not_associate=Denna e-postadress är inte knutet till något konto. send_reset_mail=Klicka här för att skicka e-post med lösenordsåterställning igen reset_password=Återställ ditt lösenord reset_password_helper=Klicka här för att återställa ditt lösenord -password_too_short=Lösenordet får ej vara kortare än %d tecken. verify=Verifiera scratch_code=Skrapkod use_scratch_code=Använd en skrapkod @@ -738,9 +737,7 @@ config.db_config=Databaskonfiguration config.db_type=Typ config.db_host=Värd config.db_name=Namn -config.db_ssl_mode_helper=(endast för "postgres") config.db_path=Sökväg -config.db_path_helper=(för "sqlite3" och "tidb") config.service_config=Tjänstkonfiguration config.show_registration_button=Visa registreringsknapp diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini index 4e33fad25..17f4fe02b 100644 --- a/options/locale/locale_tr-TR.ini +++ b/options/locale/locale_tr-TR.ini @@ -97,7 +97,6 @@ email_not_associate=Bu e-posta adresi hiçbir hesap ile ilişkilendirilmemiştir send_reset_mail=Parola sıfırlama e-postasını (yeniden) göndermek için buraya tıklayın reset_password=Parolanızı Sıfırlayın reset_password_helper=Parolanızı sıfırlamak için buraya tıklayın -password_too_short=Parola uzunluğu %d karakterden az olamaz. verify=Doğrula scratch_code=Çizgi kodu use_scratch_code=Bir çizgi kodu kullanınız @@ -802,9 +801,7 @@ config.db_config=Veritabanı Yapılandırması config.db_type=Türü config.db_host=Sunucu config.db_name=İsim -config.db_ssl_mode_helper=(sadece "postgres" için) config.db_path=Yol -config.db_path_helper=("sqlite3" ve "tidb" için) config.service_config=Servis Yapılandırması config.show_registration_button=Kaydolma Tuşunu Göster diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 82ed70a0d..3bc79cdd5 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -31,6 +31,14 @@ twofa=Двофакторна авторизація twofa_scratch=Двофакторний одноразовий пароль passcode=Код доступу +u2f_insert_key=Вставте ключ безпеки +u2f_sign_in=Натисніть кнопку на ключі безпеки. Якщо не вдається знайти кнопки, повторно вставте ключ. +u2f_press_button=Будь ласка, натисніть кнопку на ключі захисту... +u2f_use_twofa=Використовуйте дво-факторний код з вашого телефону +u2f_error=Неможливо прочитати ваш ключ безпеки! +u2f_unsupported_browser=Ваш браузер не підтримує U2F ключі. Будь ласка, спробуйте інший браузер. +u2f_error_1=Сталася невідома помилка. Спробуйте ще раз. +u2f_error_3=Сервер не може обробити, ваш запит. u2f_reload=Оновити repository=Репозиторій @@ -131,6 +139,7 @@ confirm_password=Підтвердження пароля admin_email=Адреса електронної пошти install_btn_confirm=Встановлення Gitea test_git_failed=Не в змозі перевірити 'git' команду: %v +invalid_db_setting=Налаштування бази даних є некоректними: %v save_config_failed=Не в змозі зберегти конфігурацію: %v invalid_admin_setting=Неприпустимі налаштування облікового запису адміністратора: %v install_success=Ласкаво просимо! Дякуємо вам за вибір Gitea. Розважайтеся, і будьте обережні! @@ -190,7 +199,6 @@ send_reset_mail=Натисніть сюди, щоб відправити лис reset_password=Скинути пароль invalid_code=Цей код підтвердження недійсний або закінчився. reset_password_helper=Натисніть тут для скидання пароля -password_too_short=Довжина пароля не може бути меншою за %d. non_local_account=Нелокальні акаунти не можуть змінити пароль через Gitea. verify=Підтвердити scratch_code=Одноразовий пароль @@ -256,8 +264,14 @@ team_name_been_taken=Назва команди вже зайнято. email_been_used=Ця електронна адреса вже використовується. openid_been_used=OpenID адреса '%s' вже використовується. username_password_incorrect=Неправильне ім'я користувача або пароль. +enterred_invalid_repo_name=Невірно введено ім'я репозиторію. +enterred_invalid_owner_name=Ім'я нового власника не є дійсним. +enterred_invalid_password=Введений вами пароль некоректний. user_not_exist=Даний користувач не існує. +cannot_add_org_to_team=Організацію неможливо додати як учасника команди. +invalid_ssh_key=Неможливо перевірити ваш SSH ключ: %s +invalid_gpg_key=Неможливо перевірити ваш GPG ключ: %s auth_failed=Помилка автентифікації: %v @@ -292,6 +306,7 @@ twofa=Двофакторна авторизація account_link=Прив'язані облікові записи organization=Організації uid=Ідентифікатор Uid +u2f=Ключі безпеки public_profile=Загальнодоступний профіль profile_desc=Ваша адреса електронної пошти використовуватиметься для сповіщення та інших операцій. @@ -305,6 +320,7 @@ continue=Продовжити cancel=Відміна language=Мова +lookup_avatar_by_mail=Знайти Аватар за адресою електронної пошти federated_avatar_lookup=Знайти зовнішній аватар enable_custom_avatar=Увімкнути користувацькі аватари choose_new_avatar=Оберіть новий аватар @@ -328,9 +344,13 @@ primary=Основний primary_email=Зробити основним delete_email=Видалити email_deletion=Видалити адресу електронної пошти +openid_deletion=Видалити адресу OpenID add_new_email=Додати нову адресу електронної пошти +add_new_openid=Додати новий OpenID URI add_email=Додати адресу електронної пошти +add_openid=Додати OpenID URI add_email_confirmation_sent=Електронний лист із підтвердженням було відправлено на '%s', будь ласка, перевірте вашу поштову скриньку протягом наступних %s, щоб підтвердити адресу. +add_email_success=Додано нову адресу електронної пошти. keep_email_private=Приховати адресу електронної пошти keep_email_private_popup=Вашу адресу електронної пошти буде приховано від інших користувачів. @@ -345,6 +365,8 @@ subkeys=Підключі key_id=ID ключа key_name=Ім'я ключа key_content=Зміст +add_key_success=SSH ключ '%s' додано. +add_gpg_key_success=GPG ключ '%s' додано. delete_key=Видалити ssh_key_deletion=Видалити SSH ключ gpg_key_deletion=Видалити GPG ключ @@ -378,15 +400,20 @@ access_token_deletion=Видалити токен доступу twofa_disable=Вимкнути двофакторну автентифікацію or_enter_secret=Або введіть секрет: %s +passcode_invalid=Некоректний пароль. Спробуй ще раз. +u2f_register_key=Додати ключ безпеки u2f_nickname=Псевдонім +u2f_delete_key=Видалити ключ безпеки manage_account_links=Керування обліковими записами remove_account_link=Видалити облікові записи orgs_none=Ви не є учасником будь-якої організації. +repos_none=У вас немає власних репозиторіїв delete_account=Видалити ваш обліковий запис +delete_prompt=Ця операція остаточно видалить обліковий запис користувача. Це НЕ МОЖЛИВО відмінити. confirm_delete_account=Підтвердження видалення delete_account_title=Видалити цей обліковий запис @@ -410,6 +437,7 @@ create_repo=Створити репозиторій default_branch=Головна гілка mirror_prune=Очистити mirror_interval=Інтервал дзеркалювання (доступні значення 'h', 'm', 's') +mirror_interval_invalid=Інтервал дзеркалювання є неприпустимим. mirror_address=Клонування з URL-адреси mirror_last_synced=Остання синхронізація watchers=Спостерігачі @@ -419,11 +447,12 @@ pick_reaction=Залиште свою оцінку reactions_more=додати %d більше form.reach_limit_of_creation=Ви досягли максимальної кількості %d створених репозиторіїв. +form.name_reserved=Назву репозиторію '%s' зарезервовано. need_auth=Клонувати з авторизацією migrate_type=Тип міграції migrate_type_helper=Даний репозиторій буде дзеркалом -migrate_repo=Перенесення репозиторія +migrate_repo=Перенести репозиторій migrate.clone_address=Міграція / клонувати з URL-адреси migrate.clone_address_desc=URL-адреса HTTP(S) або Git "clone" існуючого репозиторія migrate.clone_local_path=або шлях до локального серверу @@ -435,6 +464,7 @@ mirror_from=дзеркало forked_from=форк від fork_from_self=Ви не можете форкнути репозиторій, так як ви його власник. copy_link=Копіювати +copy_link_success=Посилання було скопійоване copy_link_error=Натисніть ⌘-C або Ctrl-C, щоб скопіювати copied=Скопійовано unwatch=Не стежити @@ -462,12 +492,14 @@ pulls=Запити на злиття labels=Мітки milestones=Етап commits=Коміти -commit=Змина +commit=Коміт releases=Релізи file_raw=Неформатований file_history=Історія file_view_raw=Перегляд Raw file_permalink=Постійне посилання +file_too_large=Цей файл завеликий щоб бути показаним. +video_not_supported_in_browser=Ваш браузер не підтримує тег 'video' HTML5. stored_lfs=Збережено з Git LFS commit_graph=Графік комітів @@ -475,11 +507,13 @@ editor.new_file=Новий файл editor.upload_file=Завантажити файл editor.edit_file=Редагування файлу editor.preview_changes=Попередній перегляд змін +editor.cannot_edit_non_text_files=Бінарні файли не можливо редагувати у веб-інтерфейсі. editor.edit_this_file=Редагувати файл editor.must_be_on_a_branch=Ви повинні бути у гілці щоб зробити, або запропонувати зміни до цього файлу. editor.fork_before_edit=Необхідно зробити форк цього репозиторій, щоб внести або запропонувати зміни в цей файл. editor.delete_this_file=Видалити файл editor.must_have_write_access=Ви повинні мати доступ на запис щоб запропонувати зміни до цього файлу. +editor.file_delete_success=Файл '%s' видалено. editor.name_your_file=Дайте назву файлу… editor.or=або editor.cancel_lower=Скасувати @@ -493,7 +527,10 @@ editor.commit_directly_to_this_branch=Зробіть коміт прямо в г editor.create_new_branch=Створити нову гілку для цього коміту та відкрити запит на злиття. editor.new_branch_name_desc=Ім'я нової гілки… editor.cancel=Відміна +editor.filename_cannot_be_empty=Ім'я файлу не може бути порожнім. editor.branch_already_exists=Гілка '%s' вже присутня в репозиторії. +editor.directory_is_a_file=Ім'я каталогу "%s" уже використовується як ім'я файлу в цьому репозиторії. +editor.file_already_exists=Файл з назвою "%s" уже існує у цьому репозиторію. editor.no_changes_to_show=Нема змін для показу. editor.fail_to_update_file=Не вдалося оновити/створити файл '%s' через помилку: %v editor.add_subdir=Додати каталог… @@ -509,6 +546,7 @@ commits.message=Повідомлення commits.date=Дата commits.older=Давніше commits.newer=Новіше +commits.signed_by=Підписано ext_issues=Зов. Проблеми @@ -559,6 +597,7 @@ issues.filter_sort.recentupdate=Нещодавно оновлено issues.filter_sort.leastupdate=Найдавніше оновлені issues.filter_sort.mostcomment=Найбільш коментовані issues.filter_sort.leastcomment=Найменш коментовані +issues.filter_sort.mostforks=Найбільше форків issues.action_open=Відкрити issues.action_close=Закрити issues.action_label=Мітка @@ -600,6 +639,7 @@ issues.label_edit=Редагувати issues.label_delete=Видалити issues.label_modify=Редагувати мітку issues.label_deletion=Видалити мітку +issues.label_deletion_success=Мітку було видалено. issues.label.filter_sort.alphabetically=За алфавітом issues.label.filter_sort.reverse_alphabetically=З кінця алфавіту issues.label.filter_sort.by_size=Розмір @@ -653,6 +693,8 @@ pulls.has_merged=Запит на злиття було об'єднано. pulls.can_auto_merge_desc=Цей запит можна об'єднати автоматично. pulls.cannot_auto_merge_desc=Цей запит на злиття не може бути злитий автоматично через конфлікти. pulls.cannot_auto_merge_helper=Злийте вручну для вирішення конфліктів. +pulls.no_merge_desc=Цей запити на злиття неможливо злити, оскільки всі параметри об'єднання репозиторія вимкнено. +pulls.no_merge_helper=Увімкніть параметри злиття в налаштуваннях репозиторія або злийте запити на злиття вручну. pulls.merge_pull_request=Об'єднати запит на злиття pulls.rebase_merge_pull_request=Зробити Rebase і злити pulls.squash_merge_pull_request=Об'єднати (Squash) і злити @@ -755,6 +797,7 @@ settings.use_internal_wiki=Використовувати вбудовані В settings.use_external_wiki=Використовувати зовнішні Вікі settings.external_wiki_url=URL зовнішньої вікі settings.issues_desc=Увімкнути відстеження проблем в репозиторію +settings.use_internal_issue_tracker=Використовувати вбудовану систему відстеження проблем settings.external_tracker_url=URL зовнішньої системи відстеження проблем settings.tracker_url_format=Формат URL зовнішнього трекера задач settings.tracker_issue_style.numeric=Цифровий @@ -783,6 +826,7 @@ settings.transfer_owner=Новий власник settings.make_transfer=Здіснити перенесення settings.confirm_delete=Видалити репозиторій settings.add_collaborator=Додати співавтора +settings.add_collaborator_success=Додано співавтора. settings.delete_collaborator=Видалити settings.collaborator_deletion=Видалити співавтора settings.search_user_placeholder=Пошук користувача… @@ -844,6 +888,8 @@ settings.add_deploy_key=Додати ключ для розгортування settings.is_writable=Увімкнути доступ для запису settings.title=Заголовок settings.deploy_key_content=Зміст +settings.deploy_key_deletion=Видалити ключ для розгортування +settings.deploy_key_deletion_success=Ключі розгортання було видалено. settings.branches=Гілки settings.protected_branch=Захист гілки settings.protected_branch_can_push=Дозволити push? @@ -853,6 +899,7 @@ settings.protect_whitelist_search_users=Пошук користувачів… settings.protect_whitelist_search_teams=Пошук команд… settings.add_protected_branch=Увімкнути захист settings.delete_protected_branch=Вимкнути захист +settings.protected_branch_deletion=Відключити захист гілки settings.choose_branch=Оберіть гілку… settings.no_protected_branch=Немає захищених гілок. @@ -892,6 +939,8 @@ release.save_draft=Зберегти чернетку release.edit_release=Оновити реліз release.delete_release=Видалити реліз release.deletion=Видалити реліз +release.deletion_success=Реліз, було видалено. +release.tag_name_invalid=Неприпустиме ім'я тега. release.downloads=Завантажити branch.name=Ім'я гілки @@ -899,9 +948,13 @@ branch.search=Пошук гілок branch.delete_head=Видалити branch.delete=Видалити гілку '%s' branch.delete_html=Видалити гілку +branch.deletion_success=Гілка '%s' видалена. +branch.deletion_failed=Не вдалося видалити гілку "%s". branch.create_from=з '%s' +branch.create_success=Створено гілку "%s". branch.branch_already_exists=Гілка '%s' вже присутня в репозиторії. branch.deleted_by=Видалено %s +branch.restore_success=Гілку "%s" відновлено. topic.manage_topics=Керувати тематичними мітками topic.done=Готово @@ -921,9 +974,11 @@ org_desc=Опис team_name=Назва команди team_desc=Опис team_name_helper=Назва команди має бути простою та зрозумілою. +team_desc_helper=Опишіть мету або роль команди. team_permission_desc=Права доступу team_unit_desc=Дозволити доступ до розділів репозиторію +form.name_reserved=Назву організації '%s' зарезервовано. settings=Налаштування settings.options=Організація @@ -931,6 +986,9 @@ settings.full_name=Повне ім'я settings.website=Веб-сайт settings.location=Розташування settings.update_settings=Оновити налаштування +settings.update_setting_success=Налаштування організації оновлені. +settings.change_orgname_prompt=Ця зміна змінить посилання на організацію. +settings.update_avatar_success=Аватар організації оновлений. settings.delete=Видалити організацію settings.delete_account=Видалити цю організацію settings.confirm_delete_account=Підтвердіть видалення @@ -962,6 +1020,7 @@ teams.update_settings=Оновити налаштування teams.delete_team=Видалити команду teams.add_team_member=Додати учасника команди teams.delete_team_title=Видалити команду +teams.delete_team_success=Команду було видалено. teams.read_permission_desc=Ця команда має доступ для читання: учасники можуть переглядати та клонувати репозиторії. teams.write_permission_desc=Ця команда надає доступ на запис: учасники можуть отримувати й виконувати push команди до репозитрію. teams.admin_permission_desc=Ця команда надає адміністраторський доступ: учасники можуть читати, виконувати push команди та додавати співробітників до репозиторію. @@ -985,23 +1044,29 @@ last_page=Остання total=Разом: %d dashboard.statistic=Підсумок +dashboard.operations=Технічне обслуговування dashboard.system_status=Статус системи dashboard.operation_name=Назва операції dashboard.operation_switch=Перемкнути dashboard.operation_run=Запустити dashboard.delete_inactivate_accounts=Видалити всі неактивні облікові записи dashboard.delete_inactivate_accounts_success=Усі неактивні облікові записи успішно видалено. +dashboard.delete_repo_archives=Видалити всі архіви репозиторіїв dashboard.git_gc_repos_success=Всі репозиторії завершили збирання сміття. dashboard.server_uptime=Uptime серверу +dashboard.current_goroutine=Поточна кількість Goroutines dashboard.current_memory_usage=Поточне використання пам'яті dashboard.total_memory_allocated=Виділено пам'яті загалом dashboard.memory_obtained=Отримано пам'яті +dashboard.pointer_lookup_times=Пошуків вказівника +dashboard.memory_allocate_times=Виділення пам'яті dashboard.current_heap_usage=Поточне використання динамічної пам'яті dashboard.heap_memory_obtained=Отримано динамічної пам'яті dashboard.heap_memory_idle=Не використовується динамічною пам'яттю dashboard.heap_memory_in_use=Використовується динамічною пам'яттю dashboard.heap_memory_released=Звільнено динамічної пам'яті dashboard.heap_objects=Об'єктів динамічної пам'яті +dashboard.bootstrap_stack_usage=Використання стеку Bootstrap dashboard.stack_memory_obtained=Зайнято пам'яті стеком dashboard.mspan_structures_usage=Використання структур MSpan dashboard.mspan_structures_obtained=Отримано структур MSpan @@ -1029,6 +1094,7 @@ users.send_register_notify=Надіслати повідомлення про р users.edit=Редагувати users.auth_source=Джерело автентифікації users.local=Локальні +users.update_profile_success=Обліковий запис користувача було оновлено. users.edit_account=Редагувати обліковий запис users.max_repo_creation=Максимальна кількість репозиторіїв users.max_repo_creation_desc=(Введіть -1, щоб використовувати глобальний ліміт за замовчуванням.) @@ -1040,6 +1106,7 @@ users.allow_import_local=Може імпортувати локальні реп users.allow_create_organization=Може створювати організацій users.update_profile=Оновити обліковий запис users.delete_account=Видалити цей обліковий запис +users.deletion_success=Обліковий запис користувача було видалено. orgs.org_manage_panel=Керування організаціями orgs.name=Назва @@ -1047,7 +1114,7 @@ orgs.teams=Команди orgs.members=Учасники orgs.new_orga=Нова організація -repos.repo_manage_panel=Керування організаціями +repos.repo_manage_panel=Керування репозиторіями repos.owner=Власник repos.name=Назва repos.private=Приватний @@ -1062,6 +1129,7 @@ auths.new=Додати джерело автентифікації auths.name=Ім'я auths.type=Тип auths.enabled=Увімкнено +auths.syncenabled=Увімкнути синхронізацію користувача auths.updated=Оновлено auths.auth_type=Тип автентифікації auths.auth_name=Назва автентифікації @@ -1069,8 +1137,11 @@ auths.security_protocol=Протокол безпеки auths.domain=Домен auths.host=Хост auths.port=Порт +auths.bind_dn=Прив'язати DN +auths.bind_password=Прив'язати пароль auths.user_base=База пошуку користувачів auths.user_dn=DN користувача +auths.attribute_username=Атрибут імені користувача auths.search_page_size=Розмір сторінки auths.filter=Користувацький фільтр auths.admin_filter=Фільтр адміністратора @@ -1082,6 +1153,7 @@ auths.enable_tls=Увімкнути TLS-шифрування auths.skip_tls_verify=Пропустити перевірку TLS auths.pam_service_name=Ім'я служби PAM auths.oauth2_provider=Постачальник OAuth2 +auths.oauth2_clientID=ID клієнта (ключ) auths.oauth2_clientSecret=Ключ клієнта auths.oauth2_tokenURL=URL токену auths.oauth2_authURL=URL авторизації @@ -1121,6 +1193,7 @@ config.script_type=Тип скрипта config.ssh_config=Конфігурація SSH config.ssh_enabled=Увімкнено +config.ssh_start_builtin_server=Використовувати вбудований сервер config.ssh_domain=Домен сервера config.ssh_port=Порт config.ssh_listen_port=Порт що прослуховується @@ -1136,9 +1209,7 @@ config.db_host=Хост config.db_name=Ім'я config.db_user=Ім'я кристувача config.db_ssl_mode=SSL -config.db_ssl_mode_helper=(тільки для "postgres") config.db_path=Шлях -config.db_path_helper=(для "sqlite3" і "tidb") config.service_config=Конфігурація сервісу config.register_email_confirm=Потрібно підтвердити електронну пошту для реєстрації @@ -1189,6 +1260,7 @@ config.session_life_time=Час життя сесії config.https_only=Тільки HTTPS config.cookie_life_time=Час життя cookie-файлу +config.picture_config=Налаштування фотографії або аватари config.picture_service=Сервіс зображень config.disable_gravatar=Вимкнути Gravatar config.enable_federated_avatar=Увімкнути зовнішні аватари @@ -1213,12 +1285,14 @@ monitor.name=Ім'я monitor.schedule=Розклад monitor.next=Наступного разу monitor.previous=Попереднього разу +monitor.execute_times=Кількість виконань monitor.process=Запущені процеси monitor.desc=Опис monitor.start=Час початку monitor.execute_time=Час виконання notices.system_notice_list=Сповіщення системи +notices.view_detail_header=Переглянути деталі повідомлення notices.actions=Дії notices.select_all=Вибрати все notices.deselect_all=Скасувати виділення @@ -1273,6 +1347,7 @@ raw_minutes=хвилини [dropzone] default_message=Перетягніть файли або натисніть тут, щоб завантажити. +invalid_input_type=Ви не можете завантажувати файли цього типу. file_too_big=Розмір файлу ({{filesize}} MB), що більше ніж максимальний розмір: ({{maxFilesize}} MB). remove_file=Видалити файл @@ -1288,6 +1363,7 @@ mark_as_unread=Позначити як непрочитане mark_all_as_read=Позначити всі як прочитані [gpg] +error.generate_hash=Не вдалося згенерувати хеш коміту error.not_signed_commit=Непідписаний коміт [units] diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index b57eeed1a..658f133a2 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -213,7 +213,6 @@ send_reset_mail=单击此处(重新)发送您的密码重置邮件 reset_password=重置密码 invalid_code=此确认密钥无效或已过期。 reset_password_helper=单击此处重置密码 -password_too_short=密码长度不能少于 %d 位! non_local_account=非本地帐户不能通过 Gitea 的 web 界面更改密码。 verify=验证 scratch_code=验证口令 @@ -1475,9 +1474,7 @@ config.db_host=主机 config.db_name=数据库名称 config.db_user=用户名 config.db_ssl_mode=SSL -config.db_ssl_mode_helper=(仅限 "postgres" 使用) config.db_path=数据库路径 -config.db_path_helper=(用于 "sqlite3" 和 "tidb") config.service_config=服务配置 config.register_email_confirm=需要电子邮件确认注册 diff --git a/options/locale/locale_zh-HK.ini b/options/locale/locale_zh-HK.ini index 75d6a2db5..d8b8e210c 100644 --- a/options/locale/locale_zh-HK.ini +++ b/options/locale/locale_zh-HK.ini @@ -94,7 +94,6 @@ email_not_associate=此電子郵件地址未與任何帳戶連結 send_reset_mail=點選此處重發您的密碼重製郵件 reset_password=重置密碼 reset_password_helper=單擊此處重置密碼 -password_too_short=密碼長度不能少於 %d 位! verify=驗證 scratch_code=備用碼 use_scratch_code=使用備用碼 @@ -737,9 +736,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=顯示註冊按鈕 diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index fbe418a7d..8a6914af2 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -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=使用備用碼 @@ -808,9 +807,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=顯示註冊按鈕 diff --git a/public/css/index.css b/public/css/index.css index 607ab3f6a..2ee3e8314 100644 --- a/public/css/index.css +++ b/public/css/index.css @@ -1 +1 @@ -.tribute-container{box-shadow:0 1px 3px 1px #c7c7c7}.tribute-container ul{background:#fff}.tribute-container li{padding:8px 12px;border-bottom:1px solid #dcdcdc}.tribute-container li img{display:inline-block;vertical-align:middle;width:28px;height:28px;margin-right:5px}.tribute-container li span.fullname{font-weight:400;font-size:.8rem;margin-left:3px}.tribute-container li.highlight,.tribute-container li:hover{background:#2185D0;color:#fff}.emoji{width:1.5em;height:1.5em;display:inline-block;background-size:contain}body{font-family:Lato,"Segoe UI","Microsoft YaHei",Arial,Helvetica,sans-serif!important;background-color:#fff;overflow-y:scroll;-webkit-font-smoothing:antialiased}img{border-radius:3px}.rounded{border-radius:.28571429rem!important}code,pre{font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace}code.raw,pre.raw{padding:7px 12px;margin:10px 0;background-color:#f8f8f8;border:1px solid #ddd;border-radius:3px;font-size:13px;line-height:1.5;overflow:auto}code.wrap,pre.wrap{white-space:pre-wrap;-ms-word-break:break-all;word-break:break-all;overflow-wrap:break-word;word-wrap:break-word}.dont-break-out{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.full.height{padding:0;margin:0 0 -40px 0;min-height:100%}.following.bar{z-index:900;left:0;width:100%;margin:0}.following.bar.light{background-color:#fff;border-bottom:1px solid #DDD;box-shadow:0 2px 3px rgba(0,0,0,.04)}.following.bar .column .menu{margin-top:0}.following.bar .top.menu a.item.brand{padding-left:0}.following.bar .brand .ui.mini.image{width:30px}.following.bar .top.menu .dropdown.item.active,.following.bar .top.menu .dropdown.item:hover,.following.bar .top.menu a.item:hover{background-color:transparent}.following.bar .top.menu a.item:hover{color:rgba(0,0,0,.45)}.following.bar .top.menu .menu{z-index:900}.following.bar .octicon{margin-right:.75em}.following.bar .octicon.fitted{margin-right:0}.following.bar .searchbox{background-color:#f4f4f4!important}.following.bar .searchbox:focus{background-color:#e9e9e9!important}.following.bar .text .octicon{width:16px;text-align:center}@media only screen and (max-width:767px){.following.bar #navbar:not(.shown)>:not(:first-child){display:none}}.right.stackable.menu{margin-left:auto;display:flex;display:-ms-flexbox;-ms-flex-align:inherit;align-items:inherit;-ms-flex-direction:inherit;flex-direction:inherit}.ui.left{float:left}.ui.right{float:right}.ui.button,.ui.menu .item{-moz-user-select:auto;-ms-user-select:auto;-webkit-user-select:auto;user-select:auto}.ui.container.fluid.padded{padding:0 10px 0 10px}.ui.form .ui.button{font-weight:400}.ui.floating.label{z-index:10}.ui.menu,.ui.segment,.ui.vertical.menu{box-shadow:none}.ui .menu:not(.vertical) .item>.button.compact{padding:.58928571em 1.125em}.ui .menu:not(.vertical) .item>.button.small{font-size:.92857143rem}.ui.dropdown .menu>.item>.floating.label{z-index:11}.ui.dropdown .menu .menu>.item>.floating.label{z-index:21}.ui .text.red{color:#d95c5c!important}.ui .text.red a{color:#d95c5c!important}.ui .text.red a:hover{color:#E67777!important}.ui .text.blue{color:#428bca!important}.ui .text.blue a{color:#15c!important}.ui .text.blue a:hover{color:#428bca!important}.ui .text.black{color:#444}.ui .text.black:hover{color:#000}.ui .text.grey{color:#767676!important}.ui .text.grey a{color:#444!important}.ui .text.grey a:hover{color:#000!important}.ui .text.light.grey{color:#888!important}.ui .text.green{color:#6cc644!important}.ui .text.purple{color:#6e5494!important}.ui .text.yellow{color:#FBBD08!important}.ui .text.gold{color:#a1882b!important}.ui .text.left{text-align:left!important}.ui .text.right{text-align:right!important}.ui .text.small{font-size:.75em}.ui .text.normal{font-weight:400}.ui .text.bold{font-weight:700}.ui .text.italic{font-style:italic}.ui .text.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}.ui .text.thin{font-weight:400}.ui .text.middle{vertical-align:middle}.ui .message{text-align:center}.ui .header>i+.content{padding-left:.75rem;vertical-align:middle}.ui .warning.header{background-color:#F9EDBE!important;border-color:#F0C36D}.ui .warning.segment{border-color:#F0C36D}.ui .info.segment{border:1px solid #c5d5dd}.ui .info.segment.top{background-color:#e6f1f6!important}.ui .info.segment.top h3,.ui .info.segment.top h4{margin-top:0}.ui .info.segment.top h3:last-child{margin-top:4px}.ui .info.segment.top>:last-child{margin-bottom:0}.ui .normal.header{font-weight:400}.ui .avatar.image{border-radius:3px}.ui .form .fake{display:none!important}.ui .form .sub.field{margin-left:25px}.ui .sha.label{font-family:Consolas,Menlo,Monaco,"Lucida Console",monospace;font-size:13px;padding:6px 10px 4px 10px;font-weight:400;margin:0 6px}.ui.status.buttons .octicon{margin-right:4px}.ui.inline.delete-button{padding:8px 15px;font-weight:400}.ui .background.red{background-color:#d95c5c!important}.ui .background.blue{background-color:#428bca!important}.ui .background.black{background-color:#444}.ui .background.grey{background-color:#767676!important}.ui .background.light.grey{background-color:#888!important}.ui .background.green{background-color:#6cc644!important}.ui .background.purple{background-color:#6e5494!important}.ui .background.yellow{background-color:#FBBD08!important}.ui .background.gold{background-color:#a1882b!important}.ui .branch-tag-choice{line-height:20px}.overflow.menu .items{max-height:300px;overflow-y:auto}.overflow.menu .items .item{position:relative;cursor:pointer;display:block;border:none;height:auto;border-top:none;line-height:1em;color:rgba(0,0,0,.8);padding:.71428571em 1.14285714em!important;font-size:1rem;text-transform:none;font-weight:400;box-shadow:none;-webkit-touch-callout:none}.overflow.menu .items .item.active{font-weight:700}.overflow.menu .items .item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.8);z-index:13}.scrolling.menu .item.selected{font-weight:700!important}footer{height:40px;background-color:#fff;border-top:1px solid #d6d6d6;clear:both;width:100%;color:#888}footer .container{padding-top:10px}footer .container .fa{width:16px;text-align:center;color:#428bca}footer .container .links>*{border-left:1px solid #d6d6d6;padding-left:8px;margin-left:5px}footer .container .links>:first-child{border-left:none}footer .ui.language .menu{max-height:500px;overflow-y:auto;margin-bottom:7px}.hide{display:none}.center{text-align:center}.img-1{width:2px!important;height:2px!important}.img-2{width:4px!important;height:4px!important}.img-3{width:6px!important;height:6px!important}.img-4{width:8px!important;height:8px!important}.img-5{width:10px!important;height:10px!important}.img-6{width:12px!important;height:12px!important}.img-7{width:14px!important;height:14px!important}.img-8{width:16px!important;height:16px!important}.img-9{width:18px!important;height:18px!important}.img-10{width:20px!important;height:20px!important}.img-11{width:22px!important;height:22px!important}.img-12{width:24px!important;height:24px!important}.img-13{width:26px!important;height:26px!important}.img-14{width:28px!important;height:28px!important}.img-15{width:30px!important;height:30px!important}.img-16{width:32px!important;height:32px!important}@media only screen and (min-width:768px){.mobile-only,.ui.button.mobile-only{display:none}.sr-mobile-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}}@media only screen and (max-width:767px){.not-mobile{display:none}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}@media only screen and (max-width:991px) and (min-width:768px){.ui.container{width:95%}}.hljs{background:inherit!important;padding:0!important}.ui.menu.new-menu{justify-content:center!important;padding-top:15px!important;margin-top:-15px!important;margin-bottom:15px!important;background-color:#FAFAFA!important;border-width:1px!important}@media only screen and (max-width:1200px){.ui.menu.new-menu{overflow-x:auto!important;justify-content:left!important;padding-bottom:5px}.ui.menu.new-menu::-webkit-scrollbar{height:8px;display:none}.ui.menu.new-menu:hover::-webkit-scrollbar{display:block}.ui.menu.new-menu::-webkit-scrollbar-track{background:rgba(0,0,0,.01)}.ui.menu.new-menu::-webkit-scrollbar-thumb{background:rgba(0,0,0,.2)}.ui.menu.new-menu:after{position:absolute;margin-top:-15px;display:block;background-image:linear-gradient(to right,rgba(255,255,255,0),#fff 100%);content:' ';right:0;height:53px;z-index:1000;width:60px;clear:none;visibility:visible}.ui.menu.new-menu a.item:last-child{padding-right:30px!important}}[v-cloak]{display:none!important}.repos-search{padding-bottom:0!important}.repos-filter{margin-top:0!important;border-bottom-width:0!important;margin-bottom:2px!important}.markdown:not(code){overflow:hidden;font-family:"Helvetica Neue",Helvetica,"Segoe UI",Arial,freesans,sans-serif;font-size:16px;line-height:1.6!important;word-wrap:break-word}.markdown:not(code).file-view{padding:2em 2em 2em!important}.markdown:not(code)>:first-child{margin-top:0!important}.markdown:not(code)>:last-child{margin-bottom:0!important}.markdown:not(code) a:not([href]){color:inherit;text-decoration:none}.markdown:not(code) .absent{color:#c00}.markdown:not(code) .anchor{position:absolute;top:0;left:0;display:block;padding-right:6px;padding-left:30px;margin-left:-30px}.markdown:not(code) .anchor:focus{outline:0}.markdown:not(code) h1,.markdown:not(code) h2,.markdown:not(code) h3,.markdown:not(code) h4,.markdown:not(code) h5,.markdown:not(code) h6{position:relative;margin-top:1em;margin-bottom:16px;font-weight:700;line-height:1.4}.markdown:not(code) h1:first-of-type,.markdown:not(code) h2:first-of-type,.markdown:not(code) h3:first-of-type,.markdown:not(code) h4:first-of-type,.markdown:not(code) h5:first-of-type,.markdown:not(code) h6:first-of-type{margin-top:0!important}.markdown:not(code) h1 .octicon-link,.markdown:not(code) h2 .octicon-link,.markdown:not(code) h3 .octicon-link,.markdown:not(code) h4 .octicon-link,.markdown:not(code) h5 .octicon-link,.markdown:not(code) h6 .octicon-link{display:none;color:#000;vertical-align:middle}.markdown:not(code) h1:hover .anchor,.markdown:not(code) h2:hover .anchor,.markdown:not(code) h3:hover .anchor,.markdown:not(code) h4:hover .anchor,.markdown:not(code) h5:hover .anchor,.markdown:not(code) h6:hover .anchor{padding-left:8px;margin-left:-30px;text-decoration:none}.markdown:not(code) h1:hover .anchor .octicon-link,.markdown:not(code) h2:hover .anchor .octicon-link,.markdown:not(code) h3:hover .anchor .octicon-link,.markdown:not(code) h4:hover .anchor .octicon-link,.markdown:not(code) h5:hover .anchor .octicon-link,.markdown:not(code) h6:hover .anchor .octicon-link{display:inline-block}.markdown:not(code) h1 code,.markdown:not(code) h1 tt,.markdown:not(code) h2 code,.markdown:not(code) h2 tt,.markdown:not(code) h3 code,.markdown:not(code) h3 tt,.markdown:not(code) h4 code,.markdown:not(code) h4 tt,.markdown:not(code) h5 code,.markdown:not(code) h5 tt,.markdown:not(code) h6 code,.markdown:not(code) h6 tt{font-size:inherit}.markdown:not(code) h1{padding-bottom:.3em;font-size:2.25em;line-height:1.2;border-bottom:1px solid #eee}.markdown:not(code) h1 .anchor{line-height:1}.markdown:not(code) h2{padding-bottom:.3em;font-size:1.75em;line-height:1.225;border-bottom:1px solid #eee}.markdown:not(code) h2 .anchor{line-height:1}.markdown:not(code) h3{font-size:1.5em;line-height:1.43}.markdown:not(code) h3 .anchor{line-height:1.2}.markdown:not(code) h4{font-size:1.25em}.markdown:not(code) h4 .anchor{line-height:1.2}.markdown:not(code) h5{font-size:1em}.markdown:not(code) h5 .anchor{line-height:1.1}.markdown:not(code) h6{font-size:1em;color:#777}.markdown:not(code) h6 .anchor{line-height:1.1}.markdown:not(code) blockquote,.markdown:not(code) dl,.markdown:not(code) ol,.markdown:not(code) p,.markdown:not(code) pre,.markdown:not(code) table,.markdown:not(code) ul{margin-top:0;margin-bottom:16px}.markdown:not(code) blockquote{margin-left:0}.markdown:not(code) hr{height:4px;padding:0;margin:16px 0;background-color:#e7e7e7;border:0 none}.markdown:not(code) ol,.markdown:not(code) ul{padding-left:2em}.markdown:not(code) ol.no-list,.markdown:not(code) ul.no-list{padding:0;list-style-type:none}.markdown:not(code) ol ol,.markdown:not(code) ol ul,.markdown:not(code) ul ol,.markdown:not(code) ul ul{margin-top:0;margin-bottom:0}.markdown:not(code) ol ol,.markdown:not(code) ul ol{list-style-type:lower-roman}.markdown:not(code) li>p{margin-top:0}.markdown:not(code) dl{padding:0}.markdown:not(code) dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}.markdown:not(code) dl dd{padding:0 16px;margin-bottom:16px}.markdown:not(code) blockquote{padding:0 15px;color:#777;border-left:4px solid #ddd}.markdown:not(code) blockquote>:first-child{margin-top:0}.markdown:not(code) blockquote>:last-child{margin-bottom:0}.markdown:not(code) table{width:auto;overflow:auto;word-break:normal;word-break:keep-all}.markdown:not(code) table th{font-weight:700}.markdown:not(code) table td,.markdown:not(code) table th{padding:6px 13px!important;border:1px solid #ddd!important}.markdown:not(code) table tr{background-color:#fff;border-top:1px solid #ccc}.markdown:not(code) table tr:nth-child(2n){background-color:#f8f8f8}.markdown:not(code) img{max-width:100%;box-sizing:border-box}.markdown:not(code) .emoji{max-width:none}.markdown:not(code) span.frame{display:block;overflow:hidden}.markdown:not(code) span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #ddd}.markdown:not(code) span.frame span img{display:block;float:left}.markdown:not(code) span.frame span span{display:block;padding:5px 0 0;clear:both;color:#333}.markdown:not(code) span.align-center{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown:not(code) span.align-center span img{margin:0 auto;text-align:center}.markdown:not(code) span.align-right{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown:not(code) span.align-right span img{margin:0;text-align:right}.markdown:not(code) span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown:not(code) span.float-left span{margin:13px 0 0}.markdown:not(code) span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown:not(code) span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown:not(code) code,.markdown:not(code) tt{padding:0;padding-top:.2em;padding-bottom:.2em;margin:0;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px}.markdown:not(code) code:after,.markdown:not(code) code:before,.markdown:not(code) tt:after,.markdown:not(code) tt:before{letter-spacing:-.2em;content:"\00a0"}.markdown:not(code) code br,.markdown:not(code) tt br{display:none}.markdown:not(code) del code{text-decoration:inherit}.markdown:not(code) pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:0 0;border:0}.markdown:not(code) .highlight{margin-bottom:16px}.markdown:not(code) .highlight pre,.markdown:not(code) pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f7f7f7;border-radius:3px}.markdown:not(code) .highlight pre{margin-bottom:0;word-break:normal}.markdown:not(code) pre{word-wrap:normal}.markdown:not(code) pre code,.markdown:not(code) pre tt{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown:not(code) pre code:after,.markdown:not(code) pre code:before,.markdown:not(code) pre tt:after,.markdown:not(code) pre tt:before{content:normal}.markdown:not(code) kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #ccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb}.markdown:not(code) input[type=checkbox]{vertical-align:middle!important}.markdown:not(code) .csv-data td,.markdown:not(code) .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown:not(code) .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown:not(code) .csv-data tr{border-top:0}.markdown:not(code) .csv-data th{font-weight:700;background:#f8f8f8;border-top:0}.markdown:not(code) .ui.list .list,.markdown:not(code) ol.ui.list ol,.markdown:not(code) ul.ui.list ul{padding-left:2em}.home{padding-bottom:80px}.home .logo{max-width:220px}.home .hero h1,.home .hero h2{font-family:'PT Sans Narrow',sans-serif,'Microsoft YaHei'}@media only screen and (max-width:767px){.home .hero h1{font-size:3.5em}.home .hero h2{font-size:2em}}@media only screen and (min-width:768px){.home .hero h1{font-size:5.5em}.home .hero h2{font-size:3em}}.home .hero .octicon{color:#5aa509;font-size:40px;width:50px}.home .hero.header{font-size:20px}.home p.large{font-size:16px}.home .stackable{padding-top:30px}.home a{color:#5aa509}.signup{padding-top:15px;padding-bottom:80px}.install{padding-top:45px;padding-bottom:80px}.install form label{text-align:right;width:320px!important}.install form input{width:35%!important}.install form .field{text-align:left}.install form .field .help{margin-left:335px!important}.install form .field.optional .title{margin-left:38%}.install .ui .checkbox{margin-left:40%!important}.install .ui .checkbox label{width:auto!important}.form .help{color:#999;padding-top:.6em;padding-bottom:.6em;display:inline-block}.ui.attached.header{background:#f0f0f0}.ui.attached.header .right{margin-top:-5px}.ui.attached.header .right .button{padding:8px 10px;font-weight:400}#create-page-form form{margin:auto}#create-page-form form .ui.message{text-align:center}@media only screen and (min-width:768px){#create-page-form form{width:800px!important}#create-page-form form .header{padding-left:280px!important}#create-page-form form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}#create-page-form form .help{margin-left:265px!important}#create-page-form form .optional .title{margin-left:250px!important}#create-page-form form input,#create-page-form form textarea{width:50%!important}}@media only screen and (max-width:767px){#create-page-form form .optional .title{margin-left:15px}#create-page-form form .inline.field>label{display:block}}.signin .oauth2 div{display:inline-block}.signin .oauth2 div p{margin:10px 5px 0 0;float:left}.signin .oauth2 a{margin-right:3px}.signin .oauth2 a:last-child{margin-right:0}.signin .oauth2 img{width:32px;height:32px}.signin .oauth2 img.openidConnect{width:auto}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{margin:auto}.user.activate form .ui.message,.user.forgot.password form .ui.message,.user.reset.password form .ui.message,.user.signin form .ui.message,.user.signup form .ui.message{text-align:center}@media only screen and (min-width:768px){.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:800px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:280px!important}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.user.activate form .help,.user.forgot.password form .help,.user.reset.password form .help,.user.signin form .help,.user.signup form .help{margin-left:265px!important}.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:250px!important}.user.activate form input,.user.activate form textarea,.user.forgot.password form input,.user.forgot.password form textarea,.user.reset.password form input,.user.reset.password form textarea,.user.signin form input,.user.signin form textarea,.user.signup form input,.user.signup form textarea{width:50%!important}}@media only screen and (max-width:767px){.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:15px}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{display:block}}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:700px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:0!important;text-align:center}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{width:200px!important}.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{margin:auto}.repository.new.fork form .ui.message,.repository.new.migrate form .ui.message,.repository.new.repo form .ui.message{text-align:center}@media only screen and (min-width:768px){.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{width:800px!important}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:280px!important}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.repository.new.fork form .help,.repository.new.migrate form .help,.repository.new.repo form .help{margin-left:265px!important}.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:250px!important}.repository.new.fork form input,.repository.new.fork form textarea,.repository.new.migrate form input,.repository.new.migrate form textarea,.repository.new.repo form input,.repository.new.repo form textarea{width:50%!important}}@media only screen and (max-width:767px){.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:15px}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{display:block}}.repository.new.fork form .dropdown .dropdown.icon,.repository.new.migrate form .dropdown .dropdown.icon,.repository.new.repo form .dropdown .dropdown.icon{margin-top:-7px!important}.repository.new.fork form .dropdown .text,.repository.new.migrate form .dropdown .text,.repository.new.repo form .dropdown .text{margin-right:0!important}.repository.new.fork form .dropdown .text i,.repository.new.migrate form .dropdown .text i,.repository.new.repo form .dropdown .text i{margin-right:0!important}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:0!important;text-align:center}.repository.new.repo .ui.form .selection.dropdown:not(.owner){width:50%!important}@media only screen and (min-width:768px){.repository.new.repo .ui.form #auto-init{margin-left:265px!important}}.new.webhook form .help{margin-left:25px}.new.webhook .events.fields .column{padding-left:40px}.githook textarea{font-family:monospace}.repository{padding-top:15px;padding-bottom:80px}.repository .header-grid{padding-top:5px;padding-bottom:5px}.repository .header-grid .ui.compact.menu{margin-left:1rem}.repository .header-grid .ui.header{margin-top:0}.repository .header-grid .mega-octicon{width:30px;font-size:30px}.repository .header-grid .ui.huge.breadcrumb{font-weight:400;font-size:1.7rem}.repository .header-grid .fork-flag{margin-left:38px;margin-top:3px;display:block;font-size:12px;white-space:nowrap}.repository .header-grid .octicon.octicon-repo-forked{margin-top:-1px;font-size:15px}.repository .header-grid .button{margin-top:2px;margin-bottom:2px}.repository .tabs .navbar{justify-content:initial}.repository .navbar{display:flex;justify-content:space-between}.repository .navbar .ui.label{margin-top:-2px;margin-left:7px;padding:3px 5px}.repository .owner.dropdown{min-width:40%!important}.repository #file-buttons{margin-left:auto!important;font-weight:400}.repository #file-buttons .ui.button{padding:8px 10px;font-weight:400}.repository .metas .menu{max-height:300px;overflow-x:auto}.repository .metas .ui.list .hide{display:none!important}.repository .metas .ui.list .item{padding:0}.repository .metas .ui.list .label.color{padding:0 8px;margin-right:5px}.repository .metas .ui.list a{margin:2px 0}.repository .metas .ui.list a .text{color:#444}.repository .metas .ui.list a .text:hover{color:#000}.repository .header-wrapper{background-color:#FAFAFA;margin-top:-15px;padding-top:15px}.repository .header-wrapper .ui.tabs.divider{border-bottom:none}.repository .header-wrapper .ui.tabular .octicon{margin-right:5px}.repository .filter.menu .label.color{border-radius:3px;margin-left:15px;padding:0 8px}.repository .filter.menu .octicon{float:left;margin:5px -7px 0 -5px;width:16px}.repository .filter.menu .text{margin-left:.9em}.repository .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.repository .filter.menu .dropdown.item{margin:1px;padding-right:0}.repository .select-label .item{max-width:250px;overflow:hidden;text-overflow:ellipsis}.repository .select-label .desc{padding-left:16px}.repository .ui.tabs.container{margin-top:14px;margin-bottom:0}.repository .ui.tabs.container .ui.menu{border-bottom:none}.repository .ui.tabs.divider{margin-top:0;margin-bottom:20px}.repository #clone-panel{width:350px}.repository #clone-panel input{border-radius:0;padding:5px 10px}.repository #clone-panel .clone.button{font-size:13px;padding:0 5px}.repository #clone-panel .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository #clone-panel .icon.button{padding:0 10px}.repository #clone-panel .dropdown .menu{right:0!important;left:auto!important}.repository.file.list .repo-description{display:flex;justify-content:space-between;align-items:center}.repository.file.list #repo-desc{font-size:1.2em}.repository.file.list .choose.reference .header .icon{font-size:1.4em}.repository.file.list .repo-path .divider,.repository.file.list .repo-path .section{display:inline}.repository.file.list #file-buttons{font-weight:400}.repository.file.list #file-buttons .ui.button{padding:8px 10px;font-weight:400}.repository.file.list #repo-files-table thead th{padding-top:8px;padding-bottom:5px;font-weight:400}.repository.file.list #repo-files-table thead th:first-child{display:block;position:relative;width:325%}.repository.file.list #repo-files-table thead .ui.avatar{margin-bottom:5px}.repository.file.list #repo-files-table tbody .octicon{margin-left:3px;margin-right:5px;color:#777}.repository.file.list #repo-files-table tbody .octicon.octicon-mail-reply{margin-right:10px}.repository.file.list #repo-files-table tbody .octicon.octicon-file-directory,.repository.file.list #repo-files-table tbody .octicon.octicon-file-submodule,.repository.file.list #repo-files-table tbody .octicon.octicon-file-symlink-directory{color:#1e70bf}.repository.file.list #repo-files-table td{padding-top:8px;padding-bottom:8px}.repository.file.list #repo-files-table td.message .isSigned{cursor:default}.repository.file.list #repo-files-table tr:hover{background-color:#ffE}.repository.file.list #repo-files-table .jumpable-path{color:#888}.repository.file.list .non-diff-file-content .header .icon{font-size:1em}.repository.file.list .non-diff-file-content .header .file-actions{margin-top:0;margin-bottom:-5px;padding-left:20px}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon{display:inline-block;padding:5px;margin-left:5px;line-height:1;color:#767676;vertical-align:middle;background:0 0;border:0;outline:0}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon:hover{color:#4078c0}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon-danger:hover{color:#bd2c00}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon.disabled{color:#bbb;cursor:default}.repository.file.list .non-diff-file-content .header .file-actions #delete-file-form{display:inline-block}.repository.file.list .non-diff-file-content .view-raw{padding:5px}.repository.file.list .non-diff-file-content .view-raw *{max-width:100%}.repository.file.list .non-diff-file-content .view-raw img{padding:5px 5px 0 5px}.repository.file.list .non-diff-file-content .plain-text{padding:1em 2em 1em 2em}.repository.file.list .non-diff-file-content .code-view *{font-size:12px;font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;line-height:20px}.repository.file.list .non-diff-file-content .code-view table{width:100%}.repository.file.list .non-diff-file-content .code-view .lines-num{vertical-align:top;text-align:right;color:#999;background:#f5f5f5;width:1%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}.repository.file.list .non-diff-file-content .code-view .lines-num span{line-height:20px;padding:0 10px;cursor:pointer;display:block}.repository.file.list .non-diff-file-content .code-view .lines-code,.repository.file.list .non-diff-file-content .code-view .lines-num{padding:0}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs,.repository.file.list .non-diff-file-content .code-view .lines-code ol,.repository.file.list .non-diff-file-content .code-view .lines-code pre,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs,.repository.file.list .non-diff-file-content .code-view .lines-num ol,.repository.file.list .non-diff-file-content .code-view .lines-num pre{background-color:#fff;margin:0;padding:0!important}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li,.repository.file.list .non-diff-file-content .code-view .lines-code ol li,.repository.file.list .non-diff-file-content .code-view .lines-code pre li,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li,.repository.file.list .non-diff-file-content .code-view .lines-num ol li,.repository.file.list .non-diff-file-content .code-view .lines-num pre li{display:block;width:100%}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li.active,.repository.file.list .non-diff-file-content .code-view .lines-code ol li.active,.repository.file.list .non-diff-file-content .code-view .lines-code pre li.active,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li.active,.repository.file.list .non-diff-file-content .code-view .lines-num ol li.active,.repository.file.list .non-diff-file-content .code-view .lines-num pre li.active{background:#ffd}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li:before,.repository.file.list .non-diff-file-content .code-view .lines-code ol li:before,.repository.file.list .non-diff-file-content .code-view .lines-code pre li:before,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li:before,.repository.file.list .non-diff-file-content .code-view .lines-num ol li:before,.repository.file.list .non-diff-file-content .code-view .lines-num pre li:before{content:' '}.repository.file.list .non-diff-file-content .code-view .active{background:#ffd}.repository.file.list .sidebar{padding-left:0}.repository.file.list .sidebar .octicon{width:16px}.repository.file.editor .treepath{width:100%}.repository.file.editor .treepath input{vertical-align:middle;box-shadow:rgba(0,0,0,.0745098) 0 1px 2px inset;width:inherit;padding:7px 8px;margin-right:5px}.repository.file.editor .tabular.menu .octicon{margin-right:5px}.repository.file.editor .commit-form-wrapper{padding-left:64px}.repository.file.editor .commit-form-wrapper .commit-avatar{float:left;margin-left:-64px;width:3em;height:auto}.repository.file.editor .commit-form-wrapper .commit-form{position:relative;padding:15px;margin-bottom:10px;border:1px solid #ddd;border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form:after,.repository.file.editor .commit-form-wrapper .commit-form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.file.editor .commit-form-wrapper .commit-form:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#fff}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .branch-name{display:inline-block;padding:3px 6px;font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace;color:rgba(0,0,0,.65);background-color:rgba(209,227,237,.45);border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input{position:relative;margin-left:25px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input input{width:240px!important;padding-left:26px!important}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .octicon-git-branch{position:absolute;top:9px;left:10px;color:#b0c4ce}.repository.options #interval{width:100px!important;min-width:100px}.repository.options .danger .item{padding:20px 15px}.repository.options .danger .ui.divider{margin:0}.repository.new.issue .comment.form .comment .avatar{width:3em}.repository.new.issue .comment.form .content{margin-left:4em}.repository.new.issue .comment.form .content:after,.repository.new.issue .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.new.issue .comment.form .content:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.new.issue .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.new.issue .comment.form .content:after{border-right-color:#fff}.repository.new.issue .comment.form .content .markdown{font-size:14px}.repository.new.issue .comment.form .metas{min-width:220px}.repository.new.issue .comment.form .metas .filter.menu{max-height:300px;overflow-x:auto}.repository.view.issue .title{padding-bottom:0!important}.repository.view.issue .title h1{font-weight:300;font-size:2.3rem;margin-bottom:5px}.repository.view.issue .title h1 .ui.input{font-size:.5em;vertical-align:top;width:50%;min-width:600px}.repository.view.issue .title h1 .ui.input input{font-size:1.5em;padding:6px 10px}.repository.view.issue .title .index{font-weight:300;color:#aaa;letter-spacing:-1px}.repository.view.issue .title .label{margin-right:10px}.repository.view.issue .title .edit-zone{margin-top:10px}.repository.view.issue .pull-desc code{color:#0166E6}.repository.view.issue .pull.tabular.menu{margin-bottom:10px}.repository.view.issue .pull.tabular.menu .octicon{margin-right:5px}.repository.view.issue .pull.tab.segment{border:none;padding:0;padding-top:10px;box-shadow:none;background-color:inherit}.repository.view.issue .pull .merge.box .avatar{margin-left:10px;margin-top:10px}.repository.view.issue .comment-list:before{display:block;content:"";position:absolute;margin-top:12px;margin-bottom:14px;top:0;bottom:0;left:96px;width:2px;background-color:#f3f3f3;z-index:-1}.repository.view.issue .comment-list .comment .avatar{width:3em}.repository.view.issue .comment-list .comment .tag{color:#767676;margin-top:3px;padding:2px 5px;font-size:12px;border:1px solid rgba(0,0,0,.1);border-radius:3px}.repository.view.issue .comment-list .comment .actions .item{float:left}.repository.view.issue .comment-list .comment .actions .item.tag{margin-right:5px}.repository.view.issue .comment-list .comment .actions .item.action{margin-top:6px;margin-left:10px}.repository.view.issue .comment-list .comment .content{margin-left:4em}.repository.view.issue .comment-list .comment .content>.header{font-weight:400;padding:auto 15px;position:relative;color:#767676;background-color:#f7f7f7;border-bottom:1px solid #eee;border-top-left-radius:3px;border-top-right-radius:3px}.repository.view.issue .comment-list .comment .content>.header:after,.repository.view.issue .comment-list .comment .content>.header:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.view.issue .comment-list .comment .content>.header:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.view.issue .comment-list .comment .content>.header:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.view.issue .comment-list .comment .content>.header .text{max-width:78%;padding-top:10px;padding-bottom:10px}.repository.view.issue .comment-list .comment .content .markdown{font-size:14px}.repository.view.issue .comment-list .comment .content .no-content{color:#767676;font-style:italic}.repository.view.issue .comment-list .comment .content>.bottom.segment{background:#f3f4f5}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.images::after{clear:both;content:' ';display:block}.repository.view.issue .comment-list .comment .content>.bottom.segment a{display:block;float:left;margin:5px;padding:5px;height:150px;border:solid 1px #eee;border-radius:3px;max-width:150px;background-color:#fff}.repository.view.issue .comment-list .comment .content>.bottom.segment a:before{content:' ';display:inline-block;height:100%;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.image{max-height:100%;width:auto;margin:0;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image{font-size:128px;color:#000}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image:hover{color:#000}.repository.view.issue .comment-list .comment .ui.form .field:first-child{clear:none}.repository.view.issue .comment-list .comment .ui.form .tab.segment{border:none;padding:0;padding-top:10px}.repository.view.issue .comment-list .comment .ui.form textarea{height:200px;font-family:Consolas,monospace}.repository.view.issue .comment-list .comment .edit.buttons{margin-top:10px}.repository.view.issue .comment-list .event{position:relative;margin:15px 0 15px 79px;padding-left:25px}.repository.view.issue .comment-list .event .octicon{width:30px;float:left;text-align:center}.repository.view.issue .comment-list .event .octicon.octicon-circle-slash{margin-top:5px;margin-left:-34.5px;font-size:20px;color:#bd2c00}.repository.view.issue .comment-list .event .octicon.octicon-primitive-dot{margin-left:-28.5px;margin-right:-1px;font-size:30px;color:#6cc644}.repository.view.issue .comment-list .event .octicon.octicon-bookmark{margin-top:3px;margin-left:-31px;margin-right:-1px;font-size:25px}.repository.view.issue .comment-list .event .detail{font-size:.9rem;margin-top:5px;margin-left:35px}.repository.view.issue .comment-list .event .detail .octicon.octicon-git-commit{margin-top:2px}.repository.view.issue .ui.segment.metas{margin-top:-3px}.repository.view.issue .ui.participants img{margin-top:5px;margin-right:5px}.repository .comment.form .ui.comments{margin-top:-12px;max-width:100%}.repository .comment.form .content .field:first-child{clear:none}.repository .comment.form .content .form:after,.repository .comment.form .content .form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository .comment.form .content .form:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository .comment.form .content .form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository .comment.form .content .form:after{border-right-color:#fff}.repository .comment.form .content .tab.segment{border:none;padding:0;padding-top:10px}.repository .comment.form .content textarea{height:200px;font-family:Consolas,monospace}.repository .label.list{list-style:none;padding-top:15px}.repository .label.list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .label.list .item a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .label.list .item a:hover{color:#000}.repository .label.list .item a.open-issues{margin-right:30px}.repository .label.list .item .ui.label{font-size:1em}.repository .milestone.list{list-style:none;padding-top:15px}.repository .milestone.list>.item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .milestone.list>.item>a{padding-top:5px;padding-right:10px;color:#000}.repository .milestone.list>.item>a:hover{color:#4078c0}.repository .milestone.list>.item .ui.progress{width:40%;padding:0;border:0;margin:0}.repository .milestone.list>.item .ui.progress .bar{height:20px}.repository .milestone.list>.item .meta{color:#999;padding-top:5px}.repository .milestone.list>.item .meta .issue-stats .octicon{padding-left:5px}.repository .milestone.list>.item .meta .overdue{color:red}.repository .milestone.list>.item .operate{margin-top:-15px}.repository .milestone.list>.item .operate>a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .milestone.list>.item .operate>a:hover{color:#000}.repository .milestone.list>.item .content{padding-top:10px}.repository.new.milestone textarea{height:200px}.repository.new.milestone #deadline{width:150px}.repository.compare.pull .choose.branch .octicon{padding-right:10px}.repository.compare.pull .comment.form .content:after,.repository.compare.pull .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.compare.pull .comment.form .content:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.compare.pull .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.compare.pull .comment.form .content:after{border-right-color:#fff}.repository .filter.dropdown .menu{margin-top:1px!important}.repository.commits .header .search input{font-weight:400;padding:5px 10px}.repository #commits-table thead th:first-of-type{padding-left:15px}.repository #commits-table thead .sha{width:140px}.repository #commits-table thead .shatd{text-align:center}.repository #commits-table td.sha .sha.label{margin:0}.repository #commits-table.ui.basic.striped.table tbody tr:nth-child(2n){background-color:rgba(0,0,0,.02)!important}.repository #commits-table td.sha .sha.label.isSigned,.repository #repo-files-table .sha.label.isSigned{border:1px solid #BBB}.repository #commits-table td.sha .sha.label.isSigned .detail.icon,.repository #repo-files-table .sha.label.isSigned .detail.icon{background:#FAFAFA;margin:-6px -10px -4px 0;padding:5px 3px 5px 6px;border-left:1px solid #BBB;border-top-left-radius:0;border-bottom-left-radius:0}.repository #commits-table td.sha .sha.label.isSigned.isVerified,.repository #repo-files-table .sha.label.isSigned.isVerified{border:1px solid #21BA45;background:#21BA4518}.repository #commits-table td.sha .sha.label.isSigned.isVerified .detail.icon,.repository #repo-files-table .sha.label.isSigned.isVerified .detail.icon{border-left:1px solid #21BA4580}.repository .diff-detail-box{margin:15px 0;line-height:30px}.repository .diff-detail-box ol{clear:both;padding-left:0;margin-top:5px;margin-bottom:28px}.repository .diff-detail-box ol li{list-style:none;padding-bottom:4px;margin-bottom:4px;border-bottom:1px dashed #DDD;padding-left:6px}.repository .diff-detail-box span.status{display:inline-block;width:12px;height:12px;margin-right:8px;vertical-align:middle}.repository .diff-detail-box span.status.modify{background-color:#f0db88}.repository .diff-detail-box span.status.add{background-color:#b4e2b4}.repository .diff-detail-box span.status.del{background-color:#e9aeae}.repository .diff-detail-box span.status.rename{background-color:#dad8ff}.repository .diff-detail-box .ui.right{margin-bottom:15px}.repository .diff-box .header{display:flex;align-items:center}.repository .diff-box .header .count{margin-right:12px;font-size:13px;flex:0 0 auto}.repository .diff-box .header .count .bar{background-color:#bd2c00;height:12px;width:40px;display:inline-block;margin:2px 4px 0 4px;vertical-align:text-top}.repository .diff-box .header .count .bar .add{background-color:#55a532;height:12px}.repository .diff-box .header .file{flex:1;color:#888;word-break:break-all}.repository .diff-box .header .button{margin:-5px 0 -5px 12px;padding:8px 10px;flex:0 0 auto}.repository .diff-file-box .header{background-color:#f7f7f7}.repository .diff-file-box .file-body.file-code .lines-num{text-align:right;color:#A7A7A7;background:#fafafa;width:1%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none;vertical-align:top}.repository .diff-file-box .file-body.file-code .lines-num span.fold{display:block;text-align:center}.repository .diff-file-box .file-body.file-code .lines-num-old{border-right:1px solid #DDD}.repository .diff-file-box .code-diff{font-size:12px}.repository .diff-file-box .code-diff td{padding:0;padding-left:10px;border-top:none}.repository .diff-file-box .code-diff pre{margin:0}.repository .diff-file-box .code-diff .lines-num{border-color:#d4d4d5;border-right-width:1px;border-right-style:solid;padding:0 5px}.repository .diff-file-box .code-diff tbody tr td.halfwidth{width:49%}.repository .diff-file-box .code-diff tbody tr td.tag-code,.repository .diff-file-box .code-diff tbody tr.tag-code td{background-color:#F0F0F0!important;border-color:#D2CECE!important;padding-top:8px;padding-bottom:8px}.repository .diff-file-box .code-diff tbody tr .removed-code{background-color:#f99}.repository .diff-file-box .code-diff tbody tr .added-code{background-color:#9f9}.repository .diff-file-box .code-diff-unified tbody tr.del-code td{background-color:#ffe0e0!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff-unified tbody tr.add-code td{background-color:#d6fcd6!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff-split table,.repository .diff-file-box .code-diff-split tbody{width:100%}.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(1),.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(2),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(3),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(4){background-color:#fafafa}.repository .diff-file-box .code-diff-split tbody tr td.del-code,.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(1),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(2){background-color:#ffe0e0!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff-split tbody tr td.add-code,.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(3),.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(4){background-color:#d6fcd6!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff-split tbody tr td:nth-child(3){border-left-width:1px;border-left-style:solid}.repository .diff-file-box.file-content{clear:right}.repository .diff-file-box.file-content img{max-width:100%;padding:5px 5px 0 5px}.repository .code-view{overflow:auto;overflow-x:auto;overflow-y:hidden}.repository .repo-search-result{padding-top:10px;padding-bottom:10px}.repository .repo-search-result .lines-num a{color:inherit}.repository.quickstart .guide .item{padding:1em}.repository.quickstart .guide .item small{font-weight:400}.repository.quickstart .guide .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository.quickstart .guide .ui.action.small.input{width:100%}.repository.quickstart .guide #repo-clone-url{border-radius:0;padding:5px 10px;font-size:1.2em}.repository.release #release-list{border-top:1px solid #DDD;margin-top:20px;padding-top:15px}.repository.release #release-list>li{list-style:none}.repository.release #release-list>li .detail,.repository.release #release-list>li .meta{padding-top:30px;padding-bottom:40px}.repository.release #release-list>li .meta{text-align:right;position:relative}.repository.release #release-list>li .meta .tag:not(.icon){display:block;margin-top:15px}.repository.release #release-list>li .meta .commit{display:block;margin-top:10px}.repository.release #release-list>li .detail{border-left:1px solid #DDD}.repository.release #release-list>li .detail .author img{margin-bottom:-3px}.repository.release #release-list>li .detail .download{margin-top:20px}.repository.release #release-list>li .detail .download>a .octicon{margin-left:5px;margin-right:5px}.repository.release #release-list>li .detail .download .list{padding-left:0;border-top:1px solid #eee}.repository.release #release-list>li .detail .download .list li{list-style:none;display:block;padding-top:8px;padding-bottom:8px;border-bottom:1px solid #eee}.repository.release #release-list>li .detail .dot{width:9px;height:9px;background-color:#ccc;z-index:999;position:absolute;display:block;left:-5px;top:40px;border-radius:6px;border:1px solid #FFF}.repository.new.release .target{min-width:500px}.repository.new.release .target #tag-name{margin-top:-4px}.repository.new.release .target .at{margin-left:-5px;margin-right:5px}.repository.new.release .target .dropdown.icon{margin:0;padding-top:3px}.repository.new.release .target .selection.dropdown{padding-top:10px;padding-bottom:10px}.repository.new.release .prerelease.field{margin-bottom:0}.repository.forks .list{margin-top:0}.repository.forks .list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px solid #DDD}.repository.forks .list .item .ui.avatar{float:left;margin-right:5px}.repository.forks .list .item .link{padding-top:5px}.repository.wiki.start .ui.segment{padding-top:70px;padding-bottom:100px}.repository.wiki.start .ui.segment .mega-octicon{font-size:48px}.repository.wiki.new .CodeMirror .CodeMirror-code{font-family:Consolas,monospace}.repository.wiki.new .CodeMirror .CodeMirror-code .cm-comment{background:inherit}.repository.wiki.new .editor-preview{background-color:#fff}.repository.wiki.view .choose.page{margin-top:-5px}.repository.wiki.view .ui.sub.header{text-transform:none}.repository.wiki.view>.markdown{padding:15px 30px}.repository.wiki.view>.markdown h1:first-of-type,.repository.wiki.view>.markdown h2:first-of-type,.repository.wiki.view>.markdown h3:first-of-type,.repository.wiki.view>.markdown h4:first-of-type,.repository.wiki.view>.markdown h5:first-of-type,.repository.wiki.view>.markdown h6:first-of-type{margin-top:0}@media only screen and (max-width:767px){.repository.wiki .dividing.header .stackable.grid .button{margin-top:2px;margin-bottom:2px}}.repository.settings.collaboration .collaborator.list{padding:0}.repository.settings.collaboration .collaborator.list>.item{margin:0;line-height:2em}.repository.settings.collaboration .collaborator.list>.item:not(:last-child){border-bottom:1px solid #DDD}.repository.settings.collaboration #repo-collab-form #search-user-box .results{left:7px}.repository.settings.collaboration #repo-collab-form .ui.button{margin-left:5px;margin-top:-3px}.repository.settings.branches .protected-branches .selection.dropdown{width:300px}.repository.settings.branches .protected-branches .item{border:1px solid #eaeaea;padding:10px 15px}.repository.settings.branches .protected-branches .item:not(:last-child){border-bottom:0}.repository.settings.branches .branch-protection .help{margin-left:26px;padding-top:0}.repository.settings.branches .branch-protection .fields{margin-left:20px;display:block}.repository.settings.branches .branch-protection .whitelist{margin-left:26px}.repository.settings.branches .branch-protection .whitelist .dropdown img{display:inline-block}.repository.settings.webhook .events .column{padding-bottom:0}.repository.settings.webhook .events .help{font-size:13px;margin-left:26px;padding-top:0}.repository .ui.attached.isSigned.isVerified:not(.positive){border-left:1px solid #A3C293;border-right:1px solid #A3C293}.repository .ui.attached.isSigned.isVerified.top:not(.positive){border-top:1px solid #A3C293}.repository .ui.attached.isSigned.isVerified:not(.positive):last-child{border-bottom:1px solid #A3C293}.repository .ui.segment.sub-menu{padding:7px;line-height:0}.repository .ui.segment.sub-menu .list{width:100%;display:flex}.repository .ui.segment.sub-menu .list .item{width:100%;border-radius:3px}.repository .ui.segment.sub-menu .list .item a{color:#000}.repository .ui.segment.sub-menu .list .item a:hover{color:#666}.repository .ui.segment.sub-menu .list .item.active{background:rgba(0,0,0,.05)}.repository .segment.reactions.dropdown .menu,.repository .select-reaction.dropdown .menu{right:0!important;left:auto!important}.repository .segment.reactions.dropdown .menu>.header,.repository .select-reaction.dropdown .menu>.header{margin:.75rem 0 .5rem}.repository .segment.reactions.dropdown .menu>.item,.repository .select-reaction.dropdown .menu>.item{float:left;padding:.5rem .5rem!important}.repository .segment.reactions.dropdown .menu>.item img.emoji,.repository .select-reaction.dropdown .menu>.item img.emoji{margin-right:0}.repository .segment.reactions{padding:.3em 1em}.repository .segment.reactions .ui.label{padding:.4em}.repository .segment.reactions .ui.label.disabled{cursor:default}.repository .segment.reactions .ui.label>img{height:1.5em!important}.repository .segment.reactions .select-reaction{float:none}.repository .segment.reactions .select-reaction:not(.active) a{display:none}.repository .segment.reactions:hover .select-reaction a{display:block}.user-cards .list{padding:0}.user-cards .list .item{list-style:none;width:32%;margin:10px 10px 10px 0;padding-bottom:14px;float:left}.user-cards .list .item .avatar{width:48px;height:48px;float:left;display:block;margin-right:10px}.user-cards .list .item .name{margin-top:0;margin-bottom:0;font-weight:400}.user-cards .list .item .meta{margin-top:5px}#search-repo-box .results .result .image,#search-user-box .results .result .image{float:left;margin-right:8px;width:2em;height:2em}#search-repo-box .results .result .content,#search-user-box .results .result .content{margin:6px 0}#issue-actions{display:none}.issue.list{list-style:none;padding-top:15px}.issue.list>.item{padding-top:15px;padding-bottom:10px;border-bottom:1px dashed #AAA}.issue.list>.item .title{color:#444;font-size:15px;font-weight:700;margin:0 6px}.issue.list>.item .title:hover{color:#000}.issue.list>.item .comment{padding-right:10px;color:#666}.issue.list>.item .desc{padding-top:5px;color:#999}.issue.list>.item .desc .checklist{padding-left:5px}.issue.list>.item .desc .checklist .progress-bar{margin-left:2px;width:80px;height:6px;display:inline-block;background-color:#eee;overflow:hidden;border-radius:3px;vertical-align:2px!important}.issue.list>.item .desc .checklist .progress-bar .progress{background-color:#ccc;display:block;height:100%}.issue.list>.item .desc a.milestone{padding-left:5px;color:#999!important}.issue.list>.item .desc a.milestone:hover{color:#000!important}.issue.list>.item .desc .assignee{margin-top:-5px;margin-right:5px}.issue.list>.item .desc .overdue{color:red}.page.buttons{padding-top:15px}.ui.form .dropzone{width:100%;margin-bottom:10px;border:2px dashed #0087F7;box-shadow:none!important}.ui.form .dropzone .dz-error-message{top:140px}.settings .content{margin-top:2px}.settings .content .segment,.settings .content>.header{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.settings .list>.item .green{color:#21BA45!important}.settings .list>.item:not(:first-child){border-top:1px solid #eaeaea;padding:1rem;margin:15px -1rem -1rem -1rem}.settings .list>.item>.mega-octicon{display:table-cell}.settings .list>.item>.mega-octicon+.content{display:table-cell;padding:0 0 0 .5em;vertical-align:top}.settings .list>.item .info{margin-top:10px}.settings .list>.item .info .tab.segment{border:none;padding:10px 0 0}.settings .list.key .meta{padding-top:5px;color:#666}.settings .list.email>.item:not(:first-child){min-height:60px}.settings .list.collaborator>.item{padding:0}.ui.vertical.menu .header.item{font-size:1.1em;background:#f0f0f0}.edit-label.modal .form .column,.new-label.segment .form .column{padding-right:0}.edit-label.modal .form .buttons,.new-label.segment .form .buttons{margin-left:auto;padding-top:15px}.edit-label.modal .form .color.picker.column,.new-label.segment .form .color.picker.column{width:auto}.edit-label.modal .form .color.picker.column .color-picker,.new-label.segment .form .color.picker.column .color-picker{height:35px;width:auto;padding-left:30px}.edit-label.modal .form .minicolors-swatch.minicolors-sprite,.new-label.segment .form .minicolors-swatch.minicolors-sprite{top:10px;left:10px;width:15px;height:15px}.edit-label.modal .form .precolors,.new-label.segment .form .precolors{padding-left:0;padding-right:0;margin:3px 10px auto 10px;width:120px}.edit-label.modal .form .precolors .color,.new-label.segment .form .precolors .color{float:left;width:15px;height:15px}#avatar-arrow:after,#avatar-arrow:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}#avatar-arrow:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}#avatar-arrow:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}#delete-repo-modal .ui.message,#transfer-repo-modal .ui.message{width:100%!important}.tab-size-1{tab-size:1!important;-moz-tab-size:1!important}.tab-size-2{tab-size:2!important;-moz-tab-size:2!important}.tab-size-3{tab-size:3!important;-moz-tab-size:3!important}.tab-size-4{tab-size:4!important;-moz-tab-size:4!important}.tab-size-5{tab-size:5!important;-moz-tab-size:5!important}.tab-size-6{tab-size:6!important;-moz-tab-size:6!important}.tab-size-7{tab-size:7!important;-moz-tab-size:7!important}.tab-size-8{tab-size:8!important;-moz-tab-size:8!important}.tab-size-9{tab-size:9!important;-moz-tab-size:9!important}.tab-size-10{tab-size:10!important;-moz-tab-size:10!important}.tab-size-11{tab-size:11!important;-moz-tab-size:11!important}.tab-size-12{tab-size:12!important;-moz-tab-size:12!important}.tab-size-13{tab-size:13!important;-moz-tab-size:13!important}.tab-size-14{tab-size:14!important;-moz-tab-size:14!important}.tab-size-15{tab-size:15!important;-moz-tab-size:15!important}.tab-size-16{tab-size:16!important;-moz-tab-size:16!important}.stats-table{display:table;width:100%}.stats-table .table-cell{display:table-cell}.stats-table .table-cell.tiny{height:.5em}tbody.commit-list{vertical-align:baseline}.commit-body{white-space:pre-wrap}@media only screen and (max-width:767px){.ui.stackable.menu.mobile--margin-between-items>.item{margin-top:5px;margin-bottom:5px}.ui.stackable.menu.mobile--no-negative-margins{margin-left:0;margin-right:0}}#topic_edit{margin-top:5px;display:none}#repo-topic{margin-top:5px}.CodeMirror{font:14px Consolas,"Liberation Mono",Menlo,Courier,monospace}.CodeMirror.cm-s-default{border-radius:3px;padding:0!important}.CodeMirror .cm-comment{background:inherit!important}.repository.file.editor .tab[data-tab=write]{padding:0!important}.repository.file.editor .tab[data-tab=write] .editor-toolbar{border:none!important}.repository.file.editor .tab[data-tab=write] .CodeMirror{border-left:none;border-right:none;border-bottom:none}.organization{padding-top:15px;padding-bottom:80px}.organization .head .ui.header .text{vertical-align:middle;font-size:1.6rem;margin-left:15px}.organization .head .ui.header .ui.right{margin-top:5px}.organization.new.org form{margin:auto}.organization.new.org form .ui.message{text-align:center}@media only screen and (min-width:768px){.organization.new.org form{width:800px!important}.organization.new.org form .header{padding-left:280px!important}.organization.new.org form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.organization.new.org form .help{margin-left:265px!important}.organization.new.org form .optional .title{margin-left:250px!important}.organization.new.org form input,.organization.new.org form textarea{width:50%!important}}@media only screen and (max-width:767px){.organization.new.org form .optional .title{margin-left:15px}.organization.new.org form .inline.field>label{display:block}}.organization.new.org form .header{padding-left:0!important;text-align:center}.organization.options input{min-width:300px}.organization.profile #org-avatar{width:100px;height:100px;margin-right:15px}.organization.profile #org-info .ui.header{font-size:36px;margin-bottom:0}.organization.profile #org-info .desc{font-size:16px;margin-bottom:10px}.organization.profile #org-info .meta .item{display:inline-block;margin-right:10px}.organization.profile #org-info .meta .item .icon{margin-right:5px}.organization.profile .ui.top.header .ui.right{margin-top:0}.organization.profile .teams .item{padding:10px 15px}.organization.profile .members .ui.avatar,.organization.teams .members .ui.avatar{width:48px;height:48px;margin-right:5px}.organization.invite #invite-box{margin:auto;margin-top:50px;width:500px!important}.organization.invite #invite-box #search-user-box input{margin-left:0;width:300px}.organization.invite #invite-box .ui.button{margin-left:5px;margin-top:-3px}.organization.members .list .item{margin-left:0;margin-right:0;border-bottom:1px solid #eee}.organization.members .list .item .ui.avatar{width:48px;height:48px}.organization.members .list .item .meta{line-height:24px}.organization.teams .detail .item{padding:10px 15px}.organization.teams .detail .item:not(:last-child){border-bottom:1px solid #eee}.organization.teams .members .item,.organization.teams .repositories .item{padding:10px 20px;line-height:32px}.organization.teams .members .item:not(:last-child),.organization.teams .repositories .item:not(:last-child){border-bottom:1px solid #DDD}.organization.teams .members .item .button,.organization.teams .repositories .item .button{padding:9px 10px}.organization.teams #add-member-form input,.organization.teams #add-repo-form input{margin-left:0}.organization.teams #add-member-form .ui.button,.organization.teams #add-repo-form .ui.button{margin-left:5px;margin-top:-3px}.user:not(.icon){padding-top:15px;padding-bottom:80px}.user.profile .ui.card .username{display:block}.user.profile .ui.card .extra.content{padding:0}.user.profile .ui.card .extra.content ul{margin:0;padding:0}.user.profile .ui.card .extra.content ul li{padding:10px;list-style:none}.user.profile .ui.card .extra.content ul li:not(:last-child){border-bottom:1px solid #eaeaea}.user.profile .ui.card .extra.content ul li .octicon{margin-left:1px;margin-right:5px}.user.profile .ui.card .extra.content ul li.follow .ui.button{width:100%}.user.profile .ui.repository.list{margin-top:25px}.user.followers .header.name{font-size:20px;line-height:24px;vertical-align:middle}.user.followers .follow .ui.button{padding:8px 15px}.user.notification .octicon{float:left;font-size:2em}.user.notification .content{float:left;margin-left:7px}.user.notification table form{display:inline-block}.user.notification table button{padding:3px 3px 3px 5px}.user.notification table tr{cursor:pointer}.user.notification .octicon.green{color:#21ba45}.user.notification .octicon.red{color:#d01919}.user.notification .octicon.purple{color:#a333c8}.user.notification .octicon.blue{color:#2185d0}.user.link-account:not(.icon){padding-top:15px;padding-bottom:5px}.user.settings .iconFloat{float:left}.dashboard{padding-top:15px;padding-bottom:80px}.dashboard.feeds .context.user.menu,.dashboard.issues .context.user.menu{z-index:101;min-width:200px}.dashboard.feeds .context.user.menu .ui.header,.dashboard.issues .context.user.menu .ui.header{font-size:1rem;text-transform:none}.dashboard.feeds .filter.menu .item,.dashboard.issues .filter.menu .item{text-align:left}.dashboard.feeds .filter.menu .item .text,.dashboard.issues .filter.menu .item .text{height:16px;vertical-align:middle}.dashboard.feeds .filter.menu .item .text.truncate,.dashboard.issues .filter.menu .item .text.truncate{width:85%}.dashboard.feeds .filter.menu .item .floating.label,.dashboard.issues .filter.menu .item .floating.label{top:7px;left:90%;width:15%}.dashboard.feeds .filter.menu .jump.item,.dashboard.issues .filter.menu .jump.item{margin:1px;padding-right:0}.dashboard.feeds .filter.menu .menu,.dashboard.issues .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.dashboard.feeds .right.stackable.menu>.item.active,.dashboard.issues .right.stackable.menu>.item.active{color:#d9453d}.dashboard .dashboard-repos{margin:0 1px}.feeds .news>.ui.grid{margin-left:auto;margin-right:auto}.feeds .news .ui.avatar{margin-top:13px}.feeds .news p{line-height:1em}.feeds .news .time-since{font-size:13px}.feeds .news .issue.title{width:80%}.feeds .news .push.news .content ul{font-size:13px;list-style:none;padding-left:10px}.feeds .news .push.news .content ul img{margin-bottom:-2px}.feeds .news .push.news .content ul .text.truncate{width:80%;margin-bottom:-5px}.feeds .news .commit-id{font-family:Consolas,monospace}.feeds .news code{padding:1px;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px;word-break:break-all}.feeds .list .header .ui.label{margin-top:-4px;padding:4px 5px;font-weight:400}.feeds .list .header .plus.icon{margin-top:5px}.feeds .list ul{list-style:none;margin:0;padding-left:0}.feeds .list ul li:not(:last-child){border-bottom:1px solid #EAEAEA}.feeds .list ul li.private{background-color:#fcf8e9}.feeds .list ul li a{padding:6px 1.2em;display:block}.feeds .list ul li a .octicon{color:#888}.feeds .list ul li a .octicon.rear{font-size:15px}.feeds .list ul li a .star-num{font-size:12px}.feeds .list .repo-owner-name-list .item-name{max-width:70%;margin-bottom:-4px}.feeds .list #collaborative-repo-list .owner-and-repo{max-width:80%;margin-bottom:-5px}.feeds .list #collaborative-repo-list .owner-name{max-width:120px;margin-bottom:-5px}.admin{padding-top:15px;padding-bottom:80px}.admin .table.segment{padding:0;font-size:13px}.admin .table.segment:not(.striped){padding-top:5px}.admin .table.segment:not(.striped) thead th:last-child{padding-right:5px!important}.admin .table.segment th{padding-top:5px;padding-bottom:5px}.admin .table.segment:not(.select) td:first-of-type,.admin .table.segment:not(.select) th:first-of-type{padding-left:15px!important}.admin .ui.header,.admin .ui.segment{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.admin.user .email{max-width:200px}.admin dl.admin-dl-horizontal{padding:20px;margin:0}.admin dl.admin-dl-horizontal dd{margin-left:275px}.admin dl.admin-dl-horizontal dt{font-weight:bolder;float:left;width:285px;clear:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.admin.config #test-mail-btn{margin-left:5px}.explore{padding-top:15px;padding-bottom:80px}.explore .navbar{justify-content:center;padding-top:15px!important;margin-top:-15px!important;margin-bottom:15px!important;background-color:#FAFAFA!important;border-width:1px!important}.explore .navbar .octicon{width:16px;text-align:center;margin-right:5px}.ui.repository.list .item{padding-bottom:25px}.ui.repository.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.repository.list .item .ui.header{font-size:1.5rem;padding-bottom:10px}.ui.repository.list .item .ui.header .name{word-break:break-all}.ui.repository.list .item .ui.header .metas{color:#888;font-size:14px;font-weight:400}.ui.repository.list .item .ui.header .metas span:not(:last-child){margin-right:5px}.ui.repository.list .item .time{font-size:12px;color:grey}.ui.repository.branches .time{font-size:12px;color:grey}.ui.user.list .item{padding-bottom:25px}.ui.user.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.user.list .item .ui.avatar.image{width:40px;height:40px}.ui.user.list .item .description{margin-top:5px}.ui.user.list .item .description .octicon:not(:first-child){margin-left:5px}.ui.user.list .item .description a{color:#333}.ui.user.list .item .description a:hover{text-decoration:underline} \ No newline at end of file +.tribute-container{box-shadow:0 1px 3px 1px #c7c7c7}.tribute-container ul{background:#fff}.tribute-container li{padding:8px 12px;border-bottom:1px solid #dcdcdc}.tribute-container li img{display:inline-block;vertical-align:middle;width:28px;height:28px;margin-right:5px}.tribute-container li span.fullname{font-weight:400;font-size:.8rem;margin-left:3px}.tribute-container li.highlight,.tribute-container li:hover{background:#2185D0;color:#fff}.emoji{width:1.5em;height:1.5em;display:inline-block;background-size:contain}body{font-family:Lato,"Segoe UI","Microsoft YaHei",Arial,Helvetica,sans-serif!important;background-color:#fff;overflow-y:scroll;-webkit-font-smoothing:antialiased}img{border-radius:3px}.rounded{border-radius:.28571429rem!important}code,pre{font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace}code.raw,pre.raw{padding:7px 12px;margin:10px 0;background-color:#f8f8f8;border:1px solid #ddd;border-radius:3px;font-size:13px;line-height:1.5;overflow:auto}code.wrap,pre.wrap{white-space:pre-wrap;-ms-word-break:break-all;word-break:break-all;overflow-wrap:break-word;word-wrap:break-word}.dont-break-out{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.full.height{padding:0;margin:0 0 -40px 0;min-height:100%}.following.bar{z-index:900;left:0;width:100%;margin:0}.following.bar.light{background-color:#fff;border-bottom:1px solid #DDD;box-shadow:0 2px 3px rgba(0,0,0,.04)}.following.bar .column .menu{margin-top:0}.following.bar .top.menu a.item.brand{padding-left:0}.following.bar .brand .ui.mini.image{width:30px}.following.bar .top.menu .dropdown.item.active,.following.bar .top.menu .dropdown.item:hover,.following.bar .top.menu a.item:hover{background-color:transparent}.following.bar .top.menu a.item:hover{color:rgba(0,0,0,.45)}.following.bar .top.menu .menu{z-index:900}.following.bar .octicon{margin-right:.75em}.following.bar .octicon.fitted{margin-right:0}.following.bar .searchbox{background-color:#f4f4f4!important}.following.bar .searchbox:focus{background-color:#e9e9e9!important}.following.bar .text .octicon{width:16px;text-align:center}@media only screen and (max-width:767px){.following.bar #navbar:not(.shown)>:not(:first-child){display:none}}.right.stackable.menu{margin-left:auto;display:flex;display:-ms-flexbox;-ms-flex-align:inherit;align-items:inherit;-ms-flex-direction:inherit;flex-direction:inherit}.ui.left{float:left}.ui.right{float:right}.ui.button,.ui.menu .item{-moz-user-select:auto;-ms-user-select:auto;-webkit-user-select:auto;user-select:auto}.ui.container.fluid.padded{padding:0 10px 0 10px}.ui.form .ui.button{font-weight:400}.ui.floating.label{z-index:10}.ui.menu,.ui.segment,.ui.vertical.menu{box-shadow:none}.ui .menu:not(.vertical) .item>.button.compact{padding:.58928571em 1.125em}.ui .menu:not(.vertical) .item>.button.small{font-size:.92857143rem}.ui.dropdown .menu>.item>.floating.label{z-index:11}.ui.dropdown .menu .menu>.item>.floating.label{z-index:21}.ui .text.red{color:#d95c5c!important}.ui .text.red a{color:#d95c5c!important}.ui .text.red a:hover{color:#E67777!important}.ui .text.blue{color:#428bca!important}.ui .text.blue a{color:#15c!important}.ui .text.blue a:hover{color:#428bca!important}.ui .text.black{color:#444}.ui .text.black:hover{color:#000}.ui .text.grey{color:#767676!important}.ui .text.grey a{color:#444!important}.ui .text.grey a:hover{color:#000!important}.ui .text.light.grey{color:#888!important}.ui .text.green{color:#6cc644!important}.ui .text.purple{color:#6e5494!important}.ui .text.yellow{color:#FBBD08!important}.ui .text.gold{color:#a1882b!important}.ui .text.left{text-align:left!important}.ui .text.right{text-align:right!important}.ui .text.small{font-size:.75em}.ui .text.normal{font-weight:400}.ui .text.bold{font-weight:700}.ui .text.italic{font-style:italic}.ui .text.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}.ui .text.thin{font-weight:400}.ui .text.middle{vertical-align:middle}.ui .message{text-align:center}.ui .header>i+.content{padding-left:.75rem;vertical-align:middle}.ui .warning.header{background-color:#F9EDBE!important;border-color:#F0C36D}.ui .warning.segment{border-color:#F0C36D}.ui .info.segment{border:1px solid #c5d5dd}.ui .info.segment.top{background-color:#e6f1f6!important}.ui .info.segment.top h3,.ui .info.segment.top h4{margin-top:0}.ui .info.segment.top h3:last-child{margin-top:4px}.ui .info.segment.top>:last-child{margin-bottom:0}.ui .normal.header{font-weight:400}.ui .avatar.image{border-radius:3px}.ui .form .fake{display:none!important}.ui .form .sub.field{margin-left:25px}.ui .sha.label{font-family:Consolas,Menlo,Monaco,"Lucida Console",monospace;font-size:13px;padding:6px 10px 4px 10px;font-weight:400;margin:0 6px}.ui.status.buttons .octicon{margin-right:4px}.ui.inline.delete-button{padding:8px 15px;font-weight:400}.ui .background.red{background-color:#d95c5c!important}.ui .background.blue{background-color:#428bca!important}.ui .background.black{background-color:#444}.ui .background.grey{background-color:#767676!important}.ui .background.light.grey{background-color:#888!important}.ui .background.green{background-color:#6cc644!important}.ui .background.purple{background-color:#6e5494!important}.ui .background.yellow{background-color:#FBBD08!important}.ui .background.gold{background-color:#a1882b!important}.ui .branch-tag-choice{line-height:20px}.overflow.menu .items{max-height:300px;overflow-y:auto}.overflow.menu .items .item{position:relative;cursor:pointer;display:block;border:none;height:auto;border-top:none;line-height:1em;color:rgba(0,0,0,.8);padding:.71428571em 1.14285714em!important;font-size:1rem;text-transform:none;font-weight:400;box-shadow:none;-webkit-touch-callout:none}.overflow.menu .items .item.active{font-weight:700}.overflow.menu .items .item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.8);z-index:13}.scrolling.menu .item.selected{font-weight:700!important}footer{height:40px;background-color:#fff;border-top:1px solid #d6d6d6;clear:both;width:100%;color:#888}footer .container{padding-top:10px}footer .container .fa{width:16px;text-align:center;color:#428bca}footer .container .links>*{border-left:1px solid #d6d6d6;padding-left:8px;margin-left:5px}footer .container .links>:first-child{border-left:none}footer .ui.language .menu{max-height:500px;overflow-y:auto;margin-bottom:7px}.hide{display:none}.center{text-align:center}.img-1{width:2px!important;height:2px!important}.img-2{width:4px!important;height:4px!important}.img-3{width:6px!important;height:6px!important}.img-4{width:8px!important;height:8px!important}.img-5{width:10px!important;height:10px!important}.img-6{width:12px!important;height:12px!important}.img-7{width:14px!important;height:14px!important}.img-8{width:16px!important;height:16px!important}.img-9{width:18px!important;height:18px!important}.img-10{width:20px!important;height:20px!important}.img-11{width:22px!important;height:22px!important}.img-12{width:24px!important;height:24px!important}.img-13{width:26px!important;height:26px!important}.img-14{width:28px!important;height:28px!important}.img-15{width:30px!important;height:30px!important}.img-16{width:32px!important;height:32px!important}@media only screen and (min-width:768px){.mobile-only,.ui.button.mobile-only{display:none}.sr-mobile-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}}@media only screen and (max-width:767px){.not-mobile{display:none}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}@media only screen and (max-width:991px) and (min-width:768px){.ui.container{width:95%}}.hljs{background:inherit!important;padding:0!important}.ui.menu.new-menu{justify-content:center!important;padding-top:15px!important;margin-top:-15px!important;margin-bottom:15px!important;background-color:#FAFAFA!important;border-width:1px!important}@media only screen and (max-width:1200px){.ui.menu.new-menu{overflow-x:auto!important;justify-content:left!important;padding-bottom:5px}.ui.menu.new-menu::-webkit-scrollbar{height:8px;display:none}.ui.menu.new-menu:hover::-webkit-scrollbar{display:block}.ui.menu.new-menu::-webkit-scrollbar-track{background:rgba(0,0,0,.01)}.ui.menu.new-menu::-webkit-scrollbar-thumb{background:rgba(0,0,0,.2)}.ui.menu.new-menu:after{position:absolute;margin-top:-15px;display:block;background-image:linear-gradient(to right,rgba(255,255,255,0),#fff 100%);content:' ';right:0;height:53px;z-index:1000;width:60px;clear:none;visibility:visible}.ui.menu.new-menu a.item:last-child{padding-right:30px!important}}[v-cloak]{display:none!important}.repos-search{padding-bottom:0!important}.repos-filter{margin-top:0!important;border-bottom-width:0!important;margin-bottom:2px!important}.markdown:not(code){overflow:hidden;font-family:"Helvetica Neue",Helvetica,"Segoe UI",Arial,freesans,sans-serif;font-size:16px;line-height:1.6!important;word-wrap:break-word}.markdown:not(code).ui.segment{padding:3em}.markdown:not(code).file-view{padding:2em 2em 2em!important}.markdown:not(code)>:first-child{margin-top:0!important}.markdown:not(code)>:last-child{margin-bottom:0!important}.markdown:not(code) a:not([href]){color:inherit;text-decoration:none}.markdown:not(code) .absent{color:#c00}.markdown:not(code) .anchor{position:absolute;top:0;left:0;display:block;padding-right:6px;padding-left:30px;margin-left:-30px}.markdown:not(code) .anchor:focus{outline:0}.markdown:not(code) h1,.markdown:not(code) h2,.markdown:not(code) h3,.markdown:not(code) h4,.markdown:not(code) h5,.markdown:not(code) h6{position:relative;margin-top:1em;margin-bottom:16px;font-weight:700;line-height:1.4}.markdown:not(code) h1:first-of-type,.markdown:not(code) h2:first-of-type,.markdown:not(code) h3:first-of-type,.markdown:not(code) h4:first-of-type,.markdown:not(code) h5:first-of-type,.markdown:not(code) h6:first-of-type{margin-top:0!important}.markdown:not(code) h1 .octicon-link,.markdown:not(code) h2 .octicon-link,.markdown:not(code) h3 .octicon-link,.markdown:not(code) h4 .octicon-link,.markdown:not(code) h5 .octicon-link,.markdown:not(code) h6 .octicon-link{display:none;color:#000;vertical-align:middle}.markdown:not(code) h1:hover .anchor,.markdown:not(code) h2:hover .anchor,.markdown:not(code) h3:hover .anchor,.markdown:not(code) h4:hover .anchor,.markdown:not(code) h5:hover .anchor,.markdown:not(code) h6:hover .anchor{padding-left:8px;margin-left:-30px;text-decoration:none}.markdown:not(code) h1:hover .anchor .octicon-link,.markdown:not(code) h2:hover .anchor .octicon-link,.markdown:not(code) h3:hover .anchor .octicon-link,.markdown:not(code) h4:hover .anchor .octicon-link,.markdown:not(code) h5:hover .anchor .octicon-link,.markdown:not(code) h6:hover .anchor .octicon-link{display:inline-block}.markdown:not(code) h1 code,.markdown:not(code) h1 tt,.markdown:not(code) h2 code,.markdown:not(code) h2 tt,.markdown:not(code) h3 code,.markdown:not(code) h3 tt,.markdown:not(code) h4 code,.markdown:not(code) h4 tt,.markdown:not(code) h5 code,.markdown:not(code) h5 tt,.markdown:not(code) h6 code,.markdown:not(code) h6 tt{font-size:inherit}.markdown:not(code) h1{padding-bottom:.3em;font-size:2.25em;line-height:1.2;border-bottom:1px solid #eee}.markdown:not(code) h1 .anchor{line-height:1}.markdown:not(code) h2{padding-bottom:.3em;font-size:1.75em;line-height:1.225;border-bottom:1px solid #eee}.markdown:not(code) h2 .anchor{line-height:1}.markdown:not(code) h3{font-size:1.5em;line-height:1.43}.markdown:not(code) h3 .anchor{line-height:1.2}.markdown:not(code) h4{font-size:1.25em}.markdown:not(code) h4 .anchor{line-height:1.2}.markdown:not(code) h5{font-size:1em}.markdown:not(code) h5 .anchor{line-height:1.1}.markdown:not(code) h6{font-size:1em;color:#777}.markdown:not(code) h6 .anchor{line-height:1.1}.markdown:not(code) blockquote,.markdown:not(code) dl,.markdown:not(code) ol,.markdown:not(code) p,.markdown:not(code) pre,.markdown:not(code) table,.markdown:not(code) ul{margin-top:0;margin-bottom:16px}.markdown:not(code) blockquote{margin-left:0}.markdown:not(code) hr{height:4px;padding:0;margin:16px 0;background-color:#e7e7e7;border:0 none}.markdown:not(code) ol,.markdown:not(code) ul{padding-left:2em}.markdown:not(code) ol.no-list,.markdown:not(code) ul.no-list{padding:0;list-style-type:none}.markdown:not(code) ol ol,.markdown:not(code) ol ul,.markdown:not(code) ul ol,.markdown:not(code) ul ul{margin-top:0;margin-bottom:0}.markdown:not(code) ol ol,.markdown:not(code) ul ol{list-style-type:lower-roman}.markdown:not(code) li>p{margin-top:0}.markdown:not(code) dl{padding:0}.markdown:not(code) dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}.markdown:not(code) dl dd{padding:0 16px;margin-bottom:16px}.markdown:not(code) blockquote{padding:0 15px;color:#777;border-left:4px solid #ddd}.markdown:not(code) blockquote>:first-child{margin-top:0}.markdown:not(code) blockquote>:last-child{margin-bottom:0}.markdown:not(code) table{width:auto;overflow:auto;word-break:normal;word-break:keep-all}.markdown:not(code) table th{font-weight:700}.markdown:not(code) table td,.markdown:not(code) table th{padding:6px 13px!important;border:1px solid #ddd!important}.markdown:not(code) table tr{background-color:#fff;border-top:1px solid #ccc}.markdown:not(code) table tr:nth-child(2n){background-color:#f8f8f8}.markdown:not(code) img{max-width:100%;box-sizing:border-box}.markdown:not(code) .emoji{max-width:none}.markdown:not(code) span.frame{display:block;overflow:hidden}.markdown:not(code) span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #ddd}.markdown:not(code) span.frame span img{display:block;float:left}.markdown:not(code) span.frame span span{display:block;padding:5px 0 0;clear:both;color:#333}.markdown:not(code) span.align-center{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown:not(code) span.align-center span img{margin:0 auto;text-align:center}.markdown:not(code) span.align-right{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown:not(code) span.align-right span img{margin:0;text-align:right}.markdown:not(code) span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown:not(code) span.float-left span{margin:13px 0 0}.markdown:not(code) span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown:not(code) span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown:not(code) code,.markdown:not(code) tt{padding:0;padding-top:.2em;padding-bottom:.2em;margin:0;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px}.markdown:not(code) code:after,.markdown:not(code) code:before,.markdown:not(code) tt:after,.markdown:not(code) tt:before{letter-spacing:-.2em;content:"\00a0"}.markdown:not(code) code br,.markdown:not(code) tt br{display:none}.markdown:not(code) del code{text-decoration:inherit}.markdown:not(code) pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:0 0;border:0}.markdown:not(code) .highlight{margin-bottom:16px}.markdown:not(code) .highlight pre,.markdown:not(code) pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f7f7f7;border-radius:3px}.markdown:not(code) .highlight pre{margin-bottom:0;word-break:normal}.markdown:not(code) pre{word-wrap:normal}.markdown:not(code) pre code,.markdown:not(code) pre tt{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown:not(code) pre code:after,.markdown:not(code) pre code:before,.markdown:not(code) pre tt:after,.markdown:not(code) pre tt:before{content:normal}.markdown:not(code) kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #ccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb}.markdown:not(code) input[type=checkbox]{vertical-align:middle!important}.markdown:not(code) .csv-data td,.markdown:not(code) .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown:not(code) .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown:not(code) .csv-data tr{border-top:0}.markdown:not(code) .csv-data th{font-weight:700;background:#f8f8f8;border-top:0}.markdown:not(code) .ui.list .list,.markdown:not(code) ol.ui.list ol,.markdown:not(code) ul.ui.list ul{padding-left:2em}.home{padding-bottom:80px}.home .logo{max-width:220px}.home .hero h1,.home .hero h2{font-family:'PT Sans Narrow',sans-serif,'Microsoft YaHei'}@media only screen and (max-width:767px){.home .hero h1{font-size:3.5em}.home .hero h2{font-size:2em}}@media only screen and (min-width:768px){.home .hero h1{font-size:5.5em}.home .hero h2{font-size:3em}}.home .hero .octicon{color:#5aa509;font-size:40px;width:50px}.home .hero.header{font-size:20px}.home p.large{font-size:16px}.home .stackable{padding-top:30px}.home a{color:#5aa509}.signup{padding-top:15px;padding-bottom:80px}.install{padding-top:45px;padding-bottom:80px}.install form label{text-align:right;width:320px!important}.install form input{width:35%!important}.install form .field{text-align:left}.install form .field .help{margin-left:335px!important}.install form .field.optional .title{margin-left:38%}.install .ui .checkbox{margin-left:40%!important}.install .ui .checkbox label{width:auto!important}.form .help{color:#999;padding-top:.6em;padding-bottom:.6em;display:inline-block}.ui.attached.header{background:#f0f0f0}.ui.attached.header .right{margin-top:-5px}.ui.attached.header .right .button{padding:8px 10px;font-weight:400}#create-page-form form{margin:auto}#create-page-form form .ui.message{text-align:center}@media only screen and (min-width:768px){#create-page-form form{width:800px!important}#create-page-form form .header{padding-left:280px!important}#create-page-form form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}#create-page-form form .help{margin-left:265px!important}#create-page-form form .optional .title{margin-left:250px!important}#create-page-form form input,#create-page-form form textarea{width:50%!important}}@media only screen and (max-width:767px){#create-page-form form .optional .title{margin-left:15px}#create-page-form form .inline.field>label{display:block}}.signin .oauth2 div{display:inline-block}.signin .oauth2 div p{margin:10px 5px 0 0;float:left}.signin .oauth2 a{margin-right:3px}.signin .oauth2 a:last-child{margin-right:0}.signin .oauth2 img{width:32px;height:32px}.signin .oauth2 img.openidConnect{width:auto}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{margin:auto}.user.activate form .ui.message,.user.forgot.password form .ui.message,.user.reset.password form .ui.message,.user.signin form .ui.message,.user.signup form .ui.message{text-align:center}@media only screen and (min-width:768px){.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:800px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:280px!important}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.user.activate form .help,.user.forgot.password form .help,.user.reset.password form .help,.user.signin form .help,.user.signup form .help{margin-left:265px!important}.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:250px!important}.user.activate form input,.user.activate form textarea,.user.forgot.password form input,.user.forgot.password form textarea,.user.reset.password form input,.user.reset.password form textarea,.user.signin form input,.user.signin form textarea,.user.signup form input,.user.signup form textarea{width:50%!important}}@media only screen and (max-width:767px){.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:15px}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{display:block}}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:700px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:0!important;text-align:center}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{width:200px!important}.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{margin:auto}.repository.new.fork form .ui.message,.repository.new.migrate form .ui.message,.repository.new.repo form .ui.message{text-align:center}@media only screen and (min-width:768px){.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{width:800px!important}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:280px!important}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.repository.new.fork form .help,.repository.new.migrate form .help,.repository.new.repo form .help{margin-left:265px!important}.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:250px!important}.repository.new.fork form input,.repository.new.fork form textarea,.repository.new.migrate form input,.repository.new.migrate form textarea,.repository.new.repo form input,.repository.new.repo form textarea{width:50%!important}}@media only screen and (max-width:767px){.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:15px}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{display:block}}.repository.new.fork form .dropdown .dropdown.icon,.repository.new.migrate form .dropdown .dropdown.icon,.repository.new.repo form .dropdown .dropdown.icon{margin-top:-7px!important}.repository.new.fork form .dropdown .text,.repository.new.migrate form .dropdown .text,.repository.new.repo form .dropdown .text{margin-right:0!important}.repository.new.fork form .dropdown .text i,.repository.new.migrate form .dropdown .text i,.repository.new.repo form .dropdown .text i{margin-right:0!important}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:0!important;text-align:center}.repository.new.repo .ui.form .selection.dropdown:not(.owner){width:50%!important}@media only screen and (min-width:768px){.repository.new.repo .ui.form #auto-init{margin-left:265px!important}}.new.webhook form .help{margin-left:25px}.new.webhook .events.fields .column{padding-left:40px}.githook textarea{font-family:monospace}.repository{padding-top:15px;padding-bottom:80px}.repository .header-grid{padding-top:5px;padding-bottom:5px}.repository .header-grid .ui.compact.menu{margin-left:1rem}.repository .header-grid .ui.header{margin-top:0}.repository .header-grid .mega-octicon{width:30px;font-size:30px}.repository .header-grid .ui.huge.breadcrumb{font-weight:400;font-size:1.7rem}.repository .header-grid .fork-flag{margin-left:38px;margin-top:3px;display:block;font-size:12px;white-space:nowrap}.repository .header-grid .octicon.octicon-repo-forked{margin-top:-1px;font-size:15px}.repository .header-grid .button{margin-top:2px;margin-bottom:2px}.repository .tabs .navbar{justify-content:initial}.repository .navbar{display:flex;justify-content:space-between}.repository .navbar .ui.label{margin-top:-2px;margin-left:7px;padding:3px 5px}.repository .owner.dropdown{min-width:40%!important}.repository #file-buttons{margin-left:auto!important;font-weight:400}.repository #file-buttons .ui.button{padding:8px 10px;font-weight:400}.repository .metas .menu{max-height:300px;overflow-x:auto}.repository .metas .ui.list .hide{display:none!important}.repository .metas .ui.list .item{padding:0}.repository .metas .ui.list .label.color{padding:0 8px;margin-right:5px}.repository .metas .ui.list a{margin:2px 0}.repository .metas .ui.list a .text{color:#444}.repository .metas .ui.list a .text:hover{color:#000}.repository .header-wrapper{background-color:#FAFAFA;margin-top:-15px;padding-top:15px}.repository .header-wrapper .ui.tabs.divider{border-bottom:none}.repository .header-wrapper .ui.tabular .octicon{margin-right:5px}.repository .filter.menu .label.color{border-radius:3px;margin-left:15px;padding:0 8px}.repository .filter.menu .octicon{float:left;margin:5px -7px 0 -5px;width:16px}.repository .filter.menu .text{margin-left:.9em}.repository .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.repository .filter.menu .dropdown.item{margin:1px;padding-right:0}.repository .select-label .item{max-width:250px;overflow:hidden;text-overflow:ellipsis}.repository .select-label .desc{padding-left:16px}.repository .ui.tabs.container{margin-top:14px;margin-bottom:0}.repository .ui.tabs.container .ui.menu{border-bottom:none}.repository .ui.tabs.divider{margin-top:0;margin-bottom:20px}.repository #clone-panel{width:350px}.repository #clone-panel input{border-radius:0;padding:5px 10px}.repository #clone-panel .clone.button{font-size:13px;padding:0 5px}.repository #clone-panel .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository #clone-panel .icon.button{padding:0 10px}.repository #clone-panel .dropdown .menu{right:0!important;left:auto!important}.repository.file.list .repo-description{display:flex;justify-content:space-between;align-items:center}.repository.file.list #repo-desc{font-size:1.2em}.repository.file.list .choose.reference .header .icon{font-size:1.4em}.repository.file.list .repo-path .divider,.repository.file.list .repo-path .section{display:inline}.repository.file.list #file-buttons{font-weight:400}.repository.file.list #file-buttons .ui.button{padding:8px 10px;font-weight:400}.repository.file.list #repo-files-table thead th{padding-top:8px;padding-bottom:5px;font-weight:400}.repository.file.list #repo-files-table thead th:first-child{display:block;position:relative;width:325%}.repository.file.list #repo-files-table thead .ui.avatar{margin-bottom:5px}.repository.file.list #repo-files-table tbody .octicon{margin-left:3px;margin-right:5px;color:#777}.repository.file.list #repo-files-table tbody .octicon.octicon-mail-reply{margin-right:10px}.repository.file.list #repo-files-table tbody .octicon.octicon-file-directory,.repository.file.list #repo-files-table tbody .octicon.octicon-file-submodule,.repository.file.list #repo-files-table tbody .octicon.octicon-file-symlink-directory{color:#1e70bf}.repository.file.list #repo-files-table td{padding-top:8px;padding-bottom:8px}.repository.file.list #repo-files-table td.message .isSigned{cursor:default}.repository.file.list #repo-files-table tr:hover{background-color:#ffE}.repository.file.list #repo-files-table .jumpable-path{color:#888}.repository.file.list .non-diff-file-content .header .icon{font-size:1em}.repository.file.list .non-diff-file-content .header .file-actions{margin-top:0;margin-bottom:-5px;padding-left:20px}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon{display:inline-block;padding:5px;margin-left:5px;line-height:1;color:#767676;vertical-align:middle;background:0 0;border:0;outline:0}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon:hover{color:#4078c0}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon-danger:hover{color:#bd2c00}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon.disabled{color:#bbb;cursor:default}.repository.file.list .non-diff-file-content .header .file-actions #delete-file-form{display:inline-block}.repository.file.list .non-diff-file-content .view-raw{padding:5px}.repository.file.list .non-diff-file-content .view-raw *{max-width:100%}.repository.file.list .non-diff-file-content .view-raw img{padding:5px 5px 0 5px}.repository.file.list .non-diff-file-content .plain-text{padding:1em 2em 1em 2em}.repository.file.list .non-diff-file-content .code-view *{font-size:12px;font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;line-height:20px}.repository.file.list .non-diff-file-content .code-view table{width:100%}.repository.file.list .non-diff-file-content .code-view .lines-num{vertical-align:top;text-align:right;color:#999;background:#f5f5f5;width:1%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}.repository.file.list .non-diff-file-content .code-view .lines-num span{line-height:20px;padding:0 10px;cursor:pointer;display:block}.repository.file.list .non-diff-file-content .code-view .lines-code,.repository.file.list .non-diff-file-content .code-view .lines-num{padding:0}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs,.repository.file.list .non-diff-file-content .code-view .lines-code ol,.repository.file.list .non-diff-file-content .code-view .lines-code pre,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs,.repository.file.list .non-diff-file-content .code-view .lines-num ol,.repository.file.list .non-diff-file-content .code-view .lines-num pre{background-color:#fff;margin:0;padding:0!important}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li,.repository.file.list .non-diff-file-content .code-view .lines-code ol li,.repository.file.list .non-diff-file-content .code-view .lines-code pre li,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li,.repository.file.list .non-diff-file-content .code-view .lines-num ol li,.repository.file.list .non-diff-file-content .code-view .lines-num pre li{display:block;width:100%}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li.active,.repository.file.list .non-diff-file-content .code-view .lines-code ol li.active,.repository.file.list .non-diff-file-content .code-view .lines-code pre li.active,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li.active,.repository.file.list .non-diff-file-content .code-view .lines-num ol li.active,.repository.file.list .non-diff-file-content .code-view .lines-num pre li.active{background:#ffd}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li:before,.repository.file.list .non-diff-file-content .code-view .lines-code ol li:before,.repository.file.list .non-diff-file-content .code-view .lines-code pre li:before,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li:before,.repository.file.list .non-diff-file-content .code-view .lines-num ol li:before,.repository.file.list .non-diff-file-content .code-view .lines-num pre li:before{content:' '}.repository.file.list .non-diff-file-content .code-view .active{background:#ffd}.repository.file.list .sidebar{padding-left:0}.repository.file.list .sidebar .octicon{width:16px}.repository.file.editor .treepath{width:100%}.repository.file.editor .treepath input{vertical-align:middle;box-shadow:rgba(0,0,0,.0745098) 0 1px 2px inset;width:inherit;padding:7px 8px;margin-right:5px}.repository.file.editor .tabular.menu .octicon{margin-right:5px}.repository.file.editor .commit-form-wrapper{padding-left:64px}.repository.file.editor .commit-form-wrapper .commit-avatar{float:left;margin-left:-64px;width:3em;height:auto}.repository.file.editor .commit-form-wrapper .commit-form{position:relative;padding:15px;margin-bottom:10px;border:1px solid #ddd;border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form:after,.repository.file.editor .commit-form-wrapper .commit-form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.file.editor .commit-form-wrapper .commit-form:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#fff}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .branch-name{display:inline-block;padding:3px 6px;font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace;color:rgba(0,0,0,.65);background-color:rgba(209,227,237,.45);border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input{position:relative;margin-left:25px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input input{width:240px!important;padding-left:26px!important}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .octicon-git-branch{position:absolute;top:9px;left:10px;color:#b0c4ce}.repository.options #interval{width:100px!important;min-width:100px}.repository.options .danger .item{padding:20px 15px}.repository.options .danger .ui.divider{margin:0}.repository.new.issue .comment.form .comment .avatar{width:3em}.repository.new.issue .comment.form .content{margin-left:4em}.repository.new.issue .comment.form .content:after,.repository.new.issue .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.new.issue .comment.form .content:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.new.issue .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.new.issue .comment.form .content:after{border-right-color:#fff}.repository.new.issue .comment.form .content .markdown{font-size:14px}.repository.new.issue .comment.form .metas{min-width:220px}.repository.new.issue .comment.form .metas .filter.menu{max-height:300px;overflow-x:auto}.repository.view.issue .title{padding-bottom:0!important}.repository.view.issue .title h1{font-weight:300;font-size:2.3rem;margin-bottom:5px}.repository.view.issue .title h1 .ui.input{font-size:.5em;vertical-align:top;width:50%;min-width:600px}.repository.view.issue .title h1 .ui.input input{font-size:1.5em;padding:6px 10px}.repository.view.issue .title .index{font-weight:300;color:#aaa;letter-spacing:-1px}.repository.view.issue .title .label{margin-right:10px}.repository.view.issue .title .edit-zone{margin-top:10px}.repository.view.issue .pull-desc code{color:#0166E6}.repository.view.issue .pull.tabular.menu{margin-bottom:10px}.repository.view.issue .pull.tabular.menu .octicon{margin-right:5px}.repository.view.issue .pull.tab.segment{border:none;padding:0;padding-top:10px;box-shadow:none;background-color:inherit}.repository.view.issue .pull .merge.box .avatar{margin-left:10px;margin-top:10px}.repository.view.issue .comment-list:before{display:block;content:"";position:absolute;margin-top:12px;margin-bottom:14px;top:0;bottom:0;left:96px;width:2px;background-color:#f3f3f3;z-index:-1}.repository.view.issue .comment-list .comment .avatar{width:3em}.repository.view.issue .comment-list .comment .tag{color:#767676;margin-top:3px;padding:2px 5px;font-size:12px;border:1px solid rgba(0,0,0,.1);border-radius:3px}.repository.view.issue .comment-list .comment .actions .item{float:left}.repository.view.issue .comment-list .comment .actions .item.tag{margin-right:5px}.repository.view.issue .comment-list .comment .actions .item.action{margin-top:6px;margin-left:10px}.repository.view.issue .comment-list .comment .content{margin-left:4em}.repository.view.issue .comment-list .comment .content>.header{font-weight:400;padding:auto 15px;position:relative;color:#767676;background-color:#f7f7f7;border-bottom:1px solid #eee;border-top-left-radius:3px;border-top-right-radius:3px}.repository.view.issue .comment-list .comment .content>.header:after,.repository.view.issue .comment-list .comment .content>.header:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.view.issue .comment-list .comment .content>.header:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.view.issue .comment-list .comment .content>.header:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.view.issue .comment-list .comment .content>.header .text{max-width:78%;padding-top:10px;padding-bottom:10px}.repository.view.issue .comment-list .comment .content .markdown{font-size:14px}.repository.view.issue .comment-list .comment .content .no-content{color:#767676;font-style:italic}.repository.view.issue .comment-list .comment .content>.bottom.segment{background:#f3f4f5}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.images::after{clear:both;content:' ';display:block}.repository.view.issue .comment-list .comment .content>.bottom.segment a{display:block;float:left;margin:5px;padding:5px;height:150px;border:solid 1px #eee;border-radius:3px;max-width:150px;background-color:#fff}.repository.view.issue .comment-list .comment .content>.bottom.segment a:before{content:' ';display:inline-block;height:100%;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.image{max-height:100%;width:auto;margin:0;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image{font-size:128px;color:#000}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image:hover{color:#000}.repository.view.issue .comment-list .comment .ui.form .field:first-child{clear:none}.repository.view.issue .comment-list .comment .ui.form .tab.segment{border:none;padding:0;padding-top:10px}.repository.view.issue .comment-list .comment .ui.form textarea{height:200px;font-family:Consolas,monospace}.repository.view.issue .comment-list .comment .edit.buttons{margin-top:10px}.repository.view.issue .comment-list .event{position:relative;margin:15px 0 15px 79px;padding-left:25px}.repository.view.issue .comment-list .event .octicon{width:30px;float:left;text-align:center}.repository.view.issue .comment-list .event .octicon.octicon-circle-slash{margin-top:5px;margin-left:-34.5px;font-size:20px;color:#bd2c00}.repository.view.issue .comment-list .event .octicon.octicon-primitive-dot{margin-left:-28.5px;margin-right:-1px;font-size:30px;color:#6cc644}.repository.view.issue .comment-list .event .octicon.octicon-bookmark{margin-top:3px;margin-left:-31px;margin-right:-1px;font-size:25px}.repository.view.issue .comment-list .event .detail{font-size:.9rem;margin-top:5px;margin-left:35px}.repository.view.issue .comment-list .event .detail .octicon.octicon-git-commit{margin-top:2px}.repository.view.issue .ui.segment.metas{margin-top:-3px}.repository.view.issue .ui.participants img{margin-top:5px;margin-right:5px}.repository .comment.form .ui.comments{margin-top:-12px;max-width:100%}.repository .comment.form .content .field:first-child{clear:none}.repository .comment.form .content .form:after,.repository .comment.form .content .form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository .comment.form .content .form:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository .comment.form .content .form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository .comment.form .content .form:after{border-right-color:#fff}.repository .comment.form .content .tab.segment{border:none;padding:0;padding-top:10px}.repository .comment.form .content textarea{height:200px;font-family:Consolas,monospace}.repository .label.list{list-style:none;padding-top:15px}.repository .label.list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .label.list .item a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .label.list .item a:hover{color:#000}.repository .label.list .item a.open-issues{margin-right:30px}.repository .label.list .item .ui.label{font-size:1em}.repository .milestone.list{list-style:none;padding-top:15px}.repository .milestone.list>.item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .milestone.list>.item>a{padding-top:5px;padding-right:10px;color:#000}.repository .milestone.list>.item>a:hover{color:#4078c0}.repository .milestone.list>.item .ui.progress{width:40%;padding:0;border:0;margin:0}.repository .milestone.list>.item .ui.progress .bar{height:20px}.repository .milestone.list>.item .meta{color:#999;padding-top:5px}.repository .milestone.list>.item .meta .issue-stats .octicon{padding-left:5px}.repository .milestone.list>.item .meta .overdue{color:red}.repository .milestone.list>.item .operate{margin-top:-15px}.repository .milestone.list>.item .operate>a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .milestone.list>.item .operate>a:hover{color:#000}.repository .milestone.list>.item .content{padding-top:10px}.repository.new.milestone textarea{height:200px}.repository.new.milestone #deadline{width:150px}.repository.compare.pull .choose.branch .octicon{padding-right:10px}.repository.compare.pull .comment.form .content:after,.repository.compare.pull .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.compare.pull .comment.form .content:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.compare.pull .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.compare.pull .comment.form .content:after{border-right-color:#fff}.repository .filter.dropdown .menu{margin-top:1px!important}.repository.commits .header .search input{font-weight:400;padding:5px 10px}.repository #commits-table thead th:first-of-type{padding-left:15px}.repository #commits-table thead .sha{width:140px}.repository #commits-table thead .shatd{text-align:center}.repository #commits-table td.sha .sha.label{margin:0}.repository #commits-table.ui.basic.striped.table tbody tr:nth-child(2n){background-color:rgba(0,0,0,.02)!important}.repository #commits-table td.sha .sha.label.isSigned,.repository #repo-files-table .sha.label.isSigned{border:1px solid #BBB}.repository #commits-table td.sha .sha.label.isSigned .detail.icon,.repository #repo-files-table .sha.label.isSigned .detail.icon{background:#FAFAFA;margin:-6px -10px -4px 0;padding:5px 3px 5px 6px;border-left:1px solid #BBB;border-top-left-radius:0;border-bottom-left-radius:0}.repository #commits-table td.sha .sha.label.isSigned.isVerified,.repository #repo-files-table .sha.label.isSigned.isVerified{border:1px solid #21BA45;background:#21BA4518}.repository #commits-table td.sha .sha.label.isSigned.isVerified .detail.icon,.repository #repo-files-table .sha.label.isSigned.isVerified .detail.icon{border-left:1px solid #21BA4580}.repository .diff-detail-box{margin:15px 0;line-height:30px}.repository .diff-detail-box ol{clear:both;padding-left:0;margin-top:5px;margin-bottom:28px}.repository .diff-detail-box ol li{list-style:none;padding-bottom:4px;margin-bottom:4px;border-bottom:1px dashed #DDD;padding-left:6px}.repository .diff-detail-box span.status{display:inline-block;width:12px;height:12px;margin-right:8px;vertical-align:middle}.repository .diff-detail-box span.status.modify{background-color:#f0db88}.repository .diff-detail-box span.status.add{background-color:#b4e2b4}.repository .diff-detail-box span.status.del{background-color:#e9aeae}.repository .diff-detail-box span.status.rename{background-color:#dad8ff}.repository .diff-detail-box .ui.right{margin-bottom:15px}.repository .diff-box .header{display:flex;align-items:center}.repository .diff-box .header .count{margin-right:12px;font-size:13px;flex:0 0 auto}.repository .diff-box .header .count .bar{background-color:#bd2c00;height:12px;width:40px;display:inline-block;margin:2px 4px 0 4px;vertical-align:text-top}.repository .diff-box .header .count .bar .add{background-color:#55a532;height:12px}.repository .diff-box .header .file{flex:1;color:#888;word-break:break-all}.repository .diff-box .header .button{margin:-5px 0 -5px 12px;padding:8px 10px;flex:0 0 auto}.repository .diff-file-box .header{background-color:#f7f7f7}.repository .diff-file-box .file-body.file-code .lines-num{text-align:right;color:#A7A7A7;background:#fafafa;width:1%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none;vertical-align:top}.repository .diff-file-box .file-body.file-code .lines-num span.fold{display:block;text-align:center}.repository .diff-file-box .file-body.file-code .lines-num-old{border-right:1px solid #DDD}.repository .diff-file-box .code-diff{font-size:12px}.repository .diff-file-box .code-diff td{padding:0;padding-left:10px;border-top:none}.repository .diff-file-box .code-diff pre{margin:0}.repository .diff-file-box .code-diff .lines-num{border-color:#d4d4d5;border-right-width:1px;border-right-style:solid;padding:0 5px}.repository .diff-file-box .code-diff tbody tr td.halfwidth{width:49%}.repository .diff-file-box .code-diff tbody tr td.tag-code,.repository .diff-file-box .code-diff tbody tr.tag-code td{background-color:#F0F0F0!important;border-color:#D2CECE!important;padding-top:8px;padding-bottom:8px}.repository .diff-file-box .code-diff tbody tr .removed-code{background-color:#f99}.repository .diff-file-box .code-diff tbody tr .added-code{background-color:#9f9}.repository .diff-file-box .code-diff-unified tbody tr.del-code td{background-color:#ffe0e0!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff-unified tbody tr.add-code td{background-color:#d6fcd6!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff-split table,.repository .diff-file-box .code-diff-split tbody{width:100%}.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(1),.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(2),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(3),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(4){background-color:#fafafa}.repository .diff-file-box .code-diff-split tbody tr td.del-code,.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(1),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(2){background-color:#ffe0e0!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff-split tbody tr td.add-code,.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(3),.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(4){background-color:#d6fcd6!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff-split tbody tr td:nth-child(3){border-left-width:1px;border-left-style:solid}.repository .diff-file-box.file-content{clear:right}.repository .diff-file-box.file-content img{max-width:100%;padding:5px 5px 0 5px}.repository .code-view{overflow:auto;overflow-x:auto;overflow-y:hidden}.repository .repo-search-result{padding-top:10px;padding-bottom:10px}.repository .repo-search-result .lines-num a{color:inherit}.repository.quickstart .guide .item{padding:1em}.repository.quickstart .guide .item small{font-weight:400}.repository.quickstart .guide .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository.quickstart .guide .ui.action.small.input{width:100%}.repository.quickstart .guide #repo-clone-url{border-radius:0;padding:5px 10px;font-size:1.2em}.repository.release #release-list{border-top:1px solid #DDD;margin-top:20px;padding-top:15px}.repository.release #release-list>li{list-style:none}.repository.release #release-list>li .detail,.repository.release #release-list>li .meta{padding-top:30px;padding-bottom:40px}.repository.release #release-list>li .meta{text-align:right;position:relative}.repository.release #release-list>li .meta .tag:not(.icon){display:block;margin-top:15px}.repository.release #release-list>li .meta .commit{display:block;margin-top:10px}.repository.release #release-list>li .detail{border-left:1px solid #DDD}.repository.release #release-list>li .detail .author img{margin-bottom:-3px}.repository.release #release-list>li .detail .download{margin-top:20px}.repository.release #release-list>li .detail .download>a .octicon{margin-left:5px;margin-right:5px}.repository.release #release-list>li .detail .download .list{padding-left:0;border-top:1px solid #eee}.repository.release #release-list>li .detail .download .list li{list-style:none;display:block;padding-top:8px;padding-bottom:8px;border-bottom:1px solid #eee}.repository.release #release-list>li .detail .dot{width:9px;height:9px;background-color:#ccc;z-index:999;position:absolute;display:block;left:-5px;top:40px;border-radius:6px;border:1px solid #FFF}.repository.new.release .target{min-width:500px}.repository.new.release .target #tag-name{margin-top:-4px}.repository.new.release .target .at{margin-left:-5px;margin-right:5px}.repository.new.release .target .dropdown.icon{margin:0;padding-top:3px}.repository.new.release .target .selection.dropdown{padding-top:10px;padding-bottom:10px}.repository.new.release .prerelease.field{margin-bottom:0}.repository.forks .list{margin-top:0}.repository.forks .list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px solid #DDD}.repository.forks .list .item .ui.avatar{float:left;margin-right:5px}.repository.forks .list .item .link{padding-top:5px}.repository.wiki.start .ui.segment{padding-top:70px;padding-bottom:100px}.repository.wiki.start .ui.segment .mega-octicon{font-size:48px}.repository.wiki.new .CodeMirror .CodeMirror-code{font-family:Consolas,monospace}.repository.wiki.new .CodeMirror .CodeMirror-code .cm-comment{background:inherit}.repository.wiki.new .editor-preview{background-color:#fff}.repository.wiki.view .choose.page{margin-top:-5px}.repository.wiki.view .ui.sub.header{text-transform:none}.repository.wiki.view>.markdown{padding:15px 30px}.repository.wiki.view>.markdown h1:first-of-type,.repository.wiki.view>.markdown h2:first-of-type,.repository.wiki.view>.markdown h3:first-of-type,.repository.wiki.view>.markdown h4:first-of-type,.repository.wiki.view>.markdown h5:first-of-type,.repository.wiki.view>.markdown h6:first-of-type{margin-top:0}@media only screen and (max-width:767px){.repository.wiki .dividing.header .stackable.grid .button{margin-top:2px;margin-bottom:2px}}.repository.settings.collaboration .collaborator.list{padding:0}.repository.settings.collaboration .collaborator.list>.item{margin:0;line-height:2em}.repository.settings.collaboration .collaborator.list>.item:not(:last-child){border-bottom:1px solid #DDD}.repository.settings.collaboration #repo-collab-form #search-user-box .results{left:7px}.repository.settings.collaboration #repo-collab-form .ui.button{margin-left:5px;margin-top:-3px}.repository.settings.branches .protected-branches .selection.dropdown{width:300px}.repository.settings.branches .protected-branches .item{border:1px solid #eaeaea;padding:10px 15px}.repository.settings.branches .protected-branches .item:not(:last-child){border-bottom:0}.repository.settings.branches .branch-protection .help{margin-left:26px;padding-top:0}.repository.settings.branches .branch-protection .fields{margin-left:20px;display:block}.repository.settings.branches .branch-protection .whitelist{margin-left:26px}.repository.settings.branches .branch-protection .whitelist .dropdown img{display:inline-block}.repository.settings.webhook .events .column{padding-bottom:0}.repository.settings.webhook .events .help{font-size:13px;margin-left:26px;padding-top:0}.repository .ui.attached.isSigned.isVerified:not(.positive){border-left:1px solid #A3C293;border-right:1px solid #A3C293}.repository .ui.attached.isSigned.isVerified.top:not(.positive){border-top:1px solid #A3C293}.repository .ui.attached.isSigned.isVerified:not(.positive):last-child{border-bottom:1px solid #A3C293}.repository .ui.segment.sub-menu{padding:7px;line-height:0}.repository .ui.segment.sub-menu .list{width:100%;display:flex}.repository .ui.segment.sub-menu .list .item{width:100%;border-radius:3px}.repository .ui.segment.sub-menu .list .item a{color:#000}.repository .ui.segment.sub-menu .list .item a:hover{color:#666}.repository .ui.segment.sub-menu .list .item.active{background:rgba(0,0,0,.05)}.repository .segment.reactions.dropdown .menu,.repository .select-reaction.dropdown .menu{right:0!important;left:auto!important}.repository .segment.reactions.dropdown .menu>.header,.repository .select-reaction.dropdown .menu>.header{margin:.75rem 0 .5rem}.repository .segment.reactions.dropdown .menu>.item,.repository .select-reaction.dropdown .menu>.item{float:left;padding:.5rem .5rem!important}.repository .segment.reactions.dropdown .menu>.item img.emoji,.repository .select-reaction.dropdown .menu>.item img.emoji{margin-right:0}.repository .segment.reactions{padding:.3em 1em}.repository .segment.reactions .ui.label{padding:.4em}.repository .segment.reactions .ui.label.disabled{cursor:default}.repository .segment.reactions .ui.label>img{height:1.5em!important}.repository .segment.reactions .select-reaction{float:none}.repository .segment.reactions .select-reaction:not(.active) a{display:none}.repository .segment.reactions:hover .select-reaction a{display:block}.user-cards .list{padding:0}.user-cards .list .item{list-style:none;width:32%;margin:10px 10px 10px 0;padding-bottom:14px;float:left}.user-cards .list .item .avatar{width:48px;height:48px;float:left;display:block;margin-right:10px}.user-cards .list .item .name{margin-top:0;margin-bottom:0;font-weight:400}.user-cards .list .item .meta{margin-top:5px}#search-repo-box .results .result .image,#search-user-box .results .result .image{float:left;margin-right:8px;width:2em;height:2em}#search-repo-box .results .result .content,#search-user-box .results .result .content{margin:6px 0}#issue-actions{display:none}.issue.list{list-style:none;padding-top:15px}.issue.list>.item{padding-top:15px;padding-bottom:10px;border-bottom:1px dashed #AAA}.issue.list>.item .title{color:#444;font-size:15px;font-weight:700;margin:0 6px}.issue.list>.item .title:hover{color:#000}.issue.list>.item .comment{padding-right:10px;color:#666}.issue.list>.item .desc{padding-top:5px;color:#999}.issue.list>.item .desc .checklist{padding-left:5px}.issue.list>.item .desc .checklist .progress-bar{margin-left:2px;width:80px;height:6px;display:inline-block;background-color:#eee;overflow:hidden;border-radius:3px;vertical-align:2px!important}.issue.list>.item .desc .checklist .progress-bar .progress{background-color:#ccc;display:block;height:100%}.issue.list>.item .desc a.milestone{padding-left:5px;color:#999!important}.issue.list>.item .desc a.milestone:hover{color:#000!important}.issue.list>.item .desc .assignee{margin-top:-5px;margin-right:5px}.issue.list>.item .desc .overdue{color:red}.page.buttons{padding-top:15px}.ui.form .dropzone{width:100%;margin-bottom:10px;border:2px dashed #0087F7;box-shadow:none!important}.ui.form .dropzone .dz-error-message{top:140px}.settings .content{margin-top:2px}.settings .content .segment,.settings .content>.header{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.settings .list>.item .green{color:#21BA45!important}.settings .list>.item:not(:first-child){border-top:1px solid #eaeaea;padding:1rem;margin:15px -1rem -1rem -1rem}.settings .list>.item>.mega-octicon{display:table-cell}.settings .list>.item>.mega-octicon+.content{display:table-cell;padding:0 0 0 .5em;vertical-align:top}.settings .list>.item .info{margin-top:10px}.settings .list>.item .info .tab.segment{border:none;padding:10px 0 0}.settings .list.key .meta{padding-top:5px;color:#666}.settings .list.email>.item:not(:first-child){min-height:60px}.settings .list.collaborator>.item{padding:0}.ui.vertical.menu .header.item{font-size:1.1em;background:#f0f0f0}.edit-label.modal .form .column,.new-label.segment .form .column{padding-right:0}.edit-label.modal .form .buttons,.new-label.segment .form .buttons{margin-left:auto;padding-top:15px}.edit-label.modal .form .color.picker.column,.new-label.segment .form .color.picker.column{width:auto}.edit-label.modal .form .color.picker.column .color-picker,.new-label.segment .form .color.picker.column .color-picker{height:35px;width:auto;padding-left:30px}.edit-label.modal .form .minicolors-swatch.minicolors-sprite,.new-label.segment .form .minicolors-swatch.minicolors-sprite{top:10px;left:10px;width:15px;height:15px}.edit-label.modal .form .precolors,.new-label.segment .form .precolors{padding-left:0;padding-right:0;margin:3px 10px auto 10px;width:120px}.edit-label.modal .form .precolors .color,.new-label.segment .form .precolors .color{float:left;width:15px;height:15px}#avatar-arrow:after,#avatar-arrow:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}#avatar-arrow:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}#avatar-arrow:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}#delete-repo-modal .ui.message,#transfer-repo-modal .ui.message{width:100%!important}.tab-size-1{tab-size:1!important;-moz-tab-size:1!important}.tab-size-2{tab-size:2!important;-moz-tab-size:2!important}.tab-size-3{tab-size:3!important;-moz-tab-size:3!important}.tab-size-4{tab-size:4!important;-moz-tab-size:4!important}.tab-size-5{tab-size:5!important;-moz-tab-size:5!important}.tab-size-6{tab-size:6!important;-moz-tab-size:6!important}.tab-size-7{tab-size:7!important;-moz-tab-size:7!important}.tab-size-8{tab-size:8!important;-moz-tab-size:8!important}.tab-size-9{tab-size:9!important;-moz-tab-size:9!important}.tab-size-10{tab-size:10!important;-moz-tab-size:10!important}.tab-size-11{tab-size:11!important;-moz-tab-size:11!important}.tab-size-12{tab-size:12!important;-moz-tab-size:12!important}.tab-size-13{tab-size:13!important;-moz-tab-size:13!important}.tab-size-14{tab-size:14!important;-moz-tab-size:14!important}.tab-size-15{tab-size:15!important;-moz-tab-size:15!important}.tab-size-16{tab-size:16!important;-moz-tab-size:16!important}.stats-table{display:table;width:100%}.stats-table .table-cell{display:table-cell}.stats-table .table-cell.tiny{height:.5em}tbody.commit-list{vertical-align:baseline}.commit-body{white-space:pre-wrap}@media only screen and (max-width:767px){.ui.stackable.menu.mobile--margin-between-items>.item{margin-top:5px;margin-bottom:5px}.ui.stackable.menu.mobile--no-negative-margins{margin-left:0;margin-right:0}}#topic_edit{margin-top:5px;display:none}#repo-topic{margin-top:5px}.CodeMirror{font:14px Consolas,"Liberation Mono",Menlo,Courier,monospace}.CodeMirror.cm-s-default{border-radius:3px;padding:0!important}.CodeMirror .cm-comment{background:inherit!important}.repository.file.editor .tab[data-tab=write]{padding:0!important}.repository.file.editor .tab[data-tab=write] .editor-toolbar{border:none!important}.repository.file.editor .tab[data-tab=write] .CodeMirror{border-left:none;border-right:none;border-bottom:none}.organization{padding-top:15px;padding-bottom:80px}.organization .head .ui.header .text{vertical-align:middle;font-size:1.6rem;margin-left:15px}.organization .head .ui.header .ui.right{margin-top:5px}.organization.new.org form{margin:auto}.organization.new.org form .ui.message{text-align:center}@media only screen and (min-width:768px){.organization.new.org form{width:800px!important}.organization.new.org form .header{padding-left:280px!important}.organization.new.org form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.organization.new.org form .help{margin-left:265px!important}.organization.new.org form .optional .title{margin-left:250px!important}.organization.new.org form input,.organization.new.org form textarea{width:50%!important}}@media only screen and (max-width:767px){.organization.new.org form .optional .title{margin-left:15px}.organization.new.org form .inline.field>label{display:block}}.organization.new.org form .header{padding-left:0!important;text-align:center}.organization.options input{min-width:300px}.organization.profile #org-avatar{width:100px;height:100px;margin-right:15px}.organization.profile #org-info .ui.header{font-size:36px;margin-bottom:0}.organization.profile #org-info .desc{font-size:16px;margin-bottom:10px}.organization.profile #org-info .meta .item{display:inline-block;margin-right:10px}.organization.profile #org-info .meta .item .icon{margin-right:5px}.organization.profile .ui.top.header .ui.right{margin-top:0}.organization.profile .teams .item{padding:10px 15px}.organization.profile .members .ui.avatar,.organization.teams .members .ui.avatar{width:48px;height:48px;margin-right:5px}.organization.invite #invite-box{margin:auto;margin-top:50px;width:500px!important}.organization.invite #invite-box #search-user-box input{margin-left:0;width:300px}.organization.invite #invite-box .ui.button{margin-left:5px;margin-top:-3px}.organization.members .list .item{margin-left:0;margin-right:0;border-bottom:1px solid #eee}.organization.members .list .item .ui.avatar{width:48px;height:48px}.organization.members .list .item .meta{line-height:24px}.organization.teams .detail .item{padding:10px 15px}.organization.teams .detail .item:not(:last-child){border-bottom:1px solid #eee}.organization.teams .members .item,.organization.teams .repositories .item{padding:10px 20px;line-height:32px}.organization.teams .members .item:not(:last-child),.organization.teams .repositories .item:not(:last-child){border-bottom:1px solid #DDD}.organization.teams .members .item .button,.organization.teams .repositories .item .button{padding:9px 10px}.organization.teams #add-member-form input,.organization.teams #add-repo-form input{margin-left:0}.organization.teams #add-member-form .ui.button,.organization.teams #add-repo-form .ui.button{margin-left:5px;margin-top:-3px}.user:not(.icon){padding-top:15px;padding-bottom:80px}.user.profile .ui.card .username{display:block}.user.profile .ui.card .extra.content{padding:0}.user.profile .ui.card .extra.content ul{margin:0;padding:0}.user.profile .ui.card .extra.content ul li{padding:10px;list-style:none}.user.profile .ui.card .extra.content ul li:not(:last-child){border-bottom:1px solid #eaeaea}.user.profile .ui.card .extra.content ul li .octicon{margin-left:1px;margin-right:5px}.user.profile .ui.card .extra.content ul li.follow .ui.button{width:100%}.user.profile .ui.repository.list{margin-top:25px}.user.followers .header.name{font-size:20px;line-height:24px;vertical-align:middle}.user.followers .follow .ui.button{padding:8px 15px}.user.notification .octicon{float:left;font-size:2em}.user.notification .content{float:left;margin-left:7px}.user.notification table form{display:inline-block}.user.notification table button{padding:3px 3px 3px 5px}.user.notification table tr{cursor:pointer}.user.notification .octicon.green{color:#21ba45}.user.notification .octicon.red{color:#d01919}.user.notification .octicon.purple{color:#a333c8}.user.notification .octicon.blue{color:#2185d0}.user.link-account:not(.icon){padding-top:15px;padding-bottom:5px}.user.settings .iconFloat{float:left}.dashboard{padding-top:15px;padding-bottom:80px}.dashboard.feeds .context.user.menu,.dashboard.issues .context.user.menu{z-index:101;min-width:200px}.dashboard.feeds .context.user.menu .ui.header,.dashboard.issues .context.user.menu .ui.header{font-size:1rem;text-transform:none}.dashboard.feeds .filter.menu .item,.dashboard.issues .filter.menu .item{text-align:left}.dashboard.feeds .filter.menu .item .text,.dashboard.issues .filter.menu .item .text{height:16px;vertical-align:middle}.dashboard.feeds .filter.menu .item .text.truncate,.dashboard.issues .filter.menu .item .text.truncate{width:85%}.dashboard.feeds .filter.menu .item .floating.label,.dashboard.issues .filter.menu .item .floating.label{top:7px;left:90%;width:15%}.dashboard.feeds .filter.menu .jump.item,.dashboard.issues .filter.menu .jump.item{margin:1px;padding-right:0}.dashboard.feeds .filter.menu .menu,.dashboard.issues .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.dashboard.feeds .right.stackable.menu>.item.active,.dashboard.issues .right.stackable.menu>.item.active{color:#d9453d}.dashboard .dashboard-repos{margin:0 1px}.feeds .news>.ui.grid{margin-left:auto;margin-right:auto}.feeds .news .ui.avatar{margin-top:13px}.feeds .news p{line-height:1em}.feeds .news .time-since{font-size:13px}.feeds .news .issue.title{width:80%}.feeds .news .push.news .content ul{font-size:13px;list-style:none;padding-left:10px}.feeds .news .push.news .content ul img{margin-bottom:-2px}.feeds .news .push.news .content ul .text.truncate{width:80%;margin-bottom:-5px}.feeds .news .commit-id{font-family:Consolas,monospace}.feeds .news code{padding:1px;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px;word-break:break-all}.feeds .list .header .ui.label{margin-top:-4px;padding:4px 5px;font-weight:400}.feeds .list .header .plus.icon{margin-top:5px}.feeds .list ul{list-style:none;margin:0;padding-left:0}.feeds .list ul li:not(:last-child){border-bottom:1px solid #EAEAEA}.feeds .list ul li.private{background-color:#fcf8e9}.feeds .list ul li a{padding:6px 1.2em;display:block}.feeds .list ul li a .octicon{color:#888}.feeds .list ul li a .octicon.rear{font-size:15px}.feeds .list ul li a .star-num{font-size:12px}.feeds .list .repo-owner-name-list .item-name{max-width:70%;margin-bottom:-4px}.feeds .list #collaborative-repo-list .owner-and-repo{max-width:80%;margin-bottom:-5px}.feeds .list #collaborative-repo-list .owner-name{max-width:120px;margin-bottom:-5px}.admin{padding-top:15px;padding-bottom:80px}.admin .table.segment{padding:0;font-size:13px}.admin .table.segment:not(.striped){padding-top:5px}.admin .table.segment:not(.striped) thead th:last-child{padding-right:5px!important}.admin .table.segment th{padding-top:5px;padding-bottom:5px}.admin .table.segment:not(.select) td:first-of-type,.admin .table.segment:not(.select) th:first-of-type{padding-left:15px!important}.admin .ui.header,.admin .ui.segment{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.admin.user .email{max-width:200px}.admin dl.admin-dl-horizontal{padding:20px;margin:0}.admin dl.admin-dl-horizontal dd{margin-left:275px}.admin dl.admin-dl-horizontal dt{font-weight:bolder;float:left;width:285px;clear:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.admin.config #test-mail-btn{margin-left:5px}.explore{padding-top:15px;padding-bottom:80px}.explore .navbar{justify-content:center;padding-top:15px!important;margin-top:-15px!important;margin-bottom:15px!important;background-color:#FAFAFA!important;border-width:1px!important}.explore .navbar .octicon{width:16px;text-align:center;margin-right:5px}.ui.repository.list .item{padding-bottom:25px}.ui.repository.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.repository.list .item .ui.header{font-size:1.5rem;padding-bottom:10px}.ui.repository.list .item .ui.header .name{word-break:break-all}.ui.repository.list .item .ui.header .metas{color:#888;font-size:14px;font-weight:400}.ui.repository.list .item .ui.header .metas span:not(:last-child){margin-right:5px}.ui.repository.list .item .time{font-size:12px;color:grey}.ui.repository.branches .time{font-size:12px;color:grey}.ui.user.list .item{padding-bottom:25px}.ui.user.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.user.list .item .ui.avatar.image{width:40px;height:40px}.ui.user.list .item .description{margin-top:5px}.ui.user.list .item .description .octicon:not(:first-child){margin-left:5px}.ui.user.list .item .description a{color:#333}.ui.user.list .item .description a:hover{text-decoration:underline} \ No newline at end of file diff --git a/public/less/_markdown.less b/public/less/_markdown.less index 9e2734e42..458016d71 100644 --- a/public/less/_markdown.less +++ b/public/less/_markdown.less @@ -5,6 +5,10 @@ line-height: 1.6 !important; word-wrap: break-word; + &.ui.segment { + padding: 3em; + } + &.file-view { padding: 2em 2em 2em !important; } diff --git a/public/swagger.v1.json b/public/swagger.v1.json index c5b1baa9a..e0f2a7589 100644 --- a/public/swagger.v1.json +++ b/public/swagger.v1.json @@ -321,9 +321,13 @@ "operationId": "renderMarkdownRaw", "parameters": [ { - "type": "string", + "description": "Request body to render", "name": "body", - "in": "body" + "in": "body", + "required": true, + "schema": { + "type": "string" + } } ], "responses": { @@ -448,6 +452,15 @@ ], "summary": "List an organization's webhooks", "operationId": "orgListHooks", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + } + ], "responses": { "200": { "$ref": "#/responses/HookList" @@ -468,6 +481,15 @@ ], "summary": "Create a hook", "operationId": "orgCreateHook", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + } + ], "responses": { "201": { "$ref": "#/responses/Hook" @@ -485,6 +507,22 @@ ], "summary": "Get a hook", "operationId": "orgGetHook", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the hook to get", + "name": "id", + "in": "path", + "required": true + } + ], "responses": { "200": { "$ref": "#/responses/Hook" @@ -500,6 +538,22 @@ ], "summary": "Delete a hook", "operationId": "orgDeleteHook", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the hook to delete", + "name": "id", + "in": "path", + "required": true + } + ], "responses": { "204": { "$ref": "#/responses/empty" @@ -518,6 +572,22 @@ ], "summary": "Update a hook", "operationId": "orgEditHook", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the hook to update", + "name": "id", + "in": "path", + "required": true + } + ], "responses": { "200": { "$ref": "#/responses/Hook" @@ -994,7 +1064,7 @@ } } }, - "/repos/{owner}/{repo}/archive/{filepath}": { + "/repos/{owner}/{repo}/archive/{archive}": { "get": { "produces": [ "application/json" @@ -1028,7 +1098,9 @@ } ], "responses": { - "200": {} + "200": { + "description": "success" + } } } }, @@ -1338,7 +1410,9 @@ } ], "responses": { - "200": {} + "200": { + "description": "success" + } } } }, @@ -1526,6 +1600,47 @@ } } }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Delete a hook in a repository", + "operationId": "repoDeleteHook", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the hook to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, "patch": { "produces": [ "application/json" @@ -1550,6 +1665,13 @@ "in": "path", "required": true }, + { + "type": "integer", + "description": "index of the hook", + "name": "id", + "in": "path", + "required": true + }, { "name": "body", "in": "body", @@ -1821,6 +1943,100 @@ } } }, + "/repos/{owner}/{repo}/issues/{id}/times": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "List an issue's tracked times", + "operationId": "issueTrackedTimes", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "index of the issue", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/TrackedTimeList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Add a tracked time to a issue", + "operationId": "issueAddTime", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "index of the issue to add tracked time to", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/AddTimeOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/TrackedTime" + }, + "400": { + "$ref": "#/responses/error" + }, + "403": { + "$ref": "#/responses/error" + } + } + } + }, "/repos/{owner}/{repo}/issues/{index}": { "get": { "produces": [ @@ -1937,7 +2153,7 @@ { "type": "integer", "description": "index of the issue", - "name": "id", + "name": "index", "in": "path", "required": true }, @@ -1984,7 +2200,7 @@ { "type": "integer", "description": "index of the issue", - "name": "id", + "name": "index", "in": "path", "required": true }, @@ -2328,100 +2544,6 @@ } } }, - "/repos/{owner}/{repo}/issues/{index}/times": { - "get": { - "produces": [ - "application/json" - ], - "tags": [ - "issue" - ], - "summary": "List an issue's tracked times", - "operationId": "issueTrackedTimes", - "parameters": [ - { - "type": "string", - "description": "owner of the repo", - "name": "owner", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "name of the repo", - "name": "repo", - "in": "path", - "required": true - }, - { - "type": "integer", - "description": "index of the issue", - "name": "repo", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "$ref": "#/responses/TrackedTimeList" - } - } - }, - "post": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "issue" - ], - "summary": "Add a tracked time to a issue", - "operationId": "issueAddTime", - "parameters": [ - { - "type": "string", - "description": "owner of the repo", - "name": "owner", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "name of the repo", - "name": "repo", - "in": "path", - "required": true - }, - { - "type": "integer", - "description": "index of the issue to add tracked time to", - "name": "id", - "in": "path", - "required": true - }, - { - "name": "body", - "in": "body", - "schema": { - "$ref": "#/definitions/AddTimeOption" - } - } - ], - "responses": { - "200": { - "$ref": "#/responses/TrackedTime" - }, - "400": { - "$ref": "#/responses/error" - }, - "403": { - "$ref": "#/responses/error" - } - } - } - }, "/repos/{owner}/{repo}/keys": { "get": { "produces": [ @@ -2777,7 +2899,7 @@ "issue" ], "summary": "Get all of a repository's milestones", - "operationId": "issueGetMilestones", + "operationId": "issueGetMilestonesList", "parameters": [ { "type": "string", @@ -2792,13 +2914,6 @@ "name": "repo", "in": "path", "required": true - }, - { - "type": "integer", - "description": "id of the milestone to get", - "name": "id", - "in": "path", - "required": true } ], "responses": { @@ -2859,6 +2974,29 @@ ], "summary": "Get a milestone", "operationId": "issueGetMilestone", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the milestone", + "name": "id", + "in": "path", + "required": true + } + ], "responses": { "200": { "$ref": "#/responses/Milestone" @@ -2889,7 +3027,7 @@ { "type": "integer", "description": "id of the milestone to delete", - "name": "body", + "name": "id", "in": "path", "required": true } @@ -2927,6 +3065,13 @@ "in": "path", "required": true }, + { + "type": "integer", + "description": "id of the milestone", + "name": "id", + "in": "path", + "required": true + }, { "name": "body", "in": "body", @@ -3261,7 +3406,9 @@ } ], "responses": { - "200": {} + "200": { + "description": "success" + } } } }, @@ -3973,7 +4120,7 @@ } } }, - "/repos/{owner}/{repo}/times/{tracker}": { + "/repos/{owner}/{repo}/times/{user}": { "get": { "produces": [ "application/json" @@ -4013,49 +4160,6 @@ } } }, - "/repos/{user}/{repo}/hooks/{id}": { - "delete": { - "produces": [ - "application/json" - ], - "tags": [ - "repository" - ], - "summary": "Delete a hook in a repository", - "operationId": "repoDeleteHook", - "parameters": [ - { - "type": "string", - "description": "owner of the repo", - "name": "owner", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "name of the repo", - "name": "repo", - "in": "path", - "required": true - }, - { - "type": "integer", - "description": "id of the hook to delete", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "$ref": "#/responses/empty" - }, - "404": { - "$ref": "#/responses/notFound" - } - } - } - }, "/repositories/{id}": { "get": { "produces": [ @@ -4232,7 +4336,7 @@ "organization" ], "summary": "Remove a team member", - "operationId": "orgAddTeamMember", + "operationId": "orgRemoveTeamMember", "parameters": [ { "type": "integer", @@ -4291,7 +4395,7 @@ "organization" ], "summary": "Add a repository to a team", - "operationId": "orgAddTeamMember", + "operationId": "orgAddTeamRepository", "parameters": [ { "type": "integer", @@ -4330,7 +4434,7 @@ "organization" ], "summary": "Remove a repository from a team", - "operationId": "orgAddTeamMember", + "operationId": "orgRemoveTeamRepository", "parameters": [ { "type": "integer", @@ -4373,10 +4477,10 @@ "operationId": "topicSearch", "parameters": [ { - "type": "integer", - "description": "id of the repo to get", - "name": "keyword", - "in": "path", + "type": "string", + "description": "keywords to search", + "name": "q", + "in": "query", "required": true } ], @@ -4503,7 +4607,7 @@ } } }, - "/user/following/{followee}": { + "/user/following/{username}": { "get": { "tags": [ "user" @@ -4514,7 +4618,7 @@ { "type": "string", "description": "username of followed user", - "name": "followee", + "name": "username", "in": "path", "required": true } @@ -4527,9 +4631,7 @@ "$ref": "#/responses/notFound" } } - } - }, - "/user/following/{username}": { + }, "put": { "tags": [ "user" @@ -4999,7 +5101,8 @@ "type": "string", "description": "username of user", "name": "username", - "in": "path" + "in": "path", + "required": true } ], "responses": { @@ -5273,7 +5376,8 @@ "type": "string", "description": "username of the user", "name": "username", - "in": "path" + "in": "path", + "required": true } ], "responses": { @@ -5293,6 +5397,15 @@ ], "summary": "List the authenticated user's access tokens", "operationId": "userGetTokens", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + } + ], "responses": { "200": { "$ref": "#/responses/AccessTokenList" @@ -5315,8 +5428,10 @@ { "type": "string", "x-go-name": "Name", - "name": "name", - "in": "query" + "description": "username of user", + "name": "username", + "in": "path", + "required": true } ], "responses": { @@ -7376,11 +7491,13 @@ "description": "AccessTokenList represents a list of API access token." }, "Attachment": { + "description": "Attachment", "schema": { "$ref": "#/definitions/Attachment" } }, "AttachmentList": { + "description": "AttachmentList", "schema": { "type": "array", "items": { @@ -7389,11 +7506,13 @@ } }, "Branch": { + "description": "Branch", "schema": { "$ref": "#/definitions/Branch" } }, "BranchList": { + "description": "BranchList", "schema": { "type": "array", "items": { @@ -7402,11 +7521,13 @@ } }, "Comment": { + "description": "Comment", "schema": { "$ref": "#/definitions/Comment" } }, "CommentList": { + "description": "CommentList", "schema": { "type": "array", "items": { @@ -7415,11 +7536,13 @@ } }, "DeployKey": { + "description": "DeployKey", "schema": { "$ref": "#/definitions/DeployKey" } }, "DeployKeyList": { + "description": "DeployKeyList", "schema": { "type": "array", "items": { @@ -7428,6 +7551,7 @@ } }, "EmailList": { + "description": "EmailList", "schema": { "type": "array", "items": { @@ -7436,11 +7560,13 @@ } }, "GPGKey": { + "description": "GPGKey", "schema": { "$ref": "#/definitions/GPGKey" } }, "GPGKeyList": { + "description": "GPGKeyList", "schema": { "type": "array", "items": { @@ -7449,6 +7575,7 @@ } }, "Hook": { + "description": "Hook", "schema": { "type": "array", "items": { @@ -7457,6 +7584,7 @@ } }, "HookList": { + "description": "HookList", "schema": { "type": "array", "items": { @@ -7465,11 +7593,13 @@ } }, "Issue": { + "description": "Issue", "schema": { "$ref": "#/definitions/Issue" } }, "IssueList": { + "description": "IssueList", "schema": { "type": "array", "items": { @@ -7478,11 +7608,13 @@ } }, "Label": { + "description": "Label", "schema": { "$ref": "#/definitions/Label" } }, "LabelList": { + "description": "LabelList", "schema": { "type": "array", "items": { @@ -7494,11 +7626,13 @@ "description": "MarkdownRender is a rendered markdown document" }, "Milestone": { + "description": "Milestone", "schema": { "$ref": "#/definitions/Milestone" } }, "MilestoneList": { + "description": "MilestoneList", "schema": { "type": "array", "items": { @@ -7507,11 +7641,13 @@ } }, "Organization": { + "description": "Organization", "schema": { "$ref": "#/definitions/Organization" } }, "OrganizationList": { + "description": "OrganizationList", "schema": { "type": "array", "items": { @@ -7520,11 +7656,13 @@ } }, "PublicKey": { + "description": "PublicKey", "schema": { "$ref": "#/definitions/PublicKey" } }, "PublicKeyList": { + "description": "PublicKeyList", "schema": { "type": "array", "items": { @@ -7533,11 +7671,13 @@ } }, "PullRequest": { + "description": "PullRequest", "schema": { "$ref": "#/definitions/PullRequest" } }, "PullRequestList": { + "description": "PullRequestList", "schema": { "type": "array", "items": { @@ -7546,11 +7686,13 @@ } }, "Release": { + "description": "Release", "schema": { "$ref": "#/definitions/Release" } }, "ReleaseList": { + "description": "ReleaseList", "schema": { "type": "array", "items": { @@ -7559,11 +7701,13 @@ } }, "Repository": { + "description": "Repository", "schema": { "$ref": "#/definitions/Repository" } }, "RepositoryList": { + "description": "RepositoryList", "schema": { "type": "array", "items": { @@ -7572,24 +7716,25 @@ } }, "SearchResults": { + "description": "SearchResults", "schema": { "$ref": "#/definitions/SearchResults" - }, - "headers": { - "body": {} } }, "ServerVersion": { + "description": "ServerVersion", "schema": { "$ref": "#/definitions/ServerVersion" } }, "Status": { + "description": "Status", "schema": { "$ref": "#/definitions/Status" } }, "StatusList": { + "description": "StatusList", "schema": { "type": "array", "items": { @@ -7598,11 +7743,13 @@ } }, "Team": { + "description": "Team", "schema": { "$ref": "#/definitions/Team" } }, "TeamList": { + "description": "TeamList", "schema": { "type": "array", "items": { @@ -7611,11 +7758,13 @@ } }, "TrackedTime": { + "description": "TrackedTime", "schema": { "$ref": "#/definitions/TrackedTime" } }, "TrackedTimeList": { + "description": "TrackedTimeList", "schema": { "type": "array", "items": { @@ -7624,11 +7773,13 @@ } }, "User": { + "description": "User", "schema": { "$ref": "#/definitions/User" } }, "UserList": { + "description": "UserList", "schema": { "type": "array", "items": { @@ -7637,6 +7788,7 @@ } }, "WatchInfo": { + "description": "WatchInfo", "schema": { "$ref": "#/definitions/WatchInfo" } @@ -7670,42 +7822,9 @@ "description": "APINotFound is a not found empty response" }, "parameterBodies": { + "description": "parameterBodies", "schema": { "$ref": "#/definitions/EditAttachmentOptions" - }, - "headers": { - "AddCollaboratorOption": {}, - "AddTimeOption": {}, - "CreateEmailOption": {}, - "CreateForkOption": {}, - "CreateHookOption": {}, - "CreateIssueCommentOption": {}, - "CreateIssueOption": {}, - "CreateKeyOption": {}, - "CreateLabelOption": {}, - "CreateMilestoneOption": {}, - "CreateOrgOption": {}, - "CreatePullRequestOption": {}, - "CreateReleaseOption": {}, - "CreateRepoOption": {}, - "CreateStatusOption": {}, - "CreateTeamOption": {}, - "CreateUserOption": {}, - "DeleteEmailOption": {}, - "EditAttachmentOptions": {}, - "EditHookOption": {}, - "EditIssueCommentOption": {}, - "EditIssueOption": {}, - "EditLabelOption": {}, - "EditMilestoneOption": {}, - "EditOrgOption": {}, - "EditPullRequestOption": {}, - "EditReleaseOption": {}, - "EditTeamOption": {}, - "EditUserOption": {}, - "IssueLabelsOption": {}, - "MarkdownOption": {}, - "MigrateRepoForm": {} } }, "redirect": { @@ -7745,24 +7864,16 @@ }, "security": [ { - "BasicAuth": [ - "[]" - ] + "BasicAuth": [] }, { - "Token": [ - "[]" - ] + "Token": [] }, { - "AccessToken": [ - "[]" - ] + "AccessToken": [] }, { - "AuthorizationHeaderToken": [ - "[]" - ] + "AuthorizationHeaderToken": [] } ] } \ No newline at end of file diff --git a/public/vendor/VERSIONS b/public/vendor/VERSIONS index e1e09a87e..561d3d3e4 100644 --- a/public/vendor/VERSIONS +++ b/public/vendor/VERSIONS @@ -15,10 +15,7 @@ File(s): /vendor/plugins/clipboard/clipboard.min.js Version: 1.5.9 File(s): /vendor/plugins/gitgraph/gitgraph.js -Version: 9b492e8bf1ddf7908a4997b8f83fa38a809a9da3 - -File(s): /vendor/plugins/autolink/autolink.js -Version: 741f66f +Version: 745f604212e2abfe2f0a59169ea530857b46625c File(s): /vendor/plugins/vue/vue.min.js Version: 2.1.10 @@ -50,6 +47,9 @@ Version: 1.10.1 File(s): /vendor/plugins/pdfjs/ Version: 1.4.20 +File(s): /vendor/plugins/u2f/ +Version: 1.0.8 + File(s): /vendor/assets/font-awesome/fonts/ Version: 4.6.0 diff --git a/public/vendor/librejs.html b/public/vendor/librejs.html index e24bb9c3e..3d783d412 100644 --- a/public/vendor/librejs.html +++ b/public/vendor/librejs.html @@ -45,11 +45,6 @@ BSD 3-Clause gitgraph.js-latest - - autolink.min.js - Expat - autolink.js-latest - vue.min.js Expat diff --git a/public/vendor/plugins/gitgraph/gitgraph.js b/public/vendor/plugins/gitgraph/gitgraph.js index bab36e770..05ca0844d 100644 --- a/public/vendor/plugins/gitgraph/gitgraph.js +++ b/public/vendor/plugins/gitgraph/gitgraph.js @@ -126,7 +126,20 @@ var gitGraph = function (canvas, rawGraphList, config) { !(row[i - 2] && row[i] === "_" && row[i - 2] === "|")) {} return i; - } + }; + + var findLineBreak = function (row) { + if (!row) { + return -1 + } + + var i = row.length; + + while (i-- && + !(row[i - 1] && row[i - 2] && row[i] === " " && row[i - 1] === "|" && row[i - 2] === "_")) {} + + return i; + }; var genNewFlow = function () { var newId; @@ -138,21 +151,21 @@ var gitGraph = function (canvas, rawGraphList, config) { return {id:newId, color:"#" + newId}; }; - //draw method - var drawLineRight = function (x, y, color) { + //Draw methods + var drawLine = function (moveX, moveY, lineX, lineY, color) { ctx.strokeStyle = color; ctx.beginPath(); - ctx.moveTo(x, y + config.unitSize / 2); - ctx.lineTo(x + config.unitSize, y + config.unitSize / 2); + ctx.moveTo(moveX, moveY); + ctx.lineTo(lineX, lineY); ctx.stroke(); }; + var drawLineRight = function (x, y, color) { + drawLine(x, y + config.unitSize / 2, x + config.unitSize, y + config.unitSize / 2, color); + }; + var drawLineUp = function (x, y, color) { - ctx.strokeStyle = color; - ctx.beginPath(); - ctx.moveTo(x, y + config.unitSize / 2); - ctx.lineTo(x, y - config.unitSize / 2); - ctx.stroke(); + drawLine(x, y + config.unitSize / 2, x, y - config.unitSize / 2, color); }; var drawNode = function (x, y, color) { @@ -166,37 +179,28 @@ var gitGraph = function (canvas, rawGraphList, config) { }; var drawLineIn = function (x, y, color) { - ctx.strokeStyle = color; - - ctx.beginPath(); - ctx.moveTo(x + config.unitSize, y + config.unitSize / 2); - ctx.lineTo(x, y - config.unitSize / 2); - ctx.stroke(); + drawLine(x + config.unitSize, y + config.unitSize / 2, x, y - config.unitSize / 2, color); }; var drawLineOut = function (x, y, color) { - ctx.strokeStyle = color; - ctx.beginPath(); - ctx.moveTo(x, y + config.unitSize / 2); - ctx.lineTo(x + config.unitSize, y - config.unitSize / 2); - ctx.stroke(); + drawLine(x, y + config.unitSize / 2, x + config.unitSize, y - config.unitSize / 2, color); }; var draw = function (graphList) { - var colomn, colomnIndex, prevColomn, condenseIndex; + var colomn, colomnIndex, prevColomn, condenseIndex, breakIndex = -1; var x, y; var color; - var nodePos, outPos; + var nodePos; var tempFlow; var prevRowLength = 0; var flowSwapPos = -1; var lastLinePos; - var i, k, l; + var i, l; var condenseCurrentLength, condensePrevLength = 0, condenseNextLength = 0; var inlineIntersect = false; - //initiate for first row + //initiate color array for first row for (i = 0, l = graphList[0].length; i < l; i++) { if (graphList[0][i] !== "_" && graphList[0][i] !== " ") { flows.push(genNewFlow()); @@ -275,6 +279,7 @@ var gitGraph = function (canvas, rawGraphList, config) { colomnIndex = 0; //reset index condenseIndex = 0; condensePrevLength = 0; + breakIndex = -1; //reset break index while (colomnIndex < currentRow.length) { colomn = currentRow[colomnIndex]; @@ -282,6 +287,18 @@ var gitGraph = function (canvas, rawGraphList, config) { ++condensePrevLength; } + //check and fix line break in next row + if (colomn === "/" && currentRow[colomnIndex - 1] && currentRow[colomnIndex - 1] === "|") { + if ((breakIndex = findLineBreak(nextRow)) !== -1) { + nextRow.splice(breakIndex, 1); + } + } + //if line break found replace all '/' with '|' after breakIndex in previous row + if (breakIndex !== - 1 && colomn === "/" && colomnIndex > breakIndex) { + currentRow[colomnIndex] = "|"; + colomn = "|"; + } + if (colomn === " " && currentRow[colomnIndex + 1] && currentRow[colomnIndex + 1] === "_" && @@ -294,7 +311,7 @@ var gitGraph = function (canvas, rawGraphList, config) { colomn = "/"; } - //create new flow only when no intersetc happened + //create new flow only when no intersect happened if (flowSwapPos === -1 && colomn === "/" && currentRow[colomnIndex - 1] && @@ -415,4 +432,4 @@ var gitGraph = function (canvas, rawGraphList, config) { init(); draw(graphList); }; -// @end-license +// @end-license \ No newline at end of file diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index eec55cac6..5007a0d56 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -20,10 +20,10 @@ // - text/html // // Security: -// - BasicAuth: [] -// - Token: [] -// - AccessToken: [] -// - AuthorizationHeaderToken: [] +// - BasicAuth : +// - Token : +// - AccessToken : +// - AuthorizationHeaderToken : // // SecurityDefinitions: // BasicAuth: diff --git a/routers/api/v1/misc/markdown.go b/routers/api/v1/misc/markdown.go index fd7d1489b..633dff98e 100644 --- a/routers/api/v1/misc/markdown.go +++ b/routers/api/v1/misc/markdown.go @@ -62,9 +62,12 @@ func MarkdownRaw(ctx *context.APIContext) { // --- // summary: Render raw markdown as HTML // parameters: - // - name: body - // in: body - // type: string + // - name: body + // in: body + // description: Request body to render + // required: true + // schema: + // type: string // consumes: // - text/plain // produces: diff --git a/routers/api/v1/org/hook.go b/routers/api/v1/org/hook.go index 0a77d795e..83d2a5e5b 100644 --- a/routers/api/v1/org/hook.go +++ b/routers/api/v1/org/hook.go @@ -20,6 +20,12 @@ func ListHooks(ctx *context.APIContext) { // summary: List an organization's webhooks // produces: // - application/json + // parameters: + // - name: org + // in: path + // description: name of the organization + // type: string + // required: true // responses: // "200": // "$ref": "#/responses/HookList" @@ -43,6 +49,17 @@ func GetHook(ctx *context.APIContext) { // summary: Get a hook // produces: // - application/json + // parameters: + // - name: org + // in: path + // description: name of the organization + // type: string + // required: true + // - name: id + // in: path + // description: id of the hook to get + // type: integer + // required: true // responses: // "200": // "$ref": "#/responses/Hook" @@ -64,9 +81,17 @@ func CreateHook(ctx *context.APIContext, form api.CreateHookOption) { // - application/json // produces: // - application/json + // parameters: + // - name: org + // in: path + // description: name of the organization + // type: string + // required: true // responses: // "201": // "$ref": "#/responses/Hook" + + //TODO in body params if !utils.CheckCreateHookOption(ctx, &form) { return } @@ -82,9 +107,22 @@ func EditHook(ctx *context.APIContext, form api.EditHookOption) { // - application/json // produces: // - application/json + // parameters: + // - name: org + // in: path + // description: name of the organization + // type: string + // required: true + // - name: id + // in: path + // description: id of the hook to update + // type: integer + // required: true // responses: // "200": // "$ref": "#/responses/Hook" + + //TODO in body params hookID := ctx.ParamsInt64(":id") utils.EditOrgHook(ctx, &form, hookID) } @@ -96,6 +134,17 @@ func DeleteHook(ctx *context.APIContext) { // summary: Delete a hook // produces: // - application/json + // parameters: + // - name: org + // in: path + // description: name of the organization + // type: string + // required: true + // - name: id + // in: path + // description: id of the hook to delete + // type: integer + // required: true // responses: // "204": // "$ref": "#/responses/empty" diff --git a/routers/api/v1/org/org.go b/routers/api/v1/org/org.go index c24a4aeb1..29d45d2f2 100644 --- a/routers/api/v1/org/org.go +++ b/routers/api/v1/org/org.go @@ -51,6 +51,7 @@ func ListUserOrgs(ctx *context.APIContext) { // in: path // description: username of user // type: string + // required: true // responses: // "200": // "$ref": "#/responses/OrganizationList" diff --git a/routers/api/v1/org/team.go b/routers/api/v1/org/team.go index 408d8921d..b8dd026bf 100644 --- a/routers/api/v1/org/team.go +++ b/routers/api/v1/org/team.go @@ -227,7 +227,7 @@ func AddTeamMember(ctx *context.APIContext) { // RemoveTeamMember api for remove one member from a team func RemoveTeamMember(ctx *context.APIContext) { - // swagger:operation DELETE /teams/{id}/members/{username} organization orgAddTeamMember + // swagger:operation DELETE /teams/{id}/members/{username} organization orgRemoveTeamMember // --- // summary: Remove a team member // produces: @@ -306,7 +306,7 @@ func getRepositoryByParams(ctx *context.APIContext) *models.Repository { // AddTeamRepository api for adding a repository to a team func AddTeamRepository(ctx *context.APIContext) { - // swagger:operation PUT /teams/{id}/repos/{org}/{repo} organization orgAddTeamMember + // swagger:operation PUT /teams/{id}/repos/{org}/{repo} organization orgAddTeamRepository // --- // summary: Add a repository to a team // produces: @@ -350,7 +350,7 @@ func AddTeamRepository(ctx *context.APIContext) { // RemoveTeamRepository api for removing a repository from a team func RemoveTeamRepository(ctx *context.APIContext) { - // swagger:operation DELETE /teams/{id}/repos/{org}/{repo} organization orgAddTeamMember + // swagger:operation DELETE /teams/{id}/repos/{org}/{repo} organization orgRemoveTeamRepository // --- // summary: Remove a repository from a team // description: This does not delete the repository, it only removes the diff --git a/routers/api/v1/repo/file.go b/routers/api/v1/repo/file.go index 306b65a32..610247bc2 100644 --- a/routers/api/v1/repo/file.go +++ b/routers/api/v1/repo/file.go @@ -36,7 +36,8 @@ func GetRawFile(ctx *context.APIContext) { // type: string // required: true // responses: - // 200: + // 200: + // description: success if !ctx.Repo.HasAccess() { ctx.Status(404) return @@ -63,7 +64,7 @@ func GetRawFile(ctx *context.APIContext) { // GetArchive get archive of a repository func GetArchive(ctx *context.APIContext) { - // swagger:operation GET /repos/{owner}/{repo}/archive/{filepath} repository repoGetArchive + // swagger:operation GET /repos/{owner}/{repo}/archive/{archive} repository repoGetArchive // --- // summary: Get an archive of a repository // produces: @@ -85,7 +86,8 @@ func GetArchive(ctx *context.APIContext) { // type: string // required: true // responses: - // 200: + // 200: + // description: success repoPath := models.RepoPath(ctx.Params(":username"), ctx.Params(":reponame")) gitRepo, err := git.OpenRepository(repoPath) if err != nil { @@ -121,7 +123,8 @@ func GetEditorconfig(ctx *context.APIContext) { // type: string // required: true // responses: - // 200: + // 200: + // description: success ec, err := ctx.Repo.GetEditorconfig() if err != nil { if git.IsErrNotExist(err) { diff --git a/routers/api/v1/repo/hook.go b/routers/api/v1/repo/hook.go index e412a7f1f..1f121dfc3 100644 --- a/routers/api/v1/repo/hook.go +++ b/routers/api/v1/repo/hook.go @@ -189,6 +189,11 @@ func EditHook(ctx *context.APIContext, form api.EditHookOption) { // description: name of the repo // type: string // required: true + // - name: id + // in: path + // description: index of the hook + // type: integer + // required: true // - name: body // in: body // schema: @@ -202,7 +207,7 @@ func EditHook(ctx *context.APIContext, form api.EditHookOption) { // DeleteHook delete a hook of a repository func DeleteHook(ctx *context.APIContext) { - // swagger:operation DELETE /repos/{user}/{repo}/hooks/{id} repository repoDeleteHook + // swagger:operation DELETE /repos/{owner}/{repo}/hooks/{id} repository repoDeleteHook // --- // summary: Delete a hook in a repository // produces: diff --git a/routers/api/v1/repo/issue_comment.go b/routers/api/v1/repo/issue_comment.go index 2865ea916..0cbf6493d 100644 --- a/routers/api/v1/repo/issue_comment.go +++ b/routers/api/v1/repo/issue_comment.go @@ -31,7 +31,7 @@ func ListIssueComments(ctx *context.APIContext) { // description: name of the repo // type: string // required: true - // - name: id + // - name: index // in: path // description: index of the issue // type: integer @@ -139,7 +139,7 @@ func CreateIssueComment(ctx *context.APIContext, form api.CreateIssueCommentOpti // description: name of the repo // type: string // required: true - // - name: id + // - name: index // in: path // description: index of the issue // type: integer diff --git a/routers/api/v1/repo/issue_tracked_time.go b/routers/api/v1/repo/issue_tracked_time.go index 1111d672a..9be9fee91 100644 --- a/routers/api/v1/repo/issue_tracked_time.go +++ b/routers/api/v1/repo/issue_tracked_time.go @@ -21,7 +21,7 @@ func trackedTimesToAPIFormat(trackedTimes []*models.TrackedTime) []*api.TrackedT // ListTrackedTimes list all the tracked times of an issue func ListTrackedTimes(ctx *context.APIContext) { - // swagger:operation GET /repos/{owner}/{repo}/issues/{index}/times issue issueTrackedTimes + // swagger:operation GET /repos/{owner}/{repo}/issues/{id}/times issue issueTrackedTimes // --- // summary: List an issue's tracked times // produces: @@ -37,7 +37,7 @@ func ListTrackedTimes(ctx *context.APIContext) { // description: name of the repo // type: string // required: true - // - name: repo + // - name: id // in: path // description: index of the issue // type: integer @@ -70,7 +70,7 @@ func ListTrackedTimes(ctx *context.APIContext) { // AddTime adds time manual to the given issue func AddTime(ctx *context.APIContext, form api.AddTimeOption) { - // swagger:operation Post /repos/{owner}/{repo}/issues/{index}/times issue issueAddTime + // swagger:operation Post /repos/{owner}/{repo}/issues/{id}/times issue issueAddTime // --- // summary: Add a tracked time to a issue // consumes: @@ -132,7 +132,7 @@ func AddTime(ctx *context.APIContext, form api.AddTimeOption) { // ListTrackedTimesByUser lists all tracked times of the user func ListTrackedTimesByUser(ctx *context.APIContext) { - // swagger:operation GET /repos/{owner}/{repo}/times/{tracker} user userTrackedTimes + // swagger:operation GET /repos/{owner}/{repo}/times/{user} user userTrackedTimes // --- // summary: List a user's tracked times in a repo // produces: diff --git a/routers/api/v1/repo/milestone.go b/routers/api/v1/repo/milestone.go index 3953b0c3c..a138cb7a6 100644 --- a/routers/api/v1/repo/milestone.go +++ b/routers/api/v1/repo/milestone.go @@ -16,30 +16,7 @@ import ( // ListMilestones list all the milestones for a repository func ListMilestones(ctx *context.APIContext) { - // swagger:operation GET /repos/{owner}/{repo}/milestones/{id} issue issueGetMilestone - // --- - // summary: Get a milestone - // produces: - // - application/json - // responses: - // "200": - // "$ref": "#/responses/Milestone" - milestones, err := models.GetMilestonesByRepoID(ctx.Repo.Repository.ID) - if err != nil { - ctx.Error(500, "GetMilestonesByRepoID", err) - return - } - - apiMilestones := make([]*api.Milestone, len(milestones)) - for i := range milestones { - apiMilestones[i] = milestones[i].APIFormat() - } - ctx.JSON(200, &apiMilestones) -} - -// GetMilestone get a milestone for a repository -func GetMilestone(ctx *context.APIContext) { - // swagger:operation GET /repos/{owner}/{repo}/milestones issue issueGetMilestones + // swagger:operation GET /repos/{owner}/{repo}/milestones issue issueGetMilestonesList // --- // summary: Get all of a repository's milestones // produces: @@ -55,6 +32,29 @@ func GetMilestone(ctx *context.APIContext) { // description: name of the repo // type: string // required: true + // responses: + // "200": + // "$ref": "#/responses/MilestoneList" + milestones, err := models.GetMilestonesByRepoID(ctx.Repo.Repository.ID) + if err != nil { + ctx.Error(500, "GetMilestonesByRepoID", err) + return + } + + apiMilestones := make([]*api.Milestone, len(milestones)) + for i := range milestones { + apiMilestones[i] = milestones[i].APIFormat() + } + ctx.JSON(200, &apiMilestones) +} + +// GetMilestone get a milestone for a repository +func GetMilestone(ctx *context.APIContext) { + // swagger:operation GET /repos/{owner}/{repo}/milestones/{id} issue issueGetMilestone + // --- + // summary: Get a milestone + // produces: + // - application/json // parameters: // - name: owner // in: path @@ -68,12 +68,12 @@ func GetMilestone(ctx *context.APIContext) { // required: true // - name: id // in: path - // description: id of the milestone to get + // description: id of the milestone // type: integer // required: true // responses: // "200": - // "$ref": "#/responses/MilestoneList" + // "$ref": "#/responses/Milestone" milestone, err := models.GetMilestoneByRepoID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id")) if err != nil { if models.IsErrMilestoneNotExist(err) { @@ -152,6 +152,11 @@ func EditMilestone(ctx *context.APIContext, form api.EditMilestoneOption) { // description: name of the repo // type: string // required: true + // - name: id + // in: path + // description: id of the milestone + // type: integer + // required: true // - name: body // in: body // schema: @@ -202,7 +207,7 @@ func DeleteMilestone(ctx *context.APIContext) { // description: name of the repo // type: string // required: true - // - name: body + // - name: id // in: path // description: id of the milestone to delete // type: integer diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index 9f64dda61..ccfe0440c 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -508,13 +508,13 @@ func TopicSearch(ctx *context.Context) { // --- // summary: search topics via keyword // produces: - // - application/json + // - application/json // parameters: - // - name: keyword - // in: path - // description: id of the repo to get - // type: integer - // required: true + // - name: q + // in: query + // description: keywords to search + // required: true + // type: string // responses: // "200": // "$ref": "#/responses/Repository" diff --git a/routers/api/v1/swagger/issue.go b/routers/api/v1/swagger/issue.go index 1ebb17b24..0d4e40616 100644 --- a/routers/api/v1/swagger/issue.go +++ b/routers/api/v1/swagger/issue.go @@ -8,60 +8,70 @@ import ( api "code.gitea.io/sdk/gitea" ) +// Issue // swagger:response Issue type swaggerResponseIssue struct { // in:body Body api.Issue `json:"body"` } +// IssueList // swagger:response IssueList type swaggerResponseIssueList struct { // in:body Body []api.Issue `json:"body"` } +// Comment // swagger:response Comment type swaggerResponseComment struct { // in:body Body api.Comment `json:"body"` } +// CommentList // swagger:response CommentList type swaggerResponseCommentList struct { // in:body Body []api.Comment `json:"body"` } +// Label // swagger:response Label type swaggerResponseLabel struct { // in:body Body api.Label `json:"body"` } +// LabelList // swagger:response LabelList type swaggerResponseLabelList struct { // in:body Body []api.Label `json:"body"` } +// Milestone // swagger:response Milestone type swaggerResponseMilestone struct { // in:body Body api.Milestone `json:"body"` } +// MilestoneList // swagger:response MilestoneList type swaggerResponseMilestoneList struct { // in:body Body []api.Milestone `json:"body"` } +// TrackedTime // swagger:response TrackedTime type swaggerResponseTrackedTime struct { // in:body Body api.TrackedTime `json:"body"` } +// TrackedTimeList // swagger:response TrackedTimeList type swaggerResponseTrackedTimeList struct { // in:body diff --git a/routers/api/v1/swagger/key.go b/routers/api/v1/swagger/key.go index 344d54c87..b24783238 100644 --- a/routers/api/v1/swagger/key.go +++ b/routers/api/v1/swagger/key.go @@ -8,36 +8,42 @@ import ( api "code.gitea.io/sdk/gitea" ) +// PublicKey // swagger:response PublicKey type swaggerResponsePublicKey struct { // in:body Body api.PublicKey `json:"body"` } +// PublicKeyList // swagger:response PublicKeyList type swaggerResponsePublicKeyList struct { // in:body Body []api.PublicKey `json:"body"` } +// GPGKey // swagger:response GPGKey type swaggerResponseGPGKey struct { // in:body Body api.GPGKey `json:"body"` } +// GPGKeyList // swagger:response GPGKeyList type swaggerResponseGPGKeyList struct { // in:body Body []api.GPGKey `json:"body"` } +// DeployKey // swagger:response DeployKey type swaggerResponseDeployKey struct { // in:body Body api.DeployKey `json:"body"` } +// DeployKeyList // swagger:response DeployKeyList type swaggerResponseDeployKeyList struct { // in:body diff --git a/routers/api/v1/swagger/misc.go b/routers/api/v1/swagger/misc.go index 8ec0d53a7..c28ba02db 100644 --- a/routers/api/v1/swagger/misc.go +++ b/routers/api/v1/swagger/misc.go @@ -8,6 +8,7 @@ import ( api "code.gitea.io/sdk/gitea" ) +// ServerVersion // swagger:response ServerVersion type swaggerResponseServerVersion struct { // in:body diff --git a/routers/api/v1/swagger/options.go b/routers/api/v1/swagger/options.go index 3ea324186..4f2461f46 100644 --- a/routers/api/v1/swagger/options.go +++ b/routers/api/v1/swagger/options.go @@ -12,57 +12,90 @@ import ( // not actually a response, just a hack to get go-swagger to include definitions // of the various XYZOption structs +// parameterBodies // swagger:response parameterBodies type swaggerParameterBodies struct { + // in:body AddCollaboratorOption api.AddCollaboratorOption + // in:body CreateEmailOption api.CreateEmailOption + // in:body DeleteEmailOption api.DeleteEmailOption + // in:body CreateHookOption api.CreateHookOption - EditHookOption api.EditHookOption + // in:body + EditHookOption api.EditHookOption + // in:body CreateIssueOption api.CreateIssueOption - EditIssueOption api.EditIssueOption + // in:body + EditIssueOption api.EditIssueOption + // in:body CreateIssueCommentOption api.CreateIssueCommentOption - EditIssueCommentOption api.EditIssueCommentOption + // in:body + EditIssueCommentOption api.EditIssueCommentOption + // in:body IssueLabelsOption api.IssueLabelsOption + // in:body CreateKeyOption api.CreateKeyOption + // in:body CreateLabelOption api.CreateLabelOption - EditLabelOption api.EditLabelOption + // in:body + EditLabelOption api.EditLabelOption + // in:body MarkdownOption api.MarkdownOption + // in:body CreateMilestoneOption api.CreateMilestoneOption - EditMilestoneOption api.EditMilestoneOption + // in:body + EditMilestoneOption api.EditMilestoneOption + // in:body CreateOrgOption api.CreateOrgOption - EditOrgOption api.EditOrgOption + // in:body + EditOrgOption api.EditOrgOption + // in:body CreatePullRequestOption api.CreatePullRequestOption - EditPullRequestOption api.EditPullRequestOption + // in:body + EditPullRequestOption api.EditPullRequestOption + // in:body CreateReleaseOption api.CreateReleaseOption - EditReleaseOption api.EditReleaseOption + // in:body + EditReleaseOption api.EditReleaseOption + // in:body CreateRepoOption api.CreateRepoOption + // in:body CreateForkOption api.CreateForkOption + // in:body CreateStatusOption api.CreateStatusOption + // in:body CreateTeamOption api.CreateTeamOption - EditTeamOption api.EditTeamOption + // in:body + EditTeamOption api.EditTeamOption + // in:body AddTimeOption api.AddTimeOption + // in:body CreateUserOption api.CreateUserOption - EditUserOption api.EditUserOption + // in:body + EditUserOption api.EditUserOption + // in:body MigrateRepoForm auth.MigrateRepoForm + // in:body EditAttachmentOptions api.EditAttachmentOptions } diff --git a/routers/api/v1/swagger/org.go b/routers/api/v1/swagger/org.go index 46bd56646..eb4a1084e 100644 --- a/routers/api/v1/swagger/org.go +++ b/routers/api/v1/swagger/org.go @@ -8,24 +8,28 @@ import ( api "code.gitea.io/sdk/gitea" ) +// Organization // swagger:response Organization type swaggerResponseOrganization struct { // in:body Body api.Organization `json:"body"` } +// OrganizationList // swagger:response OrganizationList type swaggerResponseOrganizationList struct { // in:body Body []api.Organization `json:"body"` } +// Team // swagger:response Team type swaggerResponseTeam struct { // in:body Body api.Team `json:"body"` } +// TeamList // swagger:response TeamList type swaggerResponseTeamList struct { // in:body diff --git a/routers/api/v1/swagger/repo.go b/routers/api/v1/swagger/repo.go index 1f2569110..9decc8f58 100644 --- a/routers/api/v1/swagger/repo.go +++ b/routers/api/v1/swagger/repo.go @@ -8,95 +8,112 @@ import ( api "code.gitea.io/sdk/gitea" ) +// Repository // swagger:response Repository type swaggerResponseRepository struct { // in:body Body api.Repository `json:"body"` } +// RepositoryList // swagger:response RepositoryList type swaggerResponseRepositoryList struct { // in:body Body []api.Repository `json:"body"` } +// Branch // swagger:response Branch type swaggerResponseBranch struct { // in:body Body api.Branch `json:"body"` } +// BranchList // swagger:response BranchList type swaggerResponseBranchList struct { // in:body Body []api.Branch `json:"body"` } +// Hook // swagger:response Hook type swaggerResponseHook struct { // in:body Body []api.Branch `json:"body"` } +// HookList // swagger:response HookList type swaggerResponseHookList struct { // in:body Body []api.Branch `json:"body"` } +// Release // swagger:response Release type swaggerResponseRelease struct { // in:body Body api.Release `json:"body"` } +// ReleaseList // swagger:response ReleaseList type swaggerResponseReleaseList struct { // in:body Body []api.Release `json:"body"` } +// PullRequest // swagger:response PullRequest type swaggerResponsePullRequest struct { // in:body Body api.PullRequest `json:"body"` } +// PullRequestList // swagger:response PullRequestList type swaggerResponsePullRequestList struct { // in:body Body []api.PullRequest `json:"body"` } +// Status // swagger:response Status type swaggerResponseStatus struct { // in:body Body api.Status `json:"body"` } +// StatusList // swagger:response StatusList type swaggerResponseStatusList struct { // in:body Body []api.Status `json:"body"` } +// WatchInfo // swagger:response WatchInfo type swaggerResponseWatchInfo struct { // in:body Body api.WatchInfo `json:"body"` } +// SearchResults // swagger:response SearchResults type swaggerResponseSearchResults struct { + // in:body Body api.SearchResults `json:"body"` } +// AttachmentList // swagger:response AttachmentList type swaggerResponseAttachmentList struct { //in: body Body []api.Attachment `json:"body"` } +// Attachment // swagger:response Attachment type swaggerResponseAttachment struct { //in: body diff --git a/routers/api/v1/swagger/user.go b/routers/api/v1/swagger/user.go index 2bb8f1b76..7ae046a9b 100644 --- a/routers/api/v1/swagger/user.go +++ b/routers/api/v1/swagger/user.go @@ -8,18 +8,21 @@ import ( api "code.gitea.io/sdk/gitea" ) +// User // swagger:response User type swaggerResponseUser struct { // in:body Body api.User `json:"body"` } +// UserList // swagger:response UserList type swaggerResponseUserList struct { // in:body Body []api.User `json:"body"` } +// EmailList // swagger:response EmailList type swaggerResponseEmailList struct { // in:body diff --git a/routers/api/v1/user/app.go b/routers/api/v1/user/app.go index e1f75de68..fc4118649 100644 --- a/routers/api/v1/user/app.go +++ b/routers/api/v1/user/app.go @@ -18,6 +18,12 @@ func ListAccessTokens(ctx *context.APIContext) { // summary: List the authenticated user's access tokens // produces: // - application/json + // parameters: + // - name: username + // in: path + // description: username of user + // type: string + // required: true // responses: // "200": // "$ref": "#/responses/AccessTokenList" @@ -46,6 +52,12 @@ func CreateAccessToken(ctx *context.APIContext, form api.CreateAccessTokenOption // - application/json // produces: // - application/json + // parameters: + // - name: username + // in: path + // description: username of user + // type: string + // required: true // responses: // "200": // "$ref": "#/responses/AccessToken" diff --git a/routers/api/v1/user/follower.go b/routers/api/v1/user/follower.go index 49d13cc38..284b7323c 100644 --- a/routers/api/v1/user/follower.go +++ b/routers/api/v1/user/follower.go @@ -119,11 +119,11 @@ func checkUserFollowing(ctx *context.APIContext, u *models.User, followID int64) // CheckMyFollowing whether the given user is followed by the authenticated user func CheckMyFollowing(ctx *context.APIContext) { - // swagger:operation GET /user/following/{followee} user userCurrentCheckFollowing + // swagger:operation GET /user/following/{username} user userCurrentCheckFollowing // --- // summary: Check whether a user is followed by the authenticated user // parameters: - // - name: followee + // - name: username // in: path // description: username of followed user // type: string diff --git a/routers/api/v1/user/watch.go b/routers/api/v1/user/watch.go index af7b9b4cc..2971bf686 100644 --- a/routers/api/v1/user/watch.go +++ b/routers/api/v1/user/watch.go @@ -43,6 +43,7 @@ func GetWatchedRepos(ctx *context.APIContext) { // type: string // in: path // description: username of the user + // required: true // responses: // "200": // "$ref": "#/responses/RepositoryList" diff --git a/routers/repo/view.go b/routers/repo/view.go index ca2ece648..4f1deeae4 100644 --- a/routers/repo/view.go +++ b/routers/repo/view.go @@ -105,7 +105,9 @@ func renderDirectory(ctx *context.Context, treeLink string) { ctx.Data["FileContent"] = string(markup.Render(readmeFile.Name(), buf, treeLink, ctx.Repo.Repository.ComposeMetas())) } else { ctx.Data["IsRenderedHTML"] = true - ctx.Data["FileContent"] = string(bytes.Replace(buf, []byte("\n"), []byte(`
`), -1)) + ctx.Data["FileContent"] = strings.Replace( + gotemplate.HTMLEscapeString(string(buf)), "\n", `
`, -1, + ) } } } @@ -208,7 +210,9 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st ctx.Data["FileContent"] = string(markup.Render(blob.Name(), buf, path.Dir(treeLink), ctx.Repo.Repository.ComposeMetas())) } else if readmeExist { ctx.Data["IsRenderedHTML"] = true - ctx.Data["FileContent"] = string(bytes.Replace(buf, []byte("\n"), []byte(`
`), -1)) + ctx.Data["FileContent"] = strings.Replace( + gotemplate.HTMLEscapeString(string(buf)), "\n", `
`, -1, + ) } else { // Building code view blocks with line number on server side. var fileContent string @@ -223,6 +227,10 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st var output bytes.Buffer lines := strings.Split(fileContent, "\n") + //Remove blank line at the end of file + if len(lines) > 0 && lines[len(lines)-1] == "" { + lines = lines[:len(lines)-1] + } for index, line := range lines { line = gotemplate.HTMLEscapeString(line) if index != len(lines)-1 { diff --git a/routers/repo/wiki.go b/routers/repo/wiki.go index 87cb9f303..3220ab134 100644 --- a/routers/repo/wiki.go +++ b/routers/repo/wiki.go @@ -350,7 +350,7 @@ func NewWikiPost(ctx *context.Context, form auth.NewWikiForm) { return } - ctx.Redirect(ctx.Repo.RepoLink + "/wiki/" + models.WikiNameToFilename(wikiName)) + ctx.Redirect(ctx.Repo.RepoLink + "/wiki/" + models.WikiNameToSubURL(wikiName)) } // EditWiki render wiki modify page @@ -391,7 +391,7 @@ func EditWikiPost(ctx *context.Context, form auth.NewWikiForm) { return } - ctx.Redirect(ctx.Repo.RepoLink + "/wiki/" + models.WikiNameToFilename(newWikiName)) + ctx.Redirect(ctx.Repo.RepoLink + "/wiki/" + models.WikiNameToSubURL(newWikiName)) } // DeleteWikiPagePost delete wiki page diff --git a/templates/admin/auth/edit.tmpl b/templates/admin/auth/edit.tmpl index 39d1f9a70..5c492ff52 100644 --- a/templates/admin/auth/edit.tmpl +++ b/templates/admin/auth/edit.tmpl @@ -191,7 +191,7 @@
- +
diff --git a/templates/admin/config.tmpl b/templates/admin/config.tmpl index d8292a9e6..21aa8756f 100644 --- a/templates/admin/config.tmpl +++ b/templates/admin/config.tmpl @@ -92,16 +92,22 @@
{{.i18n.Tr "admin.config.db_type"}}
{{.DbCfg.Type}}
+ {{if not (or (eq .DbCfg.Type "sqlite3") (eq .DbCfg.Type "tidb"))}}
{{.i18n.Tr "admin.config.db_host"}}
{{if .DbCfg.Host}}{{.DbCfg.Host}}{{else}}-{{end}}
{{.i18n.Tr "admin.config.db_name"}}
{{if .DbCfg.Name}}{{.DbCfg.Name}}{{else}}-{{end}}
{{.i18n.Tr "admin.config.db_user"}}
{{if .DbCfg.User}}{{.DbCfg.User}}{{else}}-{{end}}
+ {{end}} + {{if eq .DbCfg.Type "postgres"}}
{{.i18n.Tr "admin.config.db_ssl_mode"}}
-
{{if .DbCfg.SSLMode}}{{.DbCfg.SSLMode}}{{else}}-{{end}} {{.i18n.Tr "admin.config.db_ssl_mode_helper"}}
+
{{if .DbCfg.SSLMode}}{{.DbCfg.SSLMode}}{{else}}-{{end}}
+ {{end}} + {{if or (eq .DbCfg.Type "sqlite3") (eq .DbCfg.Type "tidb")}}
{{.i18n.Tr "admin.config.db_path"}}
-
{{if .DbCfg.Path}}{{.DbCfg.Path}}{{else}}-{{end}} {{.i18n.Tr "admin.config.db_path_helper"}}
+
{{if .DbCfg.Path}}{{.DbCfg.Path}}{{else}}-{{end}}
+ {{end}}
diff --git a/templates/admin/monitor.tmpl b/templates/admin/monitor.tmpl index ceca29146..6cc927d68 100644 --- a/templates/admin/monitor.tmpl +++ b/templates/admin/monitor.tmpl @@ -49,8 +49,8 @@ {{.PID}} {{.Description}} - {{.Start.FormatLong}} - {{TimeSinceUnix .Start $.Lang}} + {{DateFmtLong .Start}} + {{TimeSince .Start $.Lang}} {{end}} diff --git a/templates/base/head.tmpl b/templates/base/head.tmpl index a486d9b9b..fb9611cb6 100644 --- a/templates/base/head.tmpl +++ b/templates/base/head.tmpl @@ -141,7 +141,7 @@