Compare commits

..

143 Commits

Author SHA1 Message Date
Unknwon
06b6eaba06 locale: sync from Crowdin
- Add Portuguese
2019-01-30 21:59:10 -05:00
Unknwon
713a7d518d locale: sync from Crowdin 2019-01-21 15:19:27 -05:00
Guy Smoilov
5702e4bc24 pkg/mailer: support plaintext alt for HTML emails (#5568)
* Added option to use plain text alt to HTML emails. Should make the messages friendlier for spam filters.

* Check that plaintext conversion worked before adding the HTML alt

* Add description of ADD_PLAIN_TEXT_ALT to app.ini

* Added comment clarifying html AddAlternative
2018-12-25 10:08:00 -05:00
Unknwon
9b37b1569c models/repo_editor: add isRepositoryGitPath to detect invalid file path (#5558) 2018-12-25 10:01:52 -05:00
Unknwon
5f1f1bb5ed pkg/tool/path: use IsMaliciousPath to replace SanitizePath (#5558) 2018-12-25 09:47:33 -05:00
Unknwon
9ff2df78f0 public/css: make less (#5317) 2018-12-25 08:58:59 -05:00
Kyumyeong Han
74f26bb667 public/less: fix layout misalignment in Firefox for Linux (#5317)
* Update _repository.less

* Update _repository.less
2018-12-25 08:56:41 -05:00
Unknwon
1f11c1f71a models/repo_editor: ignore copying files with '.git/' path prefix (#5558) 2018-12-19 23:09:32 -05:00
Unknwon
8c8c37a66b pkg/tool/path: handle Windows path separators (#5558) 2018-12-19 22:56:36 -05:00
Unknwon
d4f9fd7204 *: remove Go 1.7 support 2018-12-19 08:38:10 -05:00
Unknwon
e70e72e025 pkg/ssh: specify ssh-keygen to always generate PEM format 2018-12-19 08:31:22 -05:00
Unknwon
e2ce6a0dab vendor: update github.com/go-sql-driver/mysql
Fix MySQL 1046 error
2018-12-19 08:26:32 -05:00
Unknwon
657ea2686f auth: coding style and glitches fixes for GitHub login source (#5340) 2018-12-18 16:46:50 -05:00
haixunlu
311df9c521 auth: add new authentication source: GitHub, including GitHub Enterprise (#5340)
* Add new Authentication Source: GitHub, including GitHub Enterprise.

* Add vendor dependencies.
2018-12-18 15:49:30 -05:00
Unknwon
ff93d9dbda pkg/tool: improve SanitizePath (#5558) 2018-12-18 01:38:08 -05:00
Unknwon
86ada87529 models/repo_editor: sanitize user-defined file name to prevent RCE (#5558)
Reported by PentesterLab (https://pentesterlab.com).
2018-12-18 01:31:04 -05:00
Unknwon
d74437af57 models/action: skip issue index parsing while using external issue tracker (#5551) 2018-12-17 22:52:58 -05:00
Unknwon
c82ac420fc vendor: update
- github.com/gogs/go-gogs-client
- gopkg.in/macaron.v1
2018-12-16 19:48:34 -05:00
Unknwon
f91cb9321e api: add GetReferenceSHA (#5546) 2018-12-16 19:47:32 -05:00
Unknwon
cc1a168aa0 vendor: update github.com/gogs/go-gogs-client 2018-12-15 00:24:53 -05:00
Unknwon
ee82d35ed8 api: add GetSingleCommit (#5546) 2018-12-15 00:24:41 -05:00
Unknwon
8bca30cfe4 vendor: update github.com/gogs/git-module 2018-12-15 00:05:06 -05:00
Unknwon
fe9a5d3159 .github: adjust issue templates
[skip ci]
2018-12-14 18:35:01 -05:00
Unknwon
f43d21d0af locale: sync from Crowdin 2018-12-11 22:17:09 -05:00
Unknwon
8e2c3b315b models: remove legacy support 2018-12-11 22:00:01 -05:00
Nikita
9079fb6a0d pkg/markup: support data URL of base64 encoded images (#5391) 2018-12-10 23:53:08 -05:00
Unknwon
db3f0048d8 templates: rename template function Str2html -> Str2HTML 2018-12-10 22:23:56 -05:00
Unknwon
d3d8284985 templates: sanitize special links in commit message (#5545)
Reported by @cezar97.
2018-12-10 22:21:42 -05:00
Unknwon
f545faa06d templates: make state changing routes to POST method (#5541)
- pkg/context: add ParamsUser to unify the injection process
2018-12-06 22:58:02 -05:00
Unknwon
458aadbb10 vendor: update github.com/go-macaron/session 2018-12-04 19:36:05 -05:00
Unknwon
f2ec0d80a8 user/auth: flush and destroy session at logout (#5540)
Reported by @cezar97.
2018-12-04 19:35:44 -05:00
Unknwon
be6bb5314e ci: update appveyor.yml 2018-12-03 20:00:28 -05:00
Unknwon
98114944fc vendor: update github.com/gogs/go-gogs-client
Bring fixes for #5538
2018-12-03 14:45:19 -05:00
Unknwon
6690023555 pkg/context: use host address and apply insecure flag for go-get=1 when needed (#5305) 2018-12-03 13:36:11 -05:00
Unknwon
a7e8187a0d pkg/context: expose port in import path for 'go-get=1' (#5305) 2018-12-03 13:24:31 -05:00
Unknwon
0c1b72616a locale: sync from Crowdin 2018-12-02 20:02:09 -05:00
Unknwon
945a378e55 public/css: adjust width of label color in dropdown
models/issue: unify Issue receiver name to 'issue'
2018-12-02 17:54:55 -05:00
Unknwon
29c5be47ed models/issue: fix panic when clear labels (#5445) 2018-12-02 17:51:24 -05:00
无闻
e0f18b2255 github: update issue templates (#5537) 2018-12-02 15:25:06 -05:00
Unknwon
e755aafe29 vendor: update github.com/gogs/go-gogs-client 2018-12-02 12:55:16 -05:00
Unknwon
e1b3a25008 api/repo: support edit repository issue tracker (gogs/go-gogs-client#94) 2018-12-02 12:55:05 -05:00
Unknwon
69c1cd3f38 routes/api: change status handle to new style
Also fixed one bug that did not catch team not found error.
2018-12-01 21:41:30 -05:00
Unknwon
ce13fbb98a routes/api: allow get repository without login (#5475) 2018-12-01 21:40:19 -05:00
Samuel Cochran
084d9e0009 templates/user/dashboard: include 'org' query parameter in new mirror URL (#5534) 2018-11-29 07:21:16 -05:00
Unknwon
3db9b06a6e api: fix critical CSRF vulnerabilities on API routes (#5355)
By explicitly requires token authentication.
2018-11-28 21:05:58 -05:00
Unknwon
e9be8016e6 README: add new sponsor 2018-11-27 10:46:46 -05:00
Unknwon
1f9e21ebd5 templates/wiki: fix emoji rendering (#4869) 2018-11-26 07:02:21 -05:00
Unknwon
a91d9054ad conf: fix unexpected behavior of config inheritance (#5007) 2018-11-26 06:44:06 -05:00
Charles Kenney
6c90d12a0c routes/repo/issue: implement issue pre-filling (#5521)
Signed-off-by: Charles Kenney <charlesc.kenney@gmail.com>
2018-11-20 13:16:42 -05:00
Unknwon
38e8ccac92 conf: add go-bindata install command in README
[ci skip]
2018-11-20 02:37:16 -05:00
Unknwon
1d19a58424 locale: sync from Crowdin 2018-11-19 18:58:00 -05:00
Danilo Riecken P. de Morais
f47f9ceade mirror: trigger additional push webhook on new branch (#5508)
This commit fixes issue #5473 and makes a new branch behave like a
      push event and trigger the appropriate webhook.
2018-11-14 23:03:03 -05:00
Federico Culloca
81effe674d templates/user/profile: added rel="me" to website link on user profile (#5485)
* Added rel="me" to website link on user profile

See issue #5008

* Added `nofollow` as per feedback
2018-11-12 20:49:30 -05:00
Unknwon
831251bcaa ci: remove Go master for the moment 2018-11-08 18:03:16 -05:00
A.J. Ruckman
f4630f9044 public/css: add 'overflow-wrap: break-word' to dashboard news feeds (#5507) 2018-11-08 17:51:56 -05:00
William Hilton
dae311ea9d repo/http: update CORS headers to allow custom user-agent (#5498)
At some point after #4970 was merged, isomorphic-git started sending a custom User-Agent in its HTTP requests to deal with some services (\*cough\* gists \*cough\*) which filtered git traffic by User-Agent. Sadly, this broke cloning from Gogs using isomorphic-git in the browser (https://github.com/isomorphic-git/isomorphic-git/issues/555). This PR fixes it by telling browsers it is OK for CORS requests to send a custom User-Agent header.
2018-11-07 18:14:15 -05:00
Unknwon
4677b46904 vendor: update github.com/go-macaron/session (#5469)
Fix security flaw reported by c957861129d62331c5704d2f04d11e41.
2018-11-06 22:22:02 -05:00
Unknwon
a4dd2b1916 Merge branch 'master' of github.com:gogs/gogs into develop 2018-11-05 16:48:31 -05:00
Masen Furer
3d117b8964 Dockerfile.aarch64hub: install shadow package (#5481)
the shadow package contains the usermod(8) utility which is used by
start.sh and finalize.sh to configure the git user
2018-11-05 16:46:53 -05:00
hopegolden
6a083e9561 ldap: grammar fix (#5493) 2018-11-05 16:44:28 -05:00
hopegolden
044d359a7e docker: grammar fix (#5492) 2018-11-05 16:44:01 -05:00
Unknwon
f35d4164d6 pkg/bindata: update content 2018-11-04 18:37:01 -05:00
Unknwon
3058f8fd69 conf: change default session cookie name
[CI SKIP]
2018-10-24 10:05:35 -04:00
Unknwon
5129ed215e vendor: update github.com/go-macaron/session (#5469)
Fix security flaw reported by c957861129d62331c5704d2f04d11e41.
2018-10-24 09:59:07 -04:00
Unknwon
b93079f1c1 vendor: update github.com/go-macaron/session (#5469)
Fix security flaw reported by c957861129d62331c5704d2f04d11e41.
2018-10-24 09:43:59 -04:00
Unknwon
a1098384c0 vendor: update github.com/gogs/git-module 2018-10-23 07:02:13 -04:00
aboron
43bca4df40 ldap: fix group membership search handling when the group members are listed by 'dn' (#4684) (#4688)
Also, fixed typo in group member list return size check.
2018-10-23 04:16:39 -04:00
Unknwon
82269e4b8c locale: sync from Crowdin 2018-10-16 16:58:18 -04:00
Unknwon
14e49614e6 gogs: rise Go requirement to 1.7 2018-10-03 20:49:49 -04:00
Unknwon
a221b2807f routes/repo/issue: fix redirect with unexpected escape (#5443) 2018-09-30 13:55:40 -04:00
Unknwon
0d66b1cc1c pkg/context: apply EscapePound at context level
Always escape template variable {{.Link}} variable and  redirect calls.

Relates to #5442
2018-09-28 23:56:45 -04:00
Unknwon
1843354d88 templates/repo/setting: fix missing EscapePound (#5442) 2018-09-28 23:32:00 -04:00
Unknwon
bd7d1e2f16 routes: fix open redirect vulnerability (#5355)
Reported by @cezar97.
2018-09-28 23:19:29 -04:00
Unknwon
aff0bbcc32 pkg/ssh: print actual error in panic (#5435) 2018-09-28 15:37:34 -04:00
Unknwon
33e009bedb README: add FOSSA badge
[ci skip]
2018-09-26 19:04:41 -04:00
Unknwon
f94dc67a43 librejs: add jQuery
[ci skip]
2018-09-19 13:24:49 -04:00
Unknwon
091f63fd4e Makefile: only read GOPATH from env var
[ci skip]
2018-09-18 12:33:14 -04:00
Unknwon
3a4c981e31 locale: sync from Crowdin 2018-09-16 11:53:32 -04:00
Unknwon
0d48344f93 docker: chown only for the frist time (#5422) 2018-09-15 13:57:41 -04:00
Unknwon
21ceba6cfd Revert "docker: remove chown the git repos on startup (refs #4996). (#5390)"
This reverts commit 068e6ce2c9.
2018-09-15 13:46:14 -04:00
Unknwon
f8302c5470 ci: fix go vet and add Go 1.11.x 2018-09-14 22:48:35 -04:00
Unknwon
7a7e07a57c vendor: add dependencies of Prometheus client 2018-09-14 22:38:06 -04:00
Unknwon
520530dfcf metrics: add initial Prometheus support (#4141) 2018-09-14 22:29:43 -04:00
Unknwon
31c18b4bc7 repo: adjust pull request setting description (#5359) 2018-09-14 20:10:54 -04:00
Unknwon
1ec365de25 repo: trigger webhook when delete branch after merged pull request (#5331) 2018-09-14 20:04:31 -04:00
Unknwon
99f3eabb1b README: update vision
[ci skip]
2018-09-14 15:25:15 -04:00
Unknwon
32479744f6 templates/admin/monitor: fix field error
[ci skip]
2018-09-13 23:30:59 -04:00
Unknwon
b68de2330d auth: support set default login source (#5274) 2018-09-13 14:06:04 -04:00
haixunlu
68a6579852 login_source: add default authentication switch (#5338)
* Add default Authentication Switch.

* adjust the code accroding to reviews

* #1. Remove redudant logic.
#2, Fix a bug in "Edit" panel.

* Remove unused logic

* Fix local authentication files are not flushed.

* refactor according to review.
2018-09-13 13:49:07 -04:00
Jakob Lykke Andersen
798798f7ab templates: hide dashboard org creation when not allowed (#5393)
The admin -> DISABLE_REGULAR_ORG_CREATION setting
hides organization creation in the header, but not
in the dashboard.
2018-09-11 14:10:09 -04:00
leonunix
54e9442a14 docker: fix aarch64 dockerfile make docker image error (#5411) 2018-09-10 15:38:35 -04:00
Unknwon
f7b9f35ce1 locale: sync from Crowdin 2018-09-10 10:41:00 -04:00
Ross Golder
068e6ce2c9 docker: remove chown the git repos on startup (refs #4996). (#5390) 2018-09-08 08:07:30 -04:00
PiPc2
5d4bb4d6f8 librejs.html: fix semantic version (#5404)
currently incompatible with librejs
2018-09-06 20:16:21 -04:00
Unknwon
a05c19682e locale: sync from Crowdin 2018-08-23 12:45:53 +08:00
Stefan Liu
5caa7436d8 gogs: remove app flags line (#5388)
No meaning for this line
2018-08-23 12:35:36 +08:00
Unknwon
512a900202 repo/editor: hide internal error detail
Prevent exposure of server path
2018-08-17 23:35:53 +08:00
Unknwon
ba7b2cc1f6 vendor: update github.com/gogs/git-module 2018-08-17 23:15:26 +08:00
Unknwon
ac73d43444 repo_editor: able to trigger Git hooks (#4338) 2018-08-17 23:15:20 +08:00
Unknwon
33434a40d7 vendor: update github.com/gogs/git-module 2018-08-17 20:03:00 +08:00
Unknwon
844d69143f pkg/markup: allow match SHA1 length 7-40 (#3321) 2018-08-17 20:02:43 +08:00
Unknwon
77275a9b31 models: rename Id to ID 2018-08-16 20:26:09 +08:00
Unknwon
de10d9be08 models: fix delete undesired release attachments when delete a comment (#4627)
Apparently, AfterDelete has ID=0
2018-08-16 20:17:19 +08:00
Steven Haigh
3c227af508 scripts: add NoNewPrivileges=true to systemd unit file (#5381)
Also add comment about unsupported options in different systemd versions.
2018-08-16 19:07:36 +08:00
Unknwon
4c1a479a60 models: fix delete public keys ORM syntax (#5376) 2018-08-14 22:10:44 +08:00
Michael Li
cc95d251d6 docker: add new Dockerfile.docker-ce for docker-ce(>=v17.06) to build docker image (#5322)
* add new Dockerfile.docker-ce for docker-ce(>=v17.06) to  build docker image

* change default Dockerfile to support docker-ce(>=v17.06) multi-stage build
2018-08-13 20:50:25 +08:00
chromium1337
1f247cf813 routes: fix open redirect vulnerability #5364 (#5365) 2018-08-06 17:10:16 +08:00
GeekComb
c9bb33afc3 repo: fix issue of fork repository no check the limit of users' repository (#5346) 2018-07-18 20:03:09 +08:00
Unknwon
97fb9d283f locale: sync from Crowdin 2018-07-16 06:14:54 +08:00
Bogdan Khomutsky
66016b8499 scripts: apply hardening for systemd service (#5332) 2018-07-09 16:13:28 +08:00
PHANI
8bbf0293f5 webhook: add headers to support spring config server (#5325)
Spring cloud config server dependency spring cloud config monitor looks for X-Github-Event condition PropertyPathEndpoint.class -> GithubPropertyPathNotificationExtractor.class if ("push".equals(headers.getFirst("X-Github-Event"))) {...}
2018-07-09 16:12:30 +08:00
cezar97
87b229d280 templates: add 'rel=noopener noreferrer' to <a> tags (#5319)
Signed-off-by: cezar97 <cezar97@protonmail.com>
2018-07-02 19:33:14 +08:00
Unknwon
2a86b3e31d restore: reset milestone deadline_unix and closed_date_unix (#5264) 2018-06-27 22:08:24 +08:00
Steve Chung
436dd6c0a4 routes/repo/setting: require autosize when repo/settings/options is rendered (#5315) 2018-06-26 21:40:09 +08:00
Unknwon
f6bdefe3f3 public: minor fix for PR #5276 2018-06-26 21:16:29 +08:00
ususdei
cd71077c6a pull request: able to add custom commit description (#5276)
* pull request merges now allow for custom commit messages

* allow i18n on commit_message label

* place label above textarea for commit message

* rename commit message for pull requests into commit description and pass to git separately
2018-06-26 20:49:46 +08:00
Unknwon
029b33c650 restore: ignore created_unix for milestone table (#5264) 2018-06-25 20:33:21 +08:00
Unknwon
f4f4edf276 vendor: update github.com/gogs/git-module 2018-06-25 19:58:40 +08:00
Unknwon
992ea5802a locale: sync from Crowdin 2018-06-18 12:21:51 +08:00
Unknwon
376a629c9f repo: add changes to repository avatar feature (#5221) 2018-06-17 22:18:41 +08:00
Sergey Dryabzhinsky
303fa37b60 repo: support avatars (#5221)
* First code for repository avatars

* Last code for repository avatars

- add new option for repo avatars location on filesystem
- add route catch in web
- add new fields to repo model
- add migration
- update settings handlers
- update repo header template

* Update locale messages

* Add repo avatars to home page

* Add repo avatars to organization right panel

* Show repo avatars in repo list

* Remove AvatarEamil field, remove Gravatar support, use generic locale messages

* Fix migration

* Fix seed and not used tool

* Revert public css changes, add them to less files

* Latest lessc (2.6.0) don't put result into file but output to stdout

So redirect output to file

* Simplify things:

- migration don't needed, and table changes too
- just upload file to repo avatar storage
- or generate random image

* Fix repo image seed - name not unique

* Get rid of not needed model fields

* Class value is enough, remove height attribute

* Don't generate random avatar for repository

- use html and semantic ui icons if no avatar found

* Update styles and templates for repo

- use repo icon as default avatar
- use globe icon for public repos
- add micro style for repo avatars at dashboard

* Remvoe redundant empty line

* Fix nl2br filter - must return string

* Fix css style for micro-repo-avatar in dashboard list

* Remove `|len`, works fine w/o it.

* Update after review 2:

- use static route for repository avatar
- format images settings block in settings

* Update after review 2:

- no random avatar for repo

* Update after review 2:

- no random avatar for repo 2
- update imports
- update UploadAvatar* functions

* Update after review 2:

- update templates

* Fix trace call

* Remove unused immport since we use static route for repo avatars.
2018-06-17 20:21:52 +08:00
Unknwon
ef02414d7e pkg/setting: ignore config inline comment by default 2018-06-17 09:10:18 +08:00
Unknwon
bcf83ea792 vendor: update gopkg.in/ini.v1 2018-06-17 09:08:21 +08:00
Unknwon
86a27cf16d modes/repo: syntax fix for PR #5234 2018-06-16 16:48:47 +08:00
James
08ae0dd74b repo: show in search if any part is public (#5234)
if repo is private but wiki and/or issue are public show repo in search
2018-06-16 16:34:55 +08:00
Unknwon
93f3a7f96a vendor: update github.com/go-sql-driver/mysql 2018-06-15 13:33:08 +08:00
Unknwon
7856b1202d *: fix wrong format type 2018-06-13 22:26:56 +08:00
Unknwon
e5ddbcab7d routes/repo/http: fix wrong format type 2018-06-13 21:58:46 +08:00
oOOps
f9bc980b0b api: correct pagination in repository search api (#5293) 2018-06-13 21:55:09 +08:00
奶爸
806754b512 repo: clean up webhook and hook_task when delete repository (#5239) 2018-06-11 21:35:38 +08:00
Unknwon
4d18df204a Merge branch 'pr-5277' into develop
# Conflicts:
#	models/migrations/migrations.go
2018-06-11 21:32:57 +08:00
奶爸
04b4431bc0 migrations: clean unlinked webhook and hook_tasks 2018-06-11 21:29:24 +08:00
Unknwon
dfd494c113 repo: minor improve for PR #5219 and support UTF-8 byte count 2018-06-11 21:06:24 +08:00
Sergey Dryabzhinsky
57897cc8c2 repo: update repository description field to contain more than 256 symbols (#5219)
* Update repository description field to contain more than 256 symbols

- update repository model - description field now is `TEXT` and limited by 4000 symbols
- new migration
- add description to html forms - repo creation and repo settings
- add translation for description

* Update for description field, new features

- add autosize (height) for description textarea, new plugin
- set max description length to 512 symbols
- update locales

* Fix migration - typo in var

* Update repo description behaviour

- add textarea autosize for /repo/create
- add symbols counter under description testarea (create/edit)

* Fix function definition - it a var

* Revert ru-RU locale

* Update by review

- Use type `varchar(512)` in migration
- Remove unused files from autosize plugin

* Fix migration - new project paths

* Fixes after review 2

- copyright year
- format includes
- use switch instead of multi-if

* Remove unused `default:` option.
2018-06-11 20:34:26 +08:00
Unknwon
459c8be94f ci: remove Go 1.6.x 2018-06-09 17:43:26 +08:00
Unknwon
5e158b51db vendor: add new dependencies 2018-06-09 17:34:38 +08:00
Unknwon
fbecc18e2e *: use jsoniter to replace encoding/json 2018-06-09 17:32:58 +08:00
Unknwon
b538c5345e restore: reset original created_unix after insert (#5264) 2018-06-09 17:21:58 +08:00
Unknwon
694208865b vendor: add github.com/json-iterator/go 2018-06-09 17:20:38 +08:00
Unknwon
a75c435245 vendor: update github.com/go-xorm/… 2018-06-09 16:28:52 +08:00
Unknwon
53c8e4263b models: skip JSON for fields skipped by XORM
Reduce output JSON size by backup command
2018-06-09 16:06:47 +08:00
Unknwon
078549518d vendor: update github.com/gogs/git-module 2018-06-09 10:00:45 +08:00
Alexey Terentyev
4c844081f3 routes/repo: added deletion of an empty line at the end of file (#5261) (#5270)
* Added deletion of an empty line at the end of file (#5261)

Signed-off-by: Alexey Terentyev <axifnx@gmail.com>

* Fix after feedback

Signed-off-by: Alexey Terentyev <axifnx@gmail.com>
2018-06-06 21:32:54 +08:00
586 changed files with 80259 additions and 5615 deletions

View File

@@ -1,5 +1,3 @@
.git
.git/**
packager
packager/**
scripts

View File

@@ -17,9 +17,8 @@ The issue will be closed without any reasons if it does not satisfy any of follo
- [ ] MSSQL
- [ ] SQLite
- Can you reproduce the bug at https://try.gogs.io:
- [ ] Yes (provide example URL)
- [ ] No
- [ ] Not relevant
- [ ] Yes: provide example URL
- [ ] No: explain why
- Log gist (usually found in `log/gogs.log`):
## Description

50
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,50 @@
---
name: Bug report
about: Create a report to help us improve
---
First of all, read https://www.chiark.greenend.org.uk/~sgtatham/bugs.html.
If you don't want to read, it's up to you. But don't waste your time continue reporting.
The issue will be closed without any explanation if it does not satisfy any of following requirements:
1. Please speak English, we have forum in [中文](https://discuss.gogs.io/c/getting-help/getting-help-chinese).
2. Please post questions or config/deploy problems on our forum: https://discuss.gogs.io, here are bugs and feature requests only.
3. Please do not end your title with a question mark or period.
3. Please take a moment to search that an issue doesn't already exist.
4. Please give all relevant information below for bug reports; incomplete details considered invalid report.
**You MUST delete above content including this line before posting; too lazy to take this action considered invalid report.**
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Additional context**
- Gogs version (or commit ref):
- Git version:
- Operating system:
- Database (replace `[ ]` with `[x]`):
- [ ] PostgreSQL
- [ ] MySQL
- [ ] MSSQL
- [ ] SQLite
- Can you reproduce the bug at https://try.gogs.io:
- [ ] Yes: provide example URL
- [ ] No: explain why
- Log gist (usually found in `log/gogs.log`):

View File

@@ -0,0 +1,26 @@
---
name: Feature request
about: Suggest an idea for this project
---
The issue will be closed without any explanation if it does not satisfy any of following requirements:
1. Please speak English, we have forum in [中文](https://discuss.gogs.io/c/getting-help/getting-help-chinese).
2. Please post questions or config/deploy problems on our forum: https://discuss.gogs.io, here are bugs and feature requests only.
3. Please do not end your title with a question mark or period.
4. Please take a moment to search that an issue doesn't already exist.
**You MUST delete above content including this line before posting; too lazy to take this action considered invalid report.**
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View File

@@ -1,19 +1,14 @@
language: go
go:
- 1.6.x
- 1.7.x
- 1.8.x
- 1.9.x
- 1.10.x
- master
- 1.11.x
before_install:
- sudo apt-get update -qq
- sudo apt-get install -y libpam-dev
env:
- GO15VENDOREXPERIMENT=1
script:
script:
- go build -v -tags "pam"
- go test -v -cover -race ./...

View File

@@ -1,7 +1,13 @@
FROM alpine:3.5
FROM golang:alpine AS binarybuilder
# Install build deps
RUN apk --no-cache --no-progress add --virtual build-deps build-base git linux-pam-dev
WORKDIR /go/src/github.com/gogs/gogs
COPY . .
RUN make build TAGS="sqlite cert pam"
FROM alpine:latest
# Install system utils & Gogs runtime dependencies
ADD https://github.com/tianon/gosu/releases/download/1.9/gosu-amd64 /usr/sbin/gosu
ADD https://github.com/tianon/gosu/releases/download/1.10/gosu-amd64 /usr/sbin/gosu
RUN chmod +x /usr/sbin/gosu \
&& echo http://dl-2.alpinelinux.org/alpine/edge/community/ >> /etc/apk/repositories \
&& apk --no-cache --no-progress add \
@@ -20,16 +26,14 @@ ENV GOGS_CUSTOM /data/gogs
# Configure LibC Name Service
COPY docker/nsswitch.conf /etc/nsswitch.conf
COPY docker /app/gogs/docker
COPY templates /app/gogs/templates
COPY public /app/gogs/public
WORKDIR /app/gogs/build
COPY . .
WORKDIR /app/gogs
COPY docker ./docker
COPY templates ./templates
COPY public ./public
COPY --from=binarybuilder /go/src/github.com/gogs/gogs/gogs .
RUN ./docker/build-go.sh \
&& ./docker/build.sh \
&& ./docker/finalize.sh
RUN ./docker/finalize.sh
# Configure Docker Container
VOLUME ["/data"]

View File

@@ -1,4 +1,4 @@
FROM arm64v8/alpine:3.6
FROM arm64v8/alpine:3.8
ENV GOGS_CUSTOM /data/gogs
ENV QEMU_EXECVE 1
@@ -17,13 +17,17 @@ RUN [ "cross-build-start" ]
#######################
# Install system utils & Gogs runtime dependencies
ADD https://github.com/tianon/gosu/releases/download/1.9/gosu-arm64 /usr/sbin/gosu
ADD https://github.com/tianon/gosu/releases/download/1.10/gosu-arm64 /usr/sbin/gosu
RUN chmod +x /usr/sbin/gosu \
&& apk --no-cache --no-progress add ca-certificates bash git linux-pam s6 curl openssh socat tzdata go
&& apk --no-cache --no-progress add ca-certificates bash git linux-pam s6 curl openssh shadow socat tzdata go=1.10.1-r0
COPY . /app/gogs/build
COPY docker /app/gogs/docker
COPY templates /app/gogs/templates
COPY public /app/gogs/public
WORKDIR /app/gogs/build
COPY . .
RUN ./docker/build.sh \
&& ./docker/finalize.sh

View File

@@ -14,7 +14,6 @@ RELEASE_ROOT = "release"
RELEASE_GOGS = "release/gogs"
NOW = $(shell date -u '+%Y%m%d%I%M%S')
GOVET = go tool vet -composites=false -methods=false -structtags=false
GOPATH = $(shell echo $${PWD%%src*})
.PHONY: build pack release bindata clean
@@ -62,7 +61,7 @@ pkg/bindata/bindata.go: $(DATA_FILES)
less: public/css/gogs.css
public/css/gogs.css: $(LESS_FILES)
lessc $< $@
@type lessc >/dev/null 2>&1 && lessc $< >$@ || echo "lessc command not found, skipped."
clean:
go clean -i ./...

View File

@@ -22,9 +22,9 @@ Gogs [![Build Status](https://travis-ci.org/gogs/gogs.svg?branch=master)](https:
[简体中文](README_ZH.md)
## Purpose
## Vision
The goal of this project is to make the easiest, fastest, and most painless way of setting up a self-hosted Git service. With Go, this can be done with an independent binary distribution across **ALL platforms** that Go supports, including Linux, macOS, Windows and ARM.
This project aims to build a simple, stable and extensible self-hosted Git service that can be setup in the most painless way. With Go, this can be done with an independent binary distribution across **ALL platforms** that Go supports, including Linux, macOS, Windows and ARM.
## Overview
@@ -52,7 +52,7 @@ The goal of this project is to make the easiest, fastest, and most painless way
- Mail service
- Administration panel
- Supports MySQL, PostgreSQL, SQLite3, MSSQL and [TiDB](https://github.com/pingcap/tidb) (via MySQL protocol)
- Multi-language support ([29 languages](https://crowdin.com/project/gogs))
- Multi-language support ([30 languages](https://crowdin.com/project/gogs))
## Hardware Requirements
@@ -125,7 +125,7 @@ There are 5 ways to install Gogs:
- Thanks [Egon Elbre](https://twitter.com/egonelbre) for designing logo.
- Thanks [Crowdin](https://crowdin.com/project/gogs) for sponsoring open source translation plan.
- Thanks [DigitalOcean](https://www.digitalocean.com) for sponsoring VPS service.
- Thanks [DigitalOcean](https://www.digitalocean.com) and [VPSServer](https://www.vpsserver.com/) for sponsoring VPS service.
- Thanks [KeyCDN](https://www.keycdn.com/) for sponsoring CDN service.
## Contributors
@@ -136,3 +136,5 @@ There are 5 ways to install Gogs:
## License
This project is under the MIT License. See the [LICENSE](https://github.com/gogs/gogs/blob/master/LICENSE) file for the full license text.
[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fgogs%2Fgogs.svg?type=small)](https://app.fossa.io/projects/git%2Bgithub.com%2Fgogs%2Fgogs?ref=badge_small)

View File

@@ -3,9 +3,9 @@ Gogs [![Build Status](https://travis-ci.org/gogs/gogs.svg?branch=master)](https:
Gogs 是一款极易搭建的自助 Git 服务。
## 开发目的
## 项目愿景
Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务。使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发,并且支持 Go 语言支持的 **所有平台**,包括 Linux、macOS、Windows 以及 ARM 平台。
本项目旨在打造一个最简便的方式搭建简单、稳定和可扩展的自助 Git 服务。使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发,并且支持 Go 语言支持的 **所有平台**,包括 Linux、macOS、Windows 以及 ARM 平台。
## 项目概览
@@ -33,7 +33,7 @@ Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自
- 支持邮件服务
- 支持后台管理面板
- 支持 MySQL、PostgreSQL、SQLite3、MSSQL 和 [TiDB](https://github.com/pingcap/tidb)(通过 MySQL 协议)数据库
- 支持多语言本地化([29 种语言]([more](https://crowdin.com/project/gogs))
- 支持多语言本地化([30 种语言]([more](https://crowdin.com/project/gogs))
## 硬件要求
@@ -94,7 +94,7 @@ Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自
- 感谢 [Egon Elbre](https://twitter.com/egonelbre) 设计的 Logo。
- 感谢 [Crowdin](https://crowdin.com/project/gogs) 提供免费的开源项目本地化支持。
- 感谢 [DigitalOcean](https://www.digitalocean.com) 提供主站和体验站点的服务器赞助。
- 感谢 [DigitalOcean](https://www.digitalocean.com) 和 [VPSServer](https://www.vpsserver.com/) 提供服务器赞助。
- 感谢 [KeyCDN](https://www.keycdn.com/) 提供 CDN 服务赞助。
## 贡献成员

View File

@@ -1,11 +1,11 @@
version: "{build}"
skip_tags: true
clone_folder: c:\gopath\src\github.com\gogits\gogs
clone_folder: c:\gopath\src\github.com\gogs\gogs
clone_depth: 1
environment:
GOPATH: c:\gopath
GOVERSION: 1.7
GOVERSION: 1.11
build: false
deploy: false
@@ -17,4 +17,4 @@ notifications:
- provider: Email
to:
- u@gogs.io
on_build_success: false
on_build_success: false

View File

@@ -39,6 +39,7 @@ portable among all supported database engines.`,
},
}
const _CURRENT_BACKUP_FORMAT_VERSION = 1
const _ARCHIVE_ROOT_DIR = "gogs-backup"
func runBackup(c *cli.Context) error {
@@ -63,7 +64,7 @@ func runBackup(c *cli.Context) error {
// Metadata
metaFile := path.Join(rootDir, "metadata.ini")
metadata := ini.Empty()
metadata.Section("").Key("VERSION").SetValue("1")
metadata.Section("").Key("VERSION").SetValue(com.ToStr(_CURRENT_BACKUP_FORMAT_VERSION))
metadata.Section("").Key("DATE_TIME").SetValue(time.Now().String())
metadata.Section("").Key("GOGS_VERSION").SetValue(setting.AppVer)
if err = metadata.SaveTo(metaFile); err != nil {
@@ -99,7 +100,7 @@ func runBackup(c *cli.Context) error {
// Data files
if !c.Bool("database-only") {
for _, dir := range []string{"attachments", "avatars"} {
for _, dir := range []string{"attachments", "avatars", "repo-avatars"} {
dirPath := path.Join(setting.AppDataPath, dir)
if !com.IsDir(dirPath) {
continue

View File

@@ -27,7 +27,6 @@ import (
"github.com/gogs/gogs/pkg/mailer"
"github.com/gogs/gogs/pkg/setting"
"github.com/gogs/gogs/pkg/template"
http "github.com/gogs/gogs/routes/repo"
)
var (
@@ -71,7 +70,7 @@ func runHookPreReceive(c *cli.Context) error {
}
setup(c, "hooks/pre-receive.log", true)
isWiki := strings.Contains(os.Getenv(http.ENV_REPO_CUSTOM_HOOKS_PATH), ".wiki.git/")
isWiki := strings.Contains(os.Getenv(models.ENV_REPO_CUSTOM_HOOKS_PATH), ".wiki.git/")
buf := bytes.NewBuffer(nil)
scanner := bufio.NewScanner(os.Stdin)
@@ -92,7 +91,7 @@ func runHookPreReceive(c *cli.Context) error {
branchName := strings.TrimPrefix(string(fields[2]), git.BRANCH_PREFIX)
// Branch protection
repoID := com.StrTo(os.Getenv(http.ENV_REPO_ID)).MustInt64()
repoID := com.StrTo(os.Getenv(models.ENV_REPO_ID)).MustInt64()
protectBranch, err := models.GetProtectBranchOfRepoByName(repoID, branchName)
if err != nil {
if errors.IsErrBranchNotExist(err) {
@@ -108,7 +107,7 @@ func runHookPreReceive(c *cli.Context) error {
bypassRequirePullRequest := false
// Check if user is in whitelist when enabled
userID := com.StrTo(os.Getenv(http.ENV_AUTH_USER_ID)).MustInt64()
userID := com.StrTo(os.Getenv(models.ENV_AUTH_USER_ID)).MustInt64()
if protectBranch.EnableWhitelist {
if !models.IsUserInProtectBranchWhitelist(repoID, userID, branchName) {
fail(fmt.Sprintf("Branch '%s' is protected and you are not in the push whitelist", branchName), "")
@@ -129,7 +128,7 @@ func runHookPreReceive(c *cli.Context) error {
// Check force push
output, err := git.NewCommand("rev-list", "--max-count=1", oldCommitID, "^"+newCommitID).
RunInDir(models.RepoPath(os.Getenv(http.ENV_REPO_OWNER_NAME), os.Getenv(http.ENV_REPO_NAME)))
RunInDir(models.RepoPath(os.Getenv(models.ENV_REPO_OWNER_NAME), os.Getenv(models.ENV_REPO_NAME)))
if err != nil {
fail("Internal error", "Fail to detect force push: %v", err)
} else if len(output) > 0 {
@@ -137,7 +136,7 @@ func runHookPreReceive(c *cli.Context) error {
}
}
customHooksPath := filepath.Join(os.Getenv(http.ENV_REPO_CUSTOM_HOOKS_PATH), "pre-receive")
customHooksPath := filepath.Join(os.Getenv(models.ENV_REPO_CUSTOM_HOOKS_PATH), "pre-receive")
if !com.IsFile(customHooksPath) {
return nil
}
@@ -148,7 +147,7 @@ func runHookPreReceive(c *cli.Context) error {
} else {
hookCmd = exec.Command(customHooksPath)
}
hookCmd.Dir = models.RepoPath(os.Getenv(http.ENV_REPO_OWNER_NAME), os.Getenv(http.ENV_REPO_NAME))
hookCmd.Dir = models.RepoPath(os.Getenv(models.ENV_REPO_OWNER_NAME), os.Getenv(models.ENV_REPO_NAME))
hookCmd.Stdout = os.Stdout
hookCmd.Stdin = buf
hookCmd.Stderr = os.Stderr
@@ -171,7 +170,7 @@ func runHookUpdate(c *cli.Context) error {
fail("First argument 'refName' is empty", "First argument 'refName' is empty")
}
customHooksPath := filepath.Join(os.Getenv(http.ENV_REPO_CUSTOM_HOOKS_PATH), "update")
customHooksPath := filepath.Join(os.Getenv(models.ENV_REPO_CUSTOM_HOOKS_PATH), "update")
if !com.IsFile(customHooksPath) {
return nil
}
@@ -182,7 +181,7 @@ func runHookUpdate(c *cli.Context) error {
} else {
hookCmd = exec.Command(customHooksPath, args...)
}
hookCmd.Dir = models.RepoPath(os.Getenv(http.ENV_REPO_OWNER_NAME), os.Getenv(http.ENV_REPO_NAME))
hookCmd.Dir = models.RepoPath(os.Getenv(models.ENV_REPO_OWNER_NAME), os.Getenv(models.ENV_REPO_NAME))
hookCmd.Stdout = os.Stdout
hookCmd.Stdin = os.Stdin
hookCmd.Stderr = os.Stderr
@@ -205,7 +204,7 @@ func runHookPostReceive(c *cli.Context) error {
mailer.InitMailRender(path.Join(setting.StaticRootPath, "templates/mail"),
path.Join(setting.CustomPath, "templates/mail"), template.NewFuncMap())
isWiki := strings.Contains(os.Getenv(http.ENV_REPO_CUSTOM_HOOKS_PATH), ".wiki.git/")
isWiki := strings.Contains(os.Getenv(models.ENV_REPO_CUSTOM_HOOKS_PATH), ".wiki.git/")
buf := bytes.NewBuffer(nil)
scanner := bufio.NewScanner(os.Stdin)
@@ -227,10 +226,10 @@ func runHookPostReceive(c *cli.Context) error {
OldCommitID: string(fields[0]),
NewCommitID: string(fields[1]),
RefFullName: string(fields[2]),
PusherID: com.StrTo(os.Getenv(http.ENV_AUTH_USER_ID)).MustInt64(),
PusherName: os.Getenv(http.ENV_AUTH_USER_NAME),
RepoUserName: os.Getenv(http.ENV_REPO_OWNER_NAME),
RepoName: os.Getenv(http.ENV_REPO_NAME),
PusherID: com.StrTo(os.Getenv(models.ENV_AUTH_USER_ID)).MustInt64(),
PusherName: os.Getenv(models.ENV_AUTH_USER_NAME),
RepoUserName: os.Getenv(models.ENV_REPO_OWNER_NAME),
RepoName: os.Getenv(models.ENV_REPO_NAME),
}
if err := models.PushUpdate(options); err != nil {
log.Error(2, "PushUpdate: %v", err)
@@ -239,8 +238,8 @@ func runHookPostReceive(c *cli.Context) error {
// Ask for running deliver hook and test pull request tasks
reqURL := setting.LocalURL + options.RepoUserName + "/" + options.RepoName + "/tasks/trigger?branch=" +
template.EscapePound(strings.TrimPrefix(options.RefFullName, git.BRANCH_PREFIX)) +
"&secret=" + os.Getenv(http.ENV_REPO_OWNER_SALT_MD5) +
"&pusher=" + os.Getenv(http.ENV_AUTH_USER_ID)
"&secret=" + os.Getenv(models.ENV_REPO_OWNER_SALT_MD5) +
"&pusher=" + os.Getenv(models.ENV_AUTH_USER_ID)
log.Trace("Trigger task: %s", reqURL)
resp, err := httplib.Head(reqURL).SetTLSClientConfig(&tls.Config{
@@ -256,7 +255,7 @@ func runHookPostReceive(c *cli.Context) error {
}
}
customHooksPath := filepath.Join(os.Getenv(http.ENV_REPO_CUSTOM_HOOKS_PATH), "post-receive")
customHooksPath := filepath.Join(os.Getenv(models.ENV_REPO_CUSTOM_HOOKS_PATH), "post-receive")
if !com.IsFile(customHooksPath) {
return nil
}
@@ -267,7 +266,7 @@ func runHookPostReceive(c *cli.Context) error {
} else {
hookCmd = exec.Command(customHooksPath)
}
hookCmd.Dir = models.RepoPath(os.Getenv(http.ENV_REPO_OWNER_NAME), os.Getenv(http.ENV_REPO_NAME))
hookCmd.Dir = models.RepoPath(os.Getenv(models.ENV_REPO_OWNER_NAME), os.Getenv(models.ENV_REPO_NAME))
hookCmd.Stdout = os.Stdout
hookCmd.Stdin = buf
hookCmd.Stderr = os.Stderr

View File

@@ -39,6 +39,10 @@ be skipped and remain unchanged.`,
},
}
// lastSupportedVersionOfFormat returns the last supported version of the backup archive
// format that is able to import.
var lastSupportedVersionOfFormat = map[int]string{}
func runRestore(c *cli.Context) error {
zip.Verbose = c.Bool("verbose")
@@ -49,9 +53,10 @@ func runRestore(c *cli.Context) error {
log.Info("Restore backup from: %s", c.String("from"))
if err := zip.ExtractTo(c.String("from"), tmpDir); err != nil {
log.Fatal(0, "Fail to extract backup archive: %v", err)
log.Fatal(0, "Failed to extract backup archive: %v", err)
}
archivePath := path.Join(tmpDir, _ARCHIVE_ROOT_DIR)
defer os.RemoveAll(archivePath)
// Check backup version
metaFile := path.Join(archivePath, "metadata.ini")
@@ -60,12 +65,20 @@ func runRestore(c *cli.Context) error {
}
metadata, err := ini.Load(metaFile)
if err != nil {
log.Fatal(0, "Fail to load metadata '%s': %v", metaFile, err)
log.Fatal(0, "Failed to load metadata '%s': %v", metaFile, err)
}
backupVersion := metadata.Section("").Key("GOGS_VERSION").MustString("999.0")
if version.Compare(setting.AppVer, backupVersion, "<") {
log.Fatal(0, "Current Gogs version is lower than backup version: %s < %s", setting.AppVer, backupVersion)
}
formatVersion := metadata.Section("").Key("VERSION").MustInt()
if formatVersion == 0 {
log.Fatal(0, "Failed to determine the backup format version from metadata '%s': %s", metaFile, "VERSION is not presented")
}
if formatVersion != _CURRENT_BACKUP_FORMAT_VERSION {
log.Fatal(0, "Backup format version found is %d but this binary only supports %d\nThe last known version that is able to import your backup is %s",
formatVersion, _CURRENT_BACKUP_FORMAT_VERSION, lastSupportedVersionOfFormat[formatVersion])
}
// If config file is not present in backup, user must set this file via flag.
// Otherwise, it's optional to set config file flag.
@@ -84,25 +97,25 @@ func runRestore(c *cli.Context) error {
// Database
dbDir := path.Join(archivePath, "db")
if err = models.ImportDatabase(dbDir, c.Bool("verbose")); err != nil {
log.Fatal(0, "Fail to import database: %v", err)
log.Fatal(0, "Failed to import database: %v", err)
}
// Custom files
if !c.Bool("database-only") {
if com.IsExist(setting.CustomPath) {
if err = os.Rename(setting.CustomPath, setting.CustomPath+".bak"); err != nil {
log.Fatal(0, "Fail to backup current 'custom': %v", err)
log.Fatal(0, "Failed to backup current 'custom': %v", err)
}
}
if err = os.Rename(path.Join(archivePath, "custom"), setting.CustomPath); err != nil {
log.Fatal(0, "Fail to import 'custom': %v", err)
log.Fatal(0, "Failed to import 'custom': %v", err)
}
}
// Data files
if !c.Bool("database-only") {
os.MkdirAll(setting.AppDataPath, os.ModePerm)
for _, dir := range []string{"attachments", "avatars"} {
for _, dir := range []string{"attachments", "avatars", "repo-avatars"} {
// Skip if backup archive does not have corresponding data
srcPath := path.Join(archivePath, "data", dir)
if !com.IsDir(srcPath) {
@@ -112,11 +125,11 @@ func runRestore(c *cli.Context) error {
dirPath := path.Join(setting.AppDataPath, dir)
if com.IsExist(dirPath) {
if err = os.Rename(dirPath, dirPath+".bak"); err != nil {
log.Fatal(0, "Fail to backup current 'data': %v", err)
log.Fatal(0, "Failed to backup current 'data': %v", err)
}
}
if err = os.Rename(srcPath, dirPath); err != nil {
log.Fatal(0, "Fail to import 'data': %v", err)
log.Fatal(0, "Failed to import 'data': %v", err)
}
}
}
@@ -125,11 +138,10 @@ func runRestore(c *cli.Context) error {
reposPath := path.Join(archivePath, "repositories.zip")
if !c.Bool("exclude-repos") && !c.Bool("database-only") && com.IsExist(reposPath) {
if err := zip.ExtractTo(reposPath, path.Dir(setting.RepoRootPath)); err != nil {
log.Fatal(0, "Fail to extract 'repositories.zip': %v", err)
log.Fatal(0, "Failed to extract 'repositories.zip': %v", err)
}
}
os.RemoveAll(path.Join(tmpDir, _ARCHIVE_ROOT_DIR))
log.Info("Restore succeed!")
log.Shutdown()
return nil

View File

@@ -19,7 +19,6 @@ import (
"github.com/gogs/gogs/models"
"github.com/gogs/gogs/models/errors"
"github.com/gogs/gogs/pkg/setting"
http "github.com/gogs/gogs/routes/repo"
)
const (
@@ -252,7 +251,7 @@ func runServ(c *cli.Context) error {
gitCmd = exec.Command(verb, repoFullName)
}
if requestMode == models.ACCESS_MODE_WRITE {
gitCmd.Env = append(os.Environ(), http.ComposeHookEnvs(http.ComposeHookEnvsOptions{
gitCmd.Env = append(os.Environ(), models.ComposeHookEnvs(models.ComposeHookEnvsOptions{
AuthUser: user,
OwnerName: owner.Name,
OwnerSalt: owner.Salt,

View File

@@ -25,6 +25,7 @@ import (
"github.com/go-macaron/session"
"github.com/go-macaron/toolbox"
"github.com/mcuadros/go-version"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/urfave/cli"
log "gopkg.in/clog.v1"
"gopkg.in/macaron.v1"
@@ -64,7 +65,7 @@ func checkVersion() {
if err != nil {
log.Fatal(2, "Fail to read 'templates/.VERSION': %v", err)
}
tplVer := string(data)
tplVer := strings.TrimSpace(string(data))
if tplVer != setting.AppVer {
if version.Compare(tplVer, setting.AppVer, ">") {
log.Fatal(2, "Binary version is lower than template file version, did you forget to recompile Gogs?")
@@ -96,7 +97,14 @@ func newMacaron() *macaron.Macaron {
m.Use(macaron.Static(
setting.AvatarUploadPath,
macaron.StaticOptions{
Prefix: "avatars",
Prefix: models.USER_AVATAR_URL_PREFIX,
SkipLogging: setting.DisableRouterLog,
},
))
m.Use(macaron.Static(
setting.RepositoryAvatarUploadPath,
macaron.StaticOptions{
Prefix: models.REPO_AVATAR_URL_PREFIX,
SkipLogging: setting.DisableRouterLog,
},
))
@@ -249,15 +257,15 @@ func runWeb(c *cli.Context) error {
m.Get("/email2user", user.Email2User)
m.Get("/forget_password", user.ForgotPasswd)
m.Post("/forget_password", user.ForgotPasswdPost)
m.Get("/logout", user.SignOut)
m.Post("/logout", user.SignOut)
})
// ***** END: User *****
adminReq := context.Toggle(&context.ToggleOptions{SignInRequired: true, AdminRequired: true})
reqAdmin := context.Toggle(&context.ToggleOptions{SignInRequired: true, AdminRequired: true})
// ***** START: Admin *****
m.Group("/admin", func() {
m.Get("", adminReq, admin.Dashboard)
m.Get("", admin.Dashboard)
m.Get("/config", admin.Config)
m.Post("/config/test_mail", admin.SendTestMail)
m.Get("/monitor", admin.Monitor)
@@ -291,7 +299,7 @@ func runWeb(c *cli.Context) error {
m.Post("/delete", admin.DeleteNotices)
m.Get("/empty", admin.EmptyNotices)
})
}, adminReq)
}, reqAdmin)
// ***** END: Admin *****
m.Group("", func() {
@@ -300,7 +308,7 @@ func runWeb(c *cli.Context) error {
m.Get("/followers", user.Followers)
m.Get("/following", user.Following)
m.Get("/stars", user.Stars)
})
}, context.InjectParamsUser())
m.Get("/attachments/:uuid", func(c *context.Context) {
attach, err := models.GetAttachmentByUUID(c.Params(":uuid"))
@@ -332,8 +340,8 @@ func runWeb(c *cli.Context) error {
}, ignSignIn)
m.Group("/:username", func() {
m.Get("/action/:action", user.Action)
}, reqSignIn)
m.Post("/action/:action", user.Action)
}, reqSignIn, context.InjectParamsUser())
if macaron.Env == macaron.DEV {
m.Get("/template/*", dev.TemplatePreview)
@@ -419,6 +427,9 @@ func runWeb(c *cli.Context) error {
m.Group("/settings", func() {
m.Combo("").Get(repo.Settings).
Post(bindIgnErr(form.RepoSetting{}), repo.SettingsPost)
m.Combo("/avatar").Get(repo.SettingsAvatar).
Post(binding.MultipartForm(form.Avatar{}), repo.SettingsAvatarPost)
m.Post("/avatar/delete", repo.SettingsDeleteAvatar)
m.Group("/collaboration", func() {
m.Combo("").Get(repo.SettingsCollaboration).Post(repo.SettingsCollaborationPost)
m.Post("/access_mode", repo.ChangeCollaborationAccessMode)
@@ -473,7 +484,7 @@ func runWeb(c *cli.Context) error {
})
}, reqSignIn, context.RepoAssignment(), reqRepoAdmin, context.RepoRef())
m.Get("/:username/:reponame/action/:action", reqSignIn, context.RepoAssignment(), repo.Action)
m.Post("/:username/:reponame/action/:action", reqSignIn, context.RepoAssignment(), repo.Action)
m.Group("/:username/:reponame", func() {
m.Get("/issues", repo.RetrieveLabels, repo.Issues)
m.Get("/issues/:index", repo.ViewIssue)
@@ -649,6 +660,18 @@ func runWeb(c *cli.Context) error {
apiv1.RegisterRoutes(m)
}, ignSignIn)
m.Group("/-", func() {
if setting.Prometheus.Enabled {
m.Get("/metrics", func(c *context.Context) {
if !setting.Prometheus.EnableBasicAuth {
return
}
c.RequireBasicAuth(setting.Prometheus.BasicAuthUsername, setting.Prometheus.BasicAuthPassword)
}, promhttp.Handler())
}
})
// robots.txt
m.Get("/robots.txt", func(c *context.Context) {
if setting.HasRobotsTxt {

View File

@@ -1,3 +1,6 @@
Execute following command in ROOT directory when anything is changed:
$ make bindata
```
$ go get -u github.com/go-bindata/go-bindata/...
$ make bindata
```

View File

@@ -96,7 +96,7 @@ ENABLE_LOCAL_PATH_MIGRATION = false
; Concurrency is used to retrieve commits information. This variable define
; the maximum number of tasks that can be run at the same time. Usually, the
; value depend of how many CPUs (cores) you have. If the value is set to zero
; or under, GOGS will automatically detect the number of CPUs your system have
; or under, Gogs will automatically detect the number of CPUs your system have
COMMITS_FETCH_CONCURRENCY = 0
; Enable render mode for raw file
ENABLE_RAW_FILE_RENDER_MODE = false
@@ -250,6 +250,8 @@ USER =
PASSWD =
; Use text/plain as format of content
USE_PLAIN_TEXT = false
; If sending html emails, then also attach a plaintext alternative to the MIME message, to support older mail clients and make spam filters happier.
ADD_PLAIN_TEXT_ALT = false
[cache]
; Either "memory", "redis", or "memcache", default is "memory"
@@ -271,7 +273,7 @@ PROVIDER = memory
; mysql: go-sql-driver/mysql dsn config string, e.g. `root:password@/session_table`
PROVIDER_CONFIG = data/sessions
; Session cookie name
COOKIE_NAME = i_like_gogits
COOKIE_NAME = i_like_gogs
; If you use session in https only, default is false
COOKIE_SECURE = false
; Enable set cookie, default is true
@@ -286,6 +288,8 @@ CSRF_COOKIE_NAME = _csrf
[picture]
; Path to store user uploaded avatars
AVATAR_UPLOAD_PATH = data/avatars
; Path to store repository uploaded avatars
REPOSITORY_AVATAR_UPLOAD_PATH = data/repo-avatars
; Chinese users can choose "duoshuo"
; or a custom avatar source, like: http://cn.gravatar.com/avatar/
GRAVATAR_SOURCE = gravatar
@@ -328,13 +332,13 @@ LEVEL = Trace
; For "console" mode only
[log.console]
; leave empty to inherit
LEVEL =
; Comment out to inherit
; LEVEL =
; For "file" mode only
[log.file]
; leave empty to inherit
LEVEL =
; Comment out to inherit
; LEVEL =
; This enables automated log rotate (switch of following options)
LOG_ROTATE = true
; Segment log daily
@@ -348,14 +352,14 @@ MAX_DAYS = 7
; For "slack" mode only
[log.slack]
; leave empty to inherit
LEVEL =
; Comment out to inherit
; LEVEL =
; Webhook URL
URL =
[log.discord]
; leave empty to inherit
LEVEL =
; Comment out to inherit
; LEVEL =
; Webhook URL
URL =
; Username displayed in webhook
@@ -462,9 +466,15 @@ NEWS_FEED_PAGING_NUM = 20
; Number of commits that are showed in one page
COMMITS_PAGING_NUM = 30
[prometheus]
ENABLED = true
ENABLE_BASIC_AUTH = false
BASIC_AUTH_USERNAME =
BASIC_AUTH_PASSWORD =
[i18n]
LANGS = en-US,zh-CN,zh-HK,zh-TW,de-DE,fr-FR,nl-NL,lv-LV,ru-RU,ja-JP,es-ES,pt-BR,pl-PL,bg-BG,it-IT,fi-FI,tr-TR,cs-CZ,sr-SP,sv-SE,ko-KR,gl-ES,uk-UA,en-GB,hu-HU,sk-SK,id-ID,fa-IR,vi-VN
NAMES = English,简体中文,繁體中文(香港),繁體中文(臺灣),Deutsch,français,Nederlands,latviešu,русский,日本語,español,português do Brasil,polski,български,italiano,suomi,Türkçe,čeština,српски,svenska,한국어,galego,українська,English (United Kingdom),Magyar,Slovenčina,Indonesian,Persian,Vietnamese
LANGS = en-US,zh-CN,zh-HK,zh-TW,de-DE,fr-FR,nl-NL,lv-LV,ru-RU,ja-JP,es-ES,pt-BR,pl-PL,bg-BG,it-IT,fi-FI,tr-TR,cs-CZ,sr-SP,sv-SE,ko-KR,gl-ES,uk-UA,en-GB,hu-HU,sk-SK,id-ID,fa-IR,vi-VN,pt-PT
NAMES = English,简体中文,繁體中文(香港),繁體中文(臺灣),Deutsch,français,Nederlands,latviešu,русский,日本語,español,português do Brasil,polski,български,italiano,suomi,Türkçe,čeština,српски,svenska,한국어,galego,українська,English (United Kingdom),Magyar,Slovenčina,Indonesian,Persian,Vietnamese,Português
; Used for datetimepicker
[i18n.datelang]
@@ -497,6 +507,7 @@ sk-SK = sk
id-ID = id
fa-IR = fa
vi-VN = vi
pt-PT = pt
; Extension mapping to highlight class
; e.g. .toml=ini

View File

@@ -0,0 +1,10 @@
# This is an example of GitHub authentication
#
id = 105
type = github
name = GitHub
is_activated = true
[config]
api_endpoint = https://api.github.com/

View File

@@ -421,6 +421,8 @@ mirror_last_synced=Последна синхр.
watchers=Наблюдаващи
stargazers=Харесващи
forks=Разклонения
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
form.reach_limit_of_creation=Притежателят е достигнал настроения лимит от %d брой хранилища.
form.name_reserved=Името на хранилището '%s' е запазено.
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Съдържанието на файла е б
editor.file_already_exists=Файл с име '%s' вече съществува в това хранилище.
editor.no_changes_to_show=Няма промени.
editor.fail_to_update_file=Невъзможно модифициране/създаване на файл '%s' заради грешка: %v
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
editor.add_subdir=Добави поддиректория...
editor.unable_to_upload_files=Невъзможно качване на файлове в '%s' заради грешка: %v
editor.upload_files_to_dir=Качи файлове в '%s'
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Не може да се извърши обедин
pulls.cannot_auto_merge_helper=Моля, използвайте инструменти на командния ред за да разрешите конфликтите.
pulls.create_merge_commit=Create a merge commit
pulls.rebase_before_merging=Rebase before merging
pulls.commit_description=Commit Description
pulls.merge_pull_request=Обедини заявка за сливане
pulls.open_unmerged_pull_exists=`Невъзможно повторно отваряне, защото вече съществува заявка за сливане (#%d) от същото хранилище със същата информация за обединяване, която чака да бъде извършена`
pulls.delete_branch=Изтрий клон
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Стил на именуване на външна
settings.tracker_issue_style.numeric=Цифров
settings.tracker_issue_style.alphanumeric=Символен
settings.tracker_url_format_desc=Можете да използвате текстови маркери <code>{user} {repo} {index}</code> за потребителско име, име на хранилище и индекс на задача съответно.
settings.pulls_desc=Включва заявки за сливане за да може да се приемат външни доработки
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
settings.pulls.ignore_whitespace=Ignore changes in whitespace
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
settings.danger_zone=Опасна зона
@@ -856,6 +860,8 @@ settings.add_key_success=Новият ключ за внедряване '%s' е
settings.deploy_key_deletion=Изтрий ключ за внедряване
settings.deploy_key_deletion_desc=При изтриването на този ключ за внедряване ще се премахнат свързаните права за достъп до това хранилище. Желаете ли да продължите?
settings.deploy_key_deletion_success=Ключът за внедряване е изтрит успешно!
settings.description_desc=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
diff.browse_source=Преглед на файлове
diff.parent=родител
@@ -1096,6 +1102,7 @@ auths.new=Добави нов начин на удостоверяване
auths.name=Име
auths.type=Тип
auths.enabled=Активно
auths.default=Default
auths.updated=Последна модификация
auths.auth_type=Тип на удостоверяване
auths.auth_name=Име на удостоверяване
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Име на PAM услуга
auths.enable_auto_register=Включи автоматична регистрация
auths.edit=Редактирай настройки за удостоверяване
auths.activated=Това удостоверяване е активно
auths.default_auth=This authentication is default login source
auths.new_success=Новото удостоверяване '%s' е добавено успешно.
auths.update_success=Настройките за удостоверяване са запазени успешно.
auths.update=Запази настройки за удостоверяване

View File

@@ -23,10 +23,10 @@ password=Heslo
re_type=Znovu zadat
captcha=CAPTCHA
repository=Repositář
repository=Repozitář
organization=Organizace
mirror=Zrcadlo
new_repo=Nový repositář
new_repo=Nový repozitář
new_migrate=Nové přenesení
new_mirror=Nové zrcadlo
new_fork=Nový repositář rozštěpení
@@ -39,7 +39,7 @@ your_profile=Váš profil
your_settings=Vaše nastavení
activities=Aktivity
pull_requests=Pull Requesty
pull_requests=Požadavky na natažení
issues=Úkoly
cancel=Zrušit
@@ -72,7 +72,7 @@ run_user=Účet pro spouštění
run_user_helper=Tento uživatel musí mít přístup do kořenového adresáře repositářů a právo spustit Gogs.
domain=Doména
domain_helper=Toto ovlivňuje URL klonů skrze SSH.
ssh_port=SSH port
ssh_port=Port SSH
ssh_port_helper=Číslo portu, které používá váš SSH server. Nechte jej prázdné pro vypnutí používání SSH.
use_builtin_ssh_server=Použít vestavěný SSH server
use_builtin_ssh_server_popup=Pro Git operace spustit vestavěný SSH server, aby byl rozpoznán od systémové SSH služby.
@@ -151,8 +151,8 @@ register_hepler_msg=Již máte účet? Přihlašte se!
social_register_hepler_msg=Již máte účet? Připojte se!
disable_register_prompt=Omlouváme se, ale registrace jsou vypnuty. Kontaktujte správce systému.
disable_register_mail=Omlouváme se, ale e-mailové služby jsou vypnuté. Kontaktujte správce systému.
auth_source=Authentication Source
local=Local
auth_source=Zdroj ověření
local=Lokální
remember_me=Zapamatovat si mne
forgot_password=Zapomenuté heslo
forget_password=Zapomněli jste heslo?
@@ -231,7 +231,7 @@ org_name_been_taken=Název organizace je již obsazen.
team_name_been_taken=Název týmu je již obsazen.
email_been_used=E-mailová adresa je již použita.
username_password_incorrect=Chybné uživatelské jméno nebo heslo.
auth_source_mismatch=The authentication source selected is not associated with the user.
auth_source_mismatch=Vybraný zdroj ověření není propojen s uživatelem.
enterred_invalid_repo_name=Ujistěte se, prosím, že zadaný název repositáře je správný.
enterred_invalid_owner_name=Ujistěte se, prosím, že jméno vlastníka je zadáno správně.
enterred_invalid_password=Ujistěte se, prosím, že zadané heslo je správné.
@@ -251,7 +251,7 @@ target_branch_not_exist=Cílová větev neexistuje.
[user]
change_avatar=Změnit vaši uživatelskou ikonu
join_on=Zaregistroval se dne
repositories=Repositáře
repositories=Repozitáře
activity=Veřejná aktivita
followers=Sledující
starred=Oblíbené repositáře
@@ -319,7 +319,7 @@ add_email_success=Vaše nová e-mailová adresa byla přidána.
manage_ssh_keys=Správa SSH klíčů
add_key=Přidat klíč
ssh_desc=Toto je seznam SSH klíčů vašeho účtu. Tyto klíče umožňují plný přístup k vašim repositářům, proto je velmi důležité, abyste jste si byli jistí, že jsou skutečně vaše.
ssh_desc=Toto je seznam SSH klíčů vašeho účtu. Jelikož SSH klíče umožňují komukoliv plný přístup k vašim repositářům, je velmi důležité, abyste si byli jistí, že jsou skutečně vaše.
ssh_helper=<strong>Nevíte jak?</strong> Podívejte se do příručky GitHubu jak si <a href="%s">vytvořit vlastní SSH klíč</a>, nebo na <a href="%s">řešení častých problémů</a>, na které můžete narazit při používání SSH.
add_new_key=Přidat SSH klíč
ssh_key_been_used=Obsah veřejného klíče byl použit.
@@ -329,8 +329,8 @@ key_content=Obsah
add_key_success=Byl přidán nový SSH klíč '%s'!
delete_key=Smazat
ssh_key_deletion=Smazání SSH klíče
ssh_key_deletion_desc=Smazání tohoto SSH klíče odstraní všechny související přístupy k vašemu účtu. Chcete pokračovat?
ssh_key_deletion_success=SSH klíč úspěšně odstraněn!
ssh_key_deletion_desc=Smazání tohoto klíče SSH odstraní všechny související přístupy k vašemu účtu. Chcete pokračovat?
ssh_key_deletion_success=SSH klíč byl úspěšně smazán!
add_on=Přidán dne
last_used=Naposledy použit dne
no_activity=Žádná aktuální aktivita
@@ -351,7 +351,7 @@ two_factor_or_enter_secret=Nebo zadejte tajný kód:
two_factor_then_enter_passcode=Pak zadejte přístupový kód:
two_factor_verify=Ověřit
two_factor_invalid_passcode=Zadaný přístupový kód není platný, prosím, zkuste to znova!
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
two_factor_reused_passcode=Kód, který jste zadali už byl použit. Prosím, zkuste jiný!
two_factor_enable_error=Povolení dvoufaktorového ověření selhalo: %v
two_factor_enable_success=Dvoufaktorové ověření bylo pro váš účet povoleno!
two_factor_recovery_codes_title=Obnovovací kódy dvoufaktorového ověření
@@ -421,6 +421,8 @@ mirror_last_synced=Naposledy synchronizováno
watchers=Sledující
stargazers=Sledující
forks=Rozštěpení
repo_description_helper=Popis repozitáře. Maximální délka 512 znaků.
repo_description_length=Dostupné znaky
form.reach_limit_of_creation=Vlastník dosáhl maximálního počtu %d vytvořených repositořů.
form.name_reserved=Název repositáře '%s' je rezervován.
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Obsah souboru se změnil od začátku úprav.
editor.file_already_exists=Soubor '%s' již v tomto repositáři existuje.
editor.no_changes_to_show=Žádné změny k zobrazení.
editor.fail_to_update_file=Vytvoření nebo změna souboru '%s' skončila chybou: %v
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
editor.add_subdir=Přidat podadresář...
editor.unable_to_upload_files=Nepodařilo se nahrát soubor do '%s'. Chyba: %v
editor.upload_files_to_dir=Nahrát soubory do '%s'
@@ -620,7 +623,7 @@ pulls.compare_compare=porovnat
pulls.filter_branch=Filtrovat větev
pulls.no_results=Nebyly nalezeny žádné výsledky.
pulls.nothing_to_compare=Není co porovnávat, protože základ a hlavní větve jsou shodné.
pulls.nothing_merge_base=There is nothing to compare because two branches have completely different history.
pulls.nothing_merge_base=Není co porovnávat, protože tyto dvě větve mají úplně jinou historii.
pulls.has_pull_request=`Požadavek na natažení mezi těmito větvemi již existuje: <a href="%[1]s/pulls/%[3]d">%[2]s#%[3]d</a>`
pulls.create=Vytvořit požadavek na natažení
pulls.title_desc=chce sloučit %[1]d revizí z větve <code>%[2]s</code> do větve <code>%[3]s</code>
@@ -636,8 +639,9 @@ pulls.is_checking=Kontrola rozporů stále pokračuje, prosím obnovte za někol
pulls.can_auto_merge_desc=Tento požadavek na natažení může být automaticky sloučen.
pulls.cannot_auto_merge_desc=Tento požadavek na natažení nemůže být automaticky sloučen, neboť se v něm nachází rozpory.
pulls.cannot_auto_merge_helper=Prosím proveďte sloučení ručně, aby byly vyřešeny rozpory.
pulls.create_merge_commit=Create a merge commit
pulls.create_merge_commit=Vytvořit slučovací commit
pulls.rebase_before_merging=Rebase before merging
pulls.commit_description=Popis Commitu
pulls.merge_pull_request=Sloučit požadavek na natažení
pulls.open_unmerged_pull_exists=`Nemůžete znovuotevřít požadavek na natažení, neboť požadavek na natažení ze stejného repositáře se stejnými informacemi pro sloučení již existuje (#%d) a čeká na sloučení.`
pulls.delete_branch=Smazat větev
@@ -742,9 +746,9 @@ settings.tracker_issue_style=Styl pojmenování úkolů v externím systému úk
settings.tracker_issue_style.numeric=Číselný
settings.tracker_issue_style.alphanumeric=Alfanumerický
settings.tracker_url_format_desc=Můžete použít zástupné výrazy <code>{user} {repo} {index}</code> pro uživatelské jméno, název repositáře a číslo úkolu.
settings.pulls_desc=Povolit požadavky na natažení, aby mohly být příspěvky veřejnosti akceptovány
settings.pulls.ignore_whitespace=Ignore changes in whitespace
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
settings.pulls.ignore_whitespace=Ignorovat změny v netisknutelných znacích
settings.pulls.allow_rebase_merge=Povolit použití reabse pro slučovací commity
settings.danger_zone=Nebezpečná zóna
settings.cannot_fork_to_same_owner=Nemůžete rozštěpit repositář jejímu vlastníkovi.
settings.new_owner_has_same_repo=Nový vlastník již repositář se stejným názvem má. Vyberte, prosím, jiné jméno.
@@ -765,7 +769,7 @@ settings.wiki_deletion_success=Data Wiki tohoto repositáře byla smazána.
settings.delete=Smazat tento repositář
settings.delete_desc=Jakmile smažete repositář, není možné se vrátit. Buďte si, prosím, jist.
settings.delete_notices_1=- Tuto operaci <strong>nelze</strong> zvrátit.
settings.delete_notices_2=- This operation will permanently delete everything in this repository, including Git data, issues, comments and collaborator access.
settings.delete_notices_2=Tato operace permanentně smaže vše v tomto repositáři, včetně dat Gitu, úkolů, komentářů a přístupu spolupracovníků.
settings.delete_notices_fork_1=- Po smazání se všechny forky se stanou nezávislé.
settings.deletion_success=Repositář byl smazán!
settings.update_settings_success=Možnosti repositáře byly změněny.
@@ -839,14 +843,14 @@ settings.recent_deliveries=Nedávné dodávky
settings.hook_type=Typ háčku
settings.add_slack_hook_desc=Přidat integraci <a href="%s">Slacku</a> do vašeho repositáře.
settings.add_discord_hook_desc=Přidat integraci <a href="%s">Discord</a> do vašeho repositáře.
settings.add_dingtalk_hook_desc=Add <a href="%s">Dingtalk</a> integration to your repository.
settings.add_dingtalk_hook_desc=Přidat integraci <a href="%s">Dingtalk</a> do vašeho repositáře.
settings.slack_token=Poukázka
settings.slack_domain=Doména
settings.slack_channel=Kanál
settings.deploy_keys=Klíče pro nasazení
settings.deploy_keys_helper=<b>Přichycen při činu!</b> Pokud chcete přidat osobní veřejné klíče, zadejte je prosím v <a href="%s%s">nastavení vašeho účtu</a>.
settings.add_deploy_key=Přidat klíč pro nasazení
settings.deploy_key_desc=Klíče pro nasazení mají pouze přístup ke čtení. Nejsou stejné jako osobní SSH klíče.
settings.deploy_key_desc=Klíče pro nasazení mají pouze přístup ke čtení. Nejsou stejné jako SSH klíče osobního účtu.
settings.no_deploy_keys=Žádné klíče pro nasazení nebyly ještě přidány.
settings.title=Název
settings.deploy_key_content=Obsah
@@ -856,6 +860,8 @@ settings.add_key_success=Nový klíč pro nasazení '%s' byl přidán!
settings.deploy_key_deletion=Smazat klíč pro nasazení
settings.deploy_key_deletion_desc=Smazání toho klíče pro nasazení smaže také veškerý k němu svázaný přístup do tohoto repositáře. Chcete pokračovat?
settings.deploy_key_deletion_success=Klíč pro nasazení byl smazán!
settings.description_desc=Description of repository. Maximum 512 characters length.
settings.description_length=Dostupné znaky
diff.browse_source=Procházet zdrojové kódy
diff.parent=rodič
@@ -911,7 +917,7 @@ people=Lidé
invite_someone=Přizvěte někoho
teams=Týmy
lower_members=členové
lower_repositories=repositáře
lower_repositories=repozitáře
create_new_team=Vytvořit nový tým
org_desc=Popis
team_name=Název týmu
@@ -975,9 +981,9 @@ teams.delete_team_success=Daný tým byl smazán.
teams.read_permission_desc=Členství v tom týmu poskytuje právo <strong>čtení</strong>: členové mohou číst z a vytvářet klony repositářů týmu.
teams.write_permission_desc=Členství v tom týmu poskytuje právo <strong>zápisu</strong>: členové mohou číst z a odesílat do repositářů týmu.
teams.admin_permission_desc=Členství v tom týmu poskytuje právo <strong>správce</strong>: členové mohou číst z, odesílat do a přidávat spolupracovníky do repositářů týmu.
teams.repositories=Repositáře týmu
teams.repositories=Repozitáře týmu
teams.search_repo_placeholder=Hledat repositář...
teams.add_team_repository=Přidat repositář týmu
teams.add_team_repository=Přidat repozitář týmu
teams.remove_repo=Odstranit
teams.add_nonexistent_repo=Repositář, který se snažíte přidat, neexistuje. Nejdříve jej vytvořte, prosím.
@@ -985,7 +991,7 @@ teams.add_nonexistent_repo=Repositář, který se snažíte přidat, neexistuje.
dashboard=Přehled
users=Uživatelé
organizations=Organizace
repositories=Repositáře
repositories=Repozitáře
authentication=Způsoby ověření
config=Nastavení
notices=Systémová oznámení
@@ -1091,11 +1097,12 @@ repos.stars=Oblíbení
repos.issues=Úkoly
repos.size=Velikost
auths.auth_sources=Authentication Sources
auths.auth_sources=Zdroje ověření
auths.new=Přidat nový zdroj
auths.name=Název
auths.type=Typ
auths.enabled=Povolený
auths.default=Výchozí
auths.updated=Změněné
auths.auth_type=Typ ověření
auths.auth_name=Název ověření
@@ -1104,7 +1111,7 @@ auths.domain=Doména
auths.host=Server
auths.port=Port
auths.bind_dn=Připojení DN
auths.bind_dn_helper=You can use '%s' as placeholder for username, e.g. DOM\%s
auths.bind_dn_helper=Můžete použít '%s' jako zástupný znak pro uživatelské jméno, například DOM\%s
auths.bind_password=Heslo připojení
auths.bind_password_helper=Upozornění: Toto heslo je ukládáno nešifrované. Nepoužívejte pro správcovské účty.
auths.user_base=Výchozí místo hledání uživatelů
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Název služby PAM
auths.enable_auto_register=Povolit zaregistrování se
auths.edit=Upravit nastavení ověřování
auths.activated=Tento způsob ověřování je aktivní
auths.default_auth=This authentication is default login source
auths.new_success=Nový způsob ověřování '%s' byl přidán.
auths.update_success=Nastavení ověřování bylo změněno.
auths.update=Změnit nastavení ověřování
@@ -1144,7 +1152,7 @@ auths.still_in_used=Tento způsob ověřování je stále používán některým
auths.deletion_success=Způsob ověřování byl smazán!
auths.login_source_exist=Zdroj přihlášení '%s' již existuje.
config.not_set=(not set)
config.not_set=(není nastaveno)
config.server_config=Nastavení serveru
config.app_name=Název aplikace
config.app_ver=Verze aplikace
@@ -1166,7 +1174,7 @@ config.ssh_domain=Doména
config.ssh_port=Port
config.ssh_listen_port=Port pro naslouchání
config.ssh_root_path=Kořenová cesta
config.ssh_rewrite_authorized_keys_at_start=Rewrite authorized_keys At Start
config.ssh_rewrite_authorized_keys_at_start=Přepsat authorized_keys při startu
config.ssh_key_test_path=Cesta testu klíčů
config.ssh_keygen_path=Cesta ke generátoru klíčů ('ssh-keygen')
config.ssh_minimum_key_size_check=Kontrola minimální velikosti klíčů
@@ -1182,7 +1190,7 @@ config.disable_http_git=Vypnout HTTP Git
config.enable_local_path_migration=Povolit migraci z místní cesty
config.commits_fetch_concurrency=Souběžnost vyzvednutí revizí
config.http_config=HTTP Configuration
config.http_config=Nastavení HTTP
config.http_access_control_allow_origin=Access Control Allow Origin
config.db_config=Nastavení databáze

View File

@@ -151,8 +151,8 @@ register_hepler_msg=Haben Sie bereits ein Konto? Jetzt anmelden!
social_register_hepler_msg=Haben Sie bereits ein Konto? Jetzt verknüpfen!
disable_register_prompt=Es tut uns leid, die Registrierung wurde deaktiviert. Bitte wenden Sie sich an den Administrator.
disable_register_mail=Es tut uns leid, die Bestätigung der Registrierungs-E-Mail wurde deaktiviert.
auth_source=Authentication Source
local=Local
auth_source=Authentifizierungsquelle
local=Lokalisierung
remember_me=Angemeldet bleiben
forgot_password=Passwort vergessen
forget_password=Passwort vergessen?
@@ -231,7 +231,7 @@ org_name_been_taken=Organisationsname ist bereits vergeben.
team_name_been_taken=Teamname ist bereits vergeben.
email_been_used=E-Mail-Adresse wird bereits verwendet.
username_password_incorrect=Benutzername oder Passwort ist nicht korrekt.
auth_source_mismatch=The authentication source selected is not associated with the user.
auth_source_mismatch=Die ausgewählte Authentifizierungsquelle ist dem Benutzer nicht zugeordnet.
enterred_invalid_repo_name=Bitte achten Sie darauf, dass der von Ihnen eingegebene Repository-Name korrekt ist.
enterred_invalid_owner_name=Bitte achten Sie darauf, dass der eingegebene Name des Besitzers korrekt ist.
enterred_invalid_password=Bitte achten Sie darauf, dass das eingegebene Passwort richtig ist.
@@ -351,7 +351,7 @@ two_factor_or_enter_secret=Oder geben Sie Ihren Geheim-Code ein:
two_factor_then_enter_passcode=Geben Sie die PIN ein:
two_factor_verify=Bestätigen
two_factor_invalid_passcode=Die eingegebene PIN ist ungültig. Bitte versuchen Sie es erneut!
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
two_factor_reused_passcode=Der von dir eingegebene Passcode wurde bereits verwendet, bitte probiere einen anderen!
two_factor_enable_error=Einschalten der Zwei-Faktor-Authentifizierung ist fehlgeschlagen: %v
two_factor_enable_success=Die Zwei-Faktor-Authentifizierung wurde für Ihr Konto erfolgreich aktiviert!
two_factor_recovery_codes_title=Zwei-Faktor-Authentifizierung-Wiederherstellungscodes
@@ -421,6 +421,8 @@ mirror_last_synced=Zuletzt synchronisiert
watchers=Beobachter
stargazers=In Favoriten von
forks=Forks
repo_description_helper=Beschreibung des Repository. Maximal 512 Zeichen.
repo_description_length=Verfügbare Zeichen
form.reach_limit_of_creation=Der Besitzer hat die maximale Anzahl von %d erstellbaren Repositories erreicht.
form.name_reserved=Repository-Name '%s' ist reserviert.
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Seit dem Start der Bearbeitung hat sich die Da
editor.file_already_exists=Eine Datei mit dem Namen '%s' existiert bereits in diesem Repository.
editor.no_changes_to_show=Keine Änderungen vorhanden.
editor.fail_to_update_file=Fehler beim Ändern/Erstellen der Datei '%s'. Fehler: %v
editor.fail_to_delete_file=Fehler beim Löschen der Datei '%s'. Fehler: %v
editor.add_subdir=Unterverzeichnis erstellen...
editor.unable_to_upload_files=Fehler beim Hochladen der Dateien zu '%s'. Fehler: %v
editor.upload_files_to_dir=Dateien hochladen nach '%s'
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Dieser Pull-Request kann nicht automatisch zusammen
pulls.cannot_auto_merge_helper=Bitte manuell zusammenführen, um die Konflikte zu lösen.
pulls.create_merge_commit=Erstelle einen Merge-Commit
pulls.rebase_before_merging=Rebase vor dem Zusammenführen
pulls.commit_description=Commit Beschreibung
pulls.merge_pull_request=Pull-Request zusammenführen
pulls.open_unmerged_pull_exists=`Sie können diesen Pull-Request nicht wieder öffnen, da bereits ein offener Pull-Request (#%d) aus dem selben Repository mit den gleichen Merge-Informationen existiert und auf das Zusammenführen wartet.`
pulls.delete_branch=Zweig löschen
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Namenskonvention des externen Issue-Trackers:
settings.tracker_issue_style.numeric=Numerisch
settings.tracker_issue_style.alphanumeric=Alphanumerisch
settings.tracker_url_format_desc=Sie können die Platzhalter <code>{user} {repo} {index}</code> für den Benutzernamen, den Namen des Repositories und die Issue-Nummer verwenden.
settings.pulls_desc=Pull-Requests aktivieren, um öffentliche Mitwirkung zu ermöglichen
settings.pulls_desc=Erlaube Pull-Requests zur Zusammenarbeit von Repositories und Branches
settings.pulls.ignore_whitespace=Ignoriere whitespace Änderungen
settings.pulls.allow_rebase_merge=Die Verwendung von Rebase erlauben, um Commits zu mergen
settings.danger_zone=Gefahrenzone
@@ -765,7 +769,7 @@ settings.wiki_deletion_success=Repository Wiki Daten erfolgreich gelöscht.
settings.delete=Dieses Repository löschen
settings.delete_desc=Wenn dieses Repository gelöscht wurde, gibt es keinen Weg zurück. Bitte seien Sie vorsichtig.
settings.delete_notices_1=- Diese Operation kann <strong>NICHT</strong> rückgängig gemacht werden.
settings.delete_notices_2=- This operation will permanently delete everything in this repository, including Git data, issues, comments and collaborator access.
settings.delete_notices_2=- Die Operation wird alles, was mit diesem Git-Repository verbunden ist, dauerhaft löschen, inklusive der Daten, Issues, Kommentare und Zugriffsrechte von Mitarbeitern.
settings.delete_notices_fork_1=- Nach dem Löschen werden alle Forks unabhängig.
settings.deletion_success=Repository wurde erfolgreich gelöscht!
settings.update_settings_success=Repository-Optionen aktualisiert.
@@ -856,6 +860,8 @@ settings.add_key_success=Der Deploy-Schlüssel '%s' wurde erfolgreich hinzugefü
settings.deploy_key_deletion=Deploy-Schlüssel löschen
settings.deploy_key_deletion_desc=Nach dem Löschen dieses Deploy-Schlüssels werden entsprechende Zugriffe auf dieses Repository nicht mehr möglich sein. Möchten Sie wirklich fortfahren?
settings.deploy_key_deletion_success=Deploy-Schlüssel wurde erfolgreich gelöscht!
settings.description_desc=Beschreibung des Repository. Maximal 512 Zeichen.
settings.description_length=Verfügbare Zeichen
diff.browse_source=Quellcode durchsuchen
diff.parent=Ursprung
@@ -1091,11 +1097,12 @@ repos.stars=Favoriten
repos.issues=Issues
repos.size=Größe
auths.auth_sources=Authentication Sources
auths.auth_sources=Authentifizierungsquelle
auths.new=Neue Quelle hinzufügen
auths.name=Name
auths.type=Typ
auths.enabled=Aktiviert
auths.default=Standard
auths.updated=Aktualisiert
auths.auth_type=Authentifizierungstyp
auths.auth_name=Authentifizierungsname
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAM Dienstname
auths.enable_auto_register=Automatische Registrierung aktivieren
auths.edit=Authentifizierungseinstellungen bearbeiten
auths.activated=Diese Authentifizierung ist aktiv
auths.default_auth=Diese Authentifizierungsmethode ist die Vorgabe
auths.new_success=Neue Authentifizierung '%s' wurde erfolgreich hinzugefügt.
auths.update_success=Die Authentifizierungseinstellungen wurden erfolgreich aktualisiert.
auths.update=Authentifizierungseinstellungen aktualisieren
@@ -1166,7 +1174,7 @@ config.ssh_domain=Domain
config.ssh_port=Port
config.ssh_listen_port=Listen Port
config.ssh_root_path=Verzeichnis
config.ssh_rewrite_authorized_keys_at_start=Rewrite authorized_keys At Start
config.ssh_rewrite_authorized_keys_at_start=Beim Start authorized_keys umschreiben
config.ssh_key_test_path=Schlüssel-Test-Pfad
config.ssh_keygen_path=Keygen ('ssh-keygen') Pfad
config.ssh_minimum_key_size_check=Prüfung der Mindestschlüssellänge
@@ -1298,13 +1306,13 @@ comment_issue=`hat Issue <a href="%s/issues/%s">%s#%[2]s</a> kommentiert`
create_pull_request=`hat Pull-Request <a href="%s/pulls/%s">%s#%[2]s</a> erstellt`
close_pull_request=`hat Pull-Request <a href="%s/pulls/%s">%s#%[2]s</a> geschlossen`
reopen_pull_request=`hat den Pull-Request <a href="%s/pulls/%s">%s#%[2]s</a> wieder geöffnet`
merge_pull_request=`hat Pull-Request <a href="%s/pulls/%s">%s#%[2]s</a> zuammengeführt`
merge_pull_request=`hat Pull-Request <a href="%s/pulls/%s">%s#%[2]s</a> zusammengeführt`
create_branch=hat neuen Branch <a href="%[1]s/src/%[2]s">%[3]s</a> in <a href="%[1]s">%[4]s</a> angelegt
delete_branch=hat Branch <code>%[2]s</code> in <a href="%[1]s">%[3]s</a> gelöscht
push_tag=hat Tag <a href="%s/src/%s">%[2]s</a> auf <a href="%[1]s">%[3]s</a> gepusht
delete_tag=hat Tag <code>%[2]s</code> in <a href="%[1]s">%[3]s</a> gelöscht
fork_repo=hat das Repository nach <a href="%s">%s</a> geforkt
mirror_sync_push=synced commits to <a href="%[1]s/src/%[2]s">%[3]s</a> at <a href="%[1]s">%[4]s</a> from mirror
mirror_sync_push=hat auf <a href="%[1]s/src/%[2]s">%[3]s</a> in <a href="%[1]s">%[4]s</a> gepusht
mirror_sync_create=synced new reference <a href="%s/src/%s">%[2]s</a> to <a href="%[1]s">%[3]s</a> from mirror
mirror_sync_delete=synced and deleted reference <code>%[2]s</code> at <a href="%[1]s">%[3]s</a> from mirror

View File

@@ -421,6 +421,8 @@ mirror_last_synced=Last Synced
watchers=Watchers
stargazers=Stargazers
forks=Forks
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
form.reach_limit_of_creation=The owner has reached maximum creation limit of %d repositories.
form.name_reserved=Repository name '%s' is reserved.
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=File content has been changed since you starte
editor.file_already_exists=A file with name '%s' already exists in this repository.
editor.no_changes_to_show=There are no changes to show.
editor.fail_to_update_file=Failed to update/create file '%s' with error: %v
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
editor.add_subdir=Add subdirectory...
editor.unable_to_upload_files=Failed to upload files to '%s' with error: %v
editor.upload_files_to_dir=Upload files to '%s'
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=This pull request can't be merged automatically bec
pulls.cannot_auto_merge_helper=Please merge manually in order to resolve the conflicts.
pulls.create_merge_commit=Create a merge commit
pulls.rebase_before_merging=Rebase before merging
pulls.commit_description=Commit Description
pulls.merge_pull_request=Merge Pull Request
pulls.open_unmerged_pull_exists=`You can't perform reopen operation because there is already an open pull request (#%d) from same repository with same merge information and is waiting for merging.`
pulls.delete_branch=Delete Branch
@@ -742,7 +746,7 @@ settings.tracker_issue_style=External Issue Tracker Naming Style:
settings.tracker_issue_style.numeric=Numeric
settings.tracker_issue_style.alphanumeric=Alphanumeric
settings.tracker_url_format_desc=You can use placeholder <code>{user} {repo} {index}</code> for user name, repository name and issue index.
settings.pulls_desc=Enable pull requests to accept public contributions
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
settings.pulls.ignore_whitespace=Ignore changes in whitespace
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
settings.danger_zone=Danger Zone
@@ -856,6 +860,8 @@ settings.add_key_success=New deploy key '%s' has been added successfully!
settings.deploy_key_deletion=Delete Deploy Key
settings.deploy_key_deletion_desc=Deleting this deploy key will remove all related accesses for this repository. Do you want to continue?
settings.deploy_key_deletion_success=Deploy key has been deleted successfully!
settings.description_desc=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
diff.browse_source=Browse Source
diff.parent=parent
@@ -1096,6 +1102,7 @@ auths.new=Add New Source
auths.name=Name
auths.type=Type
auths.enabled=Enabled
auths.default=Default
auths.updated=Updated
auths.auth_type=Authentication Type
auths.auth_name=Authentication Name
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAM Service Name
auths.enable_auto_register=Enable Auto Registration
auths.edit=Edit Authentication Setting
auths.activated=This authentication is activated
auths.default_auth=This authentication is default login source
auths.new_success=New authentication '%s' has been added successfully.
auths.update_success=Authentication setting has been updated successfully.
auths.update=Update Authentication Setting

View File

@@ -421,6 +421,8 @@ mirror_last_synced = Last Synced
watchers = Watchers
stargazers = Stargazers
forks = Forks
repo_description_helper = Description of repository. Maximum 512 characters length.
repo_description_length = Available characters
form.reach_limit_of_creation = The owner has reached maximum creation limit of %d repositories.
form.name_reserved = Repository name '%s' is reserved.
@@ -518,6 +520,7 @@ editor.file_changed_while_editing = File content has been changed since you star
editor.file_already_exists = A file with name '%s' already exists in this repository.
editor.no_changes_to_show = There are no changes to show.
editor.fail_to_update_file = Failed to update/create file '%s' with error: %v
editor.fail_to_delete_file = Failed to delete file '%s' with error: %v
editor.add_subdir = Add subdirectory...
editor.unable_to_upload_files = Failed to upload files to '%s' with error: %v
editor.upload_files_to_dir = Upload files to '%s'
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc = This pull request can't be merged automatically b
pulls.cannot_auto_merge_helper = Please merge manually in order to resolve the conflicts.
pulls.create_merge_commit = Create a merge commit
pulls.rebase_before_merging = Rebase before merging
pulls.commit_description = Commit Description
pulls.merge_pull_request = Merge Pull Request
pulls.open_unmerged_pull_exists = `You can't perform reopen operation because there is already an open pull request (#%d) from same repository with same merge information and is waiting for merging.`
pulls.delete_branch = Delete Branch
@@ -742,7 +746,7 @@ settings.tracker_issue_style = External Issue Tracker Naming Style:
settings.tracker_issue_style.numeric = Numeric
settings.tracker_issue_style.alphanumeric = Alphanumeric
settings.tracker_url_format_desc = You can use placeholder <code>{user} {repo} {index}</code> for user name, repository name and issue index.
settings.pulls_desc = Enable pull requests to accept public contributions
settings.pulls_desc = Enable pull requests to accept contributions between repositories and branches
settings.pulls.ignore_whitespace = Ignore changes in whitespace
settings.pulls.allow_rebase_merge = Allow use rebase to merge commits
settings.danger_zone = Danger Zone
@@ -856,6 +860,8 @@ settings.add_key_success = New deploy key '%s' has been added successfully!
settings.deploy_key_deletion = Delete Deploy Key
settings.deploy_key_deletion_desc = Deleting this deploy key will remove all related accesses for this repository. Do you want to continue?
settings.deploy_key_deletion_success = Deploy key has been deleted successfully!
settings.description_desc = Description of repository. Maximum 512 characters length.
settings.description_length = Available characters
diff.browse_source = Browse Source
diff.parent = parent
@@ -1096,6 +1102,7 @@ auths.new = Add New Source
auths.name = Name
auths.type = Type
auths.enabled = Enabled
auths.default = Default
auths.updated = Updated
auths.auth_type = Authentication Type
auths.auth_name = Authentication Name
@@ -1134,6 +1141,7 @@ auths.pam_service_name = PAM Service Name
auths.enable_auto_register = Enable Auto Registration
auths.edit = Edit Authentication Setting
auths.activated = This authentication is activated
auths.default_auth = This authentication is default login source
auths.new_success = New authentication '%s' has been added successfully.
auths.update_success = Authentication setting has been updated successfully.
auths.update = Update Authentication Setting
@@ -1143,6 +1151,7 @@ auths.delete_auth_desc = This authentication is going to be deleted, do you want
auths.still_in_used = This authentication is still used by some users, please delete or convert these users to another login type first.
auths.deletion_success = Authentication has been deleted successfully!
auths.login_source_exist = Login source '%s' already exists.
auths.github_api_endpoint = API Endpoint
config.not_set = (not set)
config.server_config = Server Configuration

View File

@@ -345,22 +345,22 @@ two_factor_enable=Activar
two_factor_disable=Desactivar
two_factor_view_recovery_codes=Guarda <a href="%s%s"> tus códigos de recuperación</a> en un lugar seguro. Podrás usarlos como código de acceso si pierdes el acceso a tu aplicación de autenticación.
two_factor_http=Para las operaciones sobre HTTP/HTTPS, no puedes usar un usuario y contraseña. Por favor, cree y utilice <a href="%[1]s%[2]s"> un token de acceso personal</a> como su credencial de acceso, por ejemplo, <code>%[3]s</code>.
two_factor_enable_title=Habilitar autenticaciñon en dos pasos
two_factor_enable_title=Habilitar autenticación en dos pasos
two_factor_scan_qr=Por favor, use su aplicación de autenticación para escanear la imagen:
two_factor_or_enter_secret=Or enter the secret:
two_factor_or_enter_secret=O introduzca el secreto:
two_factor_then_enter_passcode=Introduce el Pin:
two_factor_verify=Verificar
two_factor_invalid_passcode=¡El Pin que has introducido no es válido, por favor, inténtalo de nuevo!
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
two_factor_enable_error=Enable Two-factor authentication failed: %v
two_factor_enable_success=Two-factor authentication has enabled for your account successfully!
two_factor_recovery_codes_title=Two-factor Authentication Recovery Codes
two_factor_recovery_codes_desc=Recovery codes are used when you temporarily lose access to your authentication application. Each recovery code can only be used once, <b>please keep these codes in a safe place</b>.
two_factor_regenerate_recovery_codes=Regenerate Recovery Codes
two_factor_regenerate_recovery_codes_error=Regenerate recovery codes failed: %v
two_factor_regenerate_recovery_codes_success=New recovery codes has been generated successfully!
two_factor_reused_passcode=¡El pin de autenticación que has introducido ya ha sido usado, por favor intenta con otro!
two_factor_enable_error=Ha fallado la activación de la autenticación en dos pasos: %v
two_factor_enable_success=¡La autenticación en dos pasos se ha activado en tu cuenta correctamente!
two_factor_recovery_codes_title=Códigos de recuperación para la autenticación en dos pasos
two_factor_recovery_codes_desc=Los códigos de recuperación se usan cuando pierdes temporalmente el acceso a tu aplicación de autenticación. Cada código de recuperación solo puede utilizarse en una ocasión, <b>por favor, mantén estos códigos en lugar seguro</b>.
two_factor_regenerate_recovery_codes=Regenerar códigos de recuperación
two_factor_regenerate_recovery_codes_error=Ha fallado la regeneración de códigos de recuperación: %v
two_factor_regenerate_recovery_codes_success=¡Nuevos códigos de recuperación han sido generados con éxito!
two_factor_disable_title=Deshabilitar autenticación en dos pasos
two_factor_disable_desc=Your account security level will decrease after disabled two-factor authentication. Do you want to continue?
two_factor_disable_desc=El nivel de seguridad de tu cuenta se verá reducido después de desactivar la autenticación en dos pasos. ¿Deseas continuar?
two_factor_disable_success=¡La autenticación en dos pasos ha sido deshabilitada satisfactoriamente!
manage_access_token=Gestionar los Tokens de Acceso personales
@@ -421,6 +421,8 @@ mirror_last_synced=Última sincronización
watchers=Seguidores
stargazers=Fans
forks=Forks
repo_description_helper=Descripción del repositorio. Longitud máxima de 512 caracteres.
repo_description_length=Caracteres disponibles
form.reach_limit_of_creation=El propietario ha alcanzado el límite máximo de %d repositorios creados.
form.name_reserved=El nombre del repositorio '%s' está reservado.
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=El contenido del archivo ha sido modificado de
editor.file_already_exists=Ya existe un archivo con nombre '%s' en este repositorio.
editor.no_changes_to_show=No existen cambios para mostrar.
editor.fail_to_update_file=Error al actualizar/crear el archivo '%s', error: %v
editor.fail_to_delete_file=Error al borrar el fichero '%s', error: %v
editor.add_subdir=Añadir subdirectorio...
editor.unable_to_upload_files=Error al subir archivos a '%s', error: %v
editor.upload_files_to_dir=Subir archivos a '%s'
@@ -620,7 +623,7 @@ pulls.compare_compare=comparar con
pulls.filter_branch=Filtrar rama
pulls.no_results=Sin resultados.
pulls.nothing_to_compare=Nada que comparar. Las dos ramas coinciden.
pulls.nothing_merge_base=There is nothing to compare because two branches have completely different history.
pulls.nothing_merge_base=No hay nada que comparar porque las dos ramas tienen una historia completamente distinta.
pulls.has_pull_request=`Ya existe un pull request entre estas dos ramas: <a href="%[1]s/pulls/%[3]d">%[2]s#%[3]d</a>`
pulls.create=Crear Pull Request
pulls.title_desc=desea fusionar %[1]d commits de <code>%[2]s</code> en <code>%[3]s</code>
@@ -636,8 +639,9 @@ pulls.is_checking=Se está procediendo a la búsqueda de conflictos, por favor a
pulls.can_auto_merge_desc=Este Pull Request puede ser fusionado automáticamente.
pulls.cannot_auto_merge_desc=Este Pull Request no puede ser fusionado automáticamente porque hay conflictos.
pulls.cannot_auto_merge_helper=Por favor, fusiona manualmente para resolver los conflictos.
pulls.create_merge_commit=Create a merge commit
pulls.rebase_before_merging=Rebase before merging
pulls.create_merge_commit=Crear un commit del fusionado
pulls.rebase_before_merging=Hacer rebase antes de fusionar
pulls.commit_description=Descripción del commit
pulls.merge_pull_request=Fusionar Pull Request
pulls.open_unmerged_pull_exists=`Usted no puede realizar la operación de reapertura porque en estos momentos existe una solicitud de pull request (#%d) para el mismo repositorio con la misma información que se encuentra a la espera de aprobación`
pulls.delete_branch=Eliminar la rama
@@ -697,7 +701,7 @@ settings.branches_bare=No puedes gestionar ramas en un repositorio vacío. Por f
settings.default_branch=Rama predeterminada
settings.default_branch_desc=Se considera la rama «base» como la rama por defecto para commits de código, las solicitudes pull y edición en línea.
settings.update=Actualizar
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
settings.update_default_branch_unsupported=El cambio de rama por defecto no esta soportado por la versión de Git en el servidor.
settings.update_default_branch_success=¡La Rama por defecto de este repositorio ha sido actualizado con éxito!
settings.protected_branches=Ramas protegidas
settings.protected_branches_desc=Proteger ramas force pushing, de eliminación accidental y lista blanca de committers de código.
@@ -714,7 +718,7 @@ settings.protect_whitelist_users=Usuarios que pueden hacer push a esta rama
settings.protect_whitelist_search_users=Buscar usuarios
settings.protect_whitelist_teams=Equipos cuyos miembros pueden hacer push a esta rama
settings.protect_whitelist_search_teams=Buscar equipos
settings.update_protect_branch_success=Protect options for this branch has been updated successfully!
settings.update_protect_branch_success=¡Las opciones de protección para esta rama se han actualizado con éxito!
settings.hooks=Webhooks
settings.githooks=Git Hooks
settings.basic_settings=Configuración Básica
@@ -727,7 +731,7 @@ settings.change_reponame_prompt=Este cambio afectará a los enlaces al repositor
settings.advanced_settings=Ajustes avanzados
settings.wiki_desc=Activar sistema de wiki
settings.use_internal_wiki=Usar wiki integrada
settings.allow_public_wiki_desc=Allow public access to wiki when repository is private
settings.allow_public_wiki_desc=Permitir acceso público a la wiki cuando el repositorio es privado
settings.use_external_wiki=Usar Wiki externa
settings.external_wiki_url=URL externa de la Wiki
settings.external_wiki_url_desc=Los visitantes serán redireccionados a la URL cuando hagan click en la barra.
@@ -742,11 +746,11 @@ settings.tracker_issue_style=Estilo de etiquetado del tracker externo de inciden
settings.tracker_issue_style.numeric=Numérico
settings.tracker_issue_style.alphanumeric=Alfanumérico
settings.tracker_url_format_desc=Puedes usar las plantillas <code>{user} {repo} {index}</code> para el nombre de usuario, nombre del repositorio e índice de la incidencia.
settings.pulls_desc=Habilitar Pull Requests para aceptar contribuciones públicas
settings.pulls.ignore_whitespace=Ignore changes in whitespace
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
settings.pulls_desc=Permitir pull requests para aceptar contribuciones entre repositorios y ramas
settings.pulls.ignore_whitespace=Ignorar los cambios en el espacio en blanco
settings.pulls.allow_rebase_merge=Permite usar rebase para fusionar los commits
settings.danger_zone=Zona de Peligro
settings.cannot_fork_to_same_owner=You cannot fork a repository to its original owner.
settings.cannot_fork_to_same_owner=No puedes hacer fork del repositorio a su propietario original.
settings.new_owner_has_same_repo=El nuevo propietario tiene un repositorio con el mismo nombre.
settings.convert=Convertir en un repositorio normal
settings.convert_desc=Puedes convertir este repositorio en un repositorio normal. Este cambio no se puede deshacer.
@@ -765,7 +769,7 @@ settings.wiki_deletion_success=Los datos de la wiki del repositorio han sido bor
settings.delete=Eliminar este repositorio
settings.delete_desc=Una vez has eliminado un repositorio, no hay vuelta atrás. Por favor, asegúrate de que es lo que quieres.
settings.delete_notices_1=- Esta operación <strong>NO PUEDE</strong> revertirse.
settings.delete_notices_2=- This operation will permanently delete everything in this repository, including Git data, issues, comments and collaborator access.
settings.delete_notices_2=- Esta operación eliminará de manera permanente todo el contenido de este repositorio, incluyendo los datos de Git, las incidencias, los comentarios y los permisos de acceso de los colaboradores.
settings.delete_notices_fork_1=- Todos los forks se convertirán en independientes tras el borrado.
settings.deletion_success=¡El respositorio ha sido eliminado satisfactoriamente!
settings.update_settings_success=Las opciones del repositorio se han actualizado correctamente.
@@ -790,7 +794,7 @@ settings.webhook.test_delivery=Test de entrega
settings.webhook.test_delivery_desc=Enviar un falso evento Push de entrega para probar tus ajustes de webhook
settings.webhook.test_delivery_success=Probar que los webhook han sido añadidos a la cola de entrega. Esto puede tomar algunos segundos antes de aparecer en el historial de entregas.
settings.webhook.redelivery=Reenviar
settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history.
settings.webhook.redelivery_success=La tarea del Hook '%s' ha sido reañadida en la cola de entrega. Puede tardar unos segundos en actualizarse el historial de estado de la cola.
settings.webhook.request=Petición
settings.webhook.response=Respuesta
settings.webhook.headers=Encabezado
@@ -805,7 +809,7 @@ settings.add_webhook_desc=Enviaremos una petición <code>POST</code> a la siguie
settings.payload_url=URL de Payload
settings.content_type=Tipo de contenido
settings.secret=Secreto
settings.secret_desc=Secret will be sent as SHA256 HMAC hex digest of payload via <code>X-Gogs-Signature</code> header.
settings.secret_desc=El secreto será enviado como un payload SHA256 HMAC hex digest vía cabecera <code>X-Gogs-Signature</code>.
settings.slack_username=Nombre de usuario
settings.slack_icon_url=URL de icono
settings.slack_color=Color
@@ -839,7 +843,7 @@ settings.recent_deliveries=Envíos Recientes
settings.hook_type=Tipo de Hook
settings.add_slack_hook_desc=Añade integración con <a href="%s">Slack</a> a tu repositorio.
settings.add_discord_hook_desc=Añade integración con <a href="%s">Slack</a> a tu repositorio.
settings.add_dingtalk_hook_desc=Add <a href="%s">Dingtalk</a> integration to your repository.
settings.add_dingtalk_hook_desc=Añade integración con <a href="%s">Dingtalk</a> a tu repositorio.
settings.slack_token=Token
settings.slack_domain=Dominio
settings.slack_channel=Canal
@@ -856,6 +860,8 @@ settings.add_key_success=¡La nueva clave de desplieque '%s' ha sido creada con
settings.deploy_key_deletion=Eliminar Clave de Despliegue
settings.deploy_key_deletion_desc=Al eliminar esta clave de despliegue se perderán el permiso de acceso a este repositorio con dicha clave. ¿Deseas continuar?
settings.deploy_key_deletion_success=¡Clave de despliegue eliminada con éxito!
settings.description_desc=Descripción del repositorio. Longitud máxima de 512 caracteres.
settings.description_length=Caracteres disponibles
diff.browse_source=Explorar el Código
diff.parent=padre
@@ -1013,8 +1019,8 @@ dashboard.git_gc_repos=Ejecutar la recolección de basura en los repositorios
dashboard.git_gc_repos_success=Todos los repositorios han ejecutado correctamente el recolector de basuras.
dashboard.resync_all_sshkeys=Reescribir el fichero '.ssh/authorized_keys'(atención: se perderán las claves que no pertenezcan a Gogs)
dashboard.resync_all_sshkeys_success=Todas las claves públicas se han reescrito correctamente.
dashboard.resync_all_hooks=Resync pre-receive, update and post-receive hooks of all repositories
dashboard.resync_all_hooks_success=All repositories' pre-receive, update and post-receive hooks have been resynced successfully.
dashboard.resync_all_hooks=Resincroniza los "hooks" de pre-recepción, actualización y post-recepción en todos los repositorios
dashboard.resync_all_hooks_success=Se han vuelto a sincronizar todos los "hooks" de pre-recepción, actualización y post-recepción de los repositorios con éxito.
dashboard.reinit_missing_repos=Reinicializar todos los registros del repositorio que tienen archivos Git eliminados
dashboard.reinit_missing_repos_success=Todos los registros del repositorio con archivos Git eliminados han sido reinicializados con éxito.
@@ -1091,11 +1097,12 @@ repos.stars=Estrellas
repos.issues=Incidencias
repos.size=Tamaño
auths.auth_sources=Authentication Sources
auths.auth_sources=Fuentes de autentificación
auths.new=Añadir nuevo origen
auths.name=Nombre
auths.type=Tipo
auths.enabled=Activo
auths.default=Por defecto
auths.updated=Actualizado
auths.auth_type=Tipo de autenticación
auths.auth_name=Nombre de autenticación
@@ -1104,7 +1111,7 @@ auths.domain=Dominio
auths.host=Host
auths.port=Puerto
auths.bind_dn=Bind DN
auths.bind_dn_helper=You can use '%s' as placeholder for username, e.g. DOM\%s
auths.bind_dn_helper=Puedes usar '%s' como marcador de posición para el nombre de usuario, ej. DOM\%s
auths.bind_password=Contraseña Bind
auths.bind_password_helper=Advertencia: La contraseña se almacena como texto plano. No utilice una cuenta con privilegios elevados.
auths.user_base=Base de búsqueda de usuarios
@@ -1115,10 +1122,10 @@ auths.attribute_name=Atributo nombre
auths.attribute_surname=Atributo apellido
auths.attribute_mail=Atributo correo electrónico
auths.verify_group_membership=Verificar pertenencia a grupo
auths.group_search_base_dn=Group Search Base DN
auths.group_search_base_dn=Base DN para la búsqueda de grupos
auths.group_filter=Filtro de grupo
auths.group_attribute_contain_user_list=Group Attribute Containing List of Users
auths.user_attribute_listed_in_group=User Attribute Listed in Group
auths.group_attribute_contain_user_list=Atributo de grupo que contiene la lista de usuarios
auths.user_attribute_listed_in_group=Atributo de usuario listado en grupo
auths.attributes_in_bind=Buscar atributos en el contexto del Bind DN
auths.filter=Filtro de usuario
auths.admin_filter=Filtro de aministrador
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Nombre del Servicio PAM
auths.enable_auto_register=Hablilitar Auto-Registro
auths.edit=Editar la Configuración de Autenticación
auths.activated=Esta autenticación ha sido activada
auths.default_auth=Esta autenticación es la fuente de inicio de sesión predeterminada
auths.new_success=¡La autenticación '%s' ha sido añadida con éxito!
auths.update_success=La configuración de autenticación ha sido actualizada con éxito.
auths.update=Actualizar la configuración de autenticación
@@ -1144,7 +1152,7 @@ auths.still_in_used=Este método de autentificación aún es utilizado por algun
auths.deletion_success=¡La autenticación ha sido eliminada con éxito!
auths.login_source_exist=El origen de autenticación '%s' ya existe.
config.not_set=(not set)
config.not_set=(sin definir)
config.server_config=Configuración del servidor
config.app_name=Nombre de la Aplicación
config.app_ver=Versión de la Aplicación
@@ -1166,7 +1174,7 @@ config.ssh_domain=Dominio
config.ssh_port=Puerto
config.ssh_listen_port=Puerto de escucha
config.ssh_root_path=Ruta raíz
config.ssh_rewrite_authorized_keys_at_start=Rewrite authorized_keys At Start
config.ssh_rewrite_authorized_keys_at_start=Reescribir authorized_keys en el arranque
config.ssh_key_test_path=Ruta de la clave de prueba
config.ssh_keygen_path=Ruta del generador de claves ('ssh-keygen')
config.ssh_minimum_key_size_check=Tamaño mínimo de la clave de verificación
@@ -1180,9 +1188,9 @@ config.max_creation_limit=Limite máximo de creación
config.preferred_licenses=Licencias Preferidas
config.disable_http_git=Desactivar HTTP Git
config.enable_local_path_migration=Activar la migración de la ruta de acceso Local
config.commits_fetch_concurrency=Commits Fetch Concurrency
config.commits_fetch_concurrency=Concurrencia de la búsqueda de commits
config.http_config=HTTP Configuration
config.http_config=Configuración HTTP
config.http_access_control_allow_origin=Access Control Allow Origin
config.db_config=Configuración de la Base de Datos
@@ -1214,7 +1222,7 @@ config.skip_tls_verify=Omitir la Verificación TLS
config.mailer_config=Configuración del servidor de correo
config.mailer_enabled=Activado
config.mailer_disable_helo=Desactivar HELO
config.mailer_subject_prefix=Subject Prefix
config.mailer_subject_prefix=Prefijo del asunto
config.mailer_host=Host
config.mailer_user=Usuario
config.send_test_mail=Enviar email de prueba
@@ -1298,15 +1306,15 @@ comment_issue=`comentó en la incidencia <a href="%s/issues/%s">%s#%[2]s</a>`
create_pull_request=`creado pull request <a href="%s/pulls/%s">%s#%[2]s</a>`
close_pull_request=`cerró el pull request <a href="%s/pulls/%s">%s#%[2]s</a>`
reopen_pull_request=`reabrió el pull request <a href="%s/pulls/%s">%s#%[2]s</a>`
merge_pull_request=`fusionado pull request <a href="%s/pulls/%s">%s#%[2]s</a>`
merge_pull_request=`fusionó el pull request <a href="%s/pulls/%s">%s#%[2]s</a>`
create_branch=nueva rama <a href="%[1]s/src/%[2]s">%[3]s</a> creada en <a href="%[1]s">%[4]s</a>
delete_branch=borrada rama <code>%[2]s</code> at <a href="%[1]s">%[3]s</a>
push_tag=hizo push del tag <a href="%s/src/%s">%[2]s</a> a <a href="%[1]s">%[3]s</a>
delete_tag=borrada etiqueta <code>%[2]s</code> en <a href="%[1]s">%[3]s</a>
fork_repo=ha hecho un Fork en <a href="%s">%s</a>
mirror_sync_push=synced commits to <a href="%[1]s/src/%[2]s">%[3]s</a> at <a href="%[1]s">%[4]s</a> from mirror
mirror_sync_create=synced new reference <a href="%s/src/%s">%[2]s</a> to <a href="%[1]s">%[3]s</a> from mirror
mirror_sync_delete=synced and deleted reference <code>%[2]s</code> at <a href="%[1]s">%[3]s</a> from mirror
mirror_sync_push=sincronizados commits a <a href="%[1]s/src/%[2]s">%[3]s</a> en <a href="%[1]s">%[4]s</a> desde la réplica
mirror_sync_create=sincronizada nueva referencia <a href="%s/src/%s">%[2]s</a> a <a href="%[1]s">%[3]s</a> desde la réplica
mirror_sync_delete=sincronizada y eliminada referencia <code>%[2]s</code> en <a href="%[1]s">%[3]s</a> desde la réplica
[tool]
ago=hace

View File

@@ -151,8 +151,8 @@ register_hepler_msg=قبلا ثبت نام کردید؟ از اینجا وارد
social_register_hepler_msg=تا به حال حسابی داشته اید؟ به ما بپیوندید!
disable_register_prompt=با عرض پوزش، ثبت نام غیرفعال شده است. لطفا با مدیر سایت تماس بگیرید.
disable_register_mail=با عرض پوزش، تایید ایمیل ثبت نام غیر فعال شده است.
auth_source=Authentication Source
local=Local
auth_source=محل احراز هویت
local=محلی
remember_me=مرا به خاطر بسپار
forgot_password=فراموشی رمز عبور
forget_password=رمز عبور خود را فراموش کرده‌اید؟
@@ -231,7 +231,7 @@ org_name_been_taken=نام سازمان قبلا استفاده شده است.
team_name_been_taken=نام تیم گرفته شده است.
email_been_used=آدرس ایمیل قبلا استفاده شده است.
username_password_incorrect=نام کاربری یا رمز عبور صحیح نیست.
auth_source_mismatch=The authentication source selected is not associated with the user.
auth_source_mismatch=محل احراز هویت انتخاب شده با کاربر در ارتباط نمی‌باشد.
enterred_invalid_repo_name=لطفا مطمئن شوید که نام مخزن وارد شده صحیح است.
enterred_invalid_owner_name=لطفا مطمئن شوید که نام مالک وارد شده صحیح است.
enterred_invalid_password=لطفا مطمئن شوید که رمز عبور وارد شده صحیح است.
@@ -353,7 +353,7 @@ two_factor_or_enter_secret=و یا رمز را پارد کنید:
two_factor_then_enter_passcode=سپس رمز عبور را وارد کنید:
two_factor_verify=تایید‌کنید
two_factor_invalid_passcode=رمز عبور وارد شده معتبر نیست, لطفا دوباره سعی کنید!
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
two_factor_reused_passcode=رمز وارد شده قبلا استفاده شده، لطفا یک عبارت دیگر را امتحان کنید!
two_factor_enable_error=فعال کردن احراز هویت دوگانه ناموفق بود: %v
two_factor_enable_success=احراز هویت دوگانه با موفقیت برای حساب شما فعال شد!
two_factor_recovery_codes_title=کدهای بازیابی احراز هویت دوگانه
@@ -423,6 +423,8 @@ mirror_last_synced=آخرین همگام سازی
watchers=دنبال‌کنندگان
stargazers=ستاره شناسان
forks=انشعاب ها
repo_description_helper=توضیحات مخرن. حداکثر طول ۵۱۲ کاراکتر.
repo_description_length=کاراکترهای موجود
form.reach_limit_of_creation=مخزن های دارنده حساب به حداکثر تعداد مجاز %d رسیده است.
form.name_reserved=یک مخزن با نام '%s' از قبل وجود دارد.
@@ -520,6 +522,7 @@ editor.file_changed_while_editing=محتوای فایل از زمانی که ش
editor.file_already_exists=فایلی با نام %s از قبل در مخزن موجود است.
editor.no_changes_to_show=تغییری برای نمایش وجود ندارد.
editor.fail_to_update_file=خطا در ساخت/به روزرسانی فایل %. خطای رخ داده : %v
editor.fail_to_delete_file=خطا در حذف فایل '%s' رخ داده است. خطای رخ داده %v
editor.add_subdir=افزودن زیرپوشه...
editor.unable_to_upload_files=عدم موفقیت در آپلود فایل به '%s' با خطا: %v
editor.upload_files_to_dir=آپلود فایل به '%s'
@@ -640,6 +643,7 @@ pulls.cannot_auto_merge_desc=این pull request به علت تداخل نمی
pulls.cannot_auto_merge_helper=لطفا عملیات ادغام را به صورت دستی انجام دهید تا این تداخل برطرف شود.
pulls.create_merge_commit=ایجاد یک کامیت برای ادغام سازی
pulls.rebase_before_merging=Rebase قبل از ادغام
pulls.commit_description=توضیحات کامیت
pulls.merge_pull_request=ایجاد درخواست ادغام
pulls.open_unmerged_pull_exists=`به علت باز بودن pull request (#%d) از مخزنی مشابه و به همراه اطلاعات ادغام مشابه که در انتظار ادغام می باشد، بازگشایی مجدد مقدور نیست`
pulls.delete_branch=حذف شاخه
@@ -744,7 +748,7 @@ settings.tracker_issue_style=سبک نامگذاری Issue Tracker خارجی:
settings.tracker_issue_style.numeric=عددی
settings.tracker_issue_style.alphanumeric=عددی و الفبایی
settings.tracker_url_format_desc=شما میتوانید از <code>{user} {repo} {index}</code> برای نام کاربری ، نام مخزن و صفحه ی اول بخش مسائل استفاده کنید.
settings.pulls_desc=فعال سازی pull request برای پذیرش همکاری های عمومی
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
settings.pulls.ignore_whitespace=نادیده گرفتن تغییرات در فضاهای خالی
settings.pulls.allow_rebase_merge=مجاز کردن rebase برای ادغام کردن کامیت ها
settings.danger_zone=منطقه خطر
@@ -858,6 +862,8 @@ settings.add_key_success=کلیدDeploy جدید %s با موفقیت افزود
settings.deploy_key_deletion=حذف کلید Deploy
settings.deploy_key_deletion_desc=با حذف کلید Deploy، تمام دسترسی ها به این مخزن از طریق این کلید از بین میرود. آیا ادامه می دهید؟
settings.deploy_key_deletion_success=کلید Deploy با موفقیت حذف شد!
settings.description_desc=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
diff.browse_source=فهرست منبع
diff.parent=والد
@@ -1093,11 +1099,12 @@ repos.stars=ستاره ها
repos.issues=مسائل
repos.size=اندازه
auths.auth_sources=Authentication Sources
auths.auth_sources=منابع احراز هویت
auths.new=اضافه کردن منبع جدید
auths.name=نام
auths.type=نوع
auths.enabled=فعال شده
auths.default=پیش فرض
auths.updated=به روز رسانی شده
auths.auth_type=نوع تأیید اعتبار
auths.auth_name=نام مجوز احراز هویت
@@ -1136,6 +1143,7 @@ auths.pam_service_name=نام سرویس PAM
auths.enable_auto_register=فعال سازی ثبت نام خودکار
auths.edit=ویرایش تنظیمات تأیید اعتبار
auths.activated=متد احراز هویت فعال شده است
auths.default_auth=این احراز هویت پیش فرض منبع ورود می باشد
auths.new_success=متد احرازهویت %s با موفقیت افزوده شد.
auths.update_success=تنظیمات سیستم احرازهویت با موفقیت به روز شد.
auths.update=به روزرسانی تنظیمات سیستم احراز هویت
@@ -1216,7 +1224,7 @@ config.skip_tls_verify=صرف نظر از اعتبار سنجی TLS
config.mailer_config=پیکربندی سیستم ایمیلی
config.mailer_enabled=فعال شده
config.mailer_disable_helo=غیر فعال کردن HELO
config.mailer_subject_prefix=Subject Prefix
config.mailer_subject_prefix=پيشوند موضوع
config.mailer_host=میزبان
config.mailer_user=کاربر
config.send_test_mail=ارسال ایمیل تست

View File

@@ -421,6 +421,8 @@ mirror_last_synced=Synkronoitu viimeksi
watchers=Tarkkailijat
stargazers=Tähtiharrastajat
forks=Haarat
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
form.reach_limit_of_creation=Omistaja on saavuttanut maksimi luontirajan %d repoa.
form.name_reserved=Repon nimi '%s' on varattu.
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Tiedoston sisältöä on muutettu aloittamises
editor.file_already_exists=Tiedosto '%s' on jo olemassa tässä repossa.
editor.no_changes_to_show=Ei muutoksia näytettäväksi.
editor.fail_to_update_file=Tiedoston '%s' päivitys/luonti epäonnistui virheeseen: %v
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
editor.add_subdir=Lisää alikansio...
editor.unable_to_upload_files=Tiedostojen lataus epäonnistui kansioon '%s' virheellä: %v
editor.upload_files_to_dir=Lataa tiedostoja kansioon '%s'
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Tätä pull-pyyntöä ei voi yhdistää automaattis
pulls.cannot_auto_merge_helper=Ole hyvä ja yhdistä manuaalisesti konfliktien ratkaisemiseksi.
pulls.create_merge_commit=Create a merge commit
pulls.rebase_before_merging=Rebase before merging
pulls.commit_description=Commit Description
pulls.merge_pull_request=Yhdistä Pull-pyyntö
pulls.open_unmerged_pull_exists=`Et voi suorittaa uudelleenavaus toimintoa koska on jo olemassa pull-pyyntö (#%d) samasta reposta samoilla yhdistämistiedoilla ja odottaa yhdistämistä.`
pulls.delete_branch=Poista haara
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Ulkoisen virheenseurannan nimeämistyyli:
settings.tracker_issue_style.numeric=Numeerinen
settings.tracker_issue_style.alphanumeric=Aakkosnumeerinen
settings.tracker_url_format_desc=Voit käyttää paikkamerkkiä <code>{user} {repo} {index}</code> käyttäjänimelle, reponimelle ja vikanumerolle.
settings.pulls_desc=Ota käyttöön pull-pyynnöt salliaksesi julkiset koodilahjoitukset
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
settings.pulls.ignore_whitespace=Ignore changes in whitespace
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
settings.danger_zone=Vaaravyöhyke
@@ -768,7 +772,7 @@ settings.delete_notices_1=- Tätä toimintoa <strong>EI VOI</strong> peruuttaa m
settings.delete_notices_2=- This operation will permanently delete everything in this repository, including Git data, issues, comments and collaborator access.
settings.delete_notices_fork_1=- Kaikki haarat muuttuvat itsenäisiksi poiston jälkeen.
settings.deletion_success=Repo on poistettu onnistuneesti!
settings.update_settings_success=Repom asetukset on päivitetty onnistuneesti.
settings.update_settings_success=Repon asetukset on päivitetty onnistuneesti.
settings.transfer_owner=Uusi omistaja
settings.make_transfer=Tee siirto
settings.transfer_succeed=Arkiston omistusoikeus on siirretty onnistuneesti.
@@ -856,6 +860,8 @@ settings.add_key_success=Uusi deploy avain '%s' on lisätty onnistuneesti!
settings.deploy_key_deletion=Poista deploy avain
settings.deploy_key_deletion_desc=Deploy avaimen poistaminen poistaa myös kaikki liitetyt käyttötiedot tästä reposta. Haluatko jatkaa?
settings.deploy_key_deletion_success=Deploy avain on poistettu onnistuneesti!
settings.description_desc=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
diff.browse_source=Selaa lähdekoodia
diff.parent=vanhempi
@@ -1096,6 +1102,7 @@ auths.new=Lisää uusi lähde
auths.name=Nimi
auths.type=Tyyppi
auths.enabled=Käytössä
auths.default=Default
auths.updated=Päivitetty
auths.auth_type=Todennustyyppi
auths.auth_name=Todennusnimi
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAM palvelun nimi
auths.enable_auto_register=Ota käyttöön automaattinen rekisteröinti
auths.edit=Muokkaa todennusasetusta
auths.activated=Tämä todennus on aktivoitu
auths.default_auth=This authentication is default login source
auths.new_success=Uusi todennus '%s' on luotu onnistuneesti.
auths.update_success=Todennusasetus on päivitetty onnistuneesti.
auths.update=Päivitä todennusasetus

View File

@@ -151,8 +151,8 @@ register_hepler_msg=Déjà enregistré ? Connectez-vous !
social_register_hepler_msg=Déjà enregistré ? Associez-le !
disable_register_prompt=Désolé, les enregistrements ont été désactivés. Veuillez contacter l'administrateur du site.
disable_register_mail=Désolé, la confirmation par courriel des enregistrements a été désactivée.
auth_source=Authentication Source
local=Local
auth_source=Sources d'authentification
local=Locale
remember_me=Se souvenir de moi
forgot_password=Mot de passe oublié
forget_password=Mot de passe oublié ?
@@ -231,7 +231,7 @@ org_name_been_taken=Nom d'organisation déjà pris.
team_name_been_taken=Nom d'équipe déjà pris.
email_been_used=Adresse e-mail déjà utilisée.
username_password_incorrect=Nom d'utilisateur ou mot de passe incorrect.
auth_source_mismatch=The authentication source selected is not associated with the user.
auth_source_mismatch=La source dauthentification sélectionnée nest pas associée à lutilisateur.
enterred_invalid_repo_name=Veuillez vérifier que le nom saisi du dépôt soit correct.
enterred_invalid_owner_name=Veuillez vérifier que le nom du propriétaire saisi soit correct.
enterred_invalid_password=Veuillez vérifier que le mot de passe saisi soit correct.
@@ -351,7 +351,7 @@ two_factor_or_enter_secret=Ou entrez la phrase secrète :
two_factor_then_enter_passcode=Puis entrez le mot de passe :
two_factor_verify=Vérifier
two_factor_invalid_passcode=Le mot de passe que vous avez entré n'est pas valide, veuillez réessayer.
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
two_factor_reused_passcode=Le mot de passe que vous avez entré a déjà été utilisé, veuillez en essayez un autre !
two_factor_enable_error=L'activation de l'authentification en deux étapes a échoué : %v
two_factor_enable_success=L'authentification en deux étapes a été bien été activée pour votre compte.
two_factor_recovery_codes_title=Codes de secours pour l'authentification en deux étapes
@@ -421,6 +421,8 @@ mirror_last_synced=Dernière synchronisation
watchers=Observateurs
stargazers=Stargazers
forks=Forks
repo_description_helper=Description du dépôt. 512 caractères maximum.
repo_description_length=Caractères disponibles
form.reach_limit_of_creation=Le propriétaire a atteint le nombre maximal de %d dépôts créés.
form.name_reserved=Le nom de dépôt '%s' est réservé.
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Le contenu du fichier à changé depuis que vo
editor.file_already_exists=La branche '%s' existe déjà dans ce dépôt.
editor.no_changes_to_show=Il ny a aucun changement à afficher.
editor.fail_to_update_file=Échec lors de la mise à jour/création du fichier '%s' avec l'erreur : %v
editor.fail_to_delete_file=Impossible de supprimer le fichier «%s» avec lerreur : %v
editor.add_subdir=Ajouter un sous-répertoire...
editor.unable_to_upload_files=Échec lors de l'envoie du fichier '%s' avec l'erreur : %v
editor.upload_files_to_dir=Transférer les fichiers vers '%s'
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Cette pull request ne peut être fusionnée automat
pulls.cannot_auto_merge_helper=Fusionner manuellement afin de résoudre les conflits.
pulls.create_merge_commit=Créer un commit de fusion
pulls.rebase_before_merging=Rebaser avant la fusion
pulls.commit_description=Description du commit
pulls.merge_pull_request=Fusionner la Pull Request
pulls.open_unmerged_pull_exists=`Vous ne pouvez effectuer une réouverture car il y a déjà une pull-request ouverte (#%d) depuis le même dépôt avec les mêmes informations de fusion et est en attente de fusion.`
pulls.delete_branch=Supprimer la branche
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Style de nommage des bugs du tracker externe :
settings.tracker_issue_style.numeric=Numérique
settings.tracker_issue_style.alphanumeric=Alphanumérique
settings.tracker_url_format_desc=Vous pouvez utiliser l'espace réservé <code>{user} {repo} {index}</code> pour le nom d'utilisateur, le nom du dépôt et le numéro de bug.
settings.pulls_desc=Activer les pull requests pour accepter les contributions publiques
settings.pulls_desc=Activer les pull requests pour accepter les contributions depuis des dépôts et des branches
settings.pulls.ignore_whitespace=Ignorer les changements quand ce sont des espaces
settings.pulls.allow_rebase_merge=Autoriser l'utilisation de rebase pour fusionner les validations
settings.danger_zone=Zone de danger
@@ -856,6 +860,8 @@ settings.add_key_success=La nouvelle clé de déploiement '%s' a été ajoutée
settings.deploy_key_deletion=Supprimer la Clé de Déploiement
settings.deploy_key_deletion_desc=Supprimer cette clé de déploiement effacera tous les accès relatifs pour ce référentiel. Voulez-vous continuer ?
settings.deploy_key_deletion_success=La clé de déploiement a été supprimée avec succès !
settings.description_desc=Description du dépôt. 512 caractères maximum.
settings.description_length=Caractères disponibles
diff.browse_source=Parcourir la source
diff.parent=Parent
@@ -1091,11 +1097,12 @@ repos.stars=Votes
repos.issues=Tickets
repos.size=Taille
auths.auth_sources=Authentication Sources
auths.auth_sources=Sources d'authentification
auths.new=Ajouter une nouvelle source d'authentification
auths.name=Nom
auths.type=Type
auths.enabled=Activé
auths.default=Par défaut
auths.updated=Mis à jour
auths.auth_type=Type d'authentification
auths.auth_name=Nom de l'authentification
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Nom du Service PAM
auths.enable_auto_register=Connexion Automatique
auths.edit=Modifier les paramètres d'authentification
auths.activated=Authentification activée
auths.default_auth=Cette authentification est la source de connexion par défaut
auths.new_success=Nouvelle authentification «%s » a été ajoutée avec succès.
auths.update_success=Les paramètre d'authentification a été mis à jour avec succès.
auths.update=Mettre à jour les paramètres d'authentifications
@@ -1277,7 +1285,7 @@ notices.actions=Actions
notices.select_all=Tout Sélectionner
notices.deselect_all=Tous déselectionner
notices.inverse_selection=Inverser la sélection
notices.delete_selected=Supprimé les éléments sélectionnés
notices.delete_selected=Supprimer les éléments sélectionnés
notices.delete_all=Supprimer toutes les notifications
notices.type=Type
notices.type_1=Dépôt
@@ -1304,9 +1312,9 @@ delete_branch=branche supprimée <code>%[2]s</code> sur <a href="%[1]s">%[3]s</a
push_tag=a soumis le tag <a href="%s/src/%s">%[2]s</a> sur <a href="%[1]s">%[3]s</a>
delete_tag=étiquette supprimée <code>%[2]s</code> sur <a href="%[1]s">%[3]s</a>
fork_repo=a créé sa branche du dépôt vers <a href="%s">%s</a>
mirror_sync_push=synced commits to <a href="%[1]s/src/%[2]s">%[3]s</a> at <a href="%[1]s">%[4]s</a> from mirror
mirror_sync_create=synced new reference <a href="%s/src/%s">%[2]s</a> to <a href="%[1]s">%[3]s</a> from mirror
mirror_sync_delete=synced and deleted reference <code>%[2]s</code> at <a href="%[1]s">%[3]s</a> from mirror
mirror_sync_push=a commité dans <a href="%[1]s/src/%[2]s">%[3]s</a> sur <a href="%[1]s">%[4]s</a>
mirror_sync_create=a synchronisé la nouvelle référence <a href="%s/src/%s">%[2]s</a> vers <a href="%[1]s">%[3]s</a> depuis le miroir
mirror_sync_delete=Référence synchronisés et supprimé <code>%[2]s</code> sur <a href="%[1]s">%[3]s</a>
[tool]
ago=il y a

View File

@@ -421,6 +421,8 @@ mirror_last_synced=Sincronizado por última vez
watchers=Seguidores
stargazers=Fans
forks=Forks
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
form.reach_limit_of_creation=El propietario ha alcanzado el límite máximo de %d repositorios creados.=O propietario acadou o límite máximo de %d repositorios creados.
form.name_reserved=El nombre del repositorio '%s' está reservado.=O nome do repositorio '%s' está reservado.
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=O contido do arquivo cambiou desde que comezac
editor.file_already_exists=Un arquivo co nome '%s' xa existe no repositorio.
editor.no_changes_to_show=Non hai cambios que mostrar.
editor.fail_to_update_file=Fallou o actualizar/crear o arquivo '%s' co erro: %v
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
editor.add_subdir=Engadir subdirectorio...
editor.unable_to_upload_files=Fallou ao subir arquivos a '%s' co erro: %v
editor.upload_files_to_dir=Subir arquivos a '%s'
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Este Pull Request non pode ser fusionado automatica
pulls.cannot_auto_merge_helper=Por favor, fusiona manualmente para resolver os conflitos.
pulls.create_merge_commit=Create a merge commit
pulls.rebase_before_merging=Rebase before merging
pulls.commit_description=Commit Description
pulls.merge_pull_request=Fusionar Pull Request
pulls.open_unmerged_pull_exists=`Vostede non pode realizar a operación de reapertura porque nestes momentos existe unha solicitude de pull request (#%d) para o mesmo repositorio coa mesma información que se encontra á espera de aprobación`
pulls.delete_branch=Eliminar branch
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Estilo de etiquetaxe do tracker externo de incidenc
settings.tracker_issue_style.numeric=Numérico
settings.tracker_issue_style.alphanumeric=Alfanumérico
settings.tracker_url_format_desc=Podes usar os modelos <code>{user} {repo} {index}</code> para o nome de usuario, nome do repositorio e índice da incidencia.
settings.pulls_desc=Habilitar Pull Requests para aceptar contribucións públicas
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
settings.pulls.ignore_whitespace=Ignore changes in whitespace
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
settings.danger_zone=Zona de perigo
@@ -856,6 +860,8 @@ settings.add_key_success=A nova clave de despregamento '%s' foi creada con éxit
settings.deploy_key_deletion=Eliminar clave de despregamento
settings.deploy_key_deletion_desc=Ao eliminar esta clave de despregamento perderase o permiso de acceso a este repositorio coa dita clave. Desexas continuar?
settings.deploy_key_deletion_success=Clave de despregamento eliminada con éxito!
settings.description_desc=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
diff.browse_source=Explorar o código
diff.parent=pai
@@ -1096,6 +1102,7 @@ auths.new=Engadir nova orixe
auths.name=Nome
auths.type=Tipo
auths.enabled=Activo
auths.default=Default
auths.updated=Actualizado
auths.auth_type=Tipo de autenticación
auths.auth_name=Nome de autenticación
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Nome do servizo PAM
auths.enable_auto_register=Habilitar auto-rexistro
auths.edit=Editar a configuración de autenticación
auths.activated=Esta autenticación foi activada
auths.default_auth=This authentication is default login source
auths.new_success=A autenticación '%s' foi engadida con éxito!
auths.update_success=A configuración de autenticación foi actualizada con éxito.
auths.update=Actualizar a configuración de autenticación

View File

@@ -151,8 +151,8 @@ register_hepler_msg=Van már felhasználói fiókja? Jelentkezz be!
social_register_hepler_msg=Van már fiókod? Csatold most!
disable_register_prompt=Elnézést, a regisztrációt kikapcsolták. Kérlek szólj az oldal adminisztrátorának.
disable_register_mail=Elnézést, az email regisztráció megerősítését kikapcsolták.
auth_source=Authentication Source
local=Local
auth_source=Hitelesítési forrás
local=Helyi
remember_me=Emlékezz rám
forgot_password=Elfelejtett jelszó
forget_password=Elfelejtette a jelszavát?
@@ -231,7 +231,7 @@ org_name_been_taken=A szervezet neve már foglalt.
team_name_been_taken=Az a csapatnév már foglalt.
email_been_used=Ezt az email címet már felhasználták.
username_password_incorrect=Felhasználó név vagy jelszó hibás.
auth_source_mismatch=The authentication source selected is not associated with the user.
auth_source_mismatch=A kijelölt hitelesítési forráshoz nincs társítva a felhasználó.
enterred_invalid_repo_name=Kérjük, ellenőrizze, hogy a tároló neve helyes.
enterred_invalid_owner_name=Kérjük, ellenőrizze, hogy a tulajdonos neve helyes.
enterred_invalid_password=Kérlek ellenőrizd, hogy a beírt jelszó helyes.
@@ -351,7 +351,7 @@ two_factor_or_enter_secret=Vagy adja meg a titkos kódot:
two_factor_then_enter_passcode=Ezután írja be ezt a jelkódot:
two_factor_verify=Ellenőrzés
two_factor_invalid_passcode=Érvénytelen a megadott jelkód, próbálja meg újra!
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
two_factor_reused_passcode=A megadott PIN-kód már használatban van. Kérem válasszon másikat!
two_factor_enable_error=Kétlépcsős hitelesítés engedélyezése sikertelen: %v
two_factor_enable_success=Kétlépcsős hitelesítés sikeresen engedélyezve a fiókjához!
two_factor_recovery_codes_title=Kettőlépcsős hitelesítés helyreállítási kódok
@@ -421,6 +421,8 @@ mirror_last_synced=Utoljára szinkr.
watchers=Figyelők
stargazers=Csillagvizsgálók
forks=Másolások
repo_description_helper=Tároló leírása. Maximum 512 karakter hosszúságú.
repo_description_length=Rendelkezésre álló karakterek
form.reach_limit_of_creation=A tulajdonos túllépte a maximum létrehozható tárolók számát (%d).
form.name_reserved=Ez a tároló név ('%s') le van foglalva.
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=A fájl tartalma megváltozott mióta elkezdte
editor.file_already_exists=A(z) '%s' nevű fájl már létezik a tárolóban.
editor.no_changes_to_show=Nincsen megjeleníthető változás.
editor.fail_to_update_file=Nem sikerült frissíteni/létrehozni a következő fájlt: '%s' A hiba oka: %v
editor.fail_to_delete_file=Nem sikerült törölni a következő fájlt: '%s' A hiba oka: %v
editor.add_subdir=Alkönyvtár hozzáadása...
editor.unable_to_upload_files=Nem sikerült feltölteni a fájlokat a "%s" hiba: %v
editor.upload_files_to_dir=Fájlok feltöltése '%s'
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Ez a beolvasztási kérés ütközések miatt nem e
pulls.cannot_auto_merge_helper=Kérlek, egyesítsd kézileg a konfliktusok megoldásához.
pulls.create_merge_commit=Eggyesítő commit létrehozása
pulls.rebase_before_merging=Rebase eggyesítés előtt
pulls.commit_description=Commit leírása
pulls.merge_pull_request=Beolvasztási kérés egyesítése
pulls.open_unmerged_pull_exists=`Nem tudja újranyitni, mert már van egy nyitott egyesítési kérés (#%d) ugyanebben a tárolóban, ugyanezekket az egyesítési információkkal, és végrehajtásra vár.`
pulls.delete_branch=Ág törlése
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Külső hibajegykezelő elnevezési stílus:
settings.tracker_issue_style.numeric=Numerikus
settings.tracker_issue_style.alphanumeric=Alfanumerikus
settings.tracker_url_format_desc=Az alábbiak helyettesítik a felhasználónevet, repository nevet és hibajegy számot: <code>{user} {repo} {index}</code>.
settings.pulls_desc=Beolvasztási kérések engedélyezése a nyilvános hozzájárulások végett
settings.pulls_desc=Beolvasztási kérések engedélyezése tárolók és ágak közi hozzájárulásokhoz
settings.pulls.ignore_whitespace=Whitespacek figyelmen kívül hagyása
settings.pulls.allow_rebase_merge=Rebase engedélyezése eggyesítő commitokhoz
settings.danger_zone=Veszélyes terület
@@ -856,6 +860,8 @@ settings.add_key_success=Az új deploy kulcsot ('%s') sikeresen hozzáadtuk!
settings.deploy_key_deletion=Deploy Kulcs Törlése
settings.deploy_key_deletion_desc=A deploy kulcs törlése minden kapcsolódó hozzáférést töröl a repository-ból. Biztosan folytatod?
settings.deploy_key_deletion_success=A deploy kulcs sikeresen törölve!
settings.description_desc=Tároló leírása. Maximum 512 karakter hosszúságú.
settings.description_length=Rendelkezésre álló karakterek
diff.browse_source=Forráskód Böngészése
diff.parent=szülő
@@ -1091,11 +1097,12 @@ repos.stars=Csillagok
repos.issues=Problémák
repos.size=Méret
auths.auth_sources=Authentication Sources
auths.auth_sources=Hitelesítési források
auths.new=Új forrás hozzáadása
auths.name=Név
auths.type=Típus
auths.enabled=Engedélyezett
auths.default=Alapértelmezett
auths.updated=Frissítve
auths.auth_type=Hitelesítés típusa
auths.auth_name=Hitelesítési név
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAM szolgáltatás neve
auths.enable_auto_register=Automatikus regisztráció engedélyezése
auths.edit=Hitelesítési beállítások szerkesztése
auths.activated=Ez a hitelesítés mód aktiválva van
auths.default_auth=This authentication is default login source
auths.new_success=Az új hitelesítési mód '%s' sikeresen hozzáadva.
auths.update_success=A hitelesítési beállítások sikeresen firssítve lettek.
auths.update=Hitelesítési forrás frissítése
@@ -1314,14 +1322,14 @@ from_now=mostantól
now=most
1s=1 másodperce %s
1m=1 perce %s
1h=1 órája
1h=1 órája %s
1d=1 napja %s
1w=1 hete %s
1mon=1 hónapja %s
1y=1 éve %s
seconds=%d másodperce %s
minutes=%d perce %s
hours=%d órája
hours=%d órája %s
days=%d napja %s
weeks=%d hete %s
months=%d hónapja %s

View File

@@ -421,6 +421,8 @@ mirror_last_synced=Terakhir disinkronkan
watchers=Watchers
stargazers=Stargazers
forks=Forks
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
form.reach_limit_of_creation=Pemiliknya telah mencapai batas pembuatan maksimum %d repositori.
form.name_reserved=Nama repositori '%s' dicadangkan.
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Konten file telah berubah sejak Anda mulai men
editor.file_already_exists=File dengan nama '%s' sudah ada di repositori ini.
editor.no_changes_to_show=Tidak ada perubahan untuk ditunjukkan.
editor.fail_to_update_file=Gagal memperbarui / membuat file '%s' dengan error: %v
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
editor.add_subdir=Tambahkan subdirektori...
editor.unable_to_upload_files=Gagal mengunggah file ke '%s' dengan kesalahan: %v
editor.upload_files_to_dir=Upload file ke '%s'
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Permintaan tarik ini tidak bisa digabungkan secara
pulls.cannot_auto_merge_helper=Silahkan bergabung secara manual untuk menyelesaikan konflik.
pulls.create_merge_commit=Membuat komit penggabungan
pulls.rebase_before_merging=Rebase sebelum penggabungan
pulls.commit_description=Commit Description
pulls.merge_pull_request=Permintaan tarik gabungan
pulls.open_unmerged_pull_exists='Anda tidak dapat melakukan operasi membuka kembali karena sudah ada permintaan tarik terbuka (#%d) dari repositori yang sama dengan penggabungan informasi yang sama dan menunggu penggabungan. '
pulls.delete_branch=Menghapus cabang
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Isu Penamaan Tracker Isu Eksternal:
settings.tracker_issue_style.numeric=Numerik
settings.tracker_issue_style.alphanumeric=Alfanumerik
settings.tracker_url_format_desc=Anda dapat menggunakan placeholder <code>{user}{repo}{index</code> untuk nama pengguna, nama repositori dan indeks masalah.
settings.pulls_desc=Aktifkan permintaan tarik untuk menerima kontribusi publik
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
settings.pulls.ignore_whitespace=Abaikan perubahan di spasi
settings.pulls.allow_rebase_merge=Izinkan gunakan rebase untuk menggabungkan komit
settings.danger_zone=Zona Bahaya
@@ -856,6 +860,8 @@ settings.add_key_success=Kunci penerapan baru '%s' telah berhasil ditambahkan!
settings.deploy_key_deletion=Hapus Kunci Deploy
settings.deploy_key_deletion_desc=Menghapus kunci penggelaran ini akan menghapus semua akses yang terkait untuk repositori ini. Apakah Anda ingin melanjutkan?
settings.deploy_key_deletion_success=Kunci penempatan telah berhasil dihapus!
settings.description_desc=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
diff.browse_source=Jelajahi Sumber
diff.parent=induk
@@ -1096,6 +1102,7 @@ auths.new=Tambahkan Sumber Baru
auths.name=Nama
auths.type=Mengetik
auths.enabled=Diaktifkan
auths.default=Default
auths.updated=Diperbarui
auths.auth_type=Jenis Autentikasi
auths.auth_name=Nama Otentikasi
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Nama layanan PAM
auths.enable_auto_register=Mengaktifkan pendaftaran otomatis
auths.edit=Mengubah pengaturan pembuktian
auths.activated=This authentication is activated
auths.default_auth=This authentication is default login source
auths.new_success=New authentication '%s' has been added successfully.
auths.update_success=Authentication setting has been updated successfully.
auths.update=Memperbarui pengetahuan otentikasi

View File

@@ -119,7 +119,7 @@ sqlite3_not_available=Questa versione non supporta SQLite3, si prega di scaricar
invalid_db_setting=La configurazione del database non è corretta: %v
invalid_repo_path=Percorso root del repository invalido: %v
run_user_not_match=Run user non è l'utente corrente: %s -> %s
smtp_host_missing_port=SMTP Host is missing port in address.
smtp_host_missing_port=All'Host SMTP manca la porta nell'indirizzo.
invalid_smtp_from=Campo SMTP From non valido: %v
save_config_failed=Fallito il salvataggio della configurazione: %v
invalid_admin_setting=Impostazioni account Admin non valide: %v
@@ -151,8 +151,8 @@ register_hepler_msg=Hai già un account? Accedi ora!
social_register_hepler_msg=Hai già un account? Associalo ora!
disable_register_prompt=Siamo spiacenti, registrazione è stata disabilitata. Si prega di contattare l'amministratore del sito.
disable_register_mail=Siamo spiacenti, la conferma di registrazione via Mail è stata disattivata.
auth_source=Authentication Source
local=Local
auth_source=Fonte di autenticazione
local=Locale
remember_me=Ricordami
forgot_password=Password dimenticata
forget_password=Password dimenticata?
@@ -172,7 +172,7 @@ password_too_short=La lunghezza della password non può essere meno 6 caratteri.
non_local_account=Gli account non locali non possono modificare le password tramite Gogs.
login_two_factor=Autenticazione in Due Passaggi
login_two_factor_passcode=Authentication Passcode
login_two_factor_passcode=Codice di autenticazione
login_two_factor_enter_recovery_code=Inserisci il codice di recupero dell'Autenticazione a due Fattori
login_two_factor_recovery=Two-factor Recovery
login_two_factor_recovery_code=Recupera il codice
@@ -267,7 +267,7 @@ profile=Profilo
password=Password
avatar=Avatar
ssh_keys=Chiavi SSH
security=Security
security=Sicurezza
repos=Repository
orgs=Organizzazioni
applications=Applicazioni
@@ -338,30 +338,30 @@ key_state_desc=Hai utilizzato questa chiave negli ultimi 7 giorni
token_state_desc=Questo token e' satato utilizzato negli ultimi 7 giorni
two_factor=Autenticazione in Due Passaggi
two_factor_status=Status:
two_factor_status=Stato:
two_factor_on=Attiva
two_factor_off=Off
two_factor_enable=Enable
two_factor_off=Non attivo
two_factor_enable=Abilita
two_factor_disable=Disattivata
two_factor_view_recovery_codes=View and save <a href="%s%s">your recovery codes</a> in a safe place. You can use them as passcode if you lose access to your authentication application.
two_factor_view_recovery_codes=Visualizza e memorizza i tuoi <a href="%s%s">codici di recupero</a> in un posto sicuro. Puoi utilizzarli come codice di sicurezza se perdi gli accessi all'applicazione di autenticazione.
two_factor_http=For HTTP/HTTPS operations, you are no longer able to use plain username and password. Please create and use <a href="%[1]s%[2]s">Personal Access Token</a> as your credential, e.g. <code>%[3]s</code>.
two_factor_enable_title=Abilita l'autenticazione in due passaggi
two_factor_scan_qr=Please use your authentication application to scan the image:
two_factor_or_enter_secret=Or enter the secret:
two_factor_then_enter_passcode=Then enter passcode:
two_factor_scan_qr=Per favore, utilizza la tua applicazione di autenticazione per scansionare l'immagine:
two_factor_or_enter_secret=O inserisci la chiave segreta:
two_factor_then_enter_passcode=Poi inserisci la chiave di sicurezza:
two_factor_verify=Verifica
two_factor_invalid_passcode=The passcode you entered is not valid, please try again!
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
two_factor_enable_error=Enable Two-factor authentication failed: %v
two_factor_invalid_passcode=La chiave di sicurezza che hai inserito non è valida, riprova!
two_factor_reused_passcode=La chiave di sicurezza che hai inserito è già stata utilizzata, provane un'altra!
two_factor_enable_error=Impossibile abilitare l'autenticazione a due fattori: %v
two_factor_enable_success=Two-factor authentication has enabled for your account successfully!
two_factor_recovery_codes_title=Two-factor Authentication Recovery Codes
two_factor_recovery_codes_desc=Recovery codes are used when you temporarily lose access to your authentication application. Each recovery code can only be used once, <b>please keep these codes in a safe place</b>.
two_factor_regenerate_recovery_codes=Regenerate Recovery Codes
two_factor_regenerate_recovery_codes_error=Regenerate recovery codes failed: %v
two_factor_regenerate_recovery_codes_success=New recovery codes has been generated successfully!
two_factor_disable_title=Disable Two-factor Authentication
two_factor_disable_desc=Your account security level will decrease after disabled two-factor authentication. Do you want to continue?
two_factor_disable_success=Two-factor authentication has disabled successfully!
two_factor_regenerate_recovery_codes=Rigenera codici di recupero
two_factor_regenerate_recovery_codes_error=Impossibile rigenerare codici di recupero: %v
two_factor_regenerate_recovery_codes_success=I nuovi codici di recupero sono stati generati correttamente!
two_factor_disable_title=Disabilita autenticazione a due fattori
two_factor_disable_desc=Il livello di sicurezza del tuo account diminuirà disabilitando l'autenticazione a due fattori. Vuoi continuare?
two_factor_disable_success=L'autenticazione a due fattori è stata disabilitata!
manage_access_token=Gestisci i Token di Accesso Personale
generate_new_token=Genera Nuovo Token
@@ -380,7 +380,7 @@ orgs.leave_title=Abbandona una organizzazione
orgs.leave_desc=Abbandonando l'organizzazione perderai l'accesso a tutti i repository e i gruppi. Confermi?
repos.leave=Abbandona
repos.leave_title=Leave repository
repos.leave_title=Lascia il repository
repos.leave_desc=You will lose access to the repository after you left. Do you want to continue?
repos.leave_success=You have left repository '%s' successfully!
@@ -421,6 +421,8 @@ mirror_last_synced=Ultimo aggiornamento
watchers=Osservatori
stargazers=Fan
forks=Fork
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Caratteri disponibili
form.reach_limit_of_creation=Il proprietario ha raggiunto il limite massimo di %d repository creati.
form.name_reserved=Il nome repository %s è riservato.
@@ -467,7 +469,7 @@ pulls=Pull Requests
labels=Etichette
milestones=Traguardi
commits=Commit
git_branches=Branches
git_branches=Rami (Branch)
releases=Rilasci
file_raw=Originale
file_history=Cronologia
@@ -476,12 +478,12 @@ file_permalink=Permalink
file_too_large=Questo file è troppo grande per essere mostrato
video_not_supported_in_browser=Il tuo browser non supporta i tag "video" di HTML5.
branches.overview=Overview
branches.active_branches=Active Branches
branches.overview=Panoramica
branches.active_branches=Rami (Branch) attivi
branches.stale_branches=Stale Branches
branches.all=All Branches
branches.all=Tutti i rami (branch)
branches.updated_by=Updated %[1]s by %[2]s
branches.change_default_branch=Change Default Branch
branches.change_default_branch=Cambia branch di default
editor.new_file=Nuovo file
editor.upload_file=Carica File
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Il file è stato cambiato in un'altra posizion
editor.file_already_exists=Un file di nome '%s' esiste già in questo repository.
editor.no_changes_to_show=Nessuna modifica da mostrare.
editor.fail_to_update_file=La creazione o la modifica del file '%s' è fallita: %v
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
editor.add_subdir=Aggiungi sottocartella...
editor.unable_to_upload_files=È fallito il caricamento dei file su '%s': %v
editor.upload_files_to_dir=Carica file su '%s'
@@ -580,8 +583,8 @@ issues.next=Pagina successiva
issues.open_title=Aperto
issues.closed_title=Chiuso
issues.num_comments=%d commenti
issues.commented_at=`commented <a href="#%s">%s</a>`
issues.delete_comment_confirm=Are you sure you want to delete this comment?
issues.commented_at=`ha commentato <a href="#%s">%s</a>`
issues.delete_comment_confirm=Sei sicuro/a di voler eliminare questo commento?
issues.no_content=Non ci sono ancora contenuti.
issues.close_issue=Chiudi
issues.close_comment_issue=Commenta e chiudi
@@ -637,10 +640,11 @@ pulls.can_auto_merge_desc=La pull request può essere mergiata automaticamente.
pulls.cannot_auto_merge_desc=Questa pull request non può essere mergiata automaticamente perchè ci sono dei conflitti.
pulls.cannot_auto_merge_helper=Effettua il merge manualmente per risolvere i conflitti.
pulls.create_merge_commit=Create a merge commit
pulls.rebase_before_merging=Rebase before merging
pulls.rebase_before_merging=Effettua un Rebase prima del Merge
pulls.commit_description=Descrizione del Commit
pulls.merge_pull_request=Unisci Pull Request
pulls.open_unmerged_pull_exists=`You can't perform reopen operation because there is already an open pull request (#%d) from same repository with same merge information and is waiting for merging.`
pulls.delete_branch=Delete Branch
pulls.delete_branch=Elimina Ramo
pulls.delete_branch_has_new_commits=Branch cannot be deleted because it has new commits after mergence.
milestones.new=Nuova Milestone
@@ -688,62 +692,62 @@ wiki.last_updated=Ultimo aggiornamento: %s
settings=Impostazioni
settings.options=Opzioni
settings.collaboration=Collaborazione
settings.collaboration.admin=Admin
settings.collaboration.write=Write
settings.collaboration.read=Read
settings.collaboration.undefined=Undefined
settings.branches=Branches
settings.collaboration.admin=Amministratore
settings.collaboration.write=Scrivi
settings.collaboration.read=Leggi
settings.collaboration.undefined=Indefinito
settings.branches=Divisioni
settings.branches_bare=You cannot manage branches for bare repository. Please push some content first.
settings.default_branch=Default Branch
settings.default_branch=Ramo di default
settings.default_branch_desc=The default branch is considered the "base" branch for code commits, pull requests and online editing.
settings.update=Aggiorna
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
settings.update_default_branch_success=Default branch of this repository has been updated successfully!
settings.protected_branches=Branch protetti
settings.protected_branches_desc=Protect branches from force pushing, accidental deletion and whitelist code committers.
settings.choose_a_branch=Choose a branch...
settings.branch_protection=Branch Protection
settings.choose_a_branch=Scegli un ramo...
settings.branch_protection=Protezione Ramo
settings.branch_protection_desc=Please choose protect options for branch <b>%s</b>.
settings.protect_this_branch=Protect this branch
settings.protect_this_branch=Proteggere questo ramo
settings.protect_this_branch_desc=Disable force pushes and prevent from deletion.
settings.protect_require_pull_request=Require pull request instead direct pushing
settings.protect_require_pull_request_desc=Enable this option to disable direct pushing to this branch. Commits have to be pushed to another non-protected branch and merged to this branch through pull request.
settings.protect_whitelist_committers=Whitelist who can push to this branch
settings.protect_whitelist_committers_desc=Add people or teams to whitelist of direct push to this branch. Users in whitelist will bypass require pull request check.
settings.protect_whitelist_users=Users who can push to this branch
settings.protect_whitelist_search_users=Search users
settings.protect_whitelist_search_users=Cerca utenti
settings.protect_whitelist_teams=Teams for which members of them can push to this branch
settings.protect_whitelist_search_teams=Search teams
settings.protect_whitelist_search_teams=Cerca Teams
settings.update_protect_branch_success=Protect options for this branch has been updated successfully!
settings.hooks=Webhooks
settings.githooks=Git Hooks
settings.basic_settings=Impostazioni di Base
settings.mirror_settings=Mirror Settings
settings.sync_mirror=Sync Now
settings.mirror_sync_in_progress=Mirror syncing is in progress, please refresh page in about a minute.
settings.mirror_settings=Impostazioni mirror
settings.sync_mirror=Sincronizza ora
settings.mirror_sync_in_progress=Sincronizzazione del mirror in corso, aggiorna la pagina tra un minuto.
settings.site=Sito Ufficiale
settings.update_settings=Aggiorna Impostazioni
settings.change_reponame_prompt=Questa modifica influirà i link al repository.
settings.advanced_settings=Opzioni avanzate
settings.wiki_desc=Enable wiki system
settings.use_internal_wiki=Use builtin wiki
settings.wiki_desc=Abilita wiki
settings.use_internal_wiki=Usa wiki incorporato
settings.allow_public_wiki_desc=Allow public access to wiki when repository is private
settings.use_external_wiki=Usa Wiki esterno
settings.external_wiki_url=URL Wiki esterno
settings.external_wiki_url_desc=I visitatori verranno reindirizzati all'URL quando cliccano sulla scheda.
settings.issues_desc=Enable issue tracker
settings.use_internal_issue_tracker=Use builtin lightweight issue tracker
settings.issues_desc=Abilita tracking problemi
settings.use_internal_issue_tracker=Utilizza il segnalatore di problemi integrato (molto leggero)
settings.allow_public_issues_desc=Allow public access to issues when repository is private
settings.use_external_issue_tracker=Utilizza gestore di problemi esterno
settings.external_tracker_url=External Issue Tracker URL
settings.external_tracker_url_desc=Visitors will be redirected to URL when they click on the tab.
settings.external_tracker_url=URL di un segnalatore di problemi esterno
settings.external_tracker_url_desc=I visitatori verranno reindirizzati all'URL quando faranno click sulla scheda.
settings.tracker_url_format=Formato URL Gestore Problemi Esterno
settings.tracker_issue_style=External Issue Tracker Naming Style:
settings.tracker_issue_style.numeric=Numeric
settings.tracker_issue_style.alphanumeric=Alphanumeric
settings.tracker_issue_style.numeric=Numerico
settings.tracker_issue_style.alphanumeric=Alfanumerico
settings.tracker_url_format_desc=You can use placeholder <code>{user} {repo} {index}</code> for user name, repository name and issue index.
settings.pulls_desc=Abilita le pull requests per accettare contributi pubblici
settings.pulls.ignore_whitespace=Ignore changes in whitespace
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
settings.pulls.ignore_whitespace=Ignora cambiamenti di spazi bianchi
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
settings.danger_zone=Zona Pericolosa
settings.cannot_fork_to_same_owner=You cannot fork a repository to its original owner.
@@ -815,19 +819,19 @@ settings.event_send_everything=Ho bisogno di <strong>tutto</strong>.
settings.event_choose=Lasciami scegliere ciò di cui ho bisogno.
settings.event_create=Crea
settings.event_create_desc=Branch, o tag creato
settings.event_delete=Delete
settings.event_delete_desc=Branch or tag deleted
settings.event_delete=Elimina
settings.event_delete_desc=Branch o tag eliminato
settings.event_fork=Forka
settings.event_fork_desc=Repository Forkata
settings.event_push=Push
settings.event_push_desc=Git push in un repository
settings.event_issues=Issues
settings.event_issues=Problemi
settings.event_issues_desc=Issue opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, or demilestoned.
settings.event_pull_request=Pull request
settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, demilestoned, or synchronized.
settings.event_issue_comment=Issue Comment
settings.event_issue_comment_desc=Issue comment created, edited, or deleted.
settings.event_release=Release
settings.event_release=Versione
settings.event_release_desc=Release published in a repository.
settings.active=Attivo
settings.active_helper=Anche i dettagli riguardanti l'evento che ha innescato l'hook saranno inviati.
@@ -856,6 +860,8 @@ settings.add_key_success=La nuova deploy key '%s' è stata aggiunta con successo
settings.deploy_key_deletion=Elimina Deploy Key
settings.deploy_key_deletion_desc=Cancellando questa deploy key verrà rismosso ogni accesso relativo a questa repository. Vuoi continuare?
settings.deploy_key_deletion_success=Deploy key eliminata con successo!
settings.description_desc=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
diff.browse_source=Sfoglia il codice sorgente
diff.parent=parent
@@ -893,12 +899,12 @@ release.cancel=Annulla
release.publish=Pubblica Rilascio
release.save_draft=Salva Bozza
release.edit_release=Modifica Rilascio
release.delete_release=Cancela questa Release
release.delete_release=Cancella questa Release
release.deletion=Eliminazione Release
release.deletion_desc=Eliminando questa release cancellarai anche i tag Git corrispondenti. Vuoi continuare?
release.deletion_success=La release è stata eliminata con successo!
release.tag_name_already_exist=Un rilascio con questo tag esiste già.
release.tag_name_invalid=Tag name is not valid.
release.tag_name_invalid=Il nome del Tag non è valido.
release.downloads=Download
[org]
@@ -922,7 +928,7 @@ team_permission_desc=Quale livello di autorizzazione dovrebbe avere questa squad
form.name_reserved=Il nome organizzazione '%s' è riservato.
form.name_pattern_not_allowed=La struttura del nome dell'organizzazione '%s' non è consentita.
form.team_name_reserved=Team name '%s' is reserved.
form.team_name_reserved=Non puoi utilizzare '%s' come nome del Team.
settings=Impostazioni
settings.options=Opzioni
@@ -1089,13 +1095,14 @@ repos.private=Privati
repos.watches=Segue
repos.stars=Voti
repos.issues=Problemi
repos.size=Size
repos.size=Dimensione
auths.auth_sources=Authentication Sources
auths.new=Aggiungi Nuova Origine
auths.name=Nome
auths.type=Tipo
auths.enabled=Attivo
auths.default=Default
auths.updated=Aggiornato
auths.auth_type=Tipo di autenticazione
auths.auth_name=Nome di autenticazione
@@ -1114,7 +1121,7 @@ auths.attribute_username_placeholder=Se vuoto, verrà usato il nome di login del
auths.attribute_name=First Name Attribute
auths.attribute_surname=Attributo Cognome
auths.attribute_mail=Attributo Email
auths.verify_group_membership=Verify group membership
auths.verify_group_membership=Verifica gruppo di appartenenza
auths.group_search_base_dn=Group Search Base DN
auths.group_filter=Group Filter
auths.group_attribute_contain_user_list=Group Attribute Containing List of Users
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Nome del Servizio PAM
auths.enable_auto_register=Abilitare Registrazione Automatica
auths.edit=Modifica impostazioni di autenticazione
auths.activated=Questa Autenticazione è stata attivata
auths.default_auth=This authentication is default login source
auths.new_success=Nuovo meccanismo di autenticazione '%s' aggiunto.
auths.update_success=Parametro di autenticazione aggiornato.
auths.update=Aggiornare le impostazioni di autenticazione
@@ -1144,7 +1152,7 @@ auths.still_in_used=Questo meccanismo di autenticazione è ancora attivo per alc
auths.deletion_success=Il meccanismo di autenticazione è stato eliminato!
auths.login_source_exist=La fonte di autenticazione '%s' esiste già.
config.not_set=(not set)
config.not_set=(non impostata)
config.server_config=Configurazione Server
config.app_name=Nome Applicazione
config.app_ver=Versione Applicazione
@@ -1172,17 +1180,17 @@ config.ssh_keygen_path=Percorso Keygen ('ssh-keygen')
config.ssh_minimum_key_size_check=Verifica delle dimensioni minime della chiave
config.ssh_minimum_key_sizes=Dimensioni minime della chiave
config.repo_config=Repository Configuration
config.repo_config=Configurazione Repository
config.repo_root_path=Percorso Root del Repository
config.script_type=Tipo di Script
config.repo_force_private=Force Private
config.max_creation_limit=Max Creation Limit
config.preferred_licenses=Preferred Licenses
config.disable_http_git=Disable HTTP Git
config.enable_local_path_migration=Enable Local Path Migration
config.disable_http_git=Disabilita Git in HTTP
config.enable_local_path_migration=Abilita migrazioni con path locale
config.commits_fetch_concurrency=Commits Fetch Concurrency
config.http_config=HTTP Configuration
config.http_config=Configurazione HTTP
config.http_access_control_allow_origin=Access Control Allow Origin
config.db_config=Configurazione Database
@@ -1258,7 +1266,7 @@ config.git_gc_timeout=Timeout per le operazioni di GC
config.log_config=Configurazione Log
config.log_mode=Modalità
config.log_options=Options
config.log_options=Opzioni
monitor.cron=Incarici di cron
monitor.name=Nome

View File

@@ -151,8 +151,8 @@ register_hepler_msg=既にアカウントをお持ちですか?今すぐログ
social_register_hepler_msg=既にアカウントをお持ちですか?連携しましょう!
disable_register_prompt=申し訳ありませんが、現在登録は受け付けておりません。サイトの管理者にお問い合わせください。
disable_register_mail=申し訳ありませんが、登録メールの確認機能が無効になっています。
auth_source=Authentication Source
local=Local
auth_source=認証ソース
local=ローカル
remember_me=ログインしたままにする
forgot_password=パスワードを忘れた
forget_password=パスワードを忘れましたか?
@@ -231,7 +231,7 @@ org_name_been_taken=組織名は既に使用されています。
team_name_been_taken=チーム名は既に使用されています。
email_been_used=電子メール アドレスは既に使用されています。
username_password_incorrect=ユーザー名またはパスワードが正しくありません。
auth_source_mismatch=The authentication source selected is not associated with the user.
auth_source_mismatch=選択されている認証ソースは、ユーザーに関連付けられていません。
enterred_invalid_repo_name=入力したリポジトリの名前が正しいかどうかを確認してください。
enterred_invalid_owner_name=入力された所有者名が正しいかどうかを確認してください。
enterred_invalid_password=入力したパスワードが正しいか確認してください。
@@ -421,6 +421,8 @@ mirror_last_synced=最終同期
watchers=ウォッチャー
stargazers=スターゲイザー
forks=フォーク
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
form.reach_limit_of_creation=リポジトリの最大作成数 %d にすでに達しています。
form.name_reserved=リポジトリ名 '%s' は使用されています。
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=あなたが編集を開始してから、フ
editor.file_already_exists=ファイル名 '%s' は、このリポジトリに既に存在します。
editor.no_changes_to_show=表示する変更箇所はありません。
editor.fail_to_update_file=ファイル '%s' の作成/更新に失敗しました: %v
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
editor.add_subdir=サブディレクトリを追加...
editor.unable_to_upload_files='%s' へのファイルアップロード中にエラーが発生し、失敗しました: %v
editor.upload_files_to_dir='%s' にファイルをアップロード
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=コンフリクトが発生しているため、こ
pulls.cannot_auto_merge_helper=競合を解決するためには、手動でマージする必要があります。
pulls.create_merge_commit=マージコミットを作成する
pulls.rebase_before_merging=マージする前に再配置します。
pulls.commit_description=Commit Description
pulls.merge_pull_request=プルリクエストをマージします。
pulls.open_unmerged_pull_exists=`同じリポジトリに同じマージ情報持つ未解決のプルリクエスト (#%d) が存在するため再び開くことができません。`
pulls.delete_branch=ブランチの削除
@@ -742,7 +746,7 @@ settings.tracker_issue_style=外部課題トラッキングシステムの命名
settings.tracker_issue_style.numeric=数値
settings.tracker_issue_style.alphanumeric=英数字
settings.tracker_url_format_desc=ユーザー名、リポジトリ名、課題番号を埋め込むために <code>{user} {repo} {index}</code> が使用できます。
settings.pulls_desc=誰でもコントリビュートできるよう、プルリクエストの受け付けを有効にします
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
settings.pulls.ignore_whitespace=空白の変更を無視する
settings.pulls.allow_rebase_merge=コミットをマージするためのリベースの使用を許可する
settings.danger_zone=危険地帯
@@ -856,6 +860,8 @@ settings.add_key_success=新しいデプロイキー '%s'が正常に追加さ
settings.deploy_key_deletion=デプロイキーを削除
settings.deploy_key_deletion_desc=このデプロイキーを削除すると、このリポジトリに関連するすべてのアクセス権も削除されます。続行しますか。
settings.deploy_key_deletion_success=デプロイキーが正常に削除された!
settings.description_desc=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
diff.browse_source=ソースを参照
diff.parent=
@@ -1096,6 +1102,7 @@ auths.new=新しいソースを追加
auths.name=名前
auths.type=タイプ
auths.enabled=有効
auths.default=Default
auths.updated=更新しました
auths.auth_type=認証タイプ
auths.auth_name=認証名
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAMサービス名
auths.enable_auto_register=自動登録を有効にする
auths.edit=認証設定を編集
auths.activated=認証の有効化
auths.default_auth=This authentication is default login source
auths.new_success=新しい認証 '%s' が正常に追加されました。
auths.update_success=認証の設定が正常に更新されました。
auths.update=認証設定を更新

View File

@@ -152,7 +152,7 @@ social_register_hepler_msg=계정을 가지고 계신가요? 연결하세요!
disable_register_prompt=죄송합니다, 가입이 비활성화 되어있습니다. 사이트 관리자에게 문의 해주세요.
disable_register_mail=죄송합니다. 메일 등록이 비활성화 되었습니다.
auth_source=Authentication Source
local=Local
local=로컬
remember_me=자동 로그인
forgot_password=비밀번호 찾기
forget_password=비밀번호를 잊으셨습니까?
@@ -379,8 +379,8 @@ orgs.none=당신은 어떤 조직의 구성원도 아닙니다.
orgs.leave_title=조직 떠나기
orgs.leave_desc=조직을 떠난 후에는 모든 리포지토리와 팀에 액세스 할 수 없게 됩니다. 계속 하시겠습니까?
repos.leave=Leave
repos.leave_title=Leave repository
repos.leave=나가기
repos.leave_title=저장소 나가기
repos.leave_desc=You will lose access to the repository after you left. Do you want to continue?
repos.leave_success=You have left repository '%s' successfully!
@@ -421,6 +421,8 @@ mirror_last_synced=마지막으로 동기화됨
watchers=주시하고 있는 사람들
stargazers=별을 준 사람들
forks=포크
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
form.reach_limit_of_creation=소유자가 저장소 만들기 최대 제한에 (%d개) 도달했습니다.
form.name_reserved=저장소 이름 '%s'은 예약 되어 있습니다.
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=편집을 시작한 이후 파일 내용이
editor.file_already_exists=이 저장소에 이름이 '%s'인 파일이 이미 존재합니다.
editor.no_changes_to_show=표시할 변경사항이 없습니다.
editor.fail_to_update_file=파일 '%s'를 변경/추가 하는데 실패하였습니다. 에러: %v
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
editor.add_subdir=하위 디렉토리 추가...
editor.unable_to_upload_files=파일 '%s'를 업로드하는데 실패하였습니다. 에러: %v
editor.upload_files_to_dir=파일 업로드 '%s'
@@ -638,7 +641,8 @@ pulls.can_auto_merge_desc=이 풀리퀘스트는 자동적으로 머지될 수
pulls.cannot_auto_merge_desc=컨플릭이 존재해서 이 풀리퀘스트는 자동을 머지될 수 없습니다.
pulls.cannot_auto_merge_helper=컨플릭을 해결하려면 수동으로 머지해 주십시오.
pulls.create_merge_commit=Create a merge commit
pulls.rebase_before_merging=Rebase before merging
pulls.rebase_before_merging=병합 하기 전에 리베이스
pulls.commit_description=Commit Description
pulls.merge_pull_request=풀리퀘스트 머지
pulls.open_unmerged_pull_exists=`같은 리파지토리에서 같은 머지 정보로 만들어진 풀리퀘스트 (#%d) 가 이미 오픈 상태이고 머지를 기다리고 있기 때문에 다시 열기 작업을 할 수 없습니다.`
pulls.delete_branch=브랜치 삭제
@@ -743,7 +747,7 @@ settings.tracker_issue_style=외부 이슈 트래커 명명 스타일:
settings.tracker_issue_style.numeric=숫자
settings.tracker_issue_style.alphanumeric=문자 숫자
settings.tracker_url_format_desc=<code>{user} {repo} {index}</code> 사용자 명, 저장소 명, 이슈 인덱스를 사용하여 표시자를 사용할 수 있습니다.
settings.pulls_desc=끌어오기 요청을 공개적으로 기여받을 수 있도록 활성화합니다.
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
settings.pulls.ignore_whitespace=Ignore changes in whitespace
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
settings.danger_zone=위험 설정
@@ -857,6 +861,8 @@ settings.add_key_success=새로운 배포 키 '%s'가 성공적으로 추가 되
settings.deploy_key_deletion=배포 키 삭제
settings.deploy_key_deletion_desc=이 배포키를 삭제하면 이 저장소와 관련된 모든 접근 권한이 삭제됩니다. 계속 하시겠습니까?
settings.deploy_key_deletion_success=배포 키가 성공적으로 삭제되었습니다!
settings.description_desc=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
diff.browse_source=소스 검색
diff.parent=부모
@@ -1090,13 +1096,14 @@ repos.private=비공개
repos.watches=지켜보기
repos.stars=Stars
repos.issues=이슈
repos.size=Size
repos.size=크기
auths.auth_sources=Authentication Sources
auths.new=새로운 소스를 추가
auths.name=이름
auths.type=유형
auths.enabled=활성화됨
auths.default=Default
auths.updated=업데이트됨
auths.auth_type=인증 유형
auths.auth_name=인증 이름
@@ -1112,10 +1119,10 @@ auths.user_base=사용자 검색 기준
auths.user_dn=사용자 DN
auths.attribute_username=유저 명 속성
auths.attribute_username_placeholder=사용자 이름에 대한 로그인 폼 필드 값을 사용하려면 비워 둡니다.
auths.attribute_name=First Name Attribute
auths.attribute_name=첫번째 이름 속성
auths.attribute_surname=성씨 속성
auths.attribute_mail=이메일 속성
auths.verify_group_membership=Verify group membership
auths.verify_group_membership=그룹 구성원 자격을 확인
auths.group_search_base_dn=Group Search Base DN
auths.group_filter=Group Filter
auths.group_attribute_contain_user_list=Group Attribute Containing List of Users
@@ -1135,6 +1142,7 @@ auths.pam_service_name=PAM 서비스 명
auths.enable_auto_register=자동 등록을 활성화
auths.edit=인증 설정 편집
auths.activated=이 인증정보는 활성화되어있습니다.
auths.default_auth=This authentication is default login source
auths.new_success=새로운 인증 '%s'가 성공적으로 추가 되었습니다.
auths.update_success=인증 설정이 성공적으로 변경되었습니다.
auths.update=인증 설정 업데이트

View File

@@ -421,6 +421,8 @@ mirror_last_synced=Pēdējo reizi sinhronizēts
watchers=Novērotāji
stargazers=Zvaigžņdevēji
forks=Atdalītie repozitoriji
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
form.reach_limit_of_creation=Īpašnieks sasniedza maksimālu pieļaujamo (%d) izveidoto repozitoriju skaitu.
form.name_reserved=Repozitorija nosaukums '%s' ir rezervēts.
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Faila saturs ir mainījies kopš brīža, kad
editor.file_already_exists=Fails ar nosaukumu '%s' repozitorijā jau eksistē.
editor.no_changes_to_show=Nav izmaiņu, ko rādīt.
editor.fail_to_update_file=Neizdevās izmainīt/izveidot failu '%s', kļūda: %v
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
editor.add_subdir=Pievienot apakšdirektoriju...
editor.unable_to_upload_files=Neizdevās augšupielādēt failus uz direktoriju '%s', kļūda: %v
editor.upload_files_to_dir=Augšupielādēt failus uz direktoriju '%s'
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Šis izmaiņu pieprasījums nevar tikt automātiski
pulls.cannot_auto_merge_helper=Lūdzu sapludiniet manuāli, lai atrisinātu konfliktus.
pulls.create_merge_commit=Create a merge commit
pulls.rebase_before_merging=Rebase before merging
pulls.commit_description=Commit Description
pulls.merge_pull_request=Izmaiņu pieprasījuma sapludināšana
pulls.open_unmerged_pull_exists=`Jūs nevarat veikt atkārtotas atvēršanas darbību, jo jau eksistē izmaiņu pieprasījums (#%d) no šī repozitorija ar tādu pašu sapludināšanas informāciju un gaida sapludināšanu.`
pulls.delete_branch=Dzēst atzaru
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Ārējā problēmu reģistra nosaukumu stils:
settings.tracker_issue_style.numeric=Cipari
settings.tracker_issue_style.alphanumeric=Burti un cipari
settings.tracker_url_format_desc=Jūs varat izmantot <code>{user}{repo}{index}</code> lietotājvārdam, repozitorija nosaukumam un problēmas identifikātoram.
settings.pulls_desc=Iespējot izmaiņu pieprasījumus lai saņemtu publiskus ieguldījumus
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
settings.pulls.ignore_whitespace=Ignore changes in whitespace
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
settings.danger_zone=Bīstamā zona
@@ -856,6 +860,8 @@ settings.add_key_success=Izvietošanas atslēga '%s' tik veiksmīgi pievienota!
settings.deploy_key_deletion=Dzēst izvietošanas atslēgu
settings.deploy_key_deletion_desc=Dzēšot šo izvietošanas atslēgu tiks noņemta arī ar to saistītā piekļuve šim repozitorijam. Vai vēlaties turpināt?
settings.deploy_key_deletion_success=Izvietošanas atslēga tika veiksmīgi izdzēsta!
settings.description_desc=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
diff.browse_source=Pārlūkot izejas kodu
diff.parent=vecāks
@@ -1096,6 +1102,7 @@ auths.new=Pievienot jaunu avotu
auths.name=Nosaukums
auths.type=Veids
auths.enabled=Iespējota
auths.default=Default
auths.updated=Atjaunināta
auths.auth_type=Autentifikācijas tips
auths.auth_name=Autentifikācijas nosaukums
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAM servisa nosaukums
auths.enable_auto_register=Iespējot automātisko reģistrāciju
auths.edit=Labot autentifikācijas iestatījumus
auths.activated=Autentifikācija ir aktivizēta
auths.default_auth=This authentication is default login source
auths.new_success=Jauna autentifikācija '%s' tika veiksmīgi pievienota.
auths.update_success=Autentifikācijas iestatījumi tika veiksmīgi saglabāti.
auths.update=Mainīt autentifikācijas iestatījumus

View File

@@ -40,7 +40,7 @@ your_settings=Uw instellingen
activities=Activiteiten
pull_requests=Pull requests
issues=Kwesties
issues=Issues
cancel=Annuleren
@@ -119,7 +119,7 @@ sqlite3_not_available=Uw versie biedt geen ondersteuning voor SQLite3, download
invalid_db_setting=Uw database instellingen zijn niet correct: %v
invalid_repo_path=Repositorie basis map is niet correct: %v
run_user_not_match=De uitvoerende gebruiker is niet de huidig gebruiker: %s -> %s
smtp_host_missing_port=SMTP Host is missing port in address.
smtp_host_missing_port=SMTP-Host mist een poort in het adres.
invalid_smtp_from=SMTP-van-veld is niet geldig: %v
save_config_failed=Kan de configuratie niet opslaan: %v
invalid_admin_setting=Uw admin-instellingen zijn niet geldig: %v
@@ -152,7 +152,7 @@ social_register_hepler_msg=Heeft u al een account? Koppel nu!
disable_register_prompt=Sorry, registratie is uitgeschakeld. Neem contact op met de beheerder van deze site.
disable_register_mail=Sorry, bevestiging van registratie per e-mail is uitgeschakeld.
auth_source=Authentication Source
local=Local
local=Lokaal
remember_me=Onthoud mij
forgot_password=Wachtwoord vergeten
forget_password=Wachtwoord vergeten?
@@ -173,10 +173,10 @@ non_local_account=Niet lokale accounts mogen hun wachtwoord niet veranderen via
login_two_factor=Twee-traps authenticatie
login_two_factor_passcode=Authenticatie wachtwoord
login_two_factor_enter_recovery_code=Enter a two-factor recovery code
login_two_factor_recovery=Two-factor Recovery
login_two_factor_recovery_code=Recovery Code
login_two_factor_enter_passcode=Enter a two-factor passcode
login_two_factor_enter_recovery_code=Voer de two-factor herstelcode in
login_two_factor_recovery=Two-factor herstel
login_two_factor_recovery_code=Herstel code
login_two_factor_enter_passcode=Voer een two-factor wachtwoord in
login_two_factor_invalid_recovery_code=Recovery code has been used or does not valid.
[mail]
@@ -421,6 +421,8 @@ mirror_last_synced=Laatste synchronisatie
watchers=Volgers
stargazers=Stargazers
forks=Forks
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
form.reach_limit_of_creation=De eigenaar heeft maximale creatie limiet van %d repositories bereikt.
form.name_reserved=Repositorienaam '%s' is gereserveerd.
@@ -454,7 +456,7 @@ quick_guide=Snelstart gids
clone_this_repo=Kloon deze repositorie
create_new_repo_command=Maak een nieuwe repositorie aan vanaf de console
push_exist_repo=Push een bestaande repositorie vanaf de console
bare_message=This repository does not have any content yet.
bare_message=Deze repository bevat nog geen inhoud.
files=Bestanden
branch=Aftakking
@@ -462,7 +464,7 @@ tree=Boom
filter_branch_and_tag=Filter branch of tag
branches=Aftakkingen
tags=Labels
issues=Kwesties
issues=Issues
pulls=Pull-aanvragen
labels=Labels
milestones=Mijlpalen
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=File content has been changed since you starte
editor.file_already_exists=A file with name '%s' already exists in this repository.
editor.no_changes_to_show=Er zijn geen wijzigingen om weer te geven.
editor.fail_to_update_file=Failed to update/create file '%s' with error: %v
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
editor.add_subdir=Submap toevoegen...
editor.unable_to_upload_files=Failed to upload files to '%s' with error: %v
editor.upload_files_to_dir=Bestanden uploaden naar '%s'
@@ -562,7 +565,7 @@ issues.filter_milestone_no_select=Geen geselecteerde mijlpaal
issues.filter_assignee=Aangewezene
issues.filter_assginee_no_select=Geen geselecteerde verantwoordelijke
issues.filter_type=Type
issues.filter_type.all_issues=Alle kwesties
issues.filter_type.all_issues=Alle issues
issues.filter_type.assigned_to_you=Aan jou toegewezen
issues.filter_type.created_by_you=Aangemaakt door jou
issues.filter_type.mentioning_you=Vermelden jou
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Dit pull-request kan niet worden gemerged omdat er
pulls.cannot_auto_merge_helper=Gelieve beide versies manueel samen te voegen om de conflicten op te lossen.
pulls.create_merge_commit=Create a merge commit
pulls.rebase_before_merging=Rebase before merging
pulls.commit_description=Commit Description
pulls.merge_pull_request=Samenvoegen van pull verzoek
pulls.open_unmerged_pull_exists=U kan de bewerking 'heropenen' niet uitvoeren omdat er al een pull-aanvraag (#%d) is van dezelfde repository met dezelfde informatie. Voeg deze eerst samen.
pulls.delete_branch=Aftakking verwijderen
@@ -731,18 +735,18 @@ settings.allow_public_wiki_desc=Allow public access to wiki when repository is p
settings.use_external_wiki=Externe wiki gebruiken
settings.external_wiki_url=Externe wiki-URL
settings.external_wiki_url_desc=Bezoekers worden doorgestuurd naar de URL als ze op het tabblad klikken.
settings.issues_desc=Kwestietracker inschakelen
settings.use_internal_issue_tracker=Gebruik ingebouwde eenvoudige kwestietracker
settings.issues_desc=Issuetracker inschakelen
settings.use_internal_issue_tracker=Gebruik ingebouwde eenvoudige issuetracker
settings.allow_public_issues_desc=Allow public access to issues when repository is private
settings.use_external_issue_tracker=Externe issuetracker gebruiken
settings.external_tracker_url=URL externe kwestietracker
settings.external_tracker_url=URL externe issuetracker
settings.external_tracker_url_desc=Bezoekers worden doorgestuurd naar de URL als ze op het tabblad klikken.
settings.tracker_url_format=URL-formaat externe issuetracker
settings.tracker_issue_style=Naamgevingstijl externe kwestietracker:
settings.tracker_issue_style=Naamgevingstijl externe issuetracker:
settings.tracker_issue_style.numeric=Nummeriek
settings.tracker_issue_style.alphanumeric=Alfanummeriek
settings.tracker_url_format_desc=U kan de aanduidingen <code>{user} {repo} {index}</code> gebruiken voor de gebruikersnaam, de naam van de repository en de lijst van open tickets.
settings.pulls_desc=Schakel 'pull request' in om publieke bijdragen te mogelijk te maken
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
settings.pulls.ignore_whitespace=Ignore changes in whitespace
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
settings.danger_zone=Gevaren zone
@@ -856,6 +860,8 @@ settings.add_key_success=Nieuwe deploy sleutel '%s' werd succesvol toegevoegd!
settings.deploy_key_deletion=Verwijder deploy sleutel
settings.deploy_key_deletion_desc=Het verwijderen van deze deploy sleutel zal alle gerelateerde toegang verwijderen voor deze repositorie. Wilt u doorgaan?
settings.deploy_key_deletion_success=Deploy sleutel werd met succes verwijderd!
settings.description_desc=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
diff.browse_source=Bladeren bron
diff.parent=bovenliggende
@@ -1088,7 +1094,7 @@ repos.name=Naam
repos.private=Prive
repos.watches=Volgers
repos.stars=Sterren
repos.issues=Kwesties
repos.issues=Issues
repos.size=Size
auths.auth_sources=Authentication Sources
@@ -1096,6 +1102,7 @@ auths.new=Nieuwe bron toevoegen
auths.name=Naam
auths.type=Type
auths.enabled=Ingeschakeld
auths.default=Default
auths.updated=Bijgewerkt
auths.auth_type=Authenticatietype
auths.auth_name=Authenticatienaam
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAM servicenaam
auths.enable_auto_register=Activeer automatische registratie
auths.edit=Verificatie-instelling bewerken
auths.activated=Deze autorisatiemethode is geactiveerd
auths.default_auth=This authentication is default login source
auths.new_success=Nieuwe authenticatie '%s' werd toegevoegd.
auths.update_success=Authenticatie instellingen zijn succesvol gewijzigd.
auths.update=Authenticatie-instellingen bijwerken
@@ -1292,8 +1300,8 @@ commit_repo=push update naar <a href="%[1]s/src/%[2]s">%[3]s</a> in <a href="%[1
compare_commits=Toon vergelijking voor deze %d commits
transfer_repo=repositorie verplaatst naar <code>%s</code> naar <a href="%s">%s</a>
create_issue=`opende issue in <a href="%s/issues/%s">%s#%[2]s</a>`
close_issue=`sloot kwestie <a href="%s/issues/%s">%s#%[2]s</a>`
reopen_issue=`heropende kwestie <a href="%s/issues/%s">%s#%[2]s</a>`
close_issue=`gesloten issue <a href="%s/issues/%s">%s#%[2]s</a>`
reopen_issue=`heropende issue <a href="%s/issues/%s">%s#%[2]s</a>`
comment_issue=`reactie op issue <a href="%s/issues/%s">%s#%[2]s</a>`
create_pull_request=`maakte pull request <a href="%s/issues/%s">%s#%[2]s</a>`
close_pull_request=`sloot pull request <a href="%s/issues/%s">%s#%[2]s</a>`

View File

@@ -151,8 +151,8 @@ register_hepler_msg=Masz już konto? Zaloguj się teraz!
social_register_hepler_msg=Masz już konto? Powiąż je teraz!
disable_register_prompt=Przepraszamy rejestracja została wyłączona. Prosimy o kontakt z administratorem serwisu.
disable_register_mail=Przepraszamy, potwierdzenia rejestracji zostały wyłączone przez administratora.
auth_source=Authentication Source
local=Local
auth_source=Źródło uwierzytelniania
local=Lokalne
remember_me=Zapamiętaj mnie
forgot_password=Zapomniałem hasła
forget_password=Zapomniałeś hasła?
@@ -231,7 +231,7 @@ org_name_been_taken=Nazwa organizacji jest już zajęta.
team_name_been_taken=Nazwa zespołu jest już zajęta.
email_been_used=Adres e-mail jest już zarejestrowany.
username_password_incorrect=Nazwa użytkownika lub hasło nie jest prawidłowe.
auth_source_mismatch=The authentication source selected is not associated with the user.
auth_source_mismatch=Wybrane źródło uwierzytelniania nie jest związane z użytkownikiem.
enterred_invalid_repo_name=Upewnij się, że wprowadzona nazwa repozytorium jest poprawna.
enterred_invalid_owner_name=Upewnij się, że nazwa właściciela repozytorium jest poprawna.
enterred_invalid_password=Proszę upewnij się, że wprowadzono hasło jest poprawne.
@@ -351,7 +351,7 @@ two_factor_or_enter_secret=Lub wprowadź sekret:
two_factor_then_enter_passcode=Następnie wprowadź kod dostępu:
two_factor_verify=Weryfikuj
two_factor_invalid_passcode=Wprowadzony kod nie jest prawidłowy, spróbuj ponownie!
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
two_factor_reused_passcode=Ten kod jest już używany, spróbuj ponownie!
two_factor_enable_error=Włączenie dwuetapowego uwierzytelniania nie powiodło się: %v
two_factor_enable_success=Uwierzytelnianie dwuetapowe Twojego konta zostało włączone pomyślnie!
two_factor_recovery_codes_title=Kody odzyskiwania uwierzytelniania dwuetapowego
@@ -421,6 +421,8 @@ mirror_last_synced=Ostatnia synchronizacja
watchers=Obserwujący
stargazers=Polubienia
forks=Forki
repo_description_helper=Opis repozytorium. Maksymalnie 512 znaków.
repo_description_length=Dostępne znaki
form.reach_limit_of_creation=Właściciel osiągnął limit maksymalnej ilości repozytoriów %d.
form.name_reserved=Nazwa repozytorium „%s” jest zarezerwowana.
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Zawartość pliku została zmieniona od rozpoc
editor.file_already_exists=Nazwa pliku '%s' już istnieje w tym repozytorium.
editor.no_changes_to_show=Brak zmian do pokazania.
editor.fail_to_update_file=Tworzenie/aktualizacja pliku '%s' nie powiodła się z błędem: %v
editor.fail_to_delete_file=Nie można usunąć pliku '%s' z powodu błędu: %v
editor.add_subdir=Dodaj podkatalog...
editor.unable_to_upload_files=Wysyłanie plików do '%s' nie powiodło się z błędem: %v
editor.upload_files_to_dir=Prześlij pliki do '%s'
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Pull request nie może być automatycznie scalony z
pulls.cannot_auto_merge_helper=Proszę scalić ręcznie, aby rozwiązać konflikty.
pulls.create_merge_commit=Utwórz scalający commit
pulls.rebase_before_merging=Rebase przed scaleniem
pulls.commit_description=Opis commitu
pulls.merge_pull_request=Scal Pull Request
pulls.open_unmerged_pull_exists=`Nie można otworzyć ponownie ponieważ już istnieje gotowy do scalenia pull request (#%d) z tego samego repozytorium z tymi samymi informacjami.`
pulls.delete_branch=Usuń gałąź
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Styl nazw zewnętrznego systemu zgłaszania problem
settings.tracker_issue_style.numeric=Numeryczny
settings.tracker_issue_style.alphanumeric=Alfanumeryczne
settings.tracker_url_format_desc=Symbole zastępcze <code>{user} {repo} {index}</code> mogą być użyte dla nazwy użytkownika, nazwy repozytorium i numeru problemu.
settings.pulls_desc=Włącz obsługę pull request, aby akceptować publiczny wkład
settings.pulls_desc=Włącz żądania pobierania, aby akceptować wkład pomiędzy repozytoriami i gałęziami
settings.pulls.ignore_whitespace=Ignoruj zmiany w białych znakach
settings.pulls.allow_rebase_merge=Zezwalaj na użycie rebase do scalenia commitów
settings.danger_zone=Strefa niebezpieczeństwa
@@ -856,6 +860,8 @@ settings.add_key_success=Nowy klucz wdrożenia '%s' został pomyślnie dodany!
settings.deploy_key_deletion=Utwórz klucz wdrożenia
settings.deploy_key_deletion_desc=Usunięcie tego klucza wdrożenia spowoduje usunięcie powiązanego dostępu do tego repozytorium. Czy chcesz kontynuować?
settings.deploy_key_deletion_success=Klucz wdrożenia został pomyślnie usunięty!
settings.description_desc=Opis repozytorium. Maksymalnie 512 znaków.
settings.description_length=Dostępne znaki
diff.browse_source=Przeglądaj źródła
diff.parent=rodzic
@@ -1091,11 +1097,12 @@ repos.stars=Polubienia
repos.issues=Problemy
repos.size=Rozmiar
auths.auth_sources=Authentication Sources
auths.auth_sources=Źródła uwierzytelniania
auths.new=Dodaj nowe źródło
auths.name=Nazwa
auths.type=Typ
auths.enabled=Włączono
auths.default=Domyślne
auths.updated=Zaktualizowano
auths.auth_type=Typ uwierzytelniania
auths.auth_name=Nazwa uwierzytelniania
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Nazwa usługi PAM
auths.enable_auto_register=Włącz automatyczną rejestrację
auths.edit=Edytuj ustawienia uwierzytelniania
auths.activated=To uwierzytelnienie zostało aktywowane
auths.default_auth=To uwierzytelnianie jest domyślnym źródłem logowania
auths.new_success=Pomyślnie dodano nowe uwierzytelnianie '%s'.
auths.update_success=Ustawienia uwierzytelnienia zostały zaktualizowane pomyślnie.
auths.update=Aktualizuj ustawienia uwierzytelniania
@@ -1166,7 +1174,7 @@ config.ssh_domain=Domena
config.ssh_port=Port
config.ssh_listen_port=Port nasłuchu
config.ssh_root_path=Ścieżka katalogu głównego
config.ssh_rewrite_authorized_keys_at_start=Rewrite authorized_keys At Start
config.ssh_rewrite_authorized_keys_at_start=Przepisz authorized_keys przy uruchomieniu
config.ssh_key_test_path=Ścieżka klucza testowego
config.ssh_keygen_path=Ścieżka generatora ('ssh-keygen')
config.ssh_minimum_key_size_check=Sprawdzanie minimalnej długości klucza
@@ -1304,7 +1312,7 @@ delete_branch=usunął gałąź <code>%[2]s</code> at <a href="%[1]s">%[3]s</a>
push_tag=taguje <a href="%s/src/%s">%[2]s</a> w <a href="%[1]s">%[3]s</a>
delete_tag=usunięty tag <code>%[2]s</code> % <a href="%[1]s">[3]s</a>
fork_repo=rozwidlone repozytorium do <a href="%s"> %s</a>
mirror_sync_push=synced commits to <a href="%[1]s/src/%[2]s">%[3]s</a> at <a href="%[1]s">%[4]s</a> from mirror
mirror_sync_push=zsynchronizowano commit z <a href="%[1]s/src/%[2]s">%[3]s</a> na <a href="%[1]s">%[4]s</a> z kopii lustrzanej
mirror_sync_create=synced new reference <a href="%s/src/%s">%[2]s</a> to <a href="%[1]s">%[3]s</a> from mirror
mirror_sync_delete=synced and deleted reference <code>%[2]s</code> at <a href="%[1]s">%[3]s</a> from mirror

View File

@@ -421,6 +421,8 @@ mirror_last_synced=Última sincronização
watchers=Observadores
stargazers=Usuários que estrelaram
forks=Forks
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
form.reach_limit_of_creation=O proprietário atingiu o limite máximo de criação de repositórios de %d.
form.name_reserved=O nome de repositório '%s' não pode ser usado.
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=O conteúdo do arquivo mudou desde que você c
editor.file_already_exists=Um arquivo com nome '%s' já existe neste repositório.
editor.no_changes_to_show=Nenhuma alteração a mostrar.
editor.fail_to_update_file=Houve erro ao criar ou atualizar arquivo '%s': %v
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
editor.add_subdir=Adicionar o subdiretório...
editor.unable_to_upload_files=Houve erro ao fazer upload de arquivos para '%s': %v
editor.upload_files_to_dir=Enviar arquivos para '%s'
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=O merge deste Pull Request não pode ser aplicado a
pulls.cannot_auto_merge_helper=Por favor, aplique o merge manualmente para resolver os conflitos.
pulls.create_merge_commit=Criar commit de um merge
pulls.rebase_before_merging=Rebase before merging
pulls.commit_description=Commit Description
pulls.merge_pull_request=Solicitação de merge de Pull Request
pulls.open_unmerged_pull_exists=`Você não pode executar a operação de reabrir porque já existe um Pull request aberto (#%d) do mesmo repositório com as mesmas informações de merge e está esperando pelo merge.`
pulls.delete_branch=Excluir Branch
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Estilo de nome de issue tracker externo:
settings.tracker_issue_style.numeric=Numérico
settings.tracker_issue_style.alphanumeric=Alfanumérico
settings.tracker_url_format_desc=Você pode usar o espaço reservado <code>{user} {repo} {index}</code> para o nome do usuário, índice de nome e a questão do repositório.
settings.pulls_desc=Habilitar Pull Requests para aceitar contribuições públicas
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
settings.pulls.ignore_whitespace=Ignorar alterações em espaço em branco
settings.pulls.allow_rebase_merge=Permitir rebase para commits via merge
settings.danger_zone=Zona de perigo
@@ -856,6 +860,8 @@ settings.add_key_success=A nova chave de Deploy '%s' foi adicionada com sucesso!
settings.deploy_key_deletion=Exclusão de chave de Deploy
settings.deploy_key_deletion_desc=Excluir esta chave de Deploy removerá permissões de acesso a este repositório. Quer mesmo continuar?
settings.deploy_key_deletion_success=Chave de Deploy excluída com sucesso!
settings.description_desc=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
diff.browse_source=Ver código fonte
diff.parent=pai
@@ -1096,6 +1102,7 @@ auths.new=Adicionar nova fonte
auths.name=Nome
auths.type=Tipo
auths.enabled=Habilitado
auths.default=Default
auths.updated=Atualizado
auths.auth_type=Tipo de autenticação
auths.auth_name=Nome da autenticação
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Nome de Serviço PAM
auths.enable_auto_register=Habilitar Registro Automático
auths.edit=Editar a configuração de autenticação
auths.activated=Esta autenticação foi ativada
auths.default_auth=This authentication is default login source
auths.new_success=Nova autenticação '%s' foi adicionada com sucesso.
auths.update_success=A configuração da autenticação foi atualizada com sucesso.
auths.update=Atualizar a configuração da autenticação

1345
conf/locale/locale_pt-PT.ini Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -151,8 +151,8 @@ register_hepler_msg=Уже есть аккаунт? Авторизуйтесь!
social_register_hepler_msg=Уже есть учетная запись? Свяжите ее с соцсетью!
disable_register_prompt=Извините, возможность регистрации отключена. Пожалуйста, свяжитесь с администратором сайта.
disable_register_mail=К сожалению подтверждение регистрации по почте отключено.
auth_source=Authentication Source
local=Local
auth_source=Тип аутентификации
local=Локальный
remember_me=Запомнить меня
forgot_password=Забыли пароль
forget_password=Забыли пароль?
@@ -231,7 +231,7 @@ org_name_been_taken=Название организации занято.
team_name_been_taken=Название команды занято.
email_been_used=Адрес электронной почты уже используется.
username_password_incorrect=Имя пользователя или пароль не правильный.
auth_source_mismatch=The authentication source selected is not associated with the user.
auth_source_mismatch=Выбранный источник проверки подлинности не связан с пользователем.
enterred_invalid_repo_name=Пожалуйста, убедитесь, что введено правильное имя репозитория.
enterred_invalid_owner_name=Убедитесь, что введенное имя владельца верное.
enterred_invalid_password=Убедитесь, что введенный пароль верен.
@@ -351,7 +351,7 @@ two_factor_or_enter_secret=Или введите кодовое слово:
two_factor_then_enter_passcode=Затем введите пароль:
two_factor_verify=Проверить
two_factor_invalid_passcode=Введенные пароли не совпадают; пожалуйста, повторите попытку!
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
two_factor_reused_passcode=Введенный вами пароль уже используется, пожалуйста, попробуйте другой!
two_factor_enable_error=Ошибка активация двухфакторной аутентификации: %v
two_factor_enable_success=Двухфакторная аутентификация активирована для вашей учетной записи!
two_factor_recovery_codes_title=Коды восстановления для двухфакторная аутентификации
@@ -421,6 +421,8 @@ mirror_last_synced=Последняя синхронизация
watchers=Наблюдатели
stargazers=Звездочеты
forks=Ответвления
repo_description_helper=Описание репозитория. Максимальная длина 512 символов.
repo_description_length=Доступные символы
form.reach_limit_of_creation=У владельца достигнут максимальный предел в %d создаваемых репозиториев.
form.name_reserved=Имя репозитория '%s' зарезервировано.
@@ -462,7 +464,7 @@ tree=Дерево
filter_branch_and_tag=Фильтр по ветке или тегу
branches=Ветки
tags=Метки
issues=Обсуждения
issues=Задачи
pulls=Запросы на слияние
labels=Метки
milestones=Этапы
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Содержимое файла изменил
editor.file_already_exists=Файл с именем «%s» уже существует в этом репозитории.
editor.no_changes_to_show=Нет изменений.
editor.fail_to_update_file=Не удалось обновить/создать файл «%s» из-за ошибки: %v
editor.fail_to_delete_file=Не удалось удалить файл «%s» из-за ошибки: %v
editor.add_subdir=Добавьте подкаталог...
editor.unable_to_upload_files=Не удалось загрузить файлы в «%s» из-за ошибки: %v
editor.upload_files_to_dir=Загрузить файлы '%s'
@@ -535,7 +538,7 @@ commits.newer=Новее
issues.new=Новая задача
issues.new.labels=Метки
issues.new.no_label=Нет меток
issues.new.clear_labels=Отчистить метки
issues.new.clear_labels=Очистить метки
issues.new.milestone=Этап
issues.new.no_milestone=Нет этапа
issues.new.clear_milestone=Очистить этап
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Этот запрос на слияние не мо
pulls.cannot_auto_merge_helper=Пожалуйста, совершите слияние вручную для урегулирования конфликтов.
pulls.create_merge_commit=Создать коммит на слияние
pulls.rebase_before_merging=Выполнить rebase перед слиянием
pulls.commit_description=Описание коммита
pulls.merge_pull_request=Слить пулл-реквест
pulls.open_unmerged_pull_exists=`Вы не можете снова открыть, поскольку уже существует запрос на слияние (#%d) из того же репозитория с той же информацией о слиянии и ожидающий слияния. `
pulls.delete_branch=Удалить ветку
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Стиль Именования Внешней Си
settings.tracker_issue_style.numeric=Цифровой
settings.tracker_issue_style.alphanumeric=Буквенноцифровой
settings.tracker_url_format_desc=Вы можете использовать шаблон <code>{user} {repo} {index}</code> для имени пользователя, репозитория и номера задачи.
settings.pulls_desc=Включить публичные запросы на слияние
settings.pulls_desc=Разрешить пул-запросы для принятия изменений между репозиториями и ветками
settings.pulls.ignore_whitespace=Игнорировать изменения в пробельных символах
settings.pulls.allow_rebase_merge=Разрешить rebase-слияние
settings.danger_zone=Опасная зона
@@ -821,7 +825,7 @@ settings.event_fork=Ответвить
settings.event_fork_desc=Репозиторий склонирован
settings.event_push=Push
settings.event_push_desc=Push в репозиторий
settings.event_issues=Вопросы
settings.event_issues=Задачи
settings.event_issues_desc=Задача изменена
settings.event_pull_request=Запросы на слияние
settings.event_pull_request_desc=Запрос слияния открыт, закрыт, переоткрыт, изменён, назначен, снят, метка обновлена, метка убрана, добавлен промежуточный этап, убран промежуточный этап или синхронизирован.
@@ -856,6 +860,8 @@ settings.add_key_success=Новый ключ развертывания '%s' у
settings.deploy_key_deletion=Удалить ключ развертывания
settings.deploy_key_deletion_desc=Удаление ключа развертывания приведет к удалению всех связанных прав доступа к репозиторию. Вы хотите продолжить?
settings.deploy_key_deletion_success=Ключ развертывания успешно удален!
settings.description_desc=Описание репозитория. Максимальная длина 512 символов.
settings.description_length=Доступные символы
diff.browse_source=Просмотр исходного кода
diff.parent=Родитель
@@ -1091,11 +1097,12 @@ repos.stars=В избранном
repos.issues=Задачи
repos.size=Размер
auths.auth_sources=Authentication Sources
auths.auth_sources=Типы аутентификации
auths.new=Добавить новый источник
auths.name=Имя
auths.type=Тип
auths.enabled=Включено
auths.default=По умолчанию
auths.updated=Обновлено
auths.auth_type=Тип аутентификации
auths.auth_name=Имя аутентификации
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Имя службы PAM
auths.enable_auto_register=Включить автоматическую регистрацию
auths.edit=Изменить параметры канала аутентификации
auths.activated=Эта аутентификация активирована
auths.default_auth=Эта аутентификация является источником входа по умолчанию
auths.new_success=Новый канал аутентификации '%s' успешно создан.
auths.update_success=Настройки канала аутентификации успешно сохранены.
auths.update=Обновить параметры аутентификации
@@ -1304,9 +1312,9 @@ delete_branch=удалил ветку <code>%[2]s</code> в <a href="%[1]s">%[3]
push_tag=запушил(а) метку <a href="%s/src/%s">%[2]s</a> в <a href="%[1]s">%[3]s</a>
delete_tag=удален тег <code>%[2]s</code> at <a href="%[1]s">%[3]s</a>
fork_repo=склонировать репозиторий в <a href="%s">%s</a>
mirror_sync_push=synced commits to <a href="%[1]s/src/%[2]s">%[3]s</a> at <a href="%[1]s">%[4]s</a> from mirror
mirror_sync_create=synced new reference <a href="%s/src/%s">%[2]s</a> to <a href="%[1]s">%[3]s</a> from mirror
mirror_sync_delete=synced and deleted reference <code>%[2]s</code> at <a href="%[1]s">%[3]s</a> from mirror
mirror_sync_push=синхронизированные коммиты с <a href="%[1]s/src/%[2]s">%[3]s</a> на <a href="%[1]s">%[4]s</a> из зеркала
mirror_sync_create=синхронизированные новые ссылки <a href="%s/src/%s">%[2]s</a> к <a href="%[1]s">%[3]s</a> из зеркала
mirror_sync_delete=синхронизированные и удаленные ссылки <code>%[2]s</code> на <a href="%[1]s">%[3]s</a> из зеркала
[tool]
ago=назад
@@ -1319,11 +1327,11 @@ now=сейчас
1w=1 неделя %s
1mon=1 месяц %s
1y=1 год %s
seconds=секунд %[2]s: %[1]d
seconds=%d секунд %s
minutes=%d минут %s
hours=%d часов %s
days=%d дней %s
weeks=недель %[2]s: %[1]d
weeks=%d недель %s
months=%d месяцев %s
years=%d лет %s
raw_seconds=секунд

View File

@@ -151,8 +151,8 @@ register_hepler_msg=Máte už účet? Prihláste sa teraz!
social_register_hepler_msg=Máte už účet? Bindovať teraz!
disable_register_prompt=Ospravedlňujeme sa, ale registrácia bola vypnutá. Obráťte sa na administrátora stránky.
disable_register_mail=Ospravedlňujeme sa, potvrdenie registračného e-mailu bolo vypnuté.
auth_source=Authentication Source
local=Local
auth_source=Zdroj overovania
local=Lokálny
remember_me=Zapamätať prihlásenie
forgot_password=Zabudnuté heslo
forget_password=Zabudli ste heslo?
@@ -231,7 +231,7 @@ org_name_been_taken=Názov organizácie už bol použitý.
team_name_been_taken=Názov tímu už bol použitý.
email_been_used=E-mailová adresa už bola použitá.
username_password_incorrect=Používateľské meno alebo heslo nie je správne.
auth_source_mismatch=The authentication source selected is not associated with the user.
auth_source_mismatch=Vybraný zdroj overenia nieje prepojený s užívateľom.
enterred_invalid_repo_name=Uistite sa prosím, že názov repozitára, ktorý ste zadali je správny.
enterred_invalid_owner_name=Uistite sa prosím, že meno vlastníka, ktoré ste zadali je správne.
enterred_invalid_password=Uistite sa prosím, že heslo ktoré ste zadali je správne.
@@ -351,7 +351,7 @@ two_factor_or_enter_secret=Alebo zadajte tajný kód:
two_factor_then_enter_passcode=Potom zadajte prístupový kód:
two_factor_verify=Overiť
two_factor_invalid_passcode=Zadaný prístupový kód nie je platný, prosím, skúste to znova!
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
two_factor_reused_passcode=Kód, ktorý ste zadali už bol použitý. Prosím, zkúste iný!
two_factor_enable_error=Povolenie dvojfaktorového overenia zlyhalo: %v
two_factor_enable_success=Dvojfaktorové overenie bolo pre Váš účet povolené!
two_factor_recovery_codes_title=Obnovovacie kódy dvojfaktorového overenia
@@ -421,6 +421,8 @@ mirror_last_synced=Naposledy synchronizované
watchers=Pozorovatelia
stargazers=Sledujúci
forks=Forky
repo_description_helper=Popis repozitára. Maximálna dĺžka 512 znakov.
repo_description_length=Dostupné znaky
form.reach_limit_of_creation=Vlastník dosiahol maximálneho počtu %d vytvorených repozitárov.
form.name_reserved=Repozitár s názvom '%s' je vyhradený.
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Obsah súboru sa zmenil od začiatku úprav. <
editor.file_already_exists=Súbor '%s' už v tomto repozitári existuje.
editor.no_changes_to_show=Žiadne zmeny k zobrazení.
editor.fail_to_update_file=Vytvorenie alebo zmena súboru '%s' skončila chybou: '%v'
editor.fail_to_delete_file=Vymazanie súboru '%s' skončilo chybou: '%v'
editor.add_subdir=Pridať podadresár...
editor.unable_to_upload_files=Nepodarilo sa nahrať súbor do '%s'. Chyba: %v
editor.upload_files_to_dir=Nahrať súbory do '%s'
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Tento pull request nemôže byť automaticky zlúč
pulls.cannot_auto_merge_helper=Prosím zlúčte manuálne pre vyriešenie konfliktov.
pulls.create_merge_commit=Vytvoriť zlúčenú revíziu
pulls.rebase_before_merging=Rebase pred zlúčením
pulls.commit_description=Popis Commitu
pulls.merge_pull_request=Zlúčiť pull request
pulls.open_unmerged_pull_exists=`Nemôžete znovu otvoriť požiadavku na stiahnutie, pretože požiadavka na stiahnutie z rovnakého repozitára s rovnakými informáciami pre zlúčenie už existuje (#%d) a čaká na zlúčenie.`
pulls.delete_branch=Odstrániť vetvu
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Štýl pomenovania úloh v externom systéme úloh:
settings.tracker_issue_style.numeric=Numerická
settings.tracker_issue_style.alphanumeric=Alfanumerické
settings.tracker_url_format_desc=Môžete použiť zástupné výrazy <code>{user} {repo} {index}</code> pre užívateľské meno, názov repozitára a číslo úlohy.
settings.pulls_desc=Povoliť požiadavky na stiahnutie, aby mohli byť príspevky verejnosti akceptované
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
settings.pulls.ignore_whitespace=Ignorovať zmeny v prázdnom priestore
settings.pulls.allow_rebase_merge=Povoliť použitie rebase pre zlúčenie revízií
settings.danger_zone=Riziková zóna
@@ -765,7 +769,7 @@ settings.wiki_deletion_success=Data Wiki tohoto repozitára boli zmazané.
settings.delete=Odstrániť tento repozitár
settings.delete_desc=Hneď ako odstránite repozitár, nie je možné vrátiť sa späť, Buďte si prosím istý.
settings.delete_notices_1=- Tuto operáciu <strong>nie je možné</strong> vrátiť.
settings.delete_notices_2=- This operation will permanently delete everything in this repository, including Git data, issues, comments and collaborator access.
settings.delete_notices_2=Táto akcia nenávratne vymaže všetko v tomto repozitári, vrátane dát Gitu, úkolov, komentárov a prístupov spolupracovníkov.
settings.delete_notices_fork_1=- Po odstránení sa všetky forky stanú nezávislé.
settings.deletion_success=Repozitár bol odstránený!
settings.update_settings_success=Možnosti repozitára boli zmenené.
@@ -856,6 +860,8 @@ settings.add_key_success=Nový deploy kľúč '%s' bol úspešne pridaný!
settings.deploy_key_deletion=Odstrániť deploy kľúč
settings.deploy_key_deletion_desc=Odstránením tohto deploy kľúča sa odstránia všetky súvisiace prístupy k tomuto repozitáru. Chcete pokračovať?
settings.deploy_key_deletion_success=Deploy kľúč bol úspešne odstránený!
settings.description_desc=Popis repozitára. Maximálna dĺžka 512 znakov.
settings.description_length=Dostupné znaky
diff.browse_source=Prechádzať zdrojové kódy
diff.parent=rodič
@@ -1091,11 +1097,12 @@ repos.stars=Hviezdy
repos.issues=Issues
repos.size=Veľkosť
auths.auth_sources=Authentication Sources
auths.auth_sources=Zdroje overenia
auths.new=Pridať nový zdroj
auths.name=Názov
auths.type=Typ
auths.enabled=Povolené
auths.default=Predvolený
auths.updated=Aktualizované
auths.auth_type=Typ overenia
auths.auth_name=Názov overenia
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Názov služby PAM
auths.enable_auto_register=Povoliť auto registráciu
auths.edit=Upraviť nastavenie overovania
auths.activated=Tento spôsob overovania je aktívny
auths.default_auth=This authentication is default login source
auths.new_success=Nový spôsob overovania '%s' bol pridaný.
auths.update_success=Nastavenie overovania bolo zmenené.
auths.update=Zmeniť nastavenie overovania
@@ -1166,7 +1174,7 @@ config.ssh_domain=Doména
config.ssh_port=Port
config.ssh_listen_port=Port pre poslúchanie
config.ssh_root_path=Koreňová cesta
config.ssh_rewrite_authorized_keys_at_start=Rewrite authorized_keys At Start
config.ssh_rewrite_authorized_keys_at_start=Prepísať authorized_keys pri štarte
config.ssh_key_test_path=Cesta testu kľúčov
config.ssh_keygen_path=Cesta ku generátoru kľúčov ('ssh-keygen')
config.ssh_minimum_key_size_check=Kontrola minimálnej veľkosti kľúčov

View File

@@ -51,7 +51,7 @@ docker_helper=Ако покрећете Gogs унутар Docker, молимо
requite_db_desc=Gogs захтева MySQL, PostgreSQL, SQLite3, MSSQL или TiDB.
db_title=Подешавања базе
db_type=Тип базе података
host=Власник
host=Домаћин
user=Корисник
password=Лозинка
db_name=Назив базе података
@@ -151,8 +151,8 @@ register_hepler_msg=Већ имате налог? Пријавите се!
social_register_hepler_msg=Већ имате налог? Повежите се преко социалне мреже!
disable_register_prompt=Извините регистрација је онемогућено. Молимо вас, контактирајте администратора.
disable_register_mail=Извините, потврда путем поште је онемогућено.
auth_source=Authentication Source
local=Local
auth_source=Извор аутентикације
local=Локално
remember_me=Запамти ме
forgot_password=Заборављена лозинка
forget_password=Заборавили сте лозинку?
@@ -231,7 +231,7 @@ org_name_been_taken=Име организације је већ заузето.
team_name_been_taken=Име екипе је већ заузето.
email_been_used=Адреса е-поште се већ користи.
username_password_incorrect=Корисничко име или лозинка није исправна.
auth_source_mismatch=The authentication source selected is not associated with the user.
auth_source_mismatch=Изабрани извор потврде идентитета није повезан са корисником.
enterred_invalid_repo_name=Молимо вас, проверите да је име спремишта тачно унешено.
enterred_invalid_owner_name=Молимо вас проверите да сте добро унели име власника.
enterred_invalid_password=Молимо вас проверите да сте добро унели лозинку.
@@ -351,7 +351,7 @@ two_factor_or_enter_secret=Или унесите тајну шифру:
two_factor_then_enter_passcode=Па унесите шифру:
two_factor_verify=Проверити
two_factor_invalid_passcode=Шифрa коју сте унели није важећа, молим бас пробајте поново!
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
two_factor_reused_passcode=Љифром који сте унијели се већ користи, молим те пробај опет!
two_factor_enable_error=Активација двоструке аутентификације није успела: %v
two_factor_enable_success=Двострука аутентификација је успешно активирана за ваш налог!
two_factor_recovery_codes_title=Шифра за опоравак за двоструку аутентификацију
@@ -421,6 +421,8 @@ mirror_last_synced=Задње синхронизовано
watchers=Посматрачи
stargazers=Пратиоци
forks=Огранци
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
form.reach_limit_of_creation=Власник има максимум број %d спремишта.
form.name_reserved=Име спремишта '%s' је резервирано.
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Садржај датотеке је пром
editor.file_already_exists=Датотека са именом '%s' већ постоји у овом спремишту.
editor.no_changes_to_show=Нема никаквих промена.
editor.fail_to_update_file=Промена над '%s' није успело са грешком: %v
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
editor.add_subdir=Додај поддиректоријуми...
editor.unable_to_upload_files=Учитање датотеке '%s' није успело са грешкном: %v
editor.upload_files_to_dir=Пошаљи датотеке на '%s'
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Овај захтев за спајање не мо
pulls.cannot_auto_merge_helper=Молимо вас, обавите спајање ручно да би сте разрешили сукобе.
pulls.create_merge_commit=Направите спајање
pulls.rebase_before_merging=Поврат пре обједињавања
pulls.commit_description=Commit Description
pulls.merge_pull_request=Обави спајање
pulls.open_unmerged_pull_exists=`Неможете поново отворити јер већ постоји захтев за спајање (#%d) из истог спремишта са истим информацијама о спајању и чека спајање.`
pulls.delete_branch=Избришите грану
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Стил именовања на спољном с
settings.tracker_issue_style.numeric=Нумерично
settings.tracker_issue_style.alphanumeric=Алфанумерично
settings.tracker_url_format_desc=Можете да користите шаблон <code>{user} {repo} {index}</code> за корисничко име, спремишта и задатака.
settings.pulls_desc=Омогући систем захтева за спајање да би сте преузели јавних доприноса
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
settings.pulls.ignore_whitespace=Занемарите промене у размаку
settings.pulls.allow_rebase_merge=Дозволи употребу поврата да обједините обавезе
settings.danger_zone=Опасна зона
@@ -856,6 +860,8 @@ settings.add_key_success=Нови кључ распоређивање '%s' је
settings.deploy_key_deletion=Уклони кључ распоређивањa
settings.deploy_key_deletion_desc=Брисање овог кључа за распоређивање ће довести до укидање приступ на овом спремишту. Да ли желите да наставите?
settings.deploy_key_deletion_success=Кључ за распоређивање је успешно обрисан!
settings.description_desc=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
diff.browse_source=Преглед изворни кода
diff.parent=родитељ
@@ -1091,11 +1097,12 @@ repos.stars=Фаворити
repos.issues=Задаци
repos.size=Величина
auths.auth_sources=Authentication Sources
auths.auth_sources=Извори аутентичности
auths.new=Додај нови извор
auths.name=Име
auths.type=Тип
auths.enabled=Омогућено
auths.default=Default
auths.updated=Ажурирано
auths.auth_type=Врста провере аутентичности
auths.auth_name=Име провере аутентичности
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Назив PAM сервиса
auths.enable_auto_register=Омогући аутоматску регистрацију
auths.edit=Промените подешавања канала аутентикације
auths.activated=Овај канал аутентикације је активан
auths.default_auth=This authentication is default login source
auths.new_success=Нови канал аутентикације '%s' је успешно креиран.
auths.update_success=Подешавања канала аутентикације су успешно ажурирана.
auths.update=Ажурирај подешавања аутентикације
@@ -1304,9 +1312,9 @@ delete_branch=избрисана филијалa <code>%[2]s</code> at <a href="
push_tag=извршује push са ознаком <a href="%s/src/%s">%[2]s</a> на <a href="%[1]s">%[3]s</a>
delete_tag=избрисана ознака <code>%[2]s</code> at <a href="%[1]s">%[3]s</a>
fork_repo=отворио спремиште <a href="%s">%s</a>
mirror_sync_push=synced commits to <a href="%[1]s/src/%[2]s">%[3]s</a> at <a href="%[1]s">%[4]s</a> from mirror
mirror_sync_create=synced new reference <a href="%s/src/%s">%[2]s</a> to <a href="%[1]s">%[3]s</a> from mirror
mirror_sync_delete=synced and deleted reference <code>%[2]s</code> at <a href="%[1]s">%[3]s</a> from mirror
mirror_sync_push=синхронизује се <a href="%[1]s/src/%[2]s">%[3]s</a> у <a href="%[1]s">%[4]s</a> из огледала
mirror_sync_create=синхронизована нова референца <a href="%s/src/%s">%[2]s</a> y <a href="%[1]s">%[3]s</a> из огледала
mirror_sync_delete=синхронизоване и избрисане референце <code>%[2]s</code> y <a href="%[1]s">%[3]s</a> из огледала
[tool]
ago=пре

View File

@@ -152,7 +152,7 @@ social_register_hepler_msg=Har du redan ett konto? Anslut det nu!
disable_register_prompt=Tyvärr är användarregistreringen inaktiverad. Vänligen kontakta din administratör.
disable_register_mail=Tyvärr så är registreringsbekräftelemailutskick inaktiverat.
auth_source=Authentication Source
local=Local
local=Lokal
remember_me=Kom ihåg mig
forgot_password=Glömt lösenord
forget_password=Glömt lösenordet?
@@ -421,6 +421,8 @@ mirror_last_synced=Senast synkad
watchers=Observerare
stargazers=Stjärnmärkare
forks=Forks
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
form.reach_limit_of_creation=Ägaren har nått maxgränsen av %d skapade repon.
form.name_reserved=Namnet '%s' på utvecklingskatalogen är reserverat.
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Filinnhållet har ändrats sedan du började r
editor.file_already_exists=En fil med namnet '%s' finns redan i förrådet.
editor.no_changes_to_show=Det finns inga ändringar att visa.
editor.fail_to_update_file=Uppdateringen/skapandet av filen '%s' misslyckades med felet: %v
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
editor.add_subdir=Lägg till underkatalog...
editor.unable_to_upload_files=Uppladdning av filen '%s' misslyckades med felet: %v
editor.upload_files_to_dir=Ladda upp filer till '%s'
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Denna pull-förfrågan kan inte sammanfogas automat
pulls.cannot_auto_merge_helper=Vänligen sammanfoga manuellt för att lösa konflikter.
pulls.create_merge_commit=Create a merge commit
pulls.rebase_before_merging=Rebase before merging
pulls.commit_description=Commit Description
pulls.merge_pull_request=Sammanfoga Pull-förfrågan
pulls.open_unmerged_pull_exists=`Du kan inte utföra återöppningsoperationen eftersom det finns redan en öppen pull-förfrågan (#%d) från samma repo med samma sammanfogningsinformation som väntar på sammanfogning.`
pulls.delete_branch=Ta bort gren
@@ -711,7 +715,7 @@ settings.protect_require_pull_request_desc=Enable this option to disable direct
settings.protect_whitelist_committers=Whitelist who can push to this branch
settings.protect_whitelist_committers_desc=Add people or teams to whitelist of direct push to this branch. Users in whitelist will bypass require pull request check.
settings.protect_whitelist_users=Users who can push to this branch
settings.protect_whitelist_search_users=Search users
settings.protect_whitelist_search_users=Sök användare
settings.protect_whitelist_teams=Teams for which members of them can push to this branch
settings.protect_whitelist_search_teams=Search teams
settings.update_protect_branch_success=Protect options for this branch has been updated successfully!
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Namngivningsstil hos det externa ärendehanteringsy
settings.tracker_issue_style.numeric=Numerisk
settings.tracker_issue_style.alphanumeric=Alfanumerisk
settings.tracker_url_format_desc=Du kan använda platshållaren <code>{user} {repo} {index}</code> för användarnamn, reponamn, och ärendenummer.
settings.pulls_desc=Aktivera pullförfrågningar för att ta emot publika bidrag
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
settings.pulls.ignore_whitespace=Ignore changes in whitespace
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
settings.danger_zone=Högrisksområde
@@ -856,6 +860,8 @@ settings.add_key_success=Den nya driftsättningsnyckeln '%s' har lagts till!
settings.deploy_key_deletion=Ta bort distribueringsnyckel
settings.deploy_key_deletion_desc=Borttagning av detta distributionsnyckel kommer att ta bort all relaterad åtkomst till det här repot. Vill du fortsätta?
settings.deploy_key_deletion_success=Distributionsnyckeln har tagits bort!
settings.description_desc=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
diff.browse_source=Bläddra i källkod
diff.parent=förälder
@@ -1096,6 +1102,7 @@ auths.new=Lägg till ny källa
auths.name=Namn
auths.type=Typ
auths.enabled=Aktiv
auths.default=Default
auths.updated=Uppdaterad
auths.auth_type=Autentiseringstyp
auths.auth_name=Autentiseringsnamn
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAM Service Name
auths.enable_auto_register=Enable Auto Registration
auths.edit=Edit Authentication Setting
auths.activated=This authentication is activated
auths.default_auth=This authentication is default login source
auths.new_success=New authentication '%s' has been added successfully.
auths.update_success=Authentication setting has been updated successfully.
auths.update=Update Authentication Setting

View File

@@ -421,6 +421,8 @@ mirror_last_synced=Son Eşzamanlama
watchers=İzleyenler
stargazers=Yıldızlayanlar
forks=Çatallamalar
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
form.reach_limit_of_creation=Sahip, maksimum %d depo oluşturma limitine ulaşmıştır.
form.name_reserved=Depo ismi '%s' başkasına ayrılmış.
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Düzenlemeye başladıktan sonra dosya içeri
editor.file_already_exists='% s ' adlı bir dosya mevcutta zaten var.
editor.no_changes_to_show=Gösterilecek bir değişiklik mevcut değil.
editor.fail_to_update_file='%s' dosyası güncellenemedi / oluşturulamadı : %v hatasıyla
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
editor.add_subdir=Alt dizin Ekle...
editor.unable_to_upload_files='%s' dosyası yüklenemedi : %v hatasıyla
editor.upload_files_to_dir=Dosyaları '%s' ye yükle
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Çakışmalardan dolayı bu değişiklik isteği ot
pulls.cannot_auto_merge_helper=Çakışmaları çözmek için lütfen elle birleştirin.
pulls.create_merge_commit=Birleştirme işlemi oluşturma
pulls.rebase_before_merging=Birleştirmeden önce yenidenreferans al
pulls.commit_description=Commit Description
pulls.merge_pull_request=Değişiklik İsteğini Birleştir
pulls.open_unmerged_pull_exists=`Yeniden açma işlemini gerçekleştiremezsiniz. Çünkü zaten aynı depodan, aynı birleştirme bilgisiyle açık olan bir değişiklik isteği var (#%d) ve birleştirme bekliyor.`
pulls.delete_branch=Şubeyi Sil
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Harici Hata İzleyicisi Adlandırma Stili:
settings.tracker_issue_style.numeric=Sayısal
settings.tracker_issue_style.alphanumeric=Alfanumerik
settings.tracker_url_format_desc=Kullanıcı adı, depo ismi ve hata indeksi için <code>{kullanıcı} {depo} {indeks}</code> tutucusunu kullanabilirsiniz.
settings.pulls_desc=Herkese açık katkıları kabul etmek için değişiklik isteklerini etkinleştirin
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
settings.pulls.ignore_whitespace=Ignore changes in whitespace
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
settings.danger_zone=Tehlike Alanı
@@ -856,6 +860,8 @@ settings.add_key_success=Yeni dağıtım anahtarı '%s' başarıyla eklendi!
settings.deploy_key_deletion=Dağıtım Anahtarını Sil
settings.deploy_key_deletion_desc=Bu dağıtım anahtarını silerseniz bu depoya ilişkin tüm erişimler de kaldırılacaktır. Devam etmek istiyor musunuz?
settings.deploy_key_deletion_success=Dağıtım anahtarı başarıyla silindi!
settings.description_desc=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
diff.browse_source=Kaynağa Gözat
diff.parent=ebeveyn
@@ -1096,6 +1102,7 @@ auths.new=Yeni Kaynak Ekle
auths.name=İsim
auths.type=Tür
auths.enabled=Aktifleştirilmiş
auths.default=Default
auths.updated=Güncellendi
auths.auth_type=Yetki Türü
auths.auth_name=Yetki İsmi
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAM Servis Adı
auths.enable_auto_register=Otomatik Kaydolmayı Aktifleştir
auths.edit=Yetkilendirme Ayarlarını Düzenle
auths.activated=Bu yetkilendirme aktif
auths.default_auth=This authentication is default login source
auths.new_success=Yeni yetkilendirme '%s' başarıyla eklendi.
auths.update_success=Yetkilendirme ayarları başarıyla güncellendi.
auths.update=Yetkilendirme Ayarlarını Güncelle

View File

@@ -151,8 +151,8 @@ register_hepler_msg=Вже зареєстровані? Увійдіть зара
social_register_hepler_msg=Вже зареєстровані? Прив'яжіть зараз!
disable_register_prompt=Вибачте, реєстрація відключена. Будь ласка, зв'яжіться з адміністратором сайту.
disable_register_mail=На жаль, підтвердження реєстрації на електрону пошту було відключено.
auth_source=Authentication Source
local=Local
auth_source=Джерело автентифікації
local=Локальний
remember_me=Запам'ятати мене
forgot_password=Забув пароль
forget_password=Забули пароль?
@@ -231,7 +231,7 @@ org_name_been_taken=Назва організаціі вже використо
team_name_been_taken=Назва команди вже використовується.
email_been_used=Адреса електронної пошти вже використовується.
username_password_incorrect=Ім'я користувача або пароль помилкові.
auth_source_mismatch=The authentication source selected is not associated with the user.
auth_source_mismatch=Обране джерело автентифікації не асоційовано з користувачем.
enterred_invalid_repo_name=Переконайтеся, що ви ввели назву сховища правильно.
enterred_invalid_owner_name=Переконайтеся, що ви ввели ім'я власника правильно.
enterred_invalid_password=Переконайтеся, що ви ввели пароль правильно.
@@ -351,7 +351,7 @@ two_factor_or_enter_secret=Або введіть секрет:
two_factor_then_enter_passcode=Потім введіть пароль:
two_factor_verify=Перевірити
two_factor_invalid_passcode=Введений пароль не валідний, будь ласка, спробуйте ще раз!
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
two_factor_reused_passcode=Введений пасскод вже було використано. Будь ласка, спробуйте інший!
two_factor_enable_error=Увімкнення двофакторної автентифікації не вдалося: %v
two_factor_enable_success=Двофакторну автентифікацію успішно активовано для вашого акаунту!
two_factor_recovery_codes_title=Пароль відновлення для двофакторної автентифікації
@@ -421,6 +421,8 @@ mirror_last_synced=Востаннє синхронізовано
watchers=Спостерігачі
stargazers=Шанувальники
forks=Відгалуження
repo_description_helper=Опис репозиторію. До 512-ти символів довжиною.
repo_description_length=Доступні символи
form.reach_limit_of_creation=Власник досягнув максимальної кількості у %d створених репозиторіїв.
form.name_reserved=Назва репозиторія '%s' зарезервовано.
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Вміст файлу було змінено
editor.file_already_exists=Файл на ім'я '%s' вже присутній у репозиторії.
editor.no_changes_to_show=Нема змін для показу.
editor.fail_to_update_file=Не вдалося оновити/створити файл '%s' через помилку: %v
editor.fail_to_delete_file=Не вдалося видалити файл '%s' через помилку: %v
editor.add_subdir=Додати підкаталогу...
editor.unable_to_upload_files=Не вдалося завантажити файли до '%s' через помилку: %v
editor.upload_files_to_dir=Завантажувати файли до '%s'
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Цей запрос не може бути влит
pulls.cannot_auto_merge_helper=Будь ласка влийте вручну щоб врегулювати конфлікти.
pulls.create_merge_commit=Створити коміт на злиття
pulls.rebase_before_merging=Перебазувати перед об'єднанням
pulls.commit_description=Опис коміту
pulls.merge_pull_request=Влити запрос на злиття
pulls.open_unmerged_pull_exists=`Ви не можете перевідкрити, бо вже існує запрос на злиття (#%d) з того самого репозиторію, з тією самою інформацією про злиття, та він очікує на влиття.`
pulls.delete_branch=Видалити гілку
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Стиль найменування задач в
settings.tracker_issue_style.numeric=Цифровий
settings.tracker_issue_style.alphanumeric=Буквено-цифровий
settings.tracker_url_format_desc=Ви можете використовувати заповнювач <code>{user} {repo} {index}</code> для ім'я користувача, назви репозиторію на номеру проблеми.
settings.pulls_desc=Увімкнути публічні запроси на злиття
settings.pulls_desc=Увімкнути запити на злиття щоб дозволити внески між репозиторіями й гілками
settings.pulls.ignore_whitespace=Ігнорувати зміни у пробільних символах
settings.pulls.allow_rebase_merge=Дозволити перебазування для merge-комітів
settings.danger_zone=Небезпечна зона
@@ -844,7 +848,7 @@ settings.slack_token=Токен
settings.slack_domain=Домен
settings.slack_channel=Канал
settings.deploy_keys=Ключи для розгортування
settings.deploy_keys_helper=<b>Common Gotcha!</b> Якщо ви шукаєте куди додати персональний публічний ключ, додайте його до <a href="%s%s">налаштуань вашого аккаунту</a>.
settings.deploy_keys_helper=<b>Common Gotcha!</b> Якщо ви шукаєте куди додати персональний публічний ключ, додайте його до <a href="%s%s">налаштувань вашого аккаунту</a>.
settings.add_deploy_key=Додати ключ для розгортування
settings.deploy_key_desc=Ключі розгортування доступні лише для читання. Це не те саме, що персональний SSH ключ акаунту.
settings.no_deploy_keys=Ви не додали жодного ключа для розгортування.
@@ -856,6 +860,8 @@ settings.add_key_success=Новий ключ розгортування '%s' у
settings.deploy_key_deletion=Видалити ключ для розгортування
settings.deploy_key_deletion_desc=Видалення цього ключа для розгортування призведе о видалення усіх пов'язаних прав до цього репозиторію. Ви справді бажаєте продовжити?
settings.deploy_key_deletion_success=Ключі для розгортування було успішно видалено!
settings.description_desc=Опис репозиторію. До 512-ти символів довжиною.
settings.description_length=Доступні символи
diff.browse_source=Переглянути джерело
diff.parent=батько
@@ -1091,11 +1097,12 @@ repos.stars=У обраному
repos.issues=Питання
repos.size=Розмір
auths.auth_sources=Authentication Sources
auths.auth_sources=Джерела автентифікації
auths.new=Додати нове джерело
auths.name=Назва
auths.type=Тип
auths.enabled=Увімкнено
auths.default=За замовчанням
auths.updated=Оновлено
auths.auth_type=Тип автентифікації
auths.auth_name=Назва автентифікації
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Ім'я служби PAM
auths.enable_auto_register=Увімкнути автоматичну реєстрацію
auths.edit=Редагувати налаштування автентифікації
auths.activated=Цю автентифікацію активовано
auths.default_auth=Це метод автентифікації за замовчанням
auths.new_success=Нову автентифікацію '%s' було успішно додано.
auths.update_success=Налаштування автентифікації було успішно оновлено.
auths.update=Оновити налаштування автентифікації
@@ -1304,9 +1312,9 @@ delete_branch=видалено гілку <code>%[2]s</code> у <a href="%[1]s">
push_tag=заштовхнуто тег <a href="%s/src/%s">%[2]s</a> до <a href="%[1]s">%[3]s</a>
delete_tag=видалено мітку <code>%[2]s</code> у <a href="%[1]s">%[3]s</a>
fork_repo=відгалуджено репозиторій у <a href="%s">%s</a>
mirror_sync_push=synced commits to <a href="%[1]s/src/%[2]s">%[3]s</a> at <a href="%[1]s">%[4]s</a> from mirror
mirror_sync_create=synced new reference <a href="%s/src/%s">%[2]s</a> to <a href="%[1]s">%[3]s</a> from mirror
mirror_sync_delete=synced and deleted reference <code>%[2]s</code> at <a href="%[1]s">%[3]s</a> from mirror
mirror_sync_push=синхронізовано коміт <a href="%[1]s/src/%[2]s">%[3]s</a> в <a href="%[1]s">%[4]s</a> із дзеркала
mirror_sync_create=синхронізовано нове посилання <a href="%s/src/%s">%[2]s</a> до <a href="%[1]s">%[3]s</a> із дзеркала
mirror_sync_delete=синхронізовано й видалено посилання <code>%[2]s</code> в <a href="%[1]s">%[3]s</a> із дзеркала
[tool]
ago=тому

View File

@@ -421,6 +421,8 @@ mirror_last_synced=Lần đồng bộ cuối
watchers=Người theo dõi
stargazers=Stargazers
forks=Forks
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
form.reach_limit_of_creation=Chủ sở hữu đã đạt giới hạn tối đa %d kho.
form.name_reserved=Tên kho '%s' đã được dành riêng.
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=File content has been changed since you starte
editor.file_already_exists=Tên tập tin '%s' đã tồn tại trong kho này.
editor.no_changes_to_show=Không có thay đổi nào.
editor.fail_to_update_file=Failed to update/create file '%s' with error: %v
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
editor.add_subdir=Thêm thư mục con...
editor.unable_to_upload_files=Failed to upload files to '%s' with error: %v
editor.upload_files_to_dir=Tải tập tin đến '%s'
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Yêu cầu kéo này không thể được kết h
pulls.cannot_auto_merge_helper=Xin vui lòng nhập theo cách thủ công để giải quyết các cuộc xung đột.
pulls.create_merge_commit=Tạo một merge commit
pulls.rebase_before_merging=Rebase trước khi sáp nhập
pulls.commit_description=Commit Description
pulls.merge_pull_request=Merge Pull Request
pulls.open_unmerged_pull_exists=' Bạn không thể thực hiện thao tác reopen vì đã có một yêu cầu kéo đang mở (#%d) từ kho lưu trữ cùng với cùng một kết hợp thông tin và chờ đợi cho việc sáp nhập.'
pulls.delete_branch=Xóa nhánh
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Kiểu Url theo dõi các vấn đề bên ngoài:
settings.tracker_issue_style.numeric=Kiểu số
settings.tracker_issue_style.alphanumeric=Chữ số
settings.tracker_url_format_desc=You can use placeholder <code>{user} {repo} {index}</code> for user name, repository name and issue index.
settings.pulls_desc=Cho phép yêu cầu pull để chấp nhận sự đóng góp công cộng
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
settings.pulls.ignore_whitespace=Bỏ qua sự thay đổi của khoảng trắng
settings.pulls.allow_rebase_merge=Cho phép sử dụng rebase để merge các commit
settings.danger_zone=Vùng nguy hiểm
@@ -856,6 +860,8 @@ settings.add_key_success=Bộ nhớ heap đã được phát hành!
settings.deploy_key_deletion=Xóa Khóa triển khai
settings.deploy_key_deletion_desc=Xóa bỏ điều này triển khai các phím sẽ loại bỏ tất cả liên quan đến truy cập cho các kho lưu trữ này. Bạn có muốn tiếp tục?
settings.deploy_key_deletion_success=Deploy key has been deleted successfully!
settings.description_desc=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
diff.browse_source=Browse Source
diff.parent=mục cha
@@ -1096,6 +1102,7 @@ auths.new=Thêm mới source
auths.name=Tên
auths.type=Loại
auths.enabled=Đã kích hoạt
auths.default=Default
auths.updated=Đã cập nhật
auths.auth_type=Loại xác thực
auths.auth_name=Tên đăng nhập xác thực
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Tên dịch vụ PAM
auths.enable_auto_register=Cho phép tự động đăng ký
auths.edit=Chỉnh sửa cài đặt xác thực
auths.activated=Xác thực này đã được kích hoạt
auths.default_auth=This authentication is default login source
auths.new_success=Xác thực mới '%s' đã được thêm vào thành công.
auths.update_success=Cài đặt xác thực đã được cập nhật thành công.
auths.update=Cập Nhật cài đặt xác thực

View File

@@ -421,6 +421,8 @@ mirror_last_synced=上次同步时间:
watchers=关注者
stargazers=称赞者
forks=派生仓库
repo_description_helper=请输入仓库描述,最多为 512 个字符
repo_description_length=剩余字符数
form.reach_limit_of_creation=该用户已经达到允许创建 %d 个仓库的最大上限。
form.name_reserved=仓库名称 '%s' 是被保留的。
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=文件内容在您进行编辑时已经发生
editor.file_already_exists=此仓库已经存在名为 '%s' 的文件。
editor.no_changes_to_show=没有可以显示的变更。
editor.fail_to_update_file=更新/创建文件 '%s' 时发生错误:%v
editor.fail_to_delete_file=删除文件 '%s' 时发生错误: %v
editor.add_subdir=添加子目录...
editor.unable_to_upload_files=上传文件至 '%s' 时发生错误:%v
editor.upload_files_to_dir=上传文件至 '%s'
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=该合并请求存在冲突,无法进行自动合
pulls.cannot_auto_merge_helper=请手动拉取代码变更以解决冲突。
pulls.create_merge_commit=创建一个新的合并提交
pulls.rebase_before_merging=合并前先进行衍合
pulls.commit_description=提交说明
pulls.merge_pull_request=合并请求
pulls.open_unmerged_pull_exists=`由于已经存在来自相同仓库和合并信息的未合并请求(#%d您无法执行重新开启操作。`
pulls.delete_branch=删除分支
@@ -742,7 +746,7 @@ settings.tracker_issue_style=外部工单管理系统命名风格:
settings.tracker_issue_style.numeric=纯数字形式
settings.tracker_issue_style.alphanumeric=英文字母数字组合形式
settings.tracker_url_format_desc=您可以使用 <code>{user} {repo} {index}</code> 分别作为用户名、仓库名和工单索引的占位符。
settings.pulls_desc=启用合并请求以接受社区贡献
settings.pulls_desc=启用合并请求以接受来自其它仓库或分支的贡献
settings.pulls.ignore_whitespace=忽略空白符号的更改
settings.pulls.allow_rebase_merge=允许在合并提交时使用衍合
settings.danger_zone=危险操作区
@@ -856,6 +860,8 @@ settings.add_key_success=新的部署密钥 '%s' 添加成功!
settings.deploy_key_deletion=删除部署密钥
settings.deploy_key_deletion_desc=删除该部署密钥会移除本仓库所以相关的操作权限。是否继续?
settings.deploy_key_deletion_success=删除部署密钥成功!
settings.description_desc=请输入仓库描述,最多为 512 个字符
settings.description_length=剩余字符数
diff.browse_source=浏览代码
diff.parent=父节点
@@ -1096,6 +1102,7 @@ auths.new=添加新的源
auths.name=认证名称
auths.type=认证类型
auths.enabled=已启用
auths.default=默认
auths.updated=最后更新时间
auths.auth_type=认证类型
auths.auth_name=认证名称
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAM 服务名称
auths.enable_auto_register=允许授权用户自动注册
auths.edit=编辑认证设置
auths.activated=该授权认证已经启用
auths.default_auth=该授权认证将作为默认登录源
auths.new_success=新的授权源 "%s" 添加成功!
auths.update_success=认证设置更新成功!
auths.update=更新认证设置

View File

@@ -421,6 +421,8 @@ mirror_last_synced=Last Synced
watchers=關注者
stargazers=稱讚者
forks=派生倉庫
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
form.reach_limit_of_creation=擁有者已達到儲存庫最大的新增上限 %d。
form.name_reserved=倉庫名稱 '%s' 是被保留的。
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=File content has been changed since you starte
editor.file_already_exists=A file with name '%s' already exists in this repository.
editor.no_changes_to_show=There are no changes to show.
editor.fail_to_update_file=Failed to update/create file '%s' with error: %v
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
editor.add_subdir=Add subdirectory...
editor.unable_to_upload_files=Failed to upload files to '%s' with error: %v
editor.upload_files_to_dir=Upload files to '%s'
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=由於存在衝突,不能自動合併這推送請
pulls.cannot_auto_merge_helper=請手動合併來解決衝突。
pulls.create_merge_commit=Create a merge commit
pulls.rebase_before_merging=Rebase before merging
pulls.commit_description=Commit Description
pulls.merge_pull_request=合併請求
pulls.open_unmerged_pull_exists=`由於已經存在來自相同倉庫和合併信息的未合併請求(#%d您無法執行重新開啟操作。`
pulls.delete_branch=Delete Branch
@@ -742,7 +746,7 @@ settings.tracker_issue_style=External Issue Tracker Naming Style:
settings.tracker_issue_style.numeric=Numeric
settings.tracker_issue_style.alphanumeric=Alphanumeric
settings.tracker_url_format_desc=您可以使用 <code>{user} {repo} {index}</code> 分別作為用戶名、倉庫名和問題索引的占位符。
settings.pulls_desc=啟用合併請求以接受社區貢獻
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
settings.pulls.ignore_whitespace=Ignore changes in whitespace
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
settings.danger_zone=危險操作區
@@ -856,6 +860,8 @@ settings.add_key_success=新的部署密鑰 '%s' 添加成功!
settings.deploy_key_deletion=刪除部署密鑰
settings.deploy_key_deletion_desc=刪除該部署密鑰會移除本倉庫所有相關的操作權限。是否繼續?
settings.deploy_key_deletion_success=刪除部署密鑰成功!
settings.description_desc=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
diff.browse_source=瀏覽代碼
diff.parent=父節點
@@ -1096,6 +1102,7 @@ auths.new=添加新認證源
auths.name=認證名稱
auths.type=認證類型
auths.enabled=已啟用
auths.default=Default
auths.updated=最後更新時間
auths.auth_type=認證類型
auths.auth_name=認證名稱
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAM 服務名稱
auths.enable_auto_register=允許授權用戶自動註冊
auths.edit=編輯認證設置
auths.activated=該授權認證已經啟用
auths.default_auth=This authentication is default login source
auths.new_success=新的認證源 "%s" 添加成功!
auths.update_success=認證設置更新成功!
auths.update=更新認證設置

View File

@@ -1,7 +1,7 @@
app_desc=基於 Go 語言的自助 Git 服務
app_desc=一款極易搭建的自助 Git 服務
home=首頁
dashboard=控制面
dashboard=控制面
explore=探索
help=說明
sign_in=登入
@@ -35,7 +35,7 @@ manage_org=管理組織
admin_panel=管理面板
account_settings=帳號設定
settings=設定
your_profile=個人資
your_profile=個人資
your_settings=用戶設定
activities=活動
@@ -83,7 +83,7 @@ app_url_helper=該設置影響 HTTP/HTTPS 複製地址和一些郵箱中的連
log_root_path=日誌路徑
log_root_path_helper=寫入日誌檔目錄
enable_console_mode=開啟主控台模式
enable_console_mode_popup=In addition to file mode, also print logs to console.
enable_console_mode_popup=除了使用檔案模式之外, 還要將日誌列印到控制台。
optional_title=可選設置
email_title=電子郵件服務設定
@@ -151,8 +151,8 @@ register_hepler_msg=已經註冊?立即登錄!
social_register_hepler_msg=已經註冊?立即綁定!
disable_register_prompt=對不起,註冊功能已被關閉。請聯系網站管理員。
disable_register_mail=對不起,註冊郵箱確認功能已被關閉。
auth_source=Authentication Source
local=Local
auth_source=認證來源
local=本地
remember_me=記住登錄
forgot_password=忘記密碼
forget_password=忘記密碼?
@@ -197,7 +197,7 @@ RepoName=儲存庫名稱
Email=郵箱地址
Password=密碼
Retype=確認密碼
SSHTitle=SSH 鑰名稱
SSHTitle=SSH 鑰名稱
HttpsUrl=HTTPS URL 地址
PayloadUrl=推送地址
TeamName=團隊名稱
@@ -231,7 +231,7 @@ org_name_been_taken=組織名稱已經被佔用。
team_name_been_taken=團隊名稱已經被佔用。
email_been_used=郵箱地址已經被使用。
username_password_incorrect=用戶名或密碼不正確。
auth_source_mismatch=The authentication source selected is not associated with the user.
auth_source_mismatch=此用戶未與所用的認證來源相關聯
enterred_invalid_repo_name=請檢查您輸入的倉庫名稱是正確。
enterred_invalid_owner_name=請檢查您輸入的新所有者用戶名是否正確。
enterred_invalid_password=請檢查您輸入的密碼是否正確。
@@ -263,7 +263,7 @@ form.name_reserved=用戶名 '%s' 是被保留的。
form.name_pattern_not_allowed=用戶名不允許 '%s' 的格式。
[settings]
profile=個人信息
profile=個人資訊
password=修改密碼
avatar=頭像
ssh_keys=管理 SSH 密鑰
@@ -280,7 +280,7 @@ full_name=自定義名稱
website=個人網站
location=所在地區
update_profile=更新信息
update_profile_success=您的個人信息更新成功!
update_profile_success=您的個人資訊更新成功!
change_username=用戶名將被修改
change_username_prompt=該操作將會影響到所有與您帳戶有關的鏈接
continue=繼續操作
@@ -344,24 +344,24 @@ two_factor_off=關閉
two_factor_enable=啟用
two_factor_disable=禁用
two_factor_view_recovery_codes=在安全的地方查看並保存 <a href="%s%s"> 您的恢復代碼 </a>。如果您失去對身份驗證應用程式的存取權限, 則可以將它們用作密碼。
two_factor_http=For HTTP/HTTPS operations, you are no longer able to use plain username and password. Please create and use <a href="%[1]s%[2]s">Personal Access Token</a> as your credential, e.g. <code>%[3]s</code>.
two_factor_enable_title=Enable Two-factor Authentication
two_factor_http=對於HTTP/HTTPS操作,您不能使用用戶名稱和密碼作為憑據。請創建和使用<a href=%[1]s%[2]s”>個人操作令牌</a>作為您的憑據,如<code>%[3]s</code>
two_factor_enable_title=啟用兩步驗證
two_factor_scan_qr=請使用您的身份驗證應用程式掃描圖像:
two_factor_or_enter_secret=或輸入密碼: %s
two_factor_then_enter_passcode=然後輸入驗證碼:
two_factor_verify=驗證
two_factor_invalid_passcode=您輸入的密碼無效,請再試一次。
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
two_factor_reused_passcode=您输入的验证码已经被使用过了,请换一个重试!
two_factor_enable_error=啟用兩步驗證失敗: %v
two_factor_enable_success=您帳戶的兩步驗證已成功啟用!
two_factor_recovery_codes_title=兩步驗證恢復代碼
two_factor_recovery_codes_desc=Recovery codes are used when you temporarily lose access to your authentication application. Each recovery code can only be used once, <b>please keep these codes in a safe place</b>.
two_factor_recovery_codes_desc=當您無法存取您的認證應用程式時,可以使用救援代碼。每個救援代碼只能使用一次,因此 <b>請在安全的地方妥善保存您的救援代碼</b>
two_factor_regenerate_recovery_codes=重新生成恢復代碼
two_factor_regenerate_recovery_codes_error=重新生成恢復代碼失敗: %v
two_factor_regenerate_recovery_codes_success=已成功生成新的恢復代碼!
two_factor_disable_title=Disable Two-factor Authentication
two_factor_disable_desc=Your account security level will decrease after disabled two-factor authentication. Do you want to continue?
two_factor_disable_success=Two-factor authentication has disabled successfully!
two_factor_disable_title=停用兩步驗證
two_factor_disable_desc=停用兩步驗證後,您的帳戶安全級別將降低。是否繼續?
two_factor_disable_success=您帳戶的兩步驗證已成功停用!
manage_access_token=管理個人操作令牌
generate_new_token=生成新的令牌
@@ -382,7 +382,7 @@ orgs.leave_desc=離開組織後,所有與組織相關的倉庫和團隊權限
repos.leave=離開
repos.leave_title=離開存儲庫
repos.leave_desc=在你離開後,您將無法進入到存儲庫。你想要繼續嗎?
repos.leave_success=You have left repository '%s' successfully!
repos.leave_success=您已經成功退出「%s」版本庫
delete_account=刪除當前帳戶
delete_prompt=刪除操作會永久清除您的帳戶信息,並且 <strong>不可恢復</strong>
@@ -421,6 +421,8 @@ mirror_last_synced=上次同步
watchers=關注者
stargazers=稱讚者
forks=派生倉庫
repo_description_helper=儲存庫的說明文字。最長 512 個字元。
repo_description_length=可用字元
form.reach_limit_of_creation=擁有者已達到儲存庫最大的新增上限 %d。
form.name_reserved=倉庫名稱 '%s' 是被保留的。
@@ -454,7 +456,7 @@ quick_guide=快速幫助
clone_this_repo=複製當前倉庫
create_new_repo_command=從命令行創建一個新的倉庫
push_exist_repo=從命令行推送已經創建的倉庫
bare_message=This repository does not have any content yet.
bare_message=此版本庫空空如也。
files=檔案
branch=分支
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=從您開始編輯已更改檔的內容。<a t
editor.file_already_exists=帶有名稱 '%s' 的檔已經存在在這個資料庫中。
editor.no_changes_to_show=沒有可以顯示的變更。
editor.fail_to_update_file=上傳/創建檔案 '%s' 失敗, 錯誤訊息: %v
editor.fail_to_delete_file=無法刪除檔案「%s」錯誤訊息%v
editor.add_subdir=新增子目錄...
editor.unable_to_upload_files=上傳檔案失敗到 '%s', 錯誤訊息: %v
editor.upload_files_to_dir=上傳檔案到 '%s'
@@ -620,7 +623,7 @@ pulls.compare_compare=對比文件變化
pulls.filter_branch=過濾分支
pulls.no_results=未找到結果
pulls.nothing_to_compare=基準和對比分支代碼已經同步,無需進行對比。
pulls.nothing_merge_base=There is nothing to compare because two branches have completely different history.
pulls.nothing_merge_base=因為兩個分支有完全不同的提交紀錄,因此無法比較。
pulls.has_pull_request=`已經存在目標分支的合併請求:<a href="%[1]s/pulls/%[3]d">%[2]s#%[3]d</a>`
pulls.create=創建合併請求
pulls.title_desc=請求將 %[1]d 次代碼提交從 <code>%[2]s</code> 合併至 <code>%[3]s</code>
@@ -637,7 +640,8 @@ pulls.can_auto_merge_desc=這個拉請求可以自動合併。
pulls.cannot_auto_merge_desc=由於存在衝突,不能自動合併這推送請求。
pulls.cannot_auto_merge_helper=請手動合併來解決衝突。
pulls.create_merge_commit=創建一個合併提交
pulls.rebase_before_merging=Rebase before merging
pulls.rebase_before_merging=合併前先 Rebase
pulls.commit_description=提交記錄說明
pulls.merge_pull_request=合併請求
pulls.open_unmerged_pull_exists=`由於已經存在來自相同倉庫和合併信息的未合併請求(#%d您無法執行重新開啟操作。`
pulls.delete_branch=刪除分支
@@ -693,11 +697,11 @@ settings.collaboration.write=可寫權限
settings.collaboration.read=可讀權限
settings.collaboration.undefined=未定義
settings.branches=分支列表
settings.branches_bare=You cannot manage branches for bare repository. Please push some content first.
settings.branches_bare=您無法管理空版本庫。請先推送一些內容至版本庫。
settings.default_branch=預設分支
settings.default_branch_desc=預設分支是程式碼 commit、pull requests 及線上編輯的基準分支。
settings.update=更新
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
settings.update_default_branch_unsupported=伺服器的 Git 版本不支援變更預設分支。
settings.update_default_branch_success=這個 repository 的預設分支更新成功!
settings.protected_branches=保護分支
settings.protected_branches_desc=保護分支不被強制 Push、意外刪除以及限制 Commit 者白名單
@@ -727,13 +731,13 @@ settings.change_reponame_prompt=該操作將會影響到所有與該倉庫有關
settings.advanced_settings=高級設置
settings.wiki_desc=啓用 Wiki 系統
settings.use_internal_wiki=使用內建 wiki
settings.allow_public_wiki_desc=Allow public access to wiki when repository is private
settings.allow_public_wiki_desc=當版本庫為私有狀態時,允許 Wiki 的公開存取。
settings.use_external_wiki=使用外部 wiki
settings.external_wiki_url=外部 Wiki 連結
settings.external_wiki_url_desc=當分頁上按一下,訪客將會重新導到 URL。
settings.issues_desc=啟用問題追蹤
settings.use_internal_issue_tracker=使用內建輕量級問題追蹤
settings.allow_public_issues_desc=Allow public access to issues when repository is private
settings.allow_public_issues_desc=當版本庫為私有狀態時,允許議題的公開存取。
settings.use_external_issue_tracker=使用外部的問題管理系統
settings.external_tracker_url=外部Issue Tracker網址
settings.external_tracker_url_desc=當訪客在分頁上按一下,他們將會重新導向到 URL。
@@ -742,9 +746,9 @@ settings.tracker_issue_style=外部公單管理系統命名風格:
settings.tracker_issue_style.numeric=數字
settings.tracker_issue_style.alphanumeric=字母及數字
settings.tracker_url_format_desc=您可以使用 <code>{user} {repo} {index}</code> 分別作為用戶名、倉庫名和問題索引的占位符。
settings.pulls_desc=啟用合併請求以接受社區貢獻
settings.pulls.ignore_whitespace=Ignore changes in whitespace
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
settings.pulls_desc=啟用合併請求」功能,接受版本庫與分支之間的貢獻
settings.pulls.ignore_whitespace=忽略空白符號的更改
settings.pulls.allow_rebase_merge=允許使用 rebase 合併提交
settings.danger_zone=危險操作區
settings.cannot_fork_to_same_owner=你不可以 fork 一個 repository 到它的擁有者。
settings.new_owner_has_same_repo=新的倉庫擁有者已經存在同名倉庫!
@@ -765,7 +769,7 @@ settings.wiki_deletion_success=儲存庫 wiki 資料已成功清除。
settings.delete=刪除本倉庫
settings.delete_desc=刪除倉庫操作不可逆轉,請三思而後行。
settings.delete_notices_1=- 此操作 <strong>不可以</strong> 被回滾。
settings.delete_notices_2=- This operation will permanently delete everything in this repository, including Git data, issues, comments and collaborator access.
settings.delete_notices_2=- 此動作將永久移除版本庫,包含了 Git 資料、議題、留言與協作者的存取權限。
settings.delete_notices_fork_1=- 刪除後所有的派生倉庫將會成為獨立倉庫
settings.deletion_success=倉庫刪除成功!
settings.update_settings_success=倉庫設置更新成功!
@@ -790,7 +794,7 @@ settings.webhook.test_delivery=測試推送
settings.webhook.test_delivery_desc=生成並推送一個模擬的 Push 事件
settings.webhook.test_delivery_success=測試推送已經加入到隊列,請耐心等待數秒再刷新推送記錄。
settings.webhook.redelivery=重新傳送
settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history.
settings.webhook.redelivery_success=任務「%s」已經重新加入至隊列。可能需要幾秒鐘來更新歷史的隊列狀態
settings.webhook.request=請求內容
settings.webhook.response=響應內容
settings.webhook.headers=標題
@@ -839,12 +843,12 @@ settings.recent_deliveries=最近推送記錄
settings.hook_type=鉤子類型
settings.add_slack_hook_desc=為您的倉庫增加 <a href="%s">Slack</a> 集成。
settings.add_discord_hook_desc=Hook <a href="%s">Discord</a> 到你的 repository。
settings.add_dingtalk_hook_desc=Add <a href="%s">Dingtalk</a> integration to your repository.
settings.add_dingtalk_hook_desc=在您的版本庫增加 <a href="%s">Dingtalk</a> 整合
settings.slack_token=令牌
settings.slack_domain=域名
settings.slack_channel=頻道
settings.deploy_keys=管理部署密鑰
settings.deploy_keys_helper=<b>噢不!</b> 如果要新增個人的公開金,請到 <a href="%s%s">用戶設定</a> 新增。
settings.deploy_keys_helper=<b>噢不!</b> 如果要新增個人的公開金,請到 <a href="%s%s">用戶設定</a> 新增。
settings.add_deploy_key=添加部署密鑰
settings.deploy_key_desc=部署密鑰僅具有隻讀權限,它在功能上和個人用戶的公開密鑰有本質區別。
settings.no_deploy_keys=您還沒有添加任何部署密鑰。
@@ -856,6 +860,8 @@ settings.add_key_success=新的部署密鑰 '%s' 添加成功!
settings.deploy_key_deletion=刪除部署密鑰
settings.deploy_key_deletion_desc=刪除該部署密鑰會移除本倉庫所有相關的操作權限。是否繼續?
settings.deploy_key_deletion_success=刪除部署密鑰成功!
settings.description_desc=儲存庫的說明文字。最長 512 個字元。
settings.description_length=可用字元
diff.browse_source=瀏覽代碼
diff.parent=父節點
@@ -1091,11 +1097,12 @@ repos.stars=讚好數
repos.issues=問題數
repos.size=大小
auths.auth_sources=Authentication Sources
auths.auth_sources=認證來源
auths.new=添加新認證源
auths.name=認證名稱
auths.type=認證類型
auths.enabled=已啟用
auths.default=預設
auths.updated=最後更新時間
auths.auth_type=認證類型
auths.auth_name=認證名稱
@@ -1104,7 +1111,7 @@ auths.domain=域名
auths.host=主機地址
auths.port=主機端口
auths.bind_dn=綁定DN
auths.bind_dn_helper=You can use '%s' as placeholder for username, e.g. DOM\%s
auths.bind_dn_helper=可以使用'%s'作為用戶名稱的預留位置,例如:DOM\%s
auths.bind_password=綁定密碼
auths.bind_password_helper=警告:該密碼將會以明文的形式保存在數據庫中。請不要使用擁有高權限的帳戶!
auths.user_base=用戶搜索基準
@@ -1115,9 +1122,9 @@ auths.attribute_name=歸納名字
auths.attribute_surname=姓氏屬性
auths.attribute_mail=電子郵箱屬性
auths.verify_group_membership=驗證組成員身份
auths.group_search_base_dn=Group Search Base DN
auths.group_search_base_dn=組蒐索基準 DN
auths.group_filter=組篩選器
auths.group_attribute_contain_user_list=Group Attribute Containing List of Users
auths.group_attribute_contain_user_list=包含使用者列表的群組屬性
auths.user_attribute_listed_in_group=組中列出的使用者屬性
auths.attributes_in_bind=從 Bind DN 中獲取屬性信息
auths.filter=使用者篩選器
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAM 服務名稱
auths.enable_auto_register=允許授權用戶自動註冊
auths.edit=編輯認證設置
auths.activated=該授權認證已經啟用
auths.default_auth=此認證方式為預設登入來源
auths.new_success=新的認證源 "%s" 添加成功!
auths.update_success=認證設置更新成功!
auths.update=更新認證設置
@@ -1166,7 +1174,7 @@ config.ssh_domain=域名
config.ssh_port=
config.ssh_listen_port=監聽埠
config.ssh_root_path=根路徑
config.ssh_rewrite_authorized_keys_at_start=Rewrite authorized_keys At Start
config.ssh_rewrite_authorized_keys_at_start=在啟動時重寫 authorized_keys 檔案
config.ssh_key_test_path=金鑰測試路徑
config.ssh_keygen_path=金鑰產生 (' ssh-keygen ') 路徑
config.ssh_minimum_key_size_check=金鑰最小大小檢查
@@ -1214,7 +1222,7 @@ config.skip_tls_verify=忽略 TLS 驗證
config.mailer_config=郵件配置
config.mailer_enabled=啟用服務
config.mailer_disable_helo=禁用 HELO 操作
config.mailer_subject_prefix=Subject Prefix
config.mailer_subject_prefix=主旨前置詞
config.mailer_host=郵件主機地址
config.mailer_user=發送者帳號
config.send_test_mail=發送測試郵件
@@ -1304,9 +1312,9 @@ delete_branch=已經刪除在 <a href="%[1]s">%[3]s</a> 上的分支 <code>%[2]s
push_tag=推送了標籤 <a href="%s/src/%s">%[2]s</a> 到 <a href="%[1]s">%[3]s</a>
delete_tag=已經刪除在 <a href="%[1]s">%[3]s</a> 上的標籤 <code>%[2]s</code>
fork_repo=已經 fork 一個 repository 到 <a href="%s">%s</a>
mirror_sync_push=synced commits to <a href="%[1]s/src/%[2]s">%[3]s</a> at <a href="%[1]s">%[4]s</a> from mirror
mirror_sync_create=synced new reference <a href="%s/src/%s">%[2]s</a> to <a href="%[1]s">%[3]s</a> from mirror
mirror_sync_delete=synced and deleted reference <code>%[2]s</code> at <a href="%[1]s">%[3]s</a> from mirror
mirror_sync_push=已經從鏡像同步了提交 <a href="%[1]s/src/%[2]s">%[3]s</a> <a href="%[1]s">%[4]s</a>
mirror_sync_create=已經從鏡像同步了參考 <a href="%s/src/%s">%[2]s</a> <a href="%[1]s">%[3]s</a>
mirror_sync_delete=已經從鏡像同步並移除了參考 <code>%[2]s</code> <a href="%[1]s">%[3]s</a>
[tool]
ago=之前

View File

@@ -108,11 +108,11 @@ Steps to upgrade Gogs with Docker:
- `docker pull gogs/gogs`
- `docker stop gogs`
- `docker rm gogs`
- Finally, create container as the first time and don't forget to do same volume and port mapping.
- Finally, create a container for the first time and don't forget to do the same for the volume and port mapping.
## Known Issues
- The docker container can not currently be build on Raspberry 1 (armv6l) as our base image `alpine` does not have a `go` package available for this platform.
- The docker container cannot currently be built on Raspberry 1 (armv6l) as our base image `alpine` does not have a `go` package available for this platform.
## Useful Links

View File

@@ -23,7 +23,9 @@ rm -r $GOPATH
# Remove build deps
apk --no-progress del build-deps
# Create git user for Gogs
addgroup -S git
adduser -G git -H -D -g 'Gogs Git User' git -h /data/git -s /bin/bash && usermod -p '*' git && passwd -u git
echo "export GOGS_CUSTOM=${GOGS_CUSTOM}" >> /etc/profile
# Move to final place
mv /app/gogs/build/gogs /app/gogs/
# Cleanup go
rm -rf /tmp/go
rm -rf /usr/local/go

View File

@@ -4,8 +4,10 @@
set -x
set -e
# Move to final place
mv /app/gogs/build/gogs /app/gogs/
# Create git user for Gogs
addgroup -S git
adduser -G git -H -D -g 'Gogs Git User' git -h /data/git -s /bin/bash && usermod -p '*' git && passwd -u git
echo "export GOGS_CUSTOM=${GOGS_CUSTOM}" >> /etc/profile
# Final cleaning
rm -rf /app/gogs/build
@@ -14,6 +16,3 @@ rm /app/gogs/docker/build-go.sh
rm /app/gogs/docker/finalize.sh
rm /app/gogs/docker/nsswitch.conf
rm /app/gogs/docker/README.md
rm -rf /tmp/go
rm -rf /usr/local/go

View File

@@ -19,5 +19,8 @@ ln -sfn /data/gogs/data ./data
# Backward Compatibility with Gogs Container v0.6.15
ln -sfn /data/git /home/git
chown -R git:git /data /app/gogs ~git/
# Only chown for the first time, '/data/gogs/conf/app.ini' must exist inside Docker after installation
if ! test -d /data/gogs/conf/app.ini; then
chown -R git:git /data /app/gogs ~git/
fi
chmod 0755 /data /data/gogs ~git/

View File

@@ -1,4 +1,4 @@
// +build go1.6
// +build go1.8
// Copyright 2014 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
@@ -16,7 +16,7 @@ import (
"github.com/gogs/gogs/pkg/setting"
)
const APP_VER = "0.11.53.0603"
const APP_VER = "0.11.86.0130"
func init() {
setting.AppVer = APP_VER
@@ -37,6 +37,5 @@ func main() {
cmd.Backup,
cmd.Restore,
}
app.Flags = append(app.Flags, []cli.Flag{}...)
app.Run(os.Args)
}

View File

@@ -237,6 +237,6 @@ func (repo *Repository) recalculateAccesses(e Engine) error {
}
// RecalculateAccesses recalculates all accesses for repository.
func (r *Repository) RecalculateAccesses() error {
return r.recalculateAccesses(x)
func (repo *Repository) RecalculateAccesses() error {
return repo.recalculateAccesses(x)
}

View File

@@ -5,7 +5,6 @@
package models
import (
"encoding/json"
"fmt"
"path"
"regexp"
@@ -15,6 +14,7 @@ import (
"github.com/Unknwon/com"
"github.com/go-xorm/xorm"
"github.com/json-iterator/go"
log "gopkg.in/clog.v1"
"github.com/gogs/git-module"
@@ -58,20 +58,15 @@ var (
IssueCloseKeywords = []string{"close", "closes", "closed", "fix", "fixes", "fixed", "resolve", "resolves", "resolved"}
IssueReopenKeywords = []string{"reopen", "reopens", "reopened"}
IssueCloseKeywordsPat, IssueReopenKeywordsPat *regexp.Regexp
IssueReferenceKeywordsPat *regexp.Regexp
IssueCloseKeywordsPat = regexp.MustCompile(assembleKeywordsPattern(IssueCloseKeywords))
IssueReopenKeywordsPat = regexp.MustCompile(assembleKeywordsPattern(IssueReopenKeywords))
IssueReferenceKeywordsPat = regexp.MustCompile(`(?i)(?:)(^| )\S+`)
)
func assembleKeywordsPattern(words []string) string {
return fmt.Sprintf(`(?i)(?:%s) \S+`, strings.Join(words, "|"))
}
func init() {
IssueCloseKeywordsPat = regexp.MustCompile(assembleKeywordsPattern(IssueCloseKeywords))
IssueReopenKeywordsPat = regexp.MustCompile(assembleKeywordsPattern(IssueReopenKeywords))
IssueReferenceKeywordsPat = regexp.MustCompile(`(?i)(?:)(^| )\S+`)
}
// Action represents user operation type and other information to repository,
// it implemented interface base.Actioner so that can be used in template render.
type Action struct {
@@ -80,14 +75,14 @@ type Action struct {
OpType ActionType
ActUserID int64 // Doer user ID
ActUserName string // Doer user name
ActAvatar string `xorm:"-"`
ActAvatar string `xorm:"-" json:"-"`
RepoID int64 `xorm:"INDEX"`
RepoUserName string
RepoName string
RefName string
IsPrivate bool `xorm:"NOT NULL DEFAULT false"`
Content string `xorm:"TEXT"`
Created time.Time `xorm:"-"`
Created time.Time `xorm:"-" json:"-"`
CreatedUnix int64
}
@@ -492,8 +487,11 @@ func CommitRepoAction(opts CommitRepoActionOptions) error {
opts.Commits.CompareURL = repo.ComposeCompareURL(opts.OldCommitID, opts.NewCommitID)
}
if err = UpdateIssuesCommit(pusher, repo, opts.Commits.Commits); err != nil {
log.Error(2, "UpdateIssuesCommit: %v", err)
// Only update issues via commits when internal issue tracker is enabled
if repo.EnableIssues && !repo.EnableExternalTracker {
if err = UpdateIssuesCommit(pusher, repo, opts.Commits.Commits); err != nil {
log.Error(2, "UpdateIssuesCommit: %v", err)
}
}
}
@@ -501,7 +499,7 @@ func CommitRepoAction(opts CommitRepoActionOptions) error {
opts.Commits.Commits = opts.Commits.Commits[:setting.UI.FeedMaxCommitNum]
}
data, err := json.Marshal(opts.Commits)
data, err := jsoniter.Marshal(opts.Commits)
if err != nil {
return fmt.Errorf("Marshal: %v", err)
}
@@ -717,7 +715,7 @@ func MirrorSyncPushAction(repo *Repository, opts MirrorSyncPushActionOptions) er
return fmt.Errorf("PrepareWebhooks: %v", err)
}
data, err := json.Marshal(opts.Commits)
data, err := jsoniter.Marshal(opts.Commits)
if err != nil {
return err
}

View File

@@ -7,7 +7,6 @@ package models
import (
"fmt"
"os"
"os/exec"
"strings"
"time"
@@ -15,7 +14,6 @@ import (
"github.com/go-xorm/xorm"
log "gopkg.in/clog.v1"
"github.com/gogs/gogs/pkg/setting"
"github.com/gogs/gogs/pkg/tool"
)
@@ -30,7 +28,7 @@ type Notice struct {
ID int64
Type NoticeType
Description string `xorm:"TEXT"`
Created time.Time `xorm:"-"`
Created time.Time `xorm:"-" json:"-"`
CreatedUnix int64
}
@@ -52,9 +50,9 @@ func (n *Notice) TrStr() string {
// CreateNotice creates new system notice.
func CreateNotice(tp NoticeType, desc string) error {
// prevent panic if database connection is not available at this point
// Prevent panic if database connection is not available at this point
if x == nil {
return fmt.Errorf("Could not save notice due database connection not being available: %d %s", tp, desc)
return fmt.Errorf("could not save notice due database connection not being available: %d %s", tp, desc)
}
n := &Notice{
@@ -73,24 +71,11 @@ func CreateRepositoryNotice(desc string) error {
// RemoveAllWithNotice removes all directories in given path and
// creates a system notice when error occurs.
func RemoveAllWithNotice(title, path string) {
var err error
// LEGACY [Go 1.7, 0.12]: workaround for Go not being able to remove read-only files/folders: https://github.com/golang/go/issues/9606
// this bug should be fixed on Go 1.7, so the workaround should be removed when Gogs don't support Go 1.6 anymore:
// https://github.com/golang/go/commit/2ffb3e5d905b5622204d199128dec06cefd57790
// Note: Windows complains when delete target does not exist, therefore we can skip deletion in such cases.
if setting.IsWindows && com.IsExist(path) {
// converting "/" to "\" in path on Windows
path = strings.Replace(path, "/", "\\", -1)
err = exec.Command("cmd", "/C", "rmdir", "/S", "/Q", path).Run()
} else {
err = os.RemoveAll(path)
}
if err != nil {
if err := os.RemoveAll(path); err != nil {
desc := fmt.Sprintf("%s [%s]: %v", title, path, err)
log.Warn(desc)
if err = CreateRepositoryNotice(desc); err != nil {
log.Error(4, "CreateRepositoryNotice: %v", err)
log.Error(2, "CreateRepositoryNotice: %v", err)
}
}
}

View File

@@ -27,7 +27,7 @@ type Attachment struct {
ReleaseID int64 `xorm:"INDEX"`
Name string
Created time.Time `xorm:"-"`
Created time.Time `xorm:"-" json:"-"`
CreatedUnix int64
}
@@ -165,7 +165,6 @@ func DeleteAttachments(attachments []*Attachment, remove bool) (int, error) {
// DeleteAttachmentsByIssue deletes all attachments associated with the given issue.
func DeleteAttachmentsByIssue(issueId int64, remove bool) (int, error) {
attachments, err := GetAttachmentsByIssueID(issueId)
if err != nil {
return 0, err
}
@@ -176,7 +175,6 @@ func DeleteAttachmentsByIssue(issueId int64, remove bool) (int, error) {
// DeleteAttachmentsByComment deletes all attachments associated with the given comment.
func DeleteAttachmentsByComment(commentId int64, remove bool) (int, error) {
attachments, err := GetAttachmentsByCommentID(commentId)
if err != nil {
return 0, err
}

View File

@@ -52,26 +52,26 @@ type Comment struct {
ID int64
Type CommentType
PosterID int64
Poster *User `xorm:"-"`
Poster *User `xorm:"-" json:"-"`
IssueID int64 `xorm:"INDEX"`
Issue *Issue `xorm:"-"`
Issue *Issue `xorm:"-" json:"-"`
CommitID int64
Line int64
Content string `xorm:"TEXT"`
RenderedContent string `xorm:"-"`
RenderedContent string `xorm:"-" json:"-"`
Created time.Time `xorm:"-"`
Created time.Time `xorm:"-" json:"-"`
CreatedUnix int64
Updated time.Time `xorm:"-"`
Updated time.Time `xorm:"-" json:"-"`
UpdatedUnix int64
// Reference issue in commit message
CommitSHA string `xorm:"VARCHAR(40)"`
Attachments []*Attachment `xorm:"-"`
Attachments []*Attachment `xorm:"-" json:"-"`
// For view issue page.
ShowTag CommentTag `xorm:"-"`
ShowTag CommentTag `xorm:"-" json:"-"`
}
func (c *Comment) BeforeInsert() {
@@ -132,14 +132,6 @@ func (c *Comment) LoadAttributes() error {
return c.loadAttributes(x)
}
func (c *Comment) AfterDelete() {
_, err := DeleteAttachmentsByComment(c.ID, true)
if err != nil {
log.Info("Could not delete files for comment %d on issue #%d: %s", c.ID, c.IssueID, err)
}
}
func (c *Comment) HTMLURL() string {
return fmt.Sprintf("%s#issuecomment-%d", c.Issue.HTMLURL(), c.ID)
}
@@ -508,7 +500,7 @@ func DeleteCommentByID(doer *User, id int64) error {
return err
}
if _, err = sess.Id(comment.ID).Delete(new(Comment)); err != nil {
if _, err = sess.ID(comment.ID).Delete(new(Comment)); err != nil {
return err
}
@@ -519,7 +511,12 @@ func DeleteCommentByID(doer *User, id int64) error {
}
if err = sess.Commit(); err != nil {
return fmt.Errorf("Commit: %v", err)
return fmt.Errorf("commit: %v", err)
}
_, err = DeleteAttachmentsByComment(comment.ID, true)
if err != nil {
log.Error(2, "Failed to delete attachments by comment[%d]: %v", comment.ID, err)
}
if err = comment.Issue.LoadAttributes(); err != nil {

View File

@@ -6,6 +6,8 @@ package errors
import "errors"
var InternalServerError = errors.New("internal server error")
// New is a wrapper of real errors.New function.
func New(text string) error {
return errors.New(text)

21
models/errors/org.go Normal file
View File

@@ -0,0 +1,21 @@
// Copyright 2018 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package errors
import "fmt"
type TeamNotExist struct {
TeamID int64
Name string
}
func IsTeamNotExist(err error) bool {
_, ok := err.(TeamNotExist)
return ok
}
func (err TeamNotExist) Error() string {
return fmt.Sprintf("team does not exist [team_id: %d, name: %s]", err.TeamID, err.Name)
}

View File

@@ -28,34 +28,34 @@ var (
type Issue struct {
ID int64
RepoID int64 `xorm:"INDEX UNIQUE(repo_index)"`
Repo *Repository `xorm:"-"`
Repo *Repository `xorm:"-" json:"-"`
Index int64 `xorm:"UNIQUE(repo_index)"` // Index in one repository.
PosterID int64
Poster *User `xorm:"-"`
Poster *User `xorm:"-" json:"-"`
Title string `xorm:"name"`
Content string `xorm:"TEXT"`
RenderedContent string `xorm:"-"`
Labels []*Label `xorm:"-"`
RenderedContent string `xorm:"-" json:"-"`
Labels []*Label `xorm:"-" json:"-"`
MilestoneID int64
Milestone *Milestone `xorm:"-"`
Milestone *Milestone `xorm:"-" json:"-"`
Priority int
AssigneeID int64
Assignee *User `xorm:"-"`
Assignee *User `xorm:"-" json:"-"`
IsClosed bool
IsRead bool `xorm:"-"`
IsRead bool `xorm:"-" json:"-"`
IsPull bool // Indicates whether is a pull request or not.
PullRequest *PullRequest `xorm:"-"`
PullRequest *PullRequest `xorm:"-" json:"-"`
NumComments int
Deadline time.Time `xorm:"-"`
Deadline time.Time `xorm:"-" json:"-"`
DeadlineUnix int64
Created time.Time `xorm:"-"`
Created time.Time `xorm:"-" json:"-"`
CreatedUnix int64
Updated time.Time `xorm:"-"`
Updated time.Time `xorm:"-" json:"-"`
UpdatedUnix int64
Attachments []*Attachment `xorm:"-"`
Comments []*Comment `xorm:"-"`
Attachments []*Attachment `xorm:"-" json:"-"`
Comments []*Comment `xorm:"-" json:"-"`
}
func (issue *Issue) BeforeInsert() {
@@ -160,8 +160,8 @@ func (issue *Issue) HTMLURL() string {
}
// State returns string representation of issue status.
func (i *Issue) State() api.StateType {
if i.IsClosed {
func (issue *Issue) State() api.StateType {
if issue.IsClosed {
return api.STATE_CLOSED
}
return api.STATE_OPEN
@@ -208,22 +208,22 @@ func (issue *Issue) APIFormat() *api.Issue {
}
// HashTag returns unique hash tag for issue.
func (i *Issue) HashTag() string {
return "issue-" + com.ToStr(i.ID)
func (issue *Issue) HashTag() string {
return "issue-" + com.ToStr(issue.ID)
}
// IsPoster returns true if given user by ID is the poster.
func (i *Issue) IsPoster(uid int64) bool {
return i.PosterID == uid
func (issue *Issue) IsPoster(uid int64) bool {
return issue.PosterID == uid
}
func (i *Issue) hasLabel(e Engine, labelID int64) bool {
return hasIssueLabel(e, i.ID, labelID)
func (issue *Issue) hasLabel(e Engine, labelID int64) bool {
return hasIssueLabel(e, issue.ID, labelID)
}
// HasLabel returns true if issue has been labeled by given ID.
func (i *Issue) HasLabel(labelID int64) bool {
return i.hasLabel(x, labelID)
func (issue *Issue) HasLabel(labelID int64) bool {
return issue.hasLabel(x, labelID)
}
func (issue *Issue) sendLabelUpdatedWebhook(doer *User) {
@@ -255,8 +255,8 @@ func (issue *Issue) sendLabelUpdatedWebhook(doer *User) {
}
}
func (i *Issue) addLabel(e *xorm.Session, label *Label) error {
return newIssueLabel(e, i, label)
func (issue *Issue) addLabel(e *xorm.Session, label *Label) error {
return newIssueLabel(e, issue, label)
}
// AddLabel adds a new label to the issue.
@@ -314,8 +314,13 @@ func (issue *Issue) clearLabels(e *xorm.Session) (err error) {
return fmt.Errorf("getLabels: %v", err)
}
// NOTE: issue.removeLabel slices issue.Labels, so we need to create another slice to be unaffected.
labels := make([]*Label, len(issue.Labels))
for i := range issue.Labels {
if err = issue.removeLabel(e, issue.Labels[i]); err != nil {
labels[i] = issue.Labels[i]
}
for i := range labels {
if err = issue.removeLabel(e, labels[i]); err != nil {
return fmt.Errorf("removeLabel: %v", err)
}
}
@@ -384,12 +389,12 @@ func (issue *Issue) ReplaceLabels(labels []*Label) (err error) {
return sess.Commit()
}
func (i *Issue) GetAssignee() (err error) {
if i.AssigneeID == 0 || i.Assignee != nil {
func (issue *Issue) GetAssignee() (err error) {
if issue.AssigneeID == 0 || issue.Assignee != nil {
return nil
}
i.Assignee, err = GetUserByID(i.AssigneeID)
issue.Assignee, err = GetUserByID(issue.AssigneeID)
if errors.IsUserNotExist(err) {
return nil
}
@@ -397,12 +402,12 @@ func (i *Issue) GetAssignee() (err error) {
}
// ReadBy sets issue to be read by given user.
func (i *Issue) ReadBy(uid int64) error {
return UpdateIssueUserByRead(uid, i.ID)
func (issue *Issue) ReadBy(uid int64) error {
return UpdateIssueUserByRead(uid, issue.ID)
}
func updateIssueCols(e Engine, issue *Issue, cols ...string) error {
_, err := e.Id(issue.ID).Cols(cols...).Update(issue)
_, err := e.ID(issue.ID).Cols(cols...).Update(issue)
return err
}
@@ -411,41 +416,41 @@ func UpdateIssueCols(issue *Issue, cols ...string) error {
return updateIssueCols(x, issue, cols...)
}
func (i *Issue) changeStatus(e *xorm.Session, doer *User, repo *Repository, isClosed bool) (err error) {
func (issue *Issue) changeStatus(e *xorm.Session, doer *User, repo *Repository, isClosed bool) (err error) {
// Nothing should be performed if current status is same as target status
if i.IsClosed == isClosed {
if issue.IsClosed == isClosed {
return nil
}
i.IsClosed = isClosed
issue.IsClosed = isClosed
if err = updateIssueCols(e, i, "is_closed"); err != nil {
if err = updateIssueCols(e, issue, "is_closed"); err != nil {
return err
} else if err = updateIssueUsersByStatus(e, i.ID, isClosed); err != nil {
} else if err = updateIssueUsersByStatus(e, issue.ID, isClosed); err != nil {
return err
}
// Update issue count of labels
if err = i.getLabels(e); err != nil {
if err = issue.getLabels(e); err != nil {
return err
}
for idx := range i.Labels {
if i.IsClosed {
i.Labels[idx].NumClosedIssues++
for idx := range issue.Labels {
if issue.IsClosed {
issue.Labels[idx].NumClosedIssues++
} else {
i.Labels[idx].NumClosedIssues--
issue.Labels[idx].NumClosedIssues--
}
if err = updateLabel(e, i.Labels[idx]); err != nil {
if err = updateLabel(e, issue.Labels[idx]); err != nil {
return err
}
}
// Update issue count of milestone
if err = changeMilestoneIssueStats(e, i); err != nil {
if err = changeMilestoneIssueStats(e, issue); err != nil {
return err
}
// New action comment
if _, err = createStatusComment(e, doer, repo, i); err != nil {
if _, err = createStatusComment(e, doer, repo, issue); err != nil {
return err
}
@@ -799,9 +804,9 @@ func GetIssueByRef(ref string) (*Issue, error) {
return nil, errors.InvalidIssueReference{ref}
}
index, err := com.StrTo(ref[n+1:]).Int64()
if err != nil {
return nil, err
index := com.StrTo(ref[n+1:]).MustInt64()
if index == 0 {
return nil, errors.IssueNotExist{}
}
repo, err := GetRepositoryByRef(ref[:n])
@@ -843,7 +848,7 @@ func GetIssueByIndex(repoID, index int64) (*Issue, error) {
func getRawIssueByID(e Engine, id int64) (*Issue, error) {
issue := new(Issue)
has, err := e.Id(id).Get(issue)
has, err := e.ID(id).Get(issue)
if err != nil {
return nil, err
} else if !has {
@@ -1354,7 +1359,7 @@ func GetRepoIssueStats(repoID, userID int64, filterMode FilterMode, isPull bool)
}
func updateIssue(e Engine, issue *Issue) error {
_, err := e.Id(issue.ID).AllCols().Update(issue)
_, err := e.ID(issue.ID).AllCols().Update(issue)
return err
}
@@ -1423,7 +1428,7 @@ func updateIssueUsersByMentions(e Engine, issueID int64, uids []int64) error {
iu.IsMentioned = true
if has {
_, err = e.Id(iu.ID).AllCols().Update(iu)
_, err = e.ID(iu.ID).AllCols().Update(iu)
} else {
_, err = e.Insert(iu)
}

View File

@@ -60,8 +60,8 @@ type Label struct {
Color string `xorm:"VARCHAR(7)"`
NumIssues int
NumClosedIssues int
NumOpenIssues int `xorm:"-"`
IsChecked bool `xorm:"-"`
NumOpenIssues int `xorm:"-" json:"-"`
IsChecked bool `xorm:"-" json:"-"`
}
func (label *Label) APIFormat() *api.Label {
@@ -196,7 +196,7 @@ func GetLabelsByIssueID(issueID int64) ([]*Label, error) {
}
func updateLabel(e Engine, l *Label) error {
_, err := e.Id(l.ID).AllCols().Update(l)
_, err := e.ID(l.ID).AllCols().Update(l)
return err
}
@@ -221,7 +221,7 @@ func DeleteLabel(repoID, labelID int64) error {
return err
}
if _, err = sess.Id(labelID).Delete(new(Label)); err != nil {
if _, err = sess.ID(labelID).Delete(new(Label)); err != nil {
return err
} else if _, err = sess.Where("label_id = ?", labelID).Delete(new(IssueLabel)); err != nil {
return err

View File

@@ -2,11 +2,11 @@
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
// FIXME: Put this file into its own package and separate into different files based on login sources.
package models
import (
"crypto/tls"
"encoding/json"
"fmt"
"net/smtp"
"net/textproto"
@@ -20,10 +20,12 @@ import (
"github.com/go-macaron/binding"
"github.com/go-xorm/core"
"github.com/go-xorm/xorm"
"github.com/json-iterator/go"
log "gopkg.in/clog.v1"
"gopkg.in/ini.v1"
"github.com/gogs/gogs/models/errors"
"github.com/gogs/gogs/pkg/auth/github"
"github.com/gogs/gogs/pkg/auth/ldap"
"github.com/gogs/gogs/pkg/auth/pam"
"github.com/gogs/gogs/pkg/setting"
@@ -39,13 +41,15 @@ const (
LOGIN_SMTP // 3
LOGIN_PAM // 4
LOGIN_DLDAP // 5
LOGIN_GITHUB // 6
)
var LoginNames = map[LoginType]string{
LOGIN_LDAP: "LDAP (via BindDN)",
LOGIN_DLDAP: "LDAP (simple auth)", // Via direct bind
LOGIN_SMTP: "SMTP",
LOGIN_PAM: "PAM",
LOGIN_LDAP: "LDAP (via BindDN)",
LOGIN_DLDAP: "LDAP (simple auth)", // Via direct bind
LOGIN_SMTP: "SMTP",
LOGIN_PAM: "PAM",
LOGIN_GITHUB: "GitHub",
}
var SecurityProtocolNames = map[ldap.SecurityProtocol]string{
@@ -59,6 +63,7 @@ var (
_ core.Conversion = &LDAPConfig{}
_ core.Conversion = &SMTPConfig{}
_ core.Conversion = &PAMConfig{}
_ core.Conversion = &GitHubConfig{}
)
type LDAPConfig struct {
@@ -66,11 +71,11 @@ type LDAPConfig struct {
}
func (cfg *LDAPConfig) FromDB(bs []byte) error {
return json.Unmarshal(bs, &cfg)
return jsoniter.Unmarshal(bs, &cfg)
}
func (cfg *LDAPConfig) ToDB() ([]byte, error) {
return json.Marshal(cfg)
return jsoniter.Marshal(cfg)
}
func (cfg *LDAPConfig) SecurityProtocolName() string {
@@ -87,11 +92,11 @@ type SMTPConfig struct {
}
func (cfg *SMTPConfig) FromDB(bs []byte) error {
return json.Unmarshal(bs, cfg)
return jsoniter.Unmarshal(bs, cfg)
}
func (cfg *SMTPConfig) ToDB() ([]byte, error) {
return json.Marshal(cfg)
return jsoniter.Marshal(cfg)
}
type PAMConfig struct {
@@ -99,11 +104,23 @@ type PAMConfig struct {
}
func (cfg *PAMConfig) FromDB(bs []byte) error {
return json.Unmarshal(bs, &cfg)
return jsoniter.Unmarshal(bs, &cfg)
}
func (cfg *PAMConfig) ToDB() ([]byte, error) {
return json.Marshal(cfg)
return jsoniter.Marshal(cfg)
}
type GitHubConfig struct {
APIEndpoint string // GitHub service (e.g. https://api.github.com/)
}
func (cfg *GitHubConfig) FromDB(bs []byte) error {
return jsoniter.Unmarshal(bs, &cfg)
}
func (cfg *GitHubConfig) ToDB() ([]byte, error) {
return jsoniter.Marshal(cfg)
}
// AuthSourceFile contains information of an authentication source file.
@@ -133,14 +150,15 @@ type LoginSource struct {
Type LoginType
Name string `xorm:"UNIQUE"`
IsActived bool `xorm:"NOT NULL DEFAULT false"`
IsDefault bool `xorm:"DEFAULT false"`
Cfg core.Conversion `xorm:"TEXT"`
Created time.Time `xorm:"-"`
Created time.Time `xorm:"-" json:"-"`
CreatedUnix int64
Updated time.Time `xorm:"-"`
Updated time.Time `xorm:"-" json:"-"`
UpdatedUnix int64
LocalFile *AuthSourceFile `xorm:"-"`
LocalFile *AuthSourceFile `xorm:"-" json:"-"`
}
func (s *LoginSource) BeforeInsert() {
@@ -173,6 +191,8 @@ func (s *LoginSource) BeforeSet(colName string, val xorm.Cell) {
s.Cfg = new(SMTPConfig)
case LOGIN_PAM:
s.Cfg = new(PAMConfig)
case LOGIN_GITHUB:
s.Cfg = new(GitHubConfig)
default:
panic("unrecognized login source type: " + com.ToStr(*val))
}
@@ -208,6 +228,10 @@ func (s *LoginSource) IsPAM() bool {
return s.Type == LOGIN_PAM
}
func (s *LoginSource) IsGitHub() bool {
return s.Type == LOGIN_GITHUB
}
func (s *LoginSource) HasTLS() bool {
return ((s.IsLDAP() || s.IsDLDAP()) &&
s.LDAP().SecurityProtocol > ldap.SECURITY_PROTOCOL_UNENCRYPTED) ||
@@ -248,6 +272,10 @@ func (s *LoginSource) PAM() *PAMConfig {
return s.Cfg.(*PAMConfig)
}
func (s *LoginSource) GitHub() *GitHubConfig {
return s.Cfg.(*GitHubConfig)
}
func CreateLoginSource(source *LoginSource) error {
has, err := x.Get(&LoginSource{Name: source.Name})
if err != nil {
@@ -257,7 +285,12 @@ func CreateLoginSource(source *LoginSource) error {
}
_, err = x.Insert(source)
return err
if err != nil {
return err
} else if source.IsDefault {
return ResetNonDefaultLoginSources(source)
}
return nil
}
// LoginSources returns all login sources defined.
@@ -291,23 +324,48 @@ func GetLoginSourceByID(id int64) (*LoginSource, error) {
return source, nil
}
// ResetNonDefaultLoginSources clean other default source flag
func ResetNonDefaultLoginSources(source *LoginSource) error {
// update changes to DB
if _, err := x.NotIn("id", []int64{source.ID}).Cols("is_default").Update(&LoginSource{IsDefault: false}); err != nil {
return err
}
// write changes to local authentications
for i := range localLoginSources.sources {
if localLoginSources.sources[i].LocalFile != nil && localLoginSources.sources[i].ID != source.ID {
localLoginSources.sources[i].LocalFile.SetGeneral("is_default", "false")
if err := localLoginSources.sources[i].LocalFile.SetConfig(source.Cfg); err != nil {
return fmt.Errorf("LocalFile.SetConfig: %v", err)
} else if err = localLoginSources.sources[i].LocalFile.Save(); err != nil {
return fmt.Errorf("LocalFile.Save: %v", err)
}
}
}
// flush memory so that web page can show the same behaviors
localLoginSources.UpdateLoginSource(source)
return nil
}
// UpdateLoginSource updates information of login source to database or local file.
func UpdateLoginSource(source *LoginSource) error {
if source.LocalFile == nil {
_, err := x.Id(source.ID).AllCols().Update(source)
return err
if _, err := x.Id(source.ID).AllCols().Update(source); err != nil {
return err
} else {
return ResetNonDefaultLoginSources(source)
}
}
source.LocalFile.SetGeneral("name", source.Name)
source.LocalFile.SetGeneral("is_activated", com.ToStr(source.IsActived))
source.LocalFile.SetGeneral("is_default", com.ToStr(source.IsDefault))
if err := source.LocalFile.SetConfig(source.Cfg); err != nil {
return fmt.Errorf("LocalFile.SetConfig: %v", err)
} else if err = source.LocalFile.Save(); err != nil {
return fmt.Errorf("LocalFile.Save: %v", err)
}
localLoginSources.UpdateLoginSource(source)
return nil
return ResetNonDefaultLoginSources(source)
}
func DeleteSource(source *LoginSource) error {
@@ -361,7 +419,6 @@ func (s *LocalLoginSources) ActivatedList() []*LoginSource {
if !s.sources[i].IsActived {
continue
}
source := &LoginSource{}
*source = *s.sources[i]
list = append(list, source)
@@ -394,7 +451,8 @@ func (s *LocalLoginSources) UpdateLoginSource(source *LoginSource) {
for i := range s.sources {
if s.sources[i].ID == source.ID {
*s.sources[i] = *source
break
} else if source.IsDefault {
s.sources[i].IsDefault = false
}
}
}
@@ -429,6 +487,7 @@ func LoadAuthSources() {
ID: s.Key("id").MustInt64(),
Name: s.Key("name").String(),
IsActived: s.Key("is_activated").MustBool(),
IsDefault: s.Key("is_default").MustBool(),
LocalFile: &AuthSourceFile{
abspath: fpath,
file: authSource,
@@ -456,6 +515,9 @@ func LoadAuthSources() {
case "pam":
loginSource.Type = LOGIN_PAM
loginSource.Cfg = &PAMConfig{}
case "github":
loginSource.Type = LOGIN_GITHUB
loginSource.Cfg = &GitHubConfig{}
default:
log.Fatal(2, "Failed to load authentication source: unknown type '%s'", authType)
}
@@ -695,6 +757,41 @@ func LoginViaPAM(user *User, login, password string, sourceID int64, cfg *PAMCon
return user, CreateUser(user)
}
//________.__ __ ___ ___ ___.
/// _____/|__|/ |_ / | \ __ _\_ |__
/// \ ___| \ __\/ ~ \ | \ __ \
//\ \_\ \ || | \ Y / | / \_\ \
//\______ /__||__| \___|_ /|____/|___ /
//\/ \/ \/
func LoginViaGitHub(user *User, login, password string, sourceID int64, cfg *GitHubConfig, autoRegister bool) (*User, error) {
fullname, email, url, location, err := github.Authenticate(cfg.APIEndpoint, login, password)
if err != nil {
if strings.Contains(err.Error(), "401") {
return nil, errors.UserNotExist{0, login}
}
return nil, err
}
if !autoRegister {
return user, nil
}
user = &User{
LowerName: strings.ToLower(login),
Name: login,
FullName: fullname,
Email: email,
Website: url,
Passwd: password,
LoginType: LOGIN_GITHUB,
LoginSource: sourceID,
LoginName: login,
IsActive: true,
Location: location,
}
return user, CreateUser(user)
}
func remoteUserLogin(user *User, login, password string, source *LoginSource, autoRegister bool) (*User, error) {
if !source.IsActived {
return nil, errors.LoginSourceNotActivated{source.ID}
@@ -707,6 +804,8 @@ func remoteUserLogin(user *User, login, password string, source *LoginSource, au
return LoginViaSMTP(user, login, password, source.ID, source.Cfg.(*SMTPConfig), autoRegister)
case LOGIN_PAM:
return LoginViaPAM(user, login, password, source.ID, source.Cfg.(*PAMConfig), autoRegister)
case LOGIN_GITHUB:
return LoginViaGitHub(user, login, password, source.ID, source.Cfg.(*GitHubConfig), autoRegister)
}
return nil, errors.InvalidLoginSourceType{source.Type}

View File

@@ -64,6 +64,10 @@ var migrations = []Migration{
NewMigration("update repository sizes", updateRepositorySizes),
// v16 -> v17:v0.10.31
NewMigration("remove invalid protect branch whitelist", removeInvalidProtectBranchWhitelist),
// v17 -> v18:v0.11.48
NewMigration("store long text in repository description field", updateRepositoryDescriptionField),
// v18 -> v19:v0.11.55
NewMigration("clean unlinked webhook and hook_tasks", cleanUnlinkedWebhookAndHookTasks),
}
// Migrate database to current version
@@ -158,7 +162,7 @@ func generateOrgRandsAndSalt(x *xorm.Engine) (err error) {
if org.Salt, err = tool.RandomString(10); err != nil {
return err
}
if _, err = sess.Id(org.ID).Update(org); err != nil {
if _, err = sess.ID(org.ID).Update(org); err != nil {
return err
}
}

View File

@@ -5,12 +5,12 @@
package migrations
import (
"encoding/json"
"fmt"
"strings"
"github.com/Unknwon/com"
"github.com/go-xorm/xorm"
"github.com/json-iterator/go"
)
func ldapUseSSLToSecurityProtocol(x *xorm.Engine) error {
@@ -30,17 +30,17 @@ func ldapUseSSLToSecurityProtocol(x *xorm.Engine) error {
for _, result := range results {
cfg := map[string]interface{}{}
if err = json.Unmarshal(result["cfg"], &cfg); err != nil {
return fmt.Errorf("decode JSON config: %v", err)
if err = jsoniter.Unmarshal(result["cfg"], &cfg); err != nil {
return fmt.Errorf("unmarshal JSON config: %v", err)
}
if com.ToStr(cfg["UseSSL"]) == "true" {
cfg["SecurityProtocol"] = 1 // LDAPS
}
delete(cfg, "UseSSL")
data, err := json.Marshal(&cfg)
data, err := jsoniter.Marshal(&cfg)
if err != nil {
return fmt.Errorf("encode JSON config: %v", err)
return fmt.Errorf("marshal JSON config: %v", err)
}
if _, err = sess.Exec("UPDATE `login_source` SET `cfg`=? WHERE `id`=?",

34
models/migrations/v18.go Normal file
View File

@@ -0,0 +1,34 @@
// Copyright 2018 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package migrations
import (
"fmt"
"github.com/go-xorm/xorm"
"github.com/gogs/gogs/pkg/setting"
)
func updateRepositoryDescriptionField(x *xorm.Engine) error {
exist, err := x.IsTableExist("repository")
if err != nil {
return fmt.Errorf("IsTableExist: %v", err)
} else if !exist {
return nil
}
switch {
case setting.UseMySQL:
_, err = x.Exec("ALTER TABLE `repository` MODIFY `description` VARCHAR(512);")
case setting.UseMSSQL:
_, err = x.Exec("ALTER TABLE `repository` ALTER COLUMN `description` VARCHAR(512);")
case setting.UsePostgreSQL:
_, err = x.Exec("ALTER TABLE `repository` ALTER COLUMN `description` TYPE VARCHAR(512);")
case setting.UseSQLite3:
// Sqlite3 uses TEXT type by default for any string type field.
// Keep this comment to mention that we don't missed any option.
}
return err
}

18
models/migrations/v19.go Normal file
View File

@@ -0,0 +1,18 @@
// Copyright 2018 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package migrations
import (
"github.com/go-xorm/xorm"
)
func cleanUnlinkedWebhookAndHookTasks(x *xorm.Engine) error {
_, err := x.Exec(`DELETE FROM webhook WHERE repo_id NOT IN (SELECT id FROM repository);`)
if err != nil {
return err
}
_, err = x.Exec(`DELETE FROM hook_task WHERE repo_id NOT IN (SELECT id FROM repository);`)
return err
}

View File

@@ -22,18 +22,18 @@ type Milestone struct {
RepoID int64 `xorm:"INDEX"`
Name string
Content string `xorm:"TEXT"`
RenderedContent string `xorm:"-"`
RenderedContent string `xorm:"-" json:"-"`
IsClosed bool
NumIssues int
NumClosedIssues int
NumOpenIssues int `xorm:"-"`
NumOpenIssues int `xorm:"-" json:"-"`
Completeness int // Percentage(1-100).
IsOverDue bool `xorm:"-"`
IsOverDue bool `xorm:"-" json:"-"`
DeadlineString string `xorm:"-"`
Deadline time.Time `xorm:"-"`
DeadlineString string `xorm:"-" json:"-"`
Deadline time.Time `xorm:"-" json:"-"`
DeadlineUnix int64
ClosedDate time.Time `xorm:"-"`
ClosedDate time.Time `xorm:"-" json:"-"`
ClosedDateUnix int64
}
@@ -166,7 +166,7 @@ func GetMilestones(repoID int64, page int, isClosed bool) ([]*Milestone, error)
}
func updateMilestone(e Engine, m *Milestone) error {
_, err := e.Id(m.ID).AllCols().Update(m)
_, err := e.ID(m.ID).AllCols().Update(m)
return err
}
@@ -223,7 +223,7 @@ func ChangeMilestoneStatus(m *Milestone, isClosed bool) (err error) {
repo.NumMilestones = int(countRepoMilestones(sess, repo.ID))
repo.NumClosedMilestones = int(countRepoClosedMilestones(sess, repo.ID))
if _, err = sess.Id(repo.ID).AllCols().Update(repo); err != nil {
if _, err = sess.ID(repo.ID).AllCols().Update(repo); err != nil {
return err
}
return sess.Commit()
@@ -383,13 +383,13 @@ func DeleteMilestoneOfRepoByID(repoID, id int64) error {
return err
}
if _, err = sess.Id(m.ID).Delete(new(Milestone)); err != nil {
if _, err = sess.ID(m.ID).Delete(new(Milestone)); err != nil {
return err
}
repo.NumMilestones = int(countRepoMilestones(sess, repo.ID))
repo.NumClosedMilestones = int(countRepoClosedMilestones(sess, repo.ID))
if _, err = sess.Id(repo.ID).AllCols().Update(repo); err != nil {
if _, err = sess.ID(repo.ID).AllCols().Update(repo); err != nil {
return err
}

View File

@@ -5,6 +5,7 @@
package models
import (
"container/list"
"fmt"
"net/url"
"strings"
@@ -29,17 +30,17 @@ var MirrorQueue = sync.NewUniqueQueue(setting.Repository.MirrorQueueLength)
type Mirror struct {
ID int64
RepoID int64
Repo *Repository `xorm:"-"`
Repo *Repository `xorm:"-" json:"-"`
Interval int // Hour.
EnablePrune bool `xorm:"NOT NULL DEFAULT true"`
// Last and next sync time of Git data from upstream
LastSync time.Time `xorm:"-"`
LastSync time.Time `xorm:"-" json:"-"`
LastSyncUnix int64 `xorm:"updated_unix"`
NextSync time.Time `xorm:"-"`
NextSync time.Time `xorm:"-" json:"-"`
NextSyncUnix int64 `xorm:"next_update_unix"`
address string `xorm:"-"`
address string `xorm:"-" json:"-"`
}
func (m *Mirror) BeforeInsert() {
@@ -211,7 +212,6 @@ func parseRemoteUpdateOutput(output string) []*mirrorSyncResult {
}
refName := lines[i][idx+3:]
switch {
case strings.HasPrefix(lines[i], " * "): // New reference
results = append(results, &mirrorSyncResult{
@@ -320,7 +320,7 @@ func GetMirrorByRepoID(repoID int64) (*Mirror, error) {
}
func updateMirror(e Engine, m *Mirror) error {
_, err := e.Id(m.ID).AllCols().Update(m)
_, err := e.ID(m.ID).AllCols().Update(m)
return err
}
@@ -362,7 +362,7 @@ func MirrorUpdate() {
func SyncMirrors() {
// Start listening on new sync requests.
for repoID := range MirrorQueue.Queue() {
log.Trace("SyncMirrors [repo_id: %d]", repoID)
log.Trace("SyncMirrors [repo_id: %s]", repoID)
MirrorQueue.Remove(repoID)
m, err := GetMirrorByRepoID(com.StrTo(repoID).MustInt64())
@@ -403,14 +403,6 @@ func SyncMirrors() {
continue
}
// Create reference
if result.oldCommitID == GIT_SHORT_EMPTY_SHA {
if err = MirrorSyncCreateAction(m.Repo, result.refName); err != nil {
log.Error(2, "MirrorSyncCreateAction [repo_id: %d]: %v", m.RepoID, err)
}
continue
}
// Delete reference
if result.newCommitID == GIT_SHORT_EMPTY_SHA {
if err = MirrorSyncDeleteAction(m.Repo, result.refName); err != nil {
@@ -419,21 +411,54 @@ func SyncMirrors() {
continue
}
// New reference
isNewRef := false
if result.oldCommitID == GIT_SHORT_EMPTY_SHA {
if err = MirrorSyncCreateAction(m.Repo, result.refName); err != nil {
log.Error(2, "MirrorSyncCreateAction [repo_id: %d]: %v", m.RepoID, err)
continue
}
isNewRef = true
}
// Push commits
oldCommitID, err := git.GetFullCommitID(gitRepo.Path, result.oldCommitID)
if err != nil {
log.Error(2, "GetFullCommitID [%d]: %v", m.RepoID, err)
continue
}
newCommitID, err := git.GetFullCommitID(gitRepo.Path, result.newCommitID)
if err != nil {
log.Error(2, "GetFullCommitID [%d]: %v", m.RepoID, err)
continue
}
commits, err := gitRepo.CommitsBetweenIDs(newCommitID, oldCommitID)
if err != nil {
log.Error(2, "CommitsBetweenIDs [repo_id: %d, new_commit_id: %s, old_commit_id: %s]: %v", m.RepoID, newCommitID, oldCommitID, err)
continue
var commits *list.List
var oldCommitID string
var newCommitID string
if !isNewRef {
oldCommitID, err = git.GetFullCommitID(gitRepo.Path, result.oldCommitID)
if err != nil {
log.Error(2, "GetFullCommitID [%d]: %v", m.RepoID, err)
continue
}
newCommitID, err = git.GetFullCommitID(gitRepo.Path, result.newCommitID)
if err != nil {
log.Error(2, "GetFullCommitID [%d]: %v", m.RepoID, err)
continue
}
commits, err = gitRepo.CommitsBetweenIDs(newCommitID, oldCommitID)
if err != nil {
log.Error(2, "CommitsBetweenIDs [repo_id: %d, new_commit_id: %s, old_commit_id: %s]: %v", m.RepoID, newCommitID, oldCommitID, err)
continue
}
} else {
refNewCommitID, err := gitRepo.GetBranchCommitID(result.refName)
if err != nil {
log.Error(2, "GetFullCommitID [%d]: %v", m.RepoID, err)
continue
}
if newCommit, err := gitRepo.GetCommit(refNewCommitID); err != nil {
log.Error(2, "GetCommit [repo_id: %d, commit_id: %s]: %v", m.RepoID, refNewCommitID, err)
continue
} else {
// TODO: Get the commits for the new ref until the closest ancestor branch like Github does
commits, err = newCommit.CommitsBeforeLimit(10)
if err != nil {
log.Error(2, "CommitsBeforeLimit [repo_id: %d, commit_id: %s]: %v", m.RepoID, refNewCommitID, err)
}
oldCommitID = git.EMPTY_SHA
newCommitID = refNewCommitID
}
}
if err = MirrorSyncPushAction(m.Repo, MirrorSyncPushActionOptions{
RefName: result.refName,

View File

@@ -7,7 +7,6 @@ package models
import (
"bufio"
"database/sql"
"encoding/json"
"errors"
"fmt"
"net/url"
@@ -20,6 +19,7 @@ import (
_ "github.com/go-sql-driver/mysql"
"github.com/go-xorm/core"
"github.com/go-xorm/xorm"
"github.com/json-iterator/go"
_ "github.com/lib/pq"
log "gopkg.in/clog.v1"
@@ -33,7 +33,7 @@ type Engine interface {
Exec(string, ...interface{}) (sql.Result, error)
Find(interface{}, ...interface{}) error
Get(interface{}) (bool, error)
Id(interface{}) *xorm.Session
ID(interface{}) *xorm.Session
In(string, ...interface{}) *xorm.Session
Insert(...interface{}) (int64, error)
InsertOne(interface{}) (int64, error)
@@ -285,8 +285,7 @@ func DumpDatabase(dirPath string) (err error) {
}
if err = x.Asc("id").Iterate(table, func(idx int, bean interface{}) (err error) {
enc := json.NewEncoder(f)
return enc.Encode(bean)
return jsoniter.NewEncoder(f).Encode(bean)
}); err != nil {
f.Close()
return fmt.Errorf("fail to dump table '%s': %v", tableName, err)
@@ -300,6 +299,11 @@ func DumpDatabase(dirPath string) (err error) {
func ImportDatabase(dirPath string, verbose bool) (err error) {
snakeMapper := core.SnakeMapper{}
skipInsertProcessors := map[string]bool{
"mirror": true,
"milestone": true,
}
// Purposely create a local variable to not modify global variable
tables := append(tables, new(Version))
for _, table := range tables {
@@ -314,22 +318,24 @@ func ImportDatabase(dirPath string, verbose bool) (err error) {
}
if err = x.DropTables(table); err != nil {
return fmt.Errorf("fail to drop table '%s': %v", tableName, err)
return fmt.Errorf("drop table '%s': %v", tableName, err)
} else if err = x.Sync2(table); err != nil {
return fmt.Errorf("fail to sync table '%s': %v", tableName, err)
return fmt.Errorf("sync table '%s': %v", tableName, err)
}
f, err := os.Open(tableFile)
if err != nil {
return fmt.Errorf("fail to open JSON file: %v", err)
return fmt.Errorf("open JSON file: %v", err)
}
rawTableName := x.TableName(table)
_, isInsertProcessor := table.(xorm.BeforeInsertProcessor)
scanner := bufio.NewScanner(f)
for scanner.Scan() {
switch bean := table.(type) {
case *LoginSource:
meta := make(map[string]interface{})
if err = json.Unmarshal(scanner.Bytes(), &meta); err != nil {
return fmt.Errorf("fail to unmarshal to map: %v", err)
if err = jsoniter.Unmarshal(scanner.Bytes(), &meta); err != nil {
return fmt.Errorf("unmarshal to map: %v", err)
}
tp := LoginType(com.StrTo(com.ToStr(meta["Type"])).MustInt64())
@@ -340,18 +346,39 @@ func ImportDatabase(dirPath string, verbose bool) (err error) {
bean.Cfg = new(SMTPConfig)
case LOGIN_PAM:
bean.Cfg = new(PAMConfig)
case LOGIN_GITHUB:
bean.Cfg = new(GitHubConfig)
default:
return fmt.Errorf("unrecognized login source type:: %v", tp)
}
table = bean
}
if err = json.Unmarshal(scanner.Bytes(), table); err != nil {
return fmt.Errorf("fail to unmarshal to struct: %v", err)
if err = jsoniter.Unmarshal(scanner.Bytes(), table); err != nil {
return fmt.Errorf("unmarshal to struct: %v", err)
}
if _, err = x.Insert(table); err != nil {
return fmt.Errorf("fail to insert strcut: %v", err)
return fmt.Errorf("insert strcut: %v", err)
}
meta := make(map[string]interface{})
if err = jsoniter.Unmarshal(scanner.Bytes(), &meta); err != nil {
log.Error(2, "Failed to unmarshal to map: %v", err)
}
// Reset created_unix back to the date save in archive because Insert method updates its value
if isInsertProcessor && !skipInsertProcessors[rawTableName] {
if _, err = x.Exec("UPDATE "+rawTableName+" SET created_unix=? WHERE id=?", meta["CreatedUnix"], meta["ID"]); err != nil {
log.Error(2, "Failed to reset 'created_unix': %v", err)
}
}
switch rawTableName {
case "milestone":
if _, err = x.Exec("UPDATE "+rawTableName+" SET deadline_unix=?, closed_date_unix=? WHERE id=?", meta["DeadlineUnix"], meta["ClosedDateUnix"], meta["ID"]); err != nil {
log.Error(2, "Failed to reset 'milestone.deadline_unix', 'milestone.closed_date_unix': %v", err)
}
}
}
@@ -360,7 +387,7 @@ func ImportDatabase(dirPath string, verbose bool) (err error) {
rawTableName := snakeMapper.Obj2Table(tableName)
seqName := rawTableName + "_id_seq"
if _, err = x.Exec(fmt.Sprintf(`SELECT setval('%s', COALESCE((SELECT MAX(id)+1 FROM "%s"), 1), false);`, seqName, rawTableName)); err != nil {
return fmt.Errorf("fail to reset table '%s' sequence: %v", rawTableName, err)
return fmt.Errorf("reset table '%s' sequence: %v", rawTableName, err)
}
}
}

View File

@@ -15,8 +15,7 @@ import (
)
var (
ErrOrgNotExist = errors.New("Organization does not exist")
ErrTeamNotExist = errors.New("Team does not exist")
ErrOrgNotExist = errors.New("Organization does not exist")
)
// IsOwnedBy returns true if given user is in the owner team.
@@ -410,7 +409,7 @@ func RemoveOrgUser(orgID, userID int64) error {
return err
}
if _, err := sess.Id(ou.ID).Delete(ou); err != nil {
if _, err := sess.ID(ou.ID).Delete(ou); err != nil {
return err
} else if _, err = sess.Exec("UPDATE `user` SET num_members=num_members-1 WHERE id=?", orgID); err != nil {
return err

View File

@@ -5,11 +5,12 @@
package models
import (
"errors"
"fmt"
"strings"
"github.com/go-xorm/xorm"
"github.com/gogs/gogs/models/errors"
)
const OWNER_TEAM = "Owners"
@@ -22,8 +23,8 @@ type Team struct {
Name string
Description string
Authorize AccessMode
Repos []*Repository `xorm:"-"`
Members []*User `xorm:"-"`
Repos []*Repository `xorm:"-" json:"-"`
Members []*User `xorm:"-" json:"-"`
NumRepos int
NumMembers int
}
@@ -111,7 +112,7 @@ func (t *Team) addRepository(e Engine, repo *Repository) (err error) {
}
t.NumRepos++
if _, err = e.Id(t.ID).AllCols().Update(t); err != nil {
if _, err = e.ID(t.ID).AllCols().Update(t); err != nil {
return fmt.Errorf("update team: %v", err)
}
@@ -157,7 +158,7 @@ func (t *Team) removeRepository(e Engine, repo *Repository, recalculate bool) (e
}
t.NumRepos--
if _, err = e.Id(t.ID).AllCols().Update(t); err != nil {
if _, err = e.ID(t.ID).AllCols().Update(t); err != nil {
return err
}
@@ -274,7 +275,7 @@ func getTeamOfOrgByName(e Engine, orgID int64, name string) (*Team, error) {
if err != nil {
return nil, err
} else if !has {
return nil, ErrTeamNotExist
return nil, errors.TeamNotExist{0, name}
}
return t, nil
}
@@ -286,11 +287,11 @@ func GetTeamOfOrgByName(orgID int64, name string) (*Team, error) {
func getTeamByID(e Engine, teamID int64) (*Team, error) {
t := new(Team)
has, err := e.Id(teamID).Get(t)
has, err := e.ID(teamID).Get(t)
if err != nil {
return nil, err
} else if !has {
return nil, ErrTeamNotExist
return nil, errors.TeamNotExist{teamID, ""}
}
return t, nil
}
@@ -334,7 +335,7 @@ func UpdateTeam(t *Team, authChanged bool) (err error) {
return ErrTeamAlreadyExist{t.OrgID, t.LowerName}
}
if _, err = sess.Id(t.ID).AllCols().Update(t); err != nil {
if _, err = sess.ID(t.ID).AllCols().Update(t); err != nil {
return fmt.Errorf("update: %v", err)
}
@@ -386,7 +387,7 @@ func DeleteTeam(t *Team) error {
}
// Delete team.
if _, err = sess.Id(t.ID).Delete(new(Team)); err != nil {
if _, err = sess.ID(t.ID).Delete(new(Team)); err != nil {
return err
}
// Update organization number of teams.
@@ -431,7 +432,7 @@ func getTeamMembers(e Engine, teamID int64) (_ []*User, err error) {
members := make([]*User, 0, len(teamUsers))
for i := range teamUsers {
member := new(User)
if _, err = e.Id(teamUsers[i].UID).Get(member); err != nil {
if _, err = e.ID(teamUsers[i].UID).Get(member); err != nil {
return nil, fmt.Errorf("get user '%d': %v", teamUsers[i].UID, err)
}
members = append(members, member)
@@ -500,7 +501,7 @@ func AddTeamMember(orgID, teamID, userID int64) error {
}
if _, err = sess.Insert(tu); err != nil {
return err
} else if _, err = sess.Id(t.ID).Update(t); err != nil {
} else if _, err = sess.ID(t.ID).Update(t); err != nil {
return err
}
@@ -520,7 +521,7 @@ func AddTeamMember(orgID, teamID, userID int64) error {
if t.IsOwnerTeam() {
ou.IsOwner = true
}
if _, err = sess.Id(ou.ID).AllCols().Update(ou); err != nil {
if _, err = sess.ID(ou.ID).AllCols().Update(ou); err != nil {
return err
}
@@ -562,7 +563,7 @@ func removeTeamMember(e Engine, orgID, teamID, uid int64) error {
}
if _, err := e.Delete(tu); err != nil {
return err
} else if _, err = e.Id(t.ID).AllCols().Update(t); err != nil {
} else if _, err = e.ID(t.ID).AllCols().Update(t); err != nil {
return err
}
@@ -583,7 +584,7 @@ func removeTeamMember(e Engine, orgID, teamID, uid int64) error {
if t.IsOwnerTeam() {
ou.IsOwner = false
}
if _, err = e.Id(ou.ID).AllCols().Update(ou); err != nil {
if _, err = e.ID(ou.ID).AllCols().Update(ou); err != nil {
return err
}
return nil

View File

@@ -48,13 +48,13 @@ type PullRequest struct {
Status PullRequestStatus
IssueID int64 `xorm:"INDEX"`
Issue *Issue `xorm:"-"`
Issue *Issue `xorm:"-" json:"-"`
Index int64
HeadRepoID int64
HeadRepo *Repository `xorm:"-"`
HeadRepo *Repository `xorm:"-" json:"-"`
BaseRepoID int64
BaseRepo *Repository `xorm:"-"`
BaseRepo *Repository `xorm:"-" json:"-"`
HeadUserName string
HeadBranch string
BaseBranch string
@@ -63,8 +63,8 @@ type PullRequest struct {
HasMerged bool
MergedCommitID string `xorm:"VARCHAR(40)"`
MergerID int64
Merger *User `xorm:"-"`
Merged time.Time `xorm:"-"`
Merger *User `xorm:"-" json:"-"`
Merged time.Time `xorm:"-" json:"-"`
MergedUnix int64
}
@@ -193,7 +193,7 @@ const (
// Merge merges pull request to base repository.
// FIXME: add repoWorkingPull make sure two merges does not happen at same time.
func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle MergeStyle) (err error) {
func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle MergeStyle, commitDescription string) (err error) {
defer func() {
go HookQueue.Add(pr.BaseRepo.ID)
go AddTestPullRequestTask(doer, pr.BaseRepo.ID, pr.BaseBranch, false)
@@ -266,7 +266,8 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle
if _, stderr, err = process.ExecDir(-1, tmpBasePath,
fmt.Sprintf("PullRequest.Merge (git merge): %s", tmpBasePath),
"git", "commit", fmt.Sprintf("--author='%s <%s>'", sig.Name, sig.Email),
"-m", fmt.Sprintf("Merge branch '%s' of %s/%s into %s", pr.HeadBranch, pr.HeadUserName, pr.HeadRepo.Name, pr.BaseBranch)); err != nil {
"-m", fmt.Sprintf("Merge branch '%s' of %s/%s into %s", pr.HeadBranch, pr.HeadUserName, pr.HeadRepo.Name, pr.BaseBranch),
"-m", commitDescription); err != nil {
return fmt.Errorf("git commit [%s]: %v - %s", tmpBasePath, err, stderr)
}
@@ -320,7 +321,7 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle
pr.HasMerged = true
pr.Merged = time.Now()
pr.MergerID = doer.ID
if _, err = sess.Id(pr.ID).AllCols().Update(pr); err != nil {
if _, err = sess.ID(pr.ID).AllCols().Update(pr); err != nil {
return fmt.Errorf("update pull request: %v", err)
}
@@ -545,7 +546,7 @@ func GetUnmergedPullRequestsByBaseInfo(repoID int64, branch string) ([]*PullRequ
func getPullRequestByID(e Engine, id int64) (*PullRequest, error) {
pr := new(PullRequest)
has, err := e.Id(id).Get(pr)
has, err := e.ID(id).Get(pr)
if err != nil {
return nil, err
} else if !has {

View File

@@ -24,24 +24,24 @@ import (
type Release struct {
ID int64
RepoID int64
Repo *Repository `xorm:"-"`
Repo *Repository `xorm:"-" json:"-"`
PublisherID int64
Publisher *User `xorm:"-"`
Publisher *User `xorm:"-" json:"-"`
TagName string
LowerTagName string
Target string
Title string
Sha1 string `xorm:"VARCHAR(40)"`
NumCommits int64
NumCommitsBehind int64 `xorm:"-"`
NumCommitsBehind int64 `xorm:"-" json:"-"`
Note string `xorm:"TEXT"`
IsDraft bool `xorm:"NOT NULL DEFAULT false"`
IsPrerelease bool
Created time.Time `xorm:"-"`
Created time.Time `xorm:"-" json:"-"`
CreatedUnix int64
Attachments []*Attachment `xorm:"-"`
Attachments []*Attachment `xorm:"-" json:"-"`
}
func (r *Release) BeforeInsert() {
@@ -293,7 +293,7 @@ func UpdateRelease(doer *User, gitRepo *git.Repository, r *Release, isPublish bo
if err = sess.Begin(); err != nil {
return err
}
if _, err = sess.Id(r.ID).AllCols().Update(r); err != nil {
if _, err = sess.ID(r.ID).AllCols().Update(r); err != nil {
return fmt.Errorf("Update: %v", err)
}

View File

@@ -7,6 +7,9 @@ package models
import (
"bytes"
"fmt"
"image"
_ "image/jpeg"
"image/png"
"io/ioutil"
"os"
"os/exec"
@@ -20,6 +23,7 @@ import (
"github.com/Unknwon/com"
"github.com/go-xorm/xorm"
"github.com/mcuadros/go-version"
"github.com/nfnt/resize"
log "gopkg.in/clog.v1"
"gopkg.in/ini.v1"
@@ -27,6 +31,7 @@ import (
api "github.com/gogs/go-gogs-client"
"github.com/gogs/gogs/models/errors"
"github.com/gogs/gogs/pkg/avatar"
"github.com/gogs/gogs/pkg/bindata"
"github.com/gogs/gogs/pkg/markup"
"github.com/gogs/gogs/pkg/process"
@@ -34,6 +39,9 @@ import (
"github.com/gogs/gogs/pkg/sync"
)
// REPO_AVATAR_URL_PREFIX is used to identify a URL is to access repository avatar.
const REPO_AVATAR_URL_PREFIX = "repo-avatars"
var repoWorkingPool = sync.NewExclusivePool()
var (
@@ -141,35 +149,37 @@ func NewRepoContext() {
// Repository contains information of a repository.
type Repository struct {
ID int64
OwnerID int64 `xorm:"UNIQUE(s)"`
Owner *User `xorm:"-"`
LowerName string `xorm:"UNIQUE(s) INDEX NOT NULL"`
Name string `xorm:"INDEX NOT NULL"`
Description string
Website string
DefaultBranch string
Size int64 `xorm:"NOT NULL DEFAULT 0"`
ID int64
OwnerID int64 `xorm:"UNIQUE(s)"`
Owner *User `xorm:"-" json:"-"`
LowerName string `xorm:"UNIQUE(s) INDEX NOT NULL"`
Name string `xorm:"INDEX NOT NULL"`
Description string `xorm:"VARCHAR(512)"`
Website string
DefaultBranch string
Size int64 `xorm:"NOT NULL DEFAULT 0"`
UseCustomAvatar bool
// Counters
NumWatches int
NumStars int
NumForks int
NumIssues int
NumClosedIssues int
NumOpenIssues int `xorm:"-"`
NumOpenIssues int `xorm:"-" json:"-"`
NumPulls int
NumClosedPulls int
NumOpenPulls int `xorm:"-"`
NumOpenPulls int `xorm:"-" json:"-"`
NumMilestones int `xorm:"NOT NULL DEFAULT 0"`
NumClosedMilestones int `xorm:"NOT NULL DEFAULT 0"`
NumOpenMilestones int `xorm:"-"`
NumTags int `xorm:"-"`
NumOpenMilestones int `xorm:"-" json:"-"`
NumTags int `xorm:"-" json:"-"`
IsPrivate bool
IsBare bool
IsMirror bool
*Mirror `xorm:"-"`
*Mirror `xorm:"-" json:"-"`
// Advanced settings
EnableWiki bool `xorm:"NOT NULL DEFAULT true"`
@@ -182,18 +192,18 @@ type Repository struct {
ExternalTrackerURL string
ExternalTrackerFormat string
ExternalTrackerStyle string
ExternalMetas map[string]string `xorm:"-"`
ExternalMetas map[string]string `xorm:"-" json:"-"`
EnablePulls bool `xorm:"NOT NULL DEFAULT true"`
PullsIgnoreWhitespace bool `xorm:"NOT NULL DEFAULT false"`
PullsAllowRebase bool `xorm:"NOT NULL DEFAULT false"`
IsFork bool `xorm:"NOT NULL DEFAULT false"`
ForkID int64
BaseRepo *Repository `xorm:"-"`
BaseRepo *Repository `xorm:"-" json:"-"`
Created time.Time `xorm:"-"`
Created time.Time `xorm:"-" json:"-"`
CreatedUnix int64
Updated time.Time `xorm:"-"`
Updated time.Time `xorm:"-" json:"-"`
UpdatedUnix int64
}
@@ -284,6 +294,65 @@ func (repo *Repository) HTMLURL() string {
return setting.AppURL + repo.FullName()
}
// CustomAvatarPath returns repository custom avatar file path.
func (repo *Repository) CustomAvatarPath() string {
return filepath.Join(setting.RepositoryAvatarUploadPath, com.ToStr(repo.ID))
}
// RelAvatarLink returns relative avatar link to the site domain,
// which includes app sub-url as prefix.
// Since Gravatar support not needed here - just check for image path.
func (repo *Repository) RelAvatarLink() string {
defaultImgUrl := ""
if !com.IsExist(repo.CustomAvatarPath()) {
return defaultImgUrl
}
return fmt.Sprintf("%s/%s/%d", setting.AppSubURL, REPO_AVATAR_URL_PREFIX, repo.ID)
}
// AvatarLink returns repository avatar absolute link.
func (repo *Repository) AvatarLink() string {
link := repo.RelAvatarLink()
if link[0] == '/' && link[1] != '/' {
return setting.AppURL + strings.TrimPrefix(link, setting.AppSubURL)[1:]
}
return link
}
// UploadAvatar saves custom avatar for repository.
// FIXME: split uploads to different subdirs in case we have massive number of repositories.
func (repo *Repository) UploadAvatar(data []byte) error {
img, _, err := image.Decode(bytes.NewReader(data))
if err != nil {
return fmt.Errorf("decode image: %v", err)
}
os.MkdirAll(setting.RepositoryAvatarUploadPath, os.ModePerm)
fw, err := os.Create(repo.CustomAvatarPath())
if err != nil {
return fmt.Errorf("create custom avatar directory: %v", err)
}
defer fw.Close()
m := resize.Resize(avatar.AVATAR_SIZE, avatar.AVATAR_SIZE, img, resize.NearestNeighbor)
if err = png.Encode(fw, m); err != nil {
return fmt.Errorf("encode image: %v", err)
}
return nil
}
// DeleteAvatar deletes the repository custom avatar.
func (repo *Repository) DeleteAvatar() error {
log.Trace("DeleteAvatar [%d]: %s", repo.ID, repo.CustomAvatarPath())
if err := os.Remove(repo.CustomAvatarPath()); err != nil {
return err
}
repo.UseCustomAvatar = false
return UpdateRepository(repo, false)
}
// This method assumes following fields have been assigned with valid values:
// Required - BaseRepo (if fork)
// Arguments that are allowed to be nil: permission
@@ -312,6 +381,8 @@ func (repo *Repository) APIFormat(permission *api.Permission, user ...*User) *ap
Created: repo.Created,
Updated: repo.Updated,
Permissions: permission,
// Reserved for go-gogs-client change
// AvatarUrl: repo.AvatarLink(),
}
if repo.IsFork {
p := &api.Permission{Pull: true}
@@ -1193,7 +1264,7 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
repo.Owner = newOwner
// Update repository.
if _, err := sess.Id(repo.ID).Update(repo); err != nil {
if _, err := sess.ID(repo.ID).Update(repo); err != nil {
return fmt.Errorf("update owner: %v", err)
}
@@ -1225,7 +1296,7 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
}
t.NumRepos--
if _, err := sess.Id(t.ID).AllCols().Update(t); err != nil {
if _, err := sess.ID(t.ID).AllCols().Update(t); err != nil {
return fmt.Errorf("decrease team repository count '%d': %v", t.ID, err)
}
}
@@ -1331,14 +1402,14 @@ func GetRepositoriesByForkID(forkID int64) ([]*Repository, error) {
func updateRepository(e Engine, repo *Repository, visibilityChanged bool) (err error) {
repo.LowerName = strings.ToLower(repo.Name)
if len(repo.Description) > 255 {
repo.Description = repo.Description[:255]
if len(repo.Description) > 512 {
repo.Description = repo.Description[:512]
}
if len(repo.Website) > 255 {
repo.Website = repo.Website[:255]
}
if _, err = e.Id(repo.ID).AllCols().Update(repo); err != nil {
if _, err = e.ID(repo.ID).AllCols().Update(repo); err != nil {
return fmt.Errorf("update: %v", err)
}
@@ -1452,6 +1523,8 @@ func DeleteRepository(uid, repoID int64) error {
&PullRequest{BaseRepoID: repoID},
&ProtectBranch{RepoID: repoID},
&ProtectBranchWhitelist{RepoID: repoID},
&Webhook{RepoID: repoID},
&HookTask{RepoID: repoID},
); err != nil {
return fmt.Errorf("deleteBeans: %v", err)
}
@@ -1552,7 +1625,7 @@ func GetRepositoryByName(ownerID int64, name string) (*Repository, error) {
func getRepositoryByID(e Engine, id int64) (*Repository, error) {
repo := new(Repository)
has, err := e.Id(id).Get(repo)
has, err := e.ID(id).Get(repo)
if err != nil {
return nil, err
} else if !has {
@@ -1651,11 +1724,11 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos []*Repository, count
// this does not include other people's private repositories even if opts.UserID is an admin.
if !opts.Private && opts.UserID > 0 {
sess.Join("LEFT", "access", "access.repo_id = repo.id").
Where("(repo.owner_id = ? OR access.user_id = ? OR repo.is_private = ?)", opts.UserID, opts.UserID, false)
Where("repo.owner_id = ? OR access.user_id = ? OR repo.is_private = ? OR (repo.is_private = ? AND (repo.allow_public_wiki = ? OR repo.allow_public_issues = ?))", opts.UserID, opts.UserID, false, true, true, true)
} else {
// Only return public repositories if opts.Private is not set
if !opts.Private {
sess.And("repo.is_private = ?", false)
sess.And("repo.is_private = ? OR (repo.is_private = ? AND (repo.allow_public_wiki = ? OR repo.allow_public_issues = ?))", false, true, true, true)
}
}
if len(opts.Keyword) > 0 {
@@ -2275,6 +2348,10 @@ func HasForkedRepo(ownerID, repoID int64) (*Repository, bool, error) {
// ForkRepository creates a fork of target repository under another user domain.
func ForkRepository(doer, owner *User, baseRepo *Repository, name, desc string) (_ *Repository, err error) {
if !owner.CanCreateRepo() {
return nil, errors.ReachLimitOfRepo{owner.RepoCreationNum()}
}
repo := &Repository{
OwnerID: owner.ID,
Owner: owner,

View File

@@ -131,7 +131,7 @@ func UpdateProtectBranch(protectBranch *ProtectBranch) (err error) {
}
}
if _, err = sess.Id(protectBranch.ID).AllCols().Update(protectBranch); err != nil {
if _, err = sess.ID(protectBranch.ID).AllCols().Update(protectBranch); err != nil {
return fmt.Errorf("Update: %v", err)
}
@@ -234,7 +234,7 @@ func UpdateOrgProtectBranch(repo *Repository, protectBranch *ProtectBranch, whit
return err
}
if _, err = sess.Id(protectBranch.ID).AllCols().Update(protectBranch); err != nil {
if _, err = sess.ID(protectBranch.ID).AllCols().Update(protectBranch); err != nil {
return fmt.Errorf("Update: %v", err)
}

View File

@@ -170,7 +170,7 @@ func (repo *Repository) ChangeCollaborationAccessMode(userID int64, mode AccessM
return err
}
if _, err = sess.Id(collaboration.ID).AllCols().Update(collaboration); err != nil {
if _, err = sess.ID(collaboration.ID).AllCols().Update(collaboration); err != nil {
return fmt.Errorf("update collaboration: %v", err)
}

View File

@@ -13,19 +13,55 @@ import (
"os/exec"
"path"
"path/filepath"
"strings"
"time"
"github.com/Unknwon/com"
gouuid "github.com/satori/go.uuid"
log "gopkg.in/clog.v1"
git "github.com/gogs/git-module"
"github.com/gogs/git-module"
"github.com/gogs/gogs/models/errors"
"github.com/gogs/gogs/pkg/process"
"github.com/gogs/gogs/pkg/setting"
"github.com/gogs/gogs/pkg/tool"
)
const (
ENV_AUTH_USER_ID = "GOGS_AUTH_USER_ID"
ENV_AUTH_USER_NAME = "GOGS_AUTH_USER_NAME"
ENV_AUTH_USER_EMAIL = "GOGS_AUTH_USER_EMAIL"
ENV_REPO_OWNER_NAME = "GOGS_REPO_OWNER_NAME"
ENV_REPO_OWNER_SALT_MD5 = "GOGS_REPO_OWNER_SALT_MD5"
ENV_REPO_ID = "GOGS_REPO_ID"
ENV_REPO_NAME = "GOGS_REPO_NAME"
ENV_REPO_CUSTOM_HOOKS_PATH = "GOGS_REPO_CUSTOM_HOOKS_PATH"
)
type ComposeHookEnvsOptions struct {
AuthUser *User
OwnerName string
OwnerSalt string
RepoID int64
RepoName string
RepoPath string
}
func ComposeHookEnvs(opts ComposeHookEnvsOptions) []string {
envs := []string{
"SSH_ORIGINAL_COMMAND=1",
ENV_AUTH_USER_ID + "=" + com.ToStr(opts.AuthUser.ID),
ENV_AUTH_USER_NAME + "=" + opts.AuthUser.Name,
ENV_AUTH_USER_EMAIL + "=" + opts.AuthUser.Email,
ENV_REPO_OWNER_NAME + "=" + opts.OwnerName,
ENV_REPO_OWNER_SALT_MD5 + "=" + tool.MD5(opts.OwnerSalt),
ENV_REPO_ID + "=" + com.ToStr(opts.RepoID),
ENV_REPO_NAME + "=" + opts.RepoName,
ENV_REPO_CUSTOM_HOOKS_PATH + "=" + path.Join(opts.RepoPath, "custom_hooks"),
}
return envs
}
// ___________ .___.__ __ ___________.__.__
// \_ _____/ __| _/|__|/ |_ \_ _____/|__| | ____
// | __)_ / __ | | \ __\ | __) | | | _/ __ \
@@ -88,9 +124,9 @@ func (repo *Repository) UpdateRepoFile(doer *User, opts UpdateRepoFileOptions) (
defer repoWorkingPool.CheckOut(com.ToStr(repo.ID))
if err = repo.DiscardLocalRepoBranchChanges(opts.OldBranch); err != nil {
return fmt.Errorf("DiscardLocalRepoBranchChanges [branch: %s]: %v", opts.OldBranch, err)
return fmt.Errorf("discard local repo branch[%s] changes: %v", opts.OldBranch, err)
} else if err = repo.UpdateLocalCopyBranch(opts.OldBranch); err != nil {
return fmt.Errorf("UpdateLocalCopyBranch [branch: %s]: %v", opts.OldBranch, err)
return fmt.Errorf("update local copy branch[%s]: %v", opts.OldBranch, err)
}
repoPath := repo.RepoPath()
@@ -107,12 +143,12 @@ func (repo *Repository) UpdateRepoFile(doer *User, opts UpdateRepoFileOptions) (
if err = git.DeleteBranch(localPath, opts.NewBranch, git.DeleteBranchOptions{
Force: true,
}); err != nil {
return fmt.Errorf("DeleteBranch [name: %s]: %v", opts.NewBranch, err)
return fmt.Errorf("delete branch[%s]: %v", opts.NewBranch, err)
}
}
if err := repo.CheckoutNewBranch(opts.OldBranch, opts.NewBranch); err != nil {
return fmt.Errorf("CheckoutNewBranch [old_branch: %s, new_branch: %s]: %v", opts.OldBranch, opts.NewBranch, err)
return fmt.Errorf("checkout new branch[%s] from old branch[%s]: %v", opts.NewBranch, opts.OldBranch, err)
}
}
@@ -131,12 +167,12 @@ func (repo *Repository) UpdateRepoFile(doer *User, opts UpdateRepoFileOptions) (
// Otherwise, move the file when name changed.
if com.IsFile(oldFilePath) && opts.OldTreeName != opts.NewTreeName {
if err = git.MoveFile(localPath, opts.OldTreeName, opts.NewTreeName); err != nil {
return fmt.Errorf("git mv %s %s: %v", opts.OldTreeName, opts.NewTreeName, err)
return fmt.Errorf("git mv %q %q: %v", opts.OldTreeName, opts.NewTreeName, err)
}
}
if err = ioutil.WriteFile(filePath, []byte(opts.Content), 0666); err != nil {
return fmt.Errorf("WriteFile: %v", err)
return fmt.Errorf("write file: %v", err)
}
if err = git.AddChanges(localPath, true); err != nil {
@@ -145,45 +181,18 @@ func (repo *Repository) UpdateRepoFile(doer *User, opts UpdateRepoFileOptions) (
Committer: doer.NewGitSig(),
Message: opts.Message,
}); err != nil {
return fmt.Errorf("CommitChanges: %v", err)
} else if err = git.Push(localPath, "origin", opts.NewBranch); err != nil {
return fmt.Errorf("commit changes on %q: %v", localPath, err)
} else if err = git.PushWithEnvs(localPath, "origin", opts.NewBranch,
ComposeHookEnvs(ComposeHookEnvsOptions{
AuthUser: doer,
OwnerName: repo.MustOwner().Name,
OwnerSalt: repo.MustOwner().Salt,
RepoID: repo.ID,
RepoName: repo.Name,
RepoPath: repo.RepoPath(),
})); err != nil {
return fmt.Errorf("git push origin %s: %v", opts.NewBranch, err)
}
gitRepo, err := git.OpenRepository(repo.RepoPath())
if err != nil {
log.Error(2, "OpenRepository: %v", err)
return nil
}
commit, err := gitRepo.GetBranchCommit(opts.NewBranch)
if err != nil {
log.Error(2, "GetBranchCommit [branch: %s]: %v", opts.NewBranch, err)
return nil
}
// Simulate push event.
pushCommits := &PushCommits{
Len: 1,
Commits: []*PushCommit{CommitToPushCommit(commit)},
}
oldCommitID := opts.LastCommitID
if opts.NewBranch != opts.OldBranch {
oldCommitID = git.EMPTY_SHA
}
if err := CommitRepoAction(CommitRepoActionOptions{
PusherName: doer.Name,
RepoOwnerID: repo.MustOwner().ID,
RepoName: repo.Name,
RefFullName: git.BRANCH_PREFIX + opts.NewBranch,
OldCommitID: oldCommitID,
NewCommitID: commit.ID.String(),
Commits: pushCommits,
}); err != nil {
log.Error(2, "CommitRepoAction: %v", err)
return nil
}
go AddTestPullRequestTask(doer, repo.ID, opts.NewBranch, true)
return nil
}
@@ -193,16 +202,16 @@ func (repo *Repository) GetDiffPreview(branch, treePath, content string) (diff *
defer repoWorkingPool.CheckOut(com.ToStr(repo.ID))
if err = repo.DiscardLocalRepoBranchChanges(branch); err != nil {
return nil, fmt.Errorf("DiscardLocalRepoBranchChanges [branch: %s]: %v", branch, err)
return nil, fmt.Errorf("discard local repo branch[%s] changes: %v", branch, err)
} else if err = repo.UpdateLocalCopyBranch(branch); err != nil {
return nil, fmt.Errorf("UpdateLocalCopyBranch [branch: %s]: %v", branch, err)
return nil, fmt.Errorf("update local copy branch[%s]: %v", branch, err)
}
localPath := repo.LocalCopyPath()
filePath := path.Join(localPath, treePath)
os.MkdirAll(filepath.Dir(filePath), os.ModePerm)
if err = ioutil.WriteFile(filePath, []byte(content), 0666); err != nil {
return nil, fmt.Errorf("WriteFile: %v", err)
return nil, fmt.Errorf("write file: %v", err)
}
cmd := exec.Command("git", "diff", treePath)
@@ -211,11 +220,11 @@ func (repo *Repository) GetDiffPreview(branch, treePath, content string) (diff *
stdout, err := cmd.StdoutPipe()
if err != nil {
return nil, fmt.Errorf("StdoutPipe: %v", err)
return nil, fmt.Errorf("get stdout pipe: %v", err)
}
if err = cmd.Start(); err != nil {
return nil, fmt.Errorf("Start: %v", err)
return nil, fmt.Errorf("start: %v", err)
}
pid := process.Add(fmt.Sprintf("GetDiffPreview [repo_path: %s]", repo.RepoPath()), cmd)
@@ -223,11 +232,11 @@ func (repo *Repository) GetDiffPreview(branch, treePath, content string) (diff *
diff, err = ParsePatch(setting.Git.MaxGitDiffLines, setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles, stdout)
if err != nil {
return nil, fmt.Errorf("ParsePatch: %v", err)
return nil, fmt.Errorf("parse path: %v", err)
}
if err = cmd.Wait(); err != nil {
return nil, fmt.Errorf("Wait: %v", err)
return nil, fmt.Errorf("wait: %v", err)
}
return diff, nil
@@ -254,20 +263,20 @@ func (repo *Repository) DeleteRepoFile(doer *User, opts DeleteRepoFileOptions) (
defer repoWorkingPool.CheckOut(com.ToStr(repo.ID))
if err = repo.DiscardLocalRepoBranchChanges(opts.OldBranch); err != nil {
return fmt.Errorf("DiscardLocalRepoBranchChanges [branch: %s]: %v", opts.OldBranch, err)
return fmt.Errorf("discard local repo branch[%s] changes: %v", opts.OldBranch, err)
} else if err = repo.UpdateLocalCopyBranch(opts.OldBranch); err != nil {
return fmt.Errorf("UpdateLocalCopyBranch [branch: %s]: %v", opts.OldBranch, err)
return fmt.Errorf("update local copy branch[%s]: %v", opts.OldBranch, err)
}
if opts.OldBranch != opts.NewBranch {
if err := repo.CheckoutNewBranch(opts.OldBranch, opts.NewBranch); err != nil {
return fmt.Errorf("CheckoutNewBranch [old_branch: %s, new_branch: %s]: %v", opts.OldBranch, opts.NewBranch, err)
return fmt.Errorf("checkout new branch[%s] from old branch[%s]: %v", opts.NewBranch, opts.OldBranch, err)
}
}
localPath := repo.LocalCopyPath()
if err = os.Remove(path.Join(localPath, opts.TreePath)); err != nil {
return fmt.Errorf("Remove: %v", err)
return fmt.Errorf("remove file %q: %v", opts.TreePath, err)
}
if err = git.AddChanges(localPath, true); err != nil {
@@ -276,41 +285,18 @@ func (repo *Repository) DeleteRepoFile(doer *User, opts DeleteRepoFileOptions) (
Committer: doer.NewGitSig(),
Message: opts.Message,
}); err != nil {
return fmt.Errorf("CommitChanges: %v", err)
} else if err = git.Push(localPath, "origin", opts.NewBranch); err != nil {
return fmt.Errorf("commit changes to %q: %v", localPath, err)
} else if err = git.PushWithEnvs(localPath, "origin", opts.NewBranch,
ComposeHookEnvs(ComposeHookEnvsOptions{
AuthUser: doer,
OwnerName: repo.MustOwner().Name,
OwnerSalt: repo.MustOwner().Salt,
RepoID: repo.ID,
RepoName: repo.Name,
RepoPath: repo.RepoPath(),
})); err != nil {
return fmt.Errorf("git push origin %s: %v", opts.NewBranch, err)
}
gitRepo, err := git.OpenRepository(repo.RepoPath())
if err != nil {
log.Error(2, "OpenRepository: %v", err)
return nil
}
commit, err := gitRepo.GetBranchCommit(opts.NewBranch)
if err != nil {
log.Error(2, "GetBranchCommit [branch: %s]: %v", opts.NewBranch, err)
return nil
}
// Simulate push event.
pushCommits := &PushCommits{
Len: 1,
Commits: []*PushCommit{CommitToPushCommit(commit)},
}
if err := CommitRepoAction(CommitRepoActionOptions{
PusherName: doer.Name,
RepoOwnerID: repo.MustOwner().ID,
RepoName: repo.Name,
RefFullName: git.BRANCH_PREFIX + opts.NewBranch,
OldCommitID: opts.LastCommitID,
NewCommitID: commit.ID.String(),
Commits: pushCommits,
}); err != nil {
log.Error(2, "CommitRepoAction: %v", err)
return nil
}
go AddTestPullRequestTask(doer, repo.ID, opts.NewBranch, true)
return nil
}
@@ -341,6 +327,10 @@ func (upload *Upload) LocalPath() string {
// NewUpload creates a new upload object.
func NewUpload(name string, buf []byte, file multipart.File) (_ *Upload, err error) {
if tool.IsMaliciousPath(name) {
return nil, fmt.Errorf("malicious path detected: %s", name)
}
upload := &Upload{
UUID: gouuid.NewV4().String(),
Name: name,
@@ -348,19 +338,19 @@ func NewUpload(name string, buf []byte, file multipart.File) (_ *Upload, err err
localPath := upload.LocalPath()
if err = os.MkdirAll(path.Dir(localPath), os.ModePerm); err != nil {
return nil, fmt.Errorf("MkdirAll: %v", err)
return nil, fmt.Errorf("mkdir all: %v", err)
}
fw, err := os.Create(localPath)
if err != nil {
return nil, fmt.Errorf("Create: %v", err)
return nil, fmt.Errorf("create: %v", err)
}
defer fw.Close()
if _, err = fw.Write(buf); err != nil {
return nil, fmt.Errorf("Write: %v", err)
return nil, fmt.Errorf("write: %v", err)
} else if _, err = io.Copy(fw, file); err != nil {
return nil, fmt.Errorf("Copy: %v", err)
return nil, fmt.Errorf("copy: %v", err)
}
if _, err := x.Insert(upload); err != nil {
@@ -434,11 +424,11 @@ func DeleteUploadByUUID(uuid string) error {
if IsErrUploadNotExist(err) {
return nil
}
return fmt.Errorf("GetUploadByUUID: %v", err)
return fmt.Errorf("get upload by UUID[%s]: %v", uuid, err)
}
if err := DeleteUpload(upload); err != nil {
return fmt.Errorf("DeleteUpload: %v", err)
return fmt.Errorf("delete upload: %v", err)
}
return nil
@@ -450,7 +440,12 @@ type UploadRepoFileOptions struct {
NewBranch string
TreePath string
Message string
Files []string // In UUID format.
Files []string // In UUID format
}
// isRepositoryGitPath returns true if given path is or resides inside ".git" path of the repository.
func isRepositoryGitPath(path string) bool {
return strings.HasSuffix(path, ".git") || strings.Contains(path, ".git"+string(os.PathSeparator))
}
func (repo *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions) (err error) {
@@ -460,21 +455,21 @@ func (repo *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions)
uploads, err := GetUploadsByUUIDs(opts.Files)
if err != nil {
return fmt.Errorf("GetUploadsByUUIDs [uuids: %v]: %v", opts.Files, err)
return fmt.Errorf("get uploads by UUIDs[%v]: %v", opts.Files, err)
}
repoWorkingPool.CheckIn(com.ToStr(repo.ID))
defer repoWorkingPool.CheckOut(com.ToStr(repo.ID))
if err = repo.DiscardLocalRepoBranchChanges(opts.OldBranch); err != nil {
return fmt.Errorf("DiscardLocalRepoBranchChanges [branch: %s]: %v", opts.OldBranch, err)
return fmt.Errorf("discard local repo branch[%s] changes: %v", opts.OldBranch, err)
} else if err = repo.UpdateLocalCopyBranch(opts.OldBranch); err != nil {
return fmt.Errorf("UpdateLocalCopyBranch [branch: %s]: %v", opts.OldBranch, err)
return fmt.Errorf("update local copy branch[%s]: %v", opts.OldBranch, err)
}
if opts.OldBranch != opts.NewBranch {
if err = repo.CheckoutNewBranch(opts.OldBranch, opts.NewBranch); err != nil {
return fmt.Errorf("CheckoutNewBranch [old_branch: %s, new_branch: %s]: %v", opts.OldBranch, opts.NewBranch, err)
return fmt.Errorf("checkout new branch[%s] from old branch[%s]: %v", opts.NewBranch, opts.OldBranch, err)
}
}
@@ -482,16 +477,21 @@ func (repo *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions)
dirPath := path.Join(localPath, opts.TreePath)
os.MkdirAll(dirPath, os.ModePerm)
// Copy uploaded files into repository.
// Copy uploaded files into repository
for _, upload := range uploads {
tmpPath := upload.LocalPath()
targetPath := path.Join(dirPath, upload.Name)
if !com.IsFile(tmpPath) {
continue
}
// Prevent copying files into .git directory, see https://github.com/gogs/gogs/issues/5558.
if isRepositoryGitPath(upload.Name) {
continue
}
targetPath := path.Join(dirPath, upload.Name)
if err = com.Copy(tmpPath, targetPath); err != nil {
return fmt.Errorf("Copy: %v", err)
return fmt.Errorf("copy: %v", err)
}
}
@@ -501,40 +501,18 @@ func (repo *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions)
Committer: doer.NewGitSig(),
Message: opts.Message,
}); err != nil {
return fmt.Errorf("CommitChanges: %v", err)
} else if err = git.Push(localPath, "origin", opts.NewBranch); err != nil {
return fmt.Errorf("commit changes on %q: %v", localPath, err)
} else if err = git.PushWithEnvs(localPath, "origin", opts.NewBranch,
ComposeHookEnvs(ComposeHookEnvsOptions{
AuthUser: doer,
OwnerName: repo.MustOwner().Name,
OwnerSalt: repo.MustOwner().Salt,
RepoID: repo.ID,
RepoName: repo.Name,
RepoPath: repo.RepoPath(),
})); err != nil {
return fmt.Errorf("git push origin %s: %v", opts.NewBranch, err)
}
gitRepo, err := git.OpenRepository(repo.RepoPath())
if err != nil {
log.Error(2, "OpenRepository: %v", err)
return nil
}
commit, err := gitRepo.GetBranchCommit(opts.NewBranch)
if err != nil {
log.Error(2, "GetBranchCommit [branch: %s]: %v", opts.NewBranch, err)
return nil
}
// Simulate push event.
pushCommits := &PushCommits{
Len: 1,
Commits: []*PushCommit{CommitToPushCommit(commit)},
}
if err := CommitRepoAction(CommitRepoActionOptions{
PusherName: doer.Name,
RepoOwnerID: repo.MustOwner().ID,
RepoName: repo.Name,
RefFullName: git.BRANCH_PREFIX + opts.NewBranch,
OldCommitID: opts.LastCommitID,
NewCommitID: commit.ID.String(),
Commits: pushCommits,
}); err != nil {
log.Error(2, "CommitRepoAction: %v", err)
return nil
}
go AddTestPullRequestTask(doer, repo.ID, opts.NewBranch, true)
return DeleteUploads(uploads...)
}

View File

@@ -0,0 +1,34 @@
// Copyright 2018 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package models
import (
"os"
"testing"
. "github.com/smartystreets/goconvey/convey"
)
func Test_isRepositoryGitPath(t *testing.T) {
Convey("Check if path is or resides inside '.git'", t, func() {
sep := string(os.PathSeparator)
testCases := []struct {
path string
expect bool
}{
{"." + sep + ".git", true},
{"." + sep + ".git" + sep + "", true},
{"." + sep + ".git" + sep + "hooks" + sep + "pre-commit", true},
{".git" + sep + "hooks", true},
{"dir" + sep + ".git", true},
{".gitignore", false},
{"dir" + sep + ".gitkeep", false},
}
for _, tc := range testCases {
So(isRepositoryGitPath(tc.path), ShouldEqual, tc.expect)
}
})
}

View File

@@ -25,7 +25,6 @@ import (
"github.com/gogs/gogs/pkg/process"
"github.com/gogs/gogs/pkg/setting"
"github.com/gogs/gogs/pkg/tool"
)
const (
@@ -51,12 +50,12 @@ type PublicKey struct {
Mode AccessMode `xorm:"NOT NULL DEFAULT 2"`
Type KeyType `xorm:"NOT NULL DEFAULT 1"`
Created time.Time `xorm:"-"`
Created time.Time `xorm:"-" json:"-"`
CreatedUnix int64
Updated time.Time `xorm:"-"` // Note: Updated must below Created for AfterSet.
Updated time.Time `xorm:"-" json:"-"` // Note: Updated must below Created for AfterSet.
UpdatedUnix int64
HasRecentActivity bool `xorm:"-"`
HasUsed bool `xorm:"-"`
HasRecentActivity bool `xorm:"-" json:"-"`
HasUsed bool `xorm:"-" json:"-"`
}
func (k *PublicKey) BeforeInsert() {
@@ -479,7 +478,7 @@ func deletePublicKeys(e *xorm.Session, keyIDs ...int64) error {
return nil
}
_, err := e.In("id", strings.Join(tool.Int64sToStrings(keyIDs), ",")).Delete(new(PublicKey))
_, err := e.In("id", keyIDs).Delete(new(PublicKey))
return err
}
@@ -568,14 +567,14 @@ type DeployKey struct {
RepoID int64 `xorm:"UNIQUE(s) INDEX"`
Name string
Fingerprint string
Content string `xorm:"-"`
Content string `xorm:"-" json:"-"`
Created time.Time `xorm:"-"`
Created time.Time `xorm:"-" json:"-"`
CreatedUnix int64
Updated time.Time `xorm:"-"` // Note: Updated must below Created for AfterSet.
Updated time.Time `xorm:"-" json:"-"` // Note: Updated must below Created for AfterSet.
UpdatedUnix int64
HasRecentActivity bool `xorm:"-"`
HasUsed bool `xorm:"-"`
HasRecentActivity bool `xorm:"-" json:"-"`
HasUsed bool `xorm:"-" json:"-"`
}
func (k *DeployKey) BeforeInsert() {
@@ -748,7 +747,7 @@ func DeleteDeployKey(doer *User, id int64) error {
return err
}
if _, err = sess.Id(key.ID).Delete(new(DeployKey)); err != nil {
if _, err = sess.ID(key.ID).Delete(new(DeployKey)); err != nil {
return fmt.Errorf("delete deploy key [%d]: %v", key.ID, err)
}

View File

@@ -20,12 +20,12 @@ type AccessToken struct {
Name string
Sha1 string `xorm:"UNIQUE VARCHAR(40)"`
Created time.Time `xorm:"-"`
Created time.Time `xorm:"-" json:"-"`
CreatedUnix int64
Updated time.Time `xorm:"-"` // Note: Updated must below Created for AfterSet.
Updated time.Time `xorm:"-" json:"-"` // Note: Updated must below Created for AfterSet.
UpdatedUnix int64
HasRecentActivity bool `xorm:"-"`
HasUsed bool `xorm:"-"`
HasRecentActivity bool `xorm:"-" json:"-"`
HasUsed bool `xorm:"-" json:"-"`
}
func (t *AccessToken) BeforeInsert() {

View File

@@ -25,7 +25,7 @@ type TwoFactor struct {
ID int64
UserID int64 `xorm:"UNIQUE"`
Secret string
Created time.Time `xorm:"-"`
Created time.Time `xorm:"-" json:"-"`
CreatedUnix int64
}

View File

@@ -35,6 +35,9 @@ import (
"github.com/gogs/gogs/pkg/tool"
)
// USER_AVATAR_URL_PREFIX is used to identify a URL is to access user avatar.
const USER_AVATAR_URL_PREFIX = "avatars"
type UserType int
const (
@@ -55,17 +58,17 @@ type User struct {
LoginSource int64 `xorm:"NOT NULL DEFAULT 0"`
LoginName string
Type UserType
OwnedOrgs []*User `xorm:"-"`
Orgs []*User `xorm:"-"`
Repos []*Repository `xorm:"-"`
OwnedOrgs []*User `xorm:"-" json:"-"`
Orgs []*User `xorm:"-" json:"-"`
Repos []*Repository `xorm:"-" json:"-"`
Location string
Website string
Rands string `xorm:"VARCHAR(10)"`
Salt string `xorm:"VARCHAR(10)"`
Created time.Time `xorm:"-"`
Created time.Time `xorm:"-" json:"-"`
CreatedUnix int64
Updated time.Time `xorm:"-"`
Updated time.Time `xorm:"-" json:"-"`
UpdatedUnix int64
// Remember visibility choice for convenience, true for private
@@ -95,8 +98,8 @@ type User struct {
Description string
NumTeams int
NumMembers int
Teams []*Team `xorm:"-"`
Members []*User `xorm:"-"`
Teams []*Team `xorm:"-" json:"-"`
Members []*User `xorm:"-" json:"-"`
}
func (u *User) BeforeInsert() {
@@ -129,6 +132,7 @@ func (u *User) APIFormat() *api.User {
return &api.User{
ID: u.ID,
UserName: u.Name,
Login: u.Name,
FullName: u.FullName,
Email: u.Email,
AvatarUrl: u.AvatarLink(),
@@ -257,7 +261,7 @@ func (u *User) RelAvatarLink() string {
if !com.IsExist(u.CustomAvatarPath()) {
return defaultImgUrl
}
return setting.AppSubURL + "/avatars/" + com.ToStr(u.ID)
return fmt.Sprintf("%s/%s/%d", setting.AppSubURL, USER_AVATAR_URL_PREFIX, u.ID)
case setting.DisableGravatar, setting.OfflineMode:
if !com.IsExist(u.CustomAvatarPath()) {
if err := u.GenerateRandomAvatar(); err != nil {
@@ -265,7 +269,7 @@ func (u *User) RelAvatarLink() string {
}
}
return setting.AppSubURL + "/avatars/" + com.ToStr(u.ID)
return fmt.Sprintf("%s/%s/%d", setting.AppSubURL, USER_AVATAR_URL_PREFIX, u.ID)
}
return tool.AvatarLink(u.AvatarEmail)
}
@@ -330,50 +334,37 @@ func (u *User) ValidatePassword(passwd string) bool {
}
// UploadAvatar saves custom avatar for user.
// FIXME: split uploads to different subdirs in case we have massive users.
// FIXME: split uploads to different subdirs in case we have massive number of users.
func (u *User) UploadAvatar(data []byte) error {
img, _, err := image.Decode(bytes.NewReader(data))
if err != nil {
return fmt.Errorf("Decode: %v", err)
}
m := resize.Resize(avatar.AVATAR_SIZE, avatar.AVATAR_SIZE, img, resize.NearestNeighbor)
sess := x.NewSession()
defer sess.Close()
if err = sess.Begin(); err != nil {
return err
}
u.UseCustomAvatar = true
if err = updateUser(sess, u); err != nil {
return fmt.Errorf("updateUser: %v", err)
return fmt.Errorf("decode image: %v", err)
}
os.MkdirAll(setting.AvatarUploadPath, os.ModePerm)
fw, err := os.Create(u.CustomAvatarPath())
if err != nil {
return fmt.Errorf("Create: %v", err)
return fmt.Errorf("create custom avatar directory: %v", err)
}
defer fw.Close()
m := resize.Resize(avatar.AVATAR_SIZE, avatar.AVATAR_SIZE, img, resize.NearestNeighbor)
if err = png.Encode(fw, m); err != nil {
return fmt.Errorf("Encode: %v", err)
return fmt.Errorf("encode image: %v", err)
}
return sess.Commit()
return nil
}
// DeleteAvatar deletes the user's custom avatar.
func (u *User) DeleteAvatar() error {
log.Trace("DeleteAvatar [%d]: %s", u.ID, u.CustomAvatarPath())
os.Remove(u.CustomAvatarPath())
if err := os.Remove(u.CustomAvatarPath()); err != nil {
return err
}
u.UseCustomAvatar = false
if err := UpdateUser(u); err != nil {
return fmt.Errorf("UpdateUser: %v", err)
}
return nil
return UpdateUser(u)
}
// IsAdminOfRepo returns true if user has admin or higher access of repository.
@@ -716,7 +707,7 @@ func updateUser(e Engine, u *User) error {
u.Website = tool.TruncateString(u.Website, 255)
u.Description = tool.TruncateString(u.Description, 255)
_, err := e.Id(u.ID).AllCols().Update(u)
_, err := e.ID(u.ID).AllCols().Update(u)
return err
}
@@ -900,7 +891,7 @@ func GetUserByKeyID(keyID int64) (*User, error) {
func getUserByID(e Engine, id int64) (*User, error) {
u := new(User)
has, err := e.Id(id).Get(u)
has, err := e.ID(id).Get(u)
if err != nil {
return nil, err
} else if !has {

View File

@@ -18,7 +18,7 @@ type EmailAddress struct {
UID int64 `xorm:"INDEX NOT NULL"`
Email string `xorm:"UNIQUE NOT NULL"`
IsActivated bool
IsPrimary bool `xorm:"-"`
IsPrimary bool `xorm:"-" json:"-"`
}
// GetEmailAddresses returns all email addresses belongs to given user.
@@ -132,7 +132,7 @@ func (email *EmailAddress) Activate() error {
}
email.IsActivated = true
if _, err := sess.Id(email.ID).AllCols().Update(email); err != nil {
if _, err := sess.ID(email.ID).AllCols().Update(email); err != nil {
return err
} else if err = updateUser(sess, user); err != nil {
return err
@@ -202,7 +202,7 @@ func MakeEmailPrimary(email *EmailAddress) error {
}
user.Email = email.Email
if _, err = sess.Id(user.ID).AllCols().Update(user); err != nil {
if _, err = sess.ID(user.ID).AllCols().Update(user); err != nil {
return err
}

View File

@@ -9,13 +9,13 @@ import (
"crypto/sha256"
"crypto/tls"
"encoding/hex"
"encoding/json"
"fmt"
"io/ioutil"
"strings"
"time"
"github.com/go-xorm/xorm"
"github.com/json-iterator/go"
gouuid "github.com/satori/go.uuid"
log "gopkg.in/clog.v1"
@@ -97,18 +97,18 @@ type Webhook struct {
OrgID int64
URL string `xorm:"url TEXT"`
ContentType HookContentType
Secret string `xorm:"TEXT"`
Events string `xorm:"TEXT"`
*HookEvent `xorm:"-"`
IsSSL bool `xorm:"is_ssl"`
Secret string `xorm:"TEXT"`
Events string `xorm:"TEXT"`
*HookEvent `xorm:"-"` // LEGACY [1.0]: Cannot ignore JSON here, it breaks old backup archive
IsSSL bool `xorm:"is_ssl"`
IsActive bool
HookTaskType HookTaskType
Meta string `xorm:"TEXT"` // store hook-specific attributes
LastStatus HookStatus // Last delivery status
Created time.Time `xorm:"-"`
Created time.Time `xorm:"-" json:"-"`
CreatedUnix int64
Updated time.Time `xorm:"-"`
Updated time.Time `xorm:"-" json:"-"`
UpdatedUnix int64
}
@@ -126,7 +126,7 @@ func (w *Webhook) AfterSet(colName string, _ xorm.Cell) {
switch colName {
case "events":
w.HookEvent = &HookEvent{}
if err = json.Unmarshal([]byte(w.Events), w.HookEvent); err != nil {
if err = jsoniter.Unmarshal([]byte(w.Events), w.HookEvent); err != nil {
log.Error(3, "Unmarshal [%d]: %v", w.ID, err)
}
case "created_unix":
@@ -138,7 +138,7 @@ func (w *Webhook) AfterSet(colName string, _ xorm.Cell) {
func (w *Webhook) GetSlackHook() *SlackMeta {
s := &SlackMeta{}
if err := json.Unmarshal([]byte(w.Meta), s); err != nil {
if err := jsoniter.Unmarshal([]byte(w.Meta), s); err != nil {
log.Error(2, "GetSlackHook [%d]: %v", w.ID, err)
}
return s
@@ -151,7 +151,7 @@ func (w *Webhook) History(page int) ([]*HookTask, error) {
// UpdateEvent handles conversion from HookEvent to Events.
func (w *Webhook) UpdateEvent() error {
data, err := json.Marshal(w.HookEvent)
data, err := jsoniter.Marshal(w.HookEvent)
w.Events = string(data)
return err
}
@@ -418,21 +418,21 @@ type HookTask struct {
Type HookTaskType
URL string `xorm:"TEXT"`
Signature string `xorm:"TEXT"`
api.Payloader `xorm:"-"`
api.Payloader `xorm:"-" json:"-"`
PayloadContent string `xorm:"TEXT"`
ContentType HookContentType
EventType HookEventType
IsSSL bool
IsDelivered bool
Delivered int64
DeliveredString string `xorm:"-"`
DeliveredString string `xorm:"-" json:"-"`
// History info.
IsSucceed bool
RequestContent string `xorm:"TEXT"`
RequestInfo *HookRequest `xorm:"-"`
RequestInfo *HookRequest `xorm:"-" json:"-"`
ResponseContent string `xorm:"TEXT"`
ResponseInfo *HookResponse `xorm:"-"`
ResponseInfo *HookResponse `xorm:"-" json:"-"`
}
func (t *HookTask) BeforeUpdate() {
@@ -456,7 +456,7 @@ func (t *HookTask) AfterSet(colName string, _ xorm.Cell) {
}
t.RequestInfo = &HookRequest{}
if err = json.Unmarshal([]byte(t.RequestContent), t.RequestInfo); err != nil {
if err = jsoniter.Unmarshal([]byte(t.RequestContent), t.RequestInfo); err != nil {
log.Error(3, "Unmarshal[%d]: %v", t.ID, err)
}
@@ -466,14 +466,14 @@ func (t *HookTask) AfterSet(colName string, _ xorm.Cell) {
}
t.ResponseInfo = &HookResponse{}
if err = json.Unmarshal([]byte(t.ResponseContent), t.ResponseInfo); err != nil {
if err = jsoniter.Unmarshal([]byte(t.ResponseContent), t.ResponseInfo); err != nil {
log.Error(3, "Unmarshal [%d]: %v", t.ID, err)
}
}
}
func (t *HookTask) MarshalJSON(v interface{}) string {
p, err := json.Marshal(v)
p, err := jsoniter.Marshal(v)
if err != nil {
log.Error(3, "Marshal [%d]: %v", t.ID, err)
}
@@ -654,6 +654,8 @@ func (t *HookTask) deliver() {
timeout := time.Duration(setting.Webhook.DeliverTimeout) * time.Second
req := httplib.Post(t.URL).SetTimeout(timeout, timeout).
Header("X-Github-Delivery", t.UUID).
Header("X-Github-Event", string(t.EventType)).
Header("X-Gogs-Delivery", t.UUID).
Header("X-Gogs-Signature", t.Signature).
Header("X-Gogs-Event", string(t.EventType)).

View File

@@ -5,10 +5,11 @@
package models
import (
"encoding/json"
"fmt"
"strings"
"github.com/json-iterator/go"
"github.com/gogs/git-module"
api "github.com/gogs/go-gogs-client"
)
@@ -41,7 +42,7 @@ type DingtalkPayload struct {
}
func (p *DingtalkPayload) JSONPayload() ([]byte, error) {
data, err := json.MarshalIndent(p, "", " ")
data, err := jsoniter.MarshalIndent(p, "", " ")
if err != nil {
return []byte{}, err
}

View File

@@ -5,11 +5,12 @@
package models
import (
"encoding/json"
"fmt"
"strconv"
"strings"
"github.com/json-iterator/go"
"github.com/gogs/git-module"
api "github.com/gogs/go-gogs-client"
@@ -49,7 +50,7 @@ type DiscordPayload struct {
}
func (p *DiscordPayload) JSONPayload() ([]byte, error) {
data, err := json.MarshalIndent(p, "", " ")
data, err := jsoniter.MarshalIndent(p, "", " ")
if err != nil {
return []byte{}, err
}
@@ -371,8 +372,8 @@ func getDiscordReleasePayload(p *api.ReleasePayload) (*DiscordPayload, error) {
func GetDiscordPayload(p api.Payloader, event HookEventType, meta string) (payload *DiscordPayload, err error) {
slack := &SlackMeta{}
if err := json.Unmarshal([]byte(meta), &slack); err != nil {
return nil, fmt.Errorf("json.Unmarshal: %v", err)
if err := jsoniter.Unmarshal([]byte(meta), &slack); err != nil {
return nil, fmt.Errorf("jsoniter.Unmarshal: %v", err)
}
switch event {

View File

@@ -5,10 +5,11 @@
package models
import (
"encoding/json"
"fmt"
"strings"
"github.com/json-iterator/go"
"github.com/gogs/git-module"
api "github.com/gogs/go-gogs-client"
@@ -40,7 +41,7 @@ type SlackPayload struct {
}
func (p *SlackPayload) JSONPayload() ([]byte, error) {
data, err := json.MarshalIndent(p, "", " ")
data, err := jsoniter.MarshalIndent(p, "", " ")
if err != nil {
return []byte{}, err
}
@@ -288,8 +289,8 @@ func getSlackReleasePayload(p *api.ReleasePayload) (*SlackPayload, error) {
func GetSlackPayload(p api.Payloader, event HookEventType, meta string) (payload *SlackPayload, err error) {
slack := &SlackMeta{}
if err := json.Unmarshal([]byte(meta), &slack); err != nil {
return nil, fmt.Errorf("json.Unmarshal: %v", err)
if err := jsoniter.Unmarshal([]byte(meta), &slack); err != nil {
return nil, fmt.Errorf("Unmarshal: %v", err)
}
switch event {

View File

@@ -23,10 +23,11 @@ func IsAPIPath(url string) bool {
return strings.HasPrefix(url, "/api/")
}
// SignedInID returns the id of signed in user.
func SignedInID(c *macaron.Context, sess session.Store) int64 {
// SignedInID returns the id of signed in user, along with one bool value which indicates whether user uses token
// authentication.
func SignedInID(c *macaron.Context, sess session.Store) (_ int64, isTokenAuth bool) {
if !models.HasEngine {
return 0
return 0, false
}
// Check access token.
@@ -53,40 +54,40 @@ func SignedInID(c *macaron.Context, sess session.Store) int64 {
if !models.IsErrAccessTokenNotExist(err) && !models.IsErrAccessTokenEmpty(err) {
log.Error(2, "GetAccessTokenBySHA: %v", err)
}
return 0
return 0, false
}
t.Updated = time.Now()
if err = models.UpdateAccessToken(t); err != nil {
log.Error(2, "UpdateAccessToken: %v", err)
}
return t.UID
return t.UID, true
}
}
uid := sess.Get("uid")
if uid == nil {
return 0
return 0, false
}
if id, ok := uid.(int64); ok {
if _, err := models.GetUserByID(id); err != nil {
if !errors.IsUserNotExist(err) {
log.Error(2, "GetUserByID: %v", err)
}
return 0
return 0, false
}
return id
return id, false
}
return 0
return 0, false
}
// SignedInUser returns the user object of signed user.
// It returns a bool value to indicate whether user uses basic auth or not.
func SignedInUser(ctx *macaron.Context, sess session.Store) (*models.User, bool) {
// SignedInUser returns the user object of signed in user, along with two bool values,
// which indicate whether user uses HTTP Basic Authentication or token authentication respectively.
func SignedInUser(ctx *macaron.Context, sess session.Store) (_ *models.User, isBasicAuth bool, isTokenAuth bool) {
if !models.HasEngine {
return nil, false
return nil, false, false
}
uid := SignedInID(ctx, sess)
uid, isTokenAuth := SignedInID(ctx, sess)
if uid <= 0 {
if setting.Service.EnableReverseProxyAuth {
@@ -95,8 +96,8 @@ func SignedInUser(ctx *macaron.Context, sess session.Store) (*models.User, bool)
u, err := models.GetUserByName(webAuthUser)
if err != nil {
if !errors.IsUserNotExist(err) {
log.Error(4, "GetUserByName: %v", err)
return nil, false
log.Error(2, "GetUserByName: %v", err)
return nil, false, false
}
// Check if enabled auto-registration.
@@ -109,14 +110,14 @@ func SignedInUser(ctx *macaron.Context, sess session.Store) (*models.User, bool)
}
if err = models.CreateUser(u); err != nil {
// FIXME: should I create a system notice?
log.Error(4, "CreateUser: %v", err)
return nil, false
log.Error(2, "CreateUser: %v", err)
return nil, false, false
} else {
return u, false
return u, false, false
}
}
}
return u, false
return u, false, false
}
}
@@ -130,21 +131,21 @@ func SignedInUser(ctx *macaron.Context, sess session.Store) (*models.User, bool)
u, err := models.UserLogin(uname, passwd, -1)
if err != nil {
if !errors.IsUserNotExist(err) {
log.Error(4, "UserLogin: %v", err)
log.Error(2, "UserLogin: %v", err)
}
return nil, false
return nil, false, false
}
return u, true
return u, true, false
}
}
return nil, false
return nil, false, false
}
u, err := models.GetUserByID(uid)
if err != nil {
log.Error(4, "GetUserById: %v", err)
return nil, false
log.Error(2, "GetUserByID: %v", err)
return nil, false, false
}
return u, false
return u, false, isTokenAuth
}

50
pkg/auth/github/github.go Normal file
View File

@@ -0,0 +1,50 @@
// Copyright 2018 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package github
import (
"context"
"crypto/tls"
"fmt"
"net/http"
"strings"
"github.com/google/go-github/github"
)
func Authenticate(apiEndpoint, login, passwd string) (name string, email string, website string, location string, _ error) {
tp := github.BasicAuthTransport{
Username: strings.TrimSpace(login),
Password: strings.TrimSpace(passwd),
Transport: &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
},
}
client, err := github.NewEnterpriseClient(apiEndpoint, apiEndpoint, tp.Client())
if err != nil {
return "", "", "", "", fmt.Errorf("create new client: %v", err)
}
user, _, err := client.Users.Get(context.Background(), "")
if err != nil {
return "", "", "", "", fmt.Errorf("get user info: %v", err)
}
if user.Name != nil {
name = *user.Name
}
if user.Email != nil {
email = *user.Email
} else {
email = login + "+github@local"
}
if user.HTMLURL != nil {
website = strings.ToLower(*user.HTMLURL)
}
if user.Location != nil {
location = strings.ToUpper(*user.Location)
}
return name, email, website, location, nil
}

View File

@@ -11,7 +11,7 @@ LDAP via BindDN functions like most LDAP authentication systems. First, it
queries the LDAP server using a Bind DN and searches for the user that is
attempting to sign in. If the user is found, the module attempts to bind to the
server using the user's supplied credentials. If this succeeds, the user has
been authenticated, and his account information is retrieved and passed to the
been authenticated, and their account information is retrieved and passed to the
Gogs login infrastructure.
LDAP simple authentication does not utilize a Bind DN. Instead, it binds
@@ -20,7 +20,7 @@ succeeds and no filter rules out the user, the user is authenticated.
LDAP via BindDN is recommended for most users. By using a Bind DN, the server
can perform authorization by restricting which entries the Bind DN account can
read. Further, using a Bind DN with reduced permissions can reduce security risk
read. Furthermore, using a Bind DN with reduced permissions can reduce security risk
in the face of application bugs.
## Usage

View File

@@ -178,7 +178,7 @@ func bindUser(l *ldap.Conn, userDN, passwd string) error {
func (ls *Source) SearchEntry(name, passwd string, directBind bool) (string, string, string, string, bool, bool) {
// See https://tools.ietf.org/search/rfc4513#section-5.1.2
if len(passwd) == 0 {
log.Trace("authentication failed for '%s' with empty password")
log.Trace("authentication failed for '%s' with empty password", name)
return "", "", "", "", false, false
}
l, err := dial(ls)
@@ -268,16 +268,26 @@ func (ls *Source) SearchEntry(name, passwd string, directBind bool) (string, str
if err != nil {
log.Error(2, "LDAP: Group search failed: %v", err)
return "", "", "", "", false, false
} else if len(sr.Entries) < 1 {
} else if len(srg.Entries) < 1 {
log.Error(2, "LDAP: Group search failed: 0 entries")
return "", "", "", "", false, false
}
isMember := false
for _, group := range srg.Entries {
for _, member := range group.GetAttributeValues(ls.GroupMemberUID) {
if member == uid {
isMember = true
if ls.UserUID == "dn" {
for _, group := range srg.Entries {
for _, member := range group.GetAttributeValues(ls.GroupMemberUID) {
if member == sr.Entries[0].DN {
isMember = true
}
}
}
} else {
for _, group := range srg.Entries {
for _, member := range group.GetAttributeValues(ls.GroupMemberUID) {
if member == uid {
isMember = true
}
}
}
}

File diff suppressed because one or more lines are too long

View File

@@ -6,6 +6,7 @@ package context
import (
"fmt"
"net/http"
"strings"
"github.com/Unknwon/paginater"
@@ -16,12 +17,16 @@ import (
)
type APIContext struct {
*Context
*Context // TODO: Reduce to only needed fields instead of full shadow
// Base URL for the version of API endpoints, e.g. https://try.gogs.io/api/v1
BaseURL string
Org *APIOrganization
}
// FIXME: move to github.com/gogs/go-gogs-client
const DOC_URL = "https://github.com/gogs/go-gogs-client/wiki"
const DOC_URL = "https://github.com/gogs/docs-api"
// Error responses error message to client with given message.
// If status is 500, also it prints error to log.
@@ -33,7 +38,7 @@ func (c *APIContext) Error(status int, title string, obj interface{}) {
message = obj.(string)
}
if status == 500 {
if status == http.StatusInternalServerError {
log.Error(3, "%s: %s", title, message)
}
@@ -43,7 +48,33 @@ func (c *APIContext) Error(status int, title string, obj interface{}) {
})
}
// SetLinkHeader sets pagination link header by given totol number and page size.
// NoContent renders the 204 response.
func (c *APIContext) NoContent() {
c.Status(http.StatusNoContent)
}
// NotFound renders the 404 response.
func (c *APIContext) NotFound() {
c.Status(http.StatusNotFound)
}
// ServerError renders the 500 response.
func (c *APIContext) ServerError(title string, err error) {
c.Error(http.StatusInternalServerError, title, err)
}
// NotFoundOrServerError use error check function to determine if the error
// is about not found. It responses with 404 status code for not found error,
// or error context description for logging purpose of 500 server error.
func (c *APIContext) NotFoundOrServerError(title string, errck func(error) bool, err error) {
if errck(err) {
c.NotFound()
return
}
c.ServerError(title, err)
}
// SetLinkHeader sets pagination link header by given total number and page size.
func (c *APIContext) SetLinkHeader(total, pageSize int) {
page := paginater.New(total, pageSize, c.QueryInt("page"), 0)
links := make([]string, 0, 4)
@@ -69,6 +100,7 @@ func APIContexter() macaron.Handler {
return func(ctx *Context) {
c := &APIContext{
Context: ctx,
BaseURL: setting.AppURL + "api/v1",
}
ctx.Map(c)
}

View File

@@ -5,13 +5,16 @@
package context
import (
"net/http"
"net/url"
"strings"
"github.com/go-macaron/csrf"
"gopkg.in/macaron.v1"
"github.com/gogs/gogs/pkg/auth"
"github.com/gogs/gogs/pkg/setting"
"github.com/gogs/gogs/pkg/tool"
)
type ToggleOptions struct {
@@ -92,3 +95,18 @@ func Toggle(options *ToggleOptions) macaron.Handler {
}
}
}
// RequireBasicAuth verifies HTTP Basic Authentication header with given credentials
func (c *Context) RequireBasicAuth(username, password string) {
fields := strings.Fields(c.Req.Header.Get("Authorization"))
if len(fields) != 2 || fields[0] != "Basic" {
c.Status(http.StatusUnauthorized)
return
}
uname, passwd, _ := tool.BasicAuthDecode(fields[1])
if uname != username || passwd != password {
c.Status(http.StatusForbidden)
return
}
}

View File

@@ -6,7 +6,6 @@ package context
import (
"fmt"
"html/template"
"io"
"net/http"
"path"
@@ -26,6 +25,7 @@ import (
"github.com/gogs/gogs/pkg/auth"
"github.com/gogs/gogs/pkg/form"
"github.com/gogs/gogs/pkg/setting"
"github.com/gogs/gogs/pkg/template"
)
// Context represents context of a request.
@@ -40,6 +40,7 @@ type Context struct {
User *models.User
IsLogged bool
IsBasicAuth bool
IsTokenAuth bool
Repo *Repository
Org *Organization
@@ -68,6 +69,14 @@ func (c *Context) RequireSimpleMDE() {
c.Require("SimpleMDE")
}
func (c *Context) RequireAutosize() {
c.Require("Autosize")
}
func (c *Context) RequireDropzone() {
c.Require("Dropzone")
}
// FormErr sets "Err_xxx" field in template data.
func (c *Context) FormErr(names ...string) {
for i := range names {
@@ -130,10 +139,21 @@ func (c *Context) JSONSuccess(data interface{}) {
c.JSON(http.StatusOK, data)
}
// RawRedirect simply calls underlying Redirect method with no escape.
func (c *Context) RawRedirect(location string, status ...int) {
c.Context.Redirect(location, status...)
}
// Redirect responses redirection wtih given location and status.
// It escapes special characters in the location string.
func (c *Context) Redirect(location string, status ...int) {
c.Context.Redirect(template.EscapePound(location), status...)
}
// SubURLRedirect responses redirection wtih given location and status.
// It prepends setting.AppSubURL to the location string.
func (c *Context) SubURLRedirect(location string, status ...int) {
c.Redirect(setting.AppSubURL + location)
c.Redirect(setting.AppSubURL+location, status...)
}
// RenderWithErr used for page has form validation but need to prompt error to users.
@@ -219,7 +239,7 @@ func Contexter() macaron.Handler {
},
Org: &Organization{},
}
c.Data["Link"] = c.Link
c.Data["Link"] = template.EscapePound(c.Link)
c.Data["PageStartTime"] = time.Now()
// Quick responses appropriate go-get meta with status 200
@@ -244,6 +264,10 @@ func Contexter() macaron.Handler {
}
prefix := setting.AppURL + path.Join(ownerName, repoName, "src", branchName)
insecureFlag := ""
if !strings.HasPrefix(setting.AppURL, "https://") {
insecureFlag = "--insecure "
}
c.PlainText(http.StatusOK, []byte(com.Expand(`<!doctype html>
<html>
<head>
@@ -251,14 +275,15 @@ func Contexter() macaron.Handler {
<meta name="go-source" content="{GoGetImport} _ {GoDocDirectory} {GoDocFile}">
</head>
<body>
go get {GoGetImport}
go get {InsecureFlag}{GoGetImport}
</body>
</html>
`, map[string]string{
"GoGetImport": path.Join(setting.Domain, setting.AppSubURL, repo.FullName()),
"GoGetImport": path.Join(setting.HostAddress, setting.AppSubURL, repo.FullName()),
"CloneLink": models.ComposeHTTPSCloneURL(ownerName, repoName),
"GoDocDirectory": prefix + "{/dir}",
"GoDocFile": prefix + "{/dir}/{file}#L{line}",
"InsecureFlag": insecureFlag,
})))
return
}
@@ -270,8 +295,8 @@ func Contexter() macaron.Handler {
c.Header().Set("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With")
}
// Get user from session if logined.
c.User, c.IsBasicAuth = auth.SignedInUser(c.Context, c.Session)
// Get user from session or header when possible
c.User, c.IsBasicAuth, c.IsTokenAuth = auth.SignedInUser(c.Context, c.Session)
if c.User != nil {
c.IsLogged = true
@@ -288,13 +313,13 @@ func Contexter() macaron.Handler {
// If request sends files, parse them here otherwise the Query() can't be parsed and the CsrfToken will be invalid.
if c.Req.Method == "POST" && strings.Contains(c.Req.Header.Get("Content-Type"), "multipart/form-data") {
if err := c.Req.ParseMultipartForm(setting.AttachmentMaxSize << 20); err != nil && !strings.Contains(err.Error(), "EOF") { // 32MB max size
c.Handle(500, "ParseMultipartForm", err)
c.ServerError("ParseMultipartForm", err)
return
}
}
c.Data["CSRFToken"] = x.GetToken()
c.Data["CSRFTokenHTML"] = template.HTML(`<input type="hidden" name="_csrf" value="` + x.GetToken() + `">`)
c.Data["CSRFTokenHTML"] = template.Safe(`<input type="hidden" name="_csrf" value="` + x.GetToken() + `">`)
log.Trace("Session ID: %s", sess.ID())
log.Trace("CSRF Token: %v", c.Data["CSRFToken"])

30
pkg/context/user.go Normal file
View File

@@ -0,0 +1,30 @@
// Copyright 2018 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package context
import (
"gopkg.in/macaron.v1"
"github.com/gogs/gogs/models"
"github.com/gogs/gogs/models/errors"
)
// ParamsUser is the wrapper type of the target user defined by URL parameter, namely ':username'.
type ParamsUser struct {
*models.User
}
// InjectParamsUser returns a handler that retrieves target user based on URL parameter ':username',
// and injects it as *ParamsUser.
func InjectParamsUser() macaron.Handler {
return func(c *Context) {
user, err := models.GetUserByName(c.Params(":username"))
if err != nil {
c.NotFoundOrServerError("GetUserByName", errors.IsUserNotExist, err)
return
}
c.Map(&ParamsUser{user})
}
}

View File

@@ -11,7 +11,7 @@ import (
type Authentication struct {
ID int64
Type int `binding:"Range(2,5)"`
Type int `binding:"Range(2,6)"`
Name string `binding:"Required;MaxSize(30)"`
Host string
Port int
@@ -32,6 +32,7 @@ type Authentication struct {
GroupMemberUID string
UserUID string
IsActive bool
IsDefault bool
SMTPAuth string
SMTPHost string
SMTPPort int
@@ -40,6 +41,7 @@ type Authentication struct {
TLS bool
SkipVerify bool
PAMServiceName string
GitHubAPIEndpoint string `form:"github_api_endpoint" binding:"Url"`
}
func (f *Authentication) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {

View File

@@ -26,7 +26,7 @@ type CreateRepo struct {
UserID int64 `binding:"Required"`
RepoName string `binding:"Required;AlphaDashDot;MaxSize(100)"`
Private bool
Description string `binding:"MaxSize(255)"`
Description string `binding:"MaxSize(512)"`
AutoInit bool
Gitignores string
License string
@@ -45,7 +45,7 @@ type MigrateRepo struct {
RepoName string `json:"repo_name" binding:"Required;AlphaDashDot;MaxSize(100)"`
Mirror bool `json:"mirror"`
Private bool `json:"private"`
Description string `json:"description" binding:"MaxSize(255)"`
Description string `json:"description" binding:"MaxSize(512)"`
}
func (f *MigrateRepo) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
@@ -82,7 +82,7 @@ func (f MigrateRepo) ParseRemoteAddr(user *models.User) (string, error) {
type RepoSetting struct {
RepoName string `binding:"Required;AlphaDashDot;MaxSize(100)"`
Description string `binding:"MaxSize(255)"`
Description string `binding:"MaxSize(512)"`
Website string `binding:"Url;MaxSize(100)"`
Branch string
Interval int

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