Compare commits

...

117 Commits

Author SHA1 Message Date
unknwon
c154721f4a Bump version 2019-08-11 18:59:46 -07:00
unknwon
48cdae2829 Dockerfile: always use alpine:latest (#5714) 2019-08-10 20:23:18 -07:00
Atsushi Midorikawa
9571a9b53d docker: change how to check whether initial or not (#5766) 2019-08-10 20:05:11 -07:00
unknwon
f1e0ebfe93 routes/api/v1: codemod 2019-08-10 13:40:48 -07:00
unknwon
c7ba519af2 routes/api/v1: codemod 2019-08-08 23:53:43 -07:00
Pablo Alcantara
04de977855 dockerfile: add rsync (#5773)
* Add rsync to docker.

Add rsync to docker.
Rsync is nearly a necessity to optimize backup inside Openshift container.
Using TAR (default without Rsync), the process of external backup constantly stops at the middle.

* Add rsync to docker

Add rsync to docker.
Rsync is nearly a necessity to optimize backup inside Openshift container.
Using TAR (default without Rsync), the process of external backup constantly stops at the middle.

* Add rsync to docker

Add rsync to docker.
Rsync is nearly a necessity to optimize backup inside Openshift container.
Using TAR (default without Rsync), the process of external backup constantly stops at the middle.

* Add rsync to docker

Add rsync to docker.
Rsync is nearly a necessity to optimize backup inside Openshift container.
Using TAR (default without Rsync), the process of external backup constantly stops at the middle.
2019-08-06 19:25:04 -07:00
Mathias Rangel Wulff
591a05caa3 Update TRANSLATORS (#5774) 2019-08-06 19:24:09 -07:00
unknwon
82700ea95a README: add Builtkite to sponsors 2019-08-04 17:20:51 -07:00
unknwon
a36b29c25c Bump version 2019-08-01 18:41:45 -07:00
unknwon
c3af3ff1d0 routes/api: fix permission checks for routes
Reported by @ManassehZhou #5764
2019-08-01 18:36:05 -07:00
unknwon
1592e578ed routes/api: add missing permission checks for routes
Permission check not enforced for deploy keys, collaborators, and hooks.

Reported by @ManassehZhou #5764
2019-08-01 18:26:05 -07:00
unknwon
e640683c97 README: add new VPS sponsor
[CI SKIP]
2019-07-29 19:17:50 -07:00
mal
e6bddd3ed2 packager.io: fix and update build files (#5760)
* Update pkgr distros and dependencies

* Configure govendor for heroku builds
2019-07-28 18:37:44 -07:00
unknwon
bd0549caea vendor: update missing test deps for ci 2019-07-28 16:08:47 -07:00
unknwon
08a53e5eca pkg/context/notice: use path.Join to concatenate path 2019-07-28 16:08:00 -07:00
unknwon
025972ef64 vendor: update missing test deps for ci 2019-07-28 16:03:54 -07:00
unknwon
00a3e368b4 vendor: update to fix tests with Go 1.12.x
- github.com/smartystreets/goconvey
- github.com/jtolds/gls
2019-07-28 15:56:22 -07:00
unknwon
6b2465746a ci: add Go 1.12.x 2019-07-28 15:14:28 -07:00
unknwon
35e2cee5c5 pkg/template: use template function Year to get number of year
To avoid update in each year
2019-07-28 15:10:44 -07:00
unknwon
d775fe7936 pkg/context: change banner file path (#5750) 2019-07-28 14:59:51 -07:00
Achilleas Koutsou
dc13eb6df0 pkg/context: Render live notice banner from file (#5750)
* pkg/context: Render live notice banner from file

- Contexter checks if there is a file called 'notice' under the
GOGS_CUSTOM directory and loads it.
- The first line is treated as a header/title and everything else as the
message body.
- Message body is rendered as HTML (tags allowed).
- File size is limited to 1024 bytes.
- File mime type must be text.
- Notice is rendered in head.tmpl for all pages.

* pkg/context: Rename maxlen to maxSize

Rename maxlen to maxSize for the maximum size (in bytes) of the notice
file to render.
Define the variable when needed to avoid instantiating it when the file
doesn't exist.

Co-Authored-By: ᴊ. ᴄʜᴇɴ <u@gogs.io>

* pkg/context: Package name after license header

Co-Authored-By: ᴊ. ᴄʜᴇɴ <u@gogs.io>

* pkg/context: Don't print 'Found notice file'

Becomes too verbose as it prints on every page load when the file
exists.

* pkg/context: Match project conventions

Import order and grouping

Variable names:
    fileloc -> fpath
    fp -> f
    finfo -> fi

* pkg/context: Remove empty line

Co-Authored-By: ᴊ. ᴄʜᴇɴ <u@gogs.io>

* pkg/context: Render notice as markdown

Server notice file should be named 'notice.md'.  The contents of the
file are treated as markdown and rendered as a warning message at the
top of every page.

* Update notice.go


Co-authored-by: ᴊ. ᴄʜᴇɴ <u@gogs.io>
2019-07-27 23:47:35 -07:00
Robin van Boven
798636c95b Include the Sha in webhook create payloads. (#5689) 2019-07-09 17:26:19 -07:00
Unknwon
25fdf6cb16 locale: sync from Crowdin 2019-06-27 08:32:59 -04:00
Paul Spieker
044a45db2e docker: prevent Gogs from running a recursive chown on each boot (#5724)
The chown command in the setup file of Gogs is supposed to be executed just once. As soon as the app.ini file exists, this step should be skipped. However, the test was checking if a directory with the name app.ini exists instead of a file. Therefore, the chown command was executed on each boot.
2019-06-16 13:42:56 -04:00
Tekaoh
0aec2df74f models/repo: idiomatic English (#5678)
* Idiomatic English

* Even better English
2019-04-11 22:22:49 -04:00
Unknwon
4f9c5b60c5 locale: sync from Crowdin 2019-03-25 03:08:25 -04:00
Menno van Rahden
bd13df972e docker: remove deprecated option (#5650)
This line has been removed in respect to the OpenSSH spec update with Version 7.5 (https://www.openssh.com/txt/release-7.5)
2019-03-16 21:53:18 -04:00
boson.cat
a971910723 README: fix tutorial links (#5641)
* Update README_ZH.md

* Update README.md
2019-02-28 19:54:07 -05:00
Unknwon
b8a6fee6d6 README: sync translation
[CI SKIP]
2019-02-25 17:57:53 -05:00
Zou Nengren
0bfa981e70 README: introduce a deployment method which using helm (#5638) 2019-02-25 17:56:07 -05:00
Unknwon
070bdda011 locale: sync from Crowdin 2019-02-25 11:29:49 -05:00
Andy Hochhaus
e19c026083 models/issue_mail: add assignee to issue related emails (#5628)
Reference #4220
2019-02-20 18:04:38 -05:00
Unknwon
8b383f86de pkg/bindata: regenerate for PR #5623 2019-02-20 17:56:43 -05:00
Andy Hochhaus
9ebd62f676 pkg/mailer/mail: render markdown in issue related emails (#5629)
Reference #4552
2019-02-20 17:54:27 -05:00
Stephen Lane-Walsh
2c3e2b701e conf/gitignore: add Unreal Engine (#5623) 2019-02-17 02:14:37 -05:00
Unknwon
16f95123cd models/models: formalize error messages 2019-02-06 18:50:02 -05:00
Unknwon
0a176df6fb models: disable idle connection and set connection max life time (#5532) 2019-02-06 18:46:15 -05:00
Unknwon
d862c43be0 README: add new sponsor
[CI SKIP]
2019-02-01 19:38:08 -05:00
Unknwon
a452767e34 README: update LunaNode link
[CI SKIP]
2019-01-30 23:22:50 -05:00
Favyen Bastani
f0aeef82a1 README: add LunaNode cloud deployment URL (#5584) 2019-01-30 23:21:18 -05:00
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
371 changed files with 37521 additions and 3110 deletions

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,15 +1,13 @@
targets:
debian-7: &debian
debian-8: &debian
build_dependencies:
- libpam0g-dev
dependencies:
- libpam0g
- git
debian-8:
<<: *debian
debian-9:
<<: *debian
ubuntu-12.04:
debian-10:
<<: *debian
ubuntu-14.04:
<<: *debian
@@ -18,6 +16,8 @@ targets:
build_dependencies:
- bzr
- mercurial
ubuntu-18.04:
<<: *debian
centos-6: &el
build_dependencies:
- pam-devel
@@ -33,4 +33,7 @@ before:
after:
- mv bin/gogs gogs
after_install: ./packager/hooks/postinst
buildpack: https://github.com/heroku/heroku-buildpack-go.git#v62
# Can be updated after CentOS 6 support is dropped, otherwise fails with
# `fatal: bad config file line 2 in /home/pkgr/.gitconfig` because of
# https://github.com/heroku/heroku-buildpack-go/blob/f96ebebfa7605fd3916521e42ab050c81c9b947a/lib/common.sh#L238
buildpack: https://github.com/heroku/heroku-buildpack-go.git#v76

View File

@@ -1,11 +1,10 @@
language: go
go:
- 1.7.x
- 1.8.x
- 1.9.x
- 1.10.x
- 1.11.x
- master
- 1.12.x
before_install:
- sudo apt-get update -qq

View File

@@ -20,7 +20,8 @@ RUN chmod +x /usr/sbin/gosu \
s6 \
shadow \
socat \
tzdata
tzdata \
rsync
ENV GOGS_CUSTOM /data/gogs

View File

@@ -1,4 +1,4 @@
FROM aarch64/alpine:3.5
FROM arm64v8/alpine:latest
# Install system utils & Gogs runtime dependencies
ADD https://github.com/tianon/gosu/releases/download/1.9/gosu-arm64 /usr/sbin/gosu
@@ -14,7 +14,8 @@ RUN chmod +x /usr/sbin/gosu \
s6 \
shadow \
socat \
tzdata
tzdata \
rsync
ENV GOGS_CUSTOM /data/gogs

View File

@@ -1,4 +1,4 @@
FROM arm64v8/alpine:3.8
FROM arm64v8/alpine:latest
ENV GOGS_CUSTOM /data/gogs
ENV QEMU_EXECVE 1
@@ -19,7 +19,7 @@ RUN [ "cross-build-start" ]
# Install system utils & Gogs runtime dependencies
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=1.10.1-r0
&& apk --no-cache --no-progress add ca-certificates bash git linux-pam s6 curl openssh shadow socat tzdata go=1.10.1-r0

View File

@@ -1,4 +1,4 @@
FROM armhf/alpine:3.5
FROM arm32v7/alpine:latest
# Install system utils & Gogs runtime dependencies
ADD https://github.com/tianon/gosu/releases/download/1.9/gosu-armhf /usr/sbin/gosu
@@ -14,7 +14,8 @@ RUN chmod +x /usr/sbin/gosu \
s6 \
shadow \
socat \
tzdata
tzdata \
rsync
ENV GOGS_CUSTOM /data/gogs

View File

@@ -1,4 +1,4 @@
FROM armhf/alpine:3.5
FROM arm32v7/alpine:latest
ENV GOGS_CUSTOM /data/gogs
ENV QEMU_EXECVE 1
@@ -30,7 +30,8 @@ RUN chmod +x /usr/sbin/gosu \
s6 \
shadow \
socat \
tzdata
tzdata \
rsync
# Configure LibC Name Service
COPY docker/nsswitch.conf /etc/nsswitch.conf

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

View File

@@ -52,7 +52,7 @@ This project aims to build a simple, stable and extensible self-hosted Git servi
- 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
@@ -69,13 +69,14 @@ This project aims to build a simple, stable and extensible self-hosted Git servi
Make sure you install the [prerequisites](https://gogs.io/docs/installation) first.
There are 5 ways to install Gogs:
There are 6 ways to install Gogs:
- [Install from binary](https://gogs.io/docs/installation/install_from_binary.html)
- [Install from source](https://gogs.io/docs/installation/install_from_source.html)
- [Install from packages](https://gogs.io/docs/installation/install_from_packages.html)
- [Ship with Docker](https://github.com/gogs/gogs/tree/master/docker)
- [Install with Vagrant](https://github.com/geerlingguy/ansible-vagrant-examples/tree/master/gogs)
- [Install with Kubernetes Using Helm Charts](https://github.com/helm/charts/tree/master/incubator/gogs)
### Tutorials
@@ -83,7 +84,7 @@ There are 5 ways to install Gogs:
- [Run your own GitHub-like service with the help of Docker](http://blog.hypriot.com/post/run-your-own-github-like-service-with-docker/)
- [Dockerized Gogs git server and alpine postgres in 20 minutes or less](http://garthwaite.org/docker-gogs.html)
- [Host Your Own Private GitHub with Gogs](https://eladnava.com/host-your-own-private-github-with-gogs-io/)
- [使用 Gogs 搭建自己的 Git 服务器](https://mynook.info/blog/post/host-your-own-git-server-using-gogs) (Chinese)
- [使用 Gogs 搭建自己的 Git 服务器](https://blog.mynook.info/post/host-your-own-git-server-using-gogs/) (Chinese)
- [阿里云上 Ubuntu 14.04 64 位安装 Gogs](http://my.oschina.net/luyao/blog/375654) (Chinese)
- [Installing Gogs on FreeBSD](https://www.codejam.info/2015/03/installing-gogs-on-freebsd.html)
- [Gogs on Raspberry Pi](http://blog.meinside.pe.kr/Gogs-on-Raspberry-Pi/)
@@ -103,6 +104,7 @@ There are 5 ways to install Gogs:
- [sloppy.io](https://github.com/sloppyio/quickstarters/tree/master/gogs)
- [YunoHost](https://github.com/YunoHost-Apps/gogs_ynh)
- [DPlatform](https://github.com/j8r/DPlatform)
- [LunaNode](https://github.com/LunaNode/launchgogs)
## Software and Service Support
@@ -125,8 +127,9 @@ 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), [VPSServer](https://www.vpsserver.com/), [Hosted.nl](https://www.hosted.nl/) and [MonoVM](https://monovm.com) for sponsoring VPS services.
- Thanks [KeyCDN](https://www.keycdn.com/) for sponsoring CDN service.
- Thanks [Buildkite](https://buildkite.com) for sponsoring open source CI/CD plan.
## Contributors
@@ -136,3 +139,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

@@ -33,7 +33,7 @@ Gogs 是一款极易搭建的自助 Git 服务。
- 支持邮件服务
- 支持后台管理面板
- 支持 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))
## 硬件要求
@@ -50,17 +50,18 @@ Gogs 是一款极易搭建的自助 Git 服务。
在安装 Gogs 之前,您需要先安装 [基本环境](https://gogs.io/docs/installation)。
然后,您可以通过以下 5 种方式来安装 Gogs
然后,您可以通过以下 6 种方式来安装 Gogs
- [二进制安装](https://gogs.io/docs/installation/install_from_binary.html)
- [源码安装](https://gogs.io/docs/installation/install_from_source.html)
- [包管理安装](https://gogs.io/docs/installation/install_from_packages.html)
- [采用 Docker 部署](https://github.com/gogs/gogs/tree/master/docker)
- [通过 Vagrant 安装](https://github.com/geerlingguy/ansible-vagrant-examples/tree/master/gogs)
- [通过基于 Kubernetes 的 Helm Charts](https://github.com/helm/charts/tree/master/incubator/gogs)
### 使用教程
- [使用 Gogs 搭建自己的 Git 服务器](https://mynook.info/blog/post/host-your-own-git-server-using-gogs)
- [使用 Gogs 搭建自己的 Git 服务器](https://blog.mynook.info/post/host-your-own-git-server-using-gogs/)
- [阿里云上 Ubuntu 14.04 64 位安装 Gogs](http://my.oschina.net/luyao/blog/375654)
### 云端部署
@@ -72,6 +73,7 @@ Gogs 是一款极易搭建的自助 Git 服务。
- [sloppy.io](https://github.com/sloppyio/quickstarters/tree/master/gogs)
- [YunoHost](https://github.com/mbugeia/gogs_ynh)
- [DPlatform](https://github.com/j8r/DPlatform)
- [LunaNode](https://github.com/LunaNode/launchgogs)
## 软件及服务支持
@@ -94,8 +96,9 @@ Gogs 是一款极易搭建的自助 Git 服务。
- 感谢 [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/)、[Hosted.nl](https://www.hosted.nl/) 和 [MonoVM](https://monovm.com) 提供服务器赞助。
- 感谢 [KeyCDN](https://www.keycdn.com/) 提供 CDN 服务赞助。
- 感谢 [Buildkite](https://buildkite.com) 提供免费的开源项目 CI/CD 支持。
## 贡献成员

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

@@ -199,7 +199,7 @@ func runServ(c *cli.Context) error {
fail("Internal error", "Fail to get user by key ID '%d': %v", key.ID, err)
}
mode, err := models.AccessLevel(user.ID, repo)
mode, err := models.UserAccessMode(user.ID, repo)
if err != nil {
fail("Internal error", "Fail to check access: %v", err)
}

View File

@@ -257,7 +257,7 @@ 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 *****
@@ -308,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"))
@@ -340,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)
@@ -484,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)

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
@@ -330,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
@@ -350,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
@@ -471,8 +473,8 @@ 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]
@@ -505,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/

76
conf/gitignore/UnrealEngine vendored Normal file
View File

@@ -0,0 +1,76 @@
# Visual Studio 2015 user specific files
.vs/
# Compiled Object files
*.slo
*.lo
*.o
*.obj
# Precompiled Headers
*.gch
*.pch
# Compiled Dynamic libraries
*.so
*.dylib
*.dll
# Fortran module files
*.mod
# Compiled Static libraries
*.lai
*.la
*.a
*.lib
# Executables
*.exe
*.out
*.app
*.ipa
# These project files can be generated by the engine
*.xcodeproj
*.xcworkspace
*.sln
*.suo
*.opensdf
*.sdf
*.VC.db
*.VC.opendb
# Precompiled Assets
SourceArt/**/*.png
SourceArt/**/*.tga
# Binary Files
Binaries/*
Plugins/*/Binaries/*
# Builds
Build/*
# Whitelist PakBlacklist-<BuildConfiguration>.txt files
!Build/*/
Build/*/**
!Build/*/PakBlacklist*.txt
# Don't ignore icon files in Build
!Build/**/*.ico
# Built data for maps
*_BuiltData.uasset
# Configuration files generated by the Editor
Saved/*
# Compiled source files for the engine to use
Intermediate/*
Plugins/*/Intermediate/*
# Cache files for the editor to use
DerivedDataCache/*

View File

@@ -56,6 +56,7 @@ Luc Stepniewski <luc AT stepniewski DOT fr>
Łukasz Jan Niemier <lukasz AT niemier DOT pl>
Marc Schiller <marc AT schiller DOT im>
Marvin Menzerath <github AT marvin-menzerath DOT de>
Mathias Rangel Wulff <m AT rawu DOT dk>
Michael Härtl <haertl DOT mike AT gmail DOT com>
Miguel de la Cruz <miguel AT mcrx DOT me>
Mikhail Burdin <xdshot9000 AT gmail DOT com>

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í
@@ -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
@@ -421,8 +421,8 @@ mirror_last_synced=Naposledy synchronizováno
watchers=Sledující
stargazers=Sledující
forks=Rozštěpení
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
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.
@@ -641,7 +641,7 @@ pulls.cannot_auto_merge_desc=Tento požadavek na natažení nemůže být automa
pulls.cannot_auto_merge_helper=Prosím proveďte sloučení ručně, aby byly vyřešeny rozpory.
pulls.create_merge_commit=Vytvořit slučovací commit
pulls.rebase_before_merging=Rebase before merging
pulls.commit_description=Commit Description
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
@@ -861,7 +861,7 @@ 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=Available characters
settings.description_length=Dostupné znaky
diff.browse_source=Procházet zdrojové kódy
diff.parent=rodič
@@ -917,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
@@ -981,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.
@@ -991,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í
@@ -1102,7 +1102,7 @@ auths.new=Přidat nový zdroj
auths.name=Název
auths.type=Typ
auths.enabled=Povolený
auths.default=Default
auths.default=Výchozí
auths.updated=Změněné
auths.auth_type=Typ ověření
auths.auth_name=Název ověření

View File

@@ -322,7 +322,7 @@ add_key=Schlüssel hinzufügen
ssh_desc=Dies ist eine Liste aller SSH-Schlüssel, die Ihrem Konto zugeordnet sind. Bitte entfernen Sie alle Schlüssel, die Ihnen nicht bekannt sind.
ssh_helper=<strong>Brauchen Sie Hilfe?</strong> Hier ist eine Anleitung zum <a href="%s">Erzeugen von SSH-Schlüsseln</a> oder <a href="%s">Lösen einfacher SSH-Probleme</a>.
add_new_key=SSH-Schlüssel hinzufügen
ssh_key_been_used=Inhalt des öffentlichen Schlüssels wurde verwendet.
ssh_key_been_used=Inhalt des öffentlichen Schlüssels wurde bereits verwendet.
ssh_key_name_used=Ein öffentlicher Schlüssel mit diesem Namen existiert bereits.
key_name=Schlüsselname
key_content=Inhalt
@@ -421,8 +421,8 @@ mirror_last_synced=Zuletzt synchronisiert
watchers=Beobachter
stargazers=In Favoriten von
forks=Forks
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
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.
@@ -520,7 +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=Failed to delete file '%s' with error: %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'
@@ -641,7 +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 Description
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
@@ -746,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=Enable pull requests to accept contributions between repositories and branches
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
@@ -860,8 +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=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
settings.description_desc=Beschreibung des Repository. Maximal 512 Zeichen.
settings.description_length=Verfügbare Zeichen
diff.browse_source=Quellcode durchsuchen
diff.parent=Ursprung
@@ -1102,7 +1102,7 @@ auths.new=Neue Quelle hinzufügen
auths.name=Name
auths.type=Typ
auths.enabled=Aktiviert
auths.default=Default
auths.default=Standard
auths.updated=Aktualisiert
auths.auth_type=Authentifizierungstyp
auths.auth_name=Authentifizierungsname
@@ -1141,7 +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=This authentication is default login source
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

View File

@@ -1151,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

@@ -152,7 +152,7 @@ social_register_hepler_msg=¿Ya tienes una cuenta? ¡Enlázala!
disable_register_prompt=Lo sentimos, el registro está deshabilitado. Por favor, contacta con el administrador del sitio.
disable_register_mail=Lo sentimos. Los correos de Confirmación de Registro están deshabilitados.
auth_source=Authentication Source
local=Idioma
local=Local
remember_me=Recuérdame
forgot_password=He olvidado mi contraseña
forget_password=¿Has olvidado tu contraseña?
@@ -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,8 +421,8 @@ mirror_last_synced=Última sincronización
watchers=Seguidores
stargazers=Fans
forks=Forks
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
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.
@@ -520,7 +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=Failed to delete file '%s' with 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'
@@ -623,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>
@@ -639,9 +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.commit_description=Commit Description
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
@@ -701,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.
@@ -718,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
@@ -731,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.
@@ -746,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=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.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.
@@ -769,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.
@@ -794,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
@@ -809,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
@@ -843,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
@@ -860,8 +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=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
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
@@ -1019,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.
@@ -1097,12 +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=Default
auths.default=Por defecto
auths.updated=Actualizado
auths.auth_type=Tipo de autenticación
auths.auth_name=Nombre de autenticación
@@ -1111,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
@@ -1122,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
@@ -1141,7 +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=This authentication is default login source
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
@@ -1152,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
@@ -1174,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
@@ -1188,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
@@ -1222,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
@@ -1312,9 +1312,9 @@ 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,8 +423,8 @@ mirror_last_synced=آخرین همگام سازی
watchers=دنبال‌کنندگان
stargazers=ستاره شناسان
forks=انشعاب ها
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
repo_description_helper=توضیحات مخرن. حداکثر طول ۵۱۲ کاراکتر.
repo_description_length=کاراکترهای موجود
form.reach_limit_of_creation=مخزن های دارنده حساب به حداکثر تعداد مجاز %d رسیده است.
form.name_reserved=یک مخزن با نام '%s' از قبل وجود دارد.
@@ -522,7 +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=Failed to delete file '%s' with error: %v
editor.fail_to_delete_file=خطا در حذف فایل '%s' رخ داده است. خطای رخ داده %v
editor.add_subdir=افزودن زیرپوشه...
editor.unable_to_upload_files=عدم موفقیت در آپلود فایل به '%s' با خطا: %v
editor.upload_files_to_dir=آپلود فایل به '%s'
@@ -643,7 +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=Commit Description
pulls.commit_description=توضیحات کامیت
pulls.merge_pull_request=ایجاد درخواست ادغام
pulls.open_unmerged_pull_exists=`به علت باز بودن pull request (#%d) از مخزنی مشابه و به همراه اطلاعات ادغام مشابه که در انتظار ادغام می باشد، بازگشایی مجدد مقدور نیست`
pulls.delete_branch=حذف شاخه
@@ -1099,12 +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=Default
auths.default=پیش فرض
auths.updated=به روز رسانی شده
auths.auth_type=نوع تأیید اعتبار
auths.auth_name=نام مجوز احراز هویت
@@ -1143,7 +1143,7 @@ auths.pam_service_name=نام سرویس PAM
auths.enable_auto_register=فعال سازی ثبت نام خودکار
auths.edit=ویرایش تنظیمات تأیید اعتبار
auths.activated=متد احراز هویت فعال شده است
auths.default_auth=This authentication is default login source
auths.default_auth=این احراز هویت پیش فرض منبع ورود می باشد
auths.new_success=متد احرازهویت %s با موفقیت افزوده شد.
auths.update_success=تنظیمات سیستم احرازهویت با موفقیت به روز شد.
auths.update=به روزرسانی تنظیمات سیستم احراز هویت
@@ -1224,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,8 +421,8 @@ mirror_last_synced=Dernière synchronisation
watchers=Observateurs
stargazers=Stargazers
forks=Forks
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
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é.
@@ -520,7 +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=Failed to delete file '%s' with error: %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'
@@ -641,7 +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=Commit Description
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
@@ -746,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=Enable pull requests to accept contributions between repositories and branches
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
@@ -860,8 +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 of repository. Maximum 512 characters length.
settings.description_length=Available characters
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
@@ -1102,7 +1102,7 @@ auths.new=Ajouter une nouvelle source d'authentification
auths.name=Nom
auths.type=Type
auths.enabled=Activé
auths.default=Default
auths.default=Par défaut
auths.updated=Mis à jour
auths.auth_type=Type d'authentification
auths.auth_name=Nom de l'authentification
@@ -1141,7 +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=This authentication is default login source
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
@@ -1285,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
@@ -1313,7 +1313,7 @@ push_tag=a soumis le tag <a href="%s/src/%s">%[2]s</a> sur <a href="%[1]s">%[3]s
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=a commité dans <a href="%[1]s/src/%[2]s">%[3]s</a> sur <a href="%[1]s">%[4]s</a>
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_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]

View File

@@ -48,7 +48,7 @@ cancel=Cancelar
install=Instalación
title=Pasos da instalación por primeira vez
docker_helper=Se está executando Gogs usando Docker, por favor lea <a target="_blank" href="%s"> estas pautas</a> antes de cambiar nada nesta páxina!
requite_db_desc=Gogs requires MySQL, PostgreSQL, SQLite3, MSSQL or TiDB.
requite_db_desc=Gogs require MySQL, PostgreSQL, SQLite3, MSSQL ouTiDB.
db_title=Configuración de base de datos
db_type=Tipo de base de datos
host=Host
@@ -58,8 +58,8 @@ db_name=Nome da base de datos
db_helper=Por favor, empregue o motor INNODB coa configuración de caracteres utf8_general_ci para MySQL.
ssl_mode=Modo SSL
path=Ruta
sqlite_helper=The file path of SQLite3 database. <br>Please use absolute path when you start as service.
err_empty_db_path=SQLite3 database path cannot be empty.
sqlite_helper=A ruta do ficheiro da base de datos SQLite3. <br> Utilice a ruta absoluta cando arrique o servicio.
err_empty_db_path=A ruta da base de datos SQLite3 non pode estar baleira.
no_admin_and_disable_registration=Non pode deshabilitar o rexistro sen crear unha conta de administrador.
err_empty_admin_password=O contrasinal de administrador non pode estar baleiro.
@@ -74,16 +74,16 @@ domain=Dominio
domain_helper=Isto afecta ás URLs para clonar por SSH.
ssh_port=Porto SSH
ssh_port_helper=Número de porto do seu servidor SSH, déixeo en branco para desactivar SSH.
use_builtin_ssh_server=Use Builtin SSH Server
use_builtin_ssh_server_popup=Start builtin SSH server for Git operations to distinguish from system SSH daemon.
use_builtin_ssh_server=Utilizar Builin en Sevidor SSH
use_builtin_ssh_server_popup=Inicia o servidor SSH integrado para que as operacións de Git sexan distintas do demonio SSH do sistema.
http_port=Porto HTTP
http_port_helper=Porto no que escoitará a aplicación.
app_url=URL da aplicación
app_url_helper=Isto afecta ás URLs para clonar por HTTP/HTTPS e a algúns correos electrónicos.
log_root_path=Ruta do rexistro
log_root_path_helper=Directorio onde almacenar os rexistros.
enable_console_mode=Enable Console Mode
enable_console_mode_popup=In addition to file mode, also print logs to console.
enable_console_mode=Habilitar Modo Consola
enable_console_mode_popup=Ademáis do modo de ficheiro, tamén imprime os rexistros para a consola.
optional_title=Configuración opcional
email_title=Configuración do servizo de correo
@@ -119,7 +119,8 @@ sqlite3_not_available=A túa versión non soporta SQLite3, por favor, descarga o
invalid_db_setting=A configuración da base de datos non é correcta: %v
invalid_repo_path=A ruta da raíz do repositorio é inválida: %v
run_user_not_match=A persoa usuaria que está executando a aplicación non é a persoa usuaria actual: %s -> %s
smtp_host_missing_port=SMTP Host is missing port in address.
smtp_host_missing_port=Falta o porto do Host SMTP
invalid_smtp_from=O campo From do SMTP non é valido: %v
save_config_failed=Erro ao gardar a configuración: %v
invalid_admin_setting=A configuración da conta de administración é inválida: %v
@@ -151,8 +152,8 @@ register_hepler_msg=Xa tes unha conta? Inicia sesión!
social_register_hepler_msg=Xa tes unha conta? Enlázaa!
disable_register_prompt=Sentímolo, o rexistro está deshabilitado. Por favor, contacta co administrador do sitio.
disable_register_mail=Sentímolo. Os correos de confirmación de rexistro están deshabilitados.
auth_source=Authentication Source
local=Local
auth_source=Fonte de Autenticación
local=Configuración rexional
remember_me=Recórdame
forgot_password=Esquecín o meu contrasinal
forget_password=Esqueciches o teu contrasinal?
@@ -171,13 +172,13 @@ reset_password_helper=Prema aquí para restablecer o seu contrasinal
password_too_short=A lonxitude do contrasinal non pode ser menor de 6.
non_local_account=Contas que non son locais non poden cambiar os contrasinais a través de Gogs.
login_two_factor=Two-factor Authentication
login_two_factor_passcode=Authentication Passcode
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_invalid_recovery_code=Recovery code has been used or does not valid.
login_two_factor=Autenticación en dous pasos
login_two_factor_passcode=Código de Autenticación
login_two_factor_enter_recovery_code=Introduza o código de recuperación da verificación en dous pasos
login_two_factor_recovery=Recuperación en dous pasos
login_two_factor_recovery_code=Codigo de Recuperación
login_two_factor_enter_passcode=Introduza o código de acceso en dous pasos
login_two_factor_invalid_recovery_code=O código de recuperación foi usado ou non é válido.
[mail]
activate_account=Por favor, activa a túa conta
@@ -214,7 +215,7 @@ Content=Contido
require_error=` non pode estar baleiro.`
alpha_dash_error=` os caracteres deben ser alfanuméricos ou dash(-_).`
alpha_dash_dot_error=` debe ser un carácter alfanumérivo válido, un guión alto ou baixo (-_) ou un signo de puntuación.`
alpha_dash_dot_slash_error=` must be valid alpha or numeric or dash(-_) or dot characters or slashes.`
alpha_dash_dot_slash_error=` debe ser un carácter válido : numérico, alfabético, guión(-_) puntos ou barras.`
size_error=` debe ser de tamaño %s.`
min_size_error=` debe conter polo menos %s caracteres.`
max_size_error=` debe conter como máximo %s caracteres.`
@@ -231,7 +232,7 @@ org_name_been_taken=Xa existe unha organización con este nome.
team_name_been_taken=Xa existe un equipo con este nome.
email_been_used=Este enderezo de correo electrónico xa está en uso.
username_password_incorrect=Nome de usuario ou contrasinal incorrectos.
auth_source_mismatch=The authentication source selected is not associated with the user.
auth_source_mismatch=A fonte de autenticación seleccionada non está asociada co usuario.
enterred_invalid_repo_name=Por favor, asegúrate de que introduciches correctamente o nome do repositorio.
enterred_invalid_owner_name=Por favor, asegúrate de que introduciches correctamente o nome do propietario.
enterred_invalid_password=Por favor, asegúrate de que introduciches correctamente o teu contrasinal.
@@ -267,8 +268,8 @@ profile=Perfil
password=Contrasinal
avatar=Avatar
ssh_keys=Claves SSH
security=Security
repos=Repositories
security=Seguridade
repos=Repositorios
orgs=Organizacións
applications=Aplicacións
delete=Eliminar conta
@@ -337,29 +338,29 @@ no_activity=Non hai actividade recente
key_state_desc=Esta clave foi usada nos últimos 7 días
token_state_desc=Token usado nos últimos 7 días
two_factor=Two-factor Authentication
two_factor_status=Status:
two_factor_on=On
two_factor_off=Off
two_factor_enable=Enable
two_factor_disable=Disable
two_factor=Autenticación en Dous Pasos
two_factor_status=Estado:
two_factor_on=Si
two_factor_off=Non
two_factor_enable=Activar
two_factor_disable=Desactivar
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_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_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_verify=Verify
two_factor_then_enter_passcode=A continuación, introduza o código:
two_factor_verify=Verificar
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_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=Rexenerar Códigos de Recuperación
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_title=Desactivar a verificación en dous pasos
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!
@@ -379,8 +380,8 @@ orgs.none=Non es membro de nengunha organización.
orgs.leave_title=Deixar unha organización
orgs.leave_desc=Deixarás de ter aceso ao tódolos repositorios e equipos despois de deixar a organización. Desexas abandonala?
repos.leave=Leave
repos.leave_title=Leave repository
repos.leave=Abandoar
repos.leave_title=Deixar repositorio
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!

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,8 +421,8 @@ mirror_last_synced=Utoljára szinkr.
watchers=Figyelők
stargazers=Csillagvizsgálók
forks=Másolások
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
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.
@@ -520,7 +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=Failed to delete file '%s' with error: %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'
@@ -641,7 +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 Description
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
@@ -746,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=Enable pull requests to accept contributions between repositories and branches
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
@@ -860,8 +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=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
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ő
@@ -1097,12 +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=Default
auths.default=Alapértelmezett
auths.updated=Frissítve
auths.auth_type=Hitelesítés típusa
auths.auth_name=Hitelesítési név
@@ -1141,7 +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.default_auth=Ez az alapértelmezett hitelesítési mód a bejelentkezéshez
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

View File

@@ -151,8 +151,8 @@ register_hepler_msg=Sudah memiliki account? Sign in sekarang!
social_register_hepler_msg=Sudah memiliki account? Ikat sekarang!
disable_register_prompt=Maaf, pendaftaran telah dinonaktifkan. Hubungi administrator situs.
disable_register_mail=Maaf, konfirmasi pendaftaran melalui email telah dinonaktifkan.
auth_source=Authentication Source
local=Local
auth_source=Sumber Autentikasi
local=Lokal
remember_me=Ingat saya
forgot_password=Lupa Sandi
forget_password=Lupa sandi?
@@ -160,7 +160,7 @@ sign_up_now=Membutuhkan akun? Daftar sekarang.
confirmation_mail_sent_prompt=Email konfirmasi baru telah terkirim ke <b>%s</b>, silakan cek inbox Anda dalam waktu %d jam untuk menyelesaikan proses pendaftaran.
active_your_account=Aktifkan Akun Anda
prohibit_login=Login tidak diperbolehkan
prohibit_login_desc=Account Anda tidak diperbolehkan untuk login, silahkan hubungi admin situs.
prohibit_login_desc=Akun Anda tidak diperbolehkan untuk masuk, silakan hubungi admin situs.
resent_limit_prompt=Maaf, Anda telah meminta email aktivasi beberapa saat lalu. Silakan tunggu 3 menit kemudian untuk dapat mencoba lagi.
has_unconfirmed_mail=Hi %s, Anda memiliki alamat email yang belum terkonfirmasi (<b>%s</b>). Jika Anda belum menerima email konfirmasi atau perlu untuk mengirim ulang yang baru, silakan klik pada tombol di bawah ini.
resend_mail=Klik di sini untuk mengirim kembali email aktivasi
@@ -171,10 +171,10 @@ reset_password_helper=Klik di sini untuk menyetel ulang sandi
password_too_short=Panjang sandi tidak bisa kurang dari 6 huruf.
non_local_account=Akun non-lokal tidak dapat mengganti password lewat Gogs.
login_two_factor=Dua faktor otentikasi
login_two_factor_passcode=Kode otentikasi
login_two_factor=Autentikasi Dua Faktor
login_two_factor_passcode=Kode Akses Autentikasi
login_two_factor_enter_recovery_code=Masukkan kode pemulihan dua faktor
login_two_factor_recovery=Dua faktor pemulihan
login_two_factor_recovery=Pemulihan Dua Faktor
login_two_factor_recovery_code=Kode pemulihan
login_two_factor_enter_passcode=Masukkan kode akses dua faktor
login_two_factor_invalid_recovery_code=Kode pemulihan telah digunakan atau tidak sesuai.
@@ -231,7 +231,7 @@ org_name_been_taken=Nama organisasi telah diambil.
team_name_been_taken=Nama tim telah diambil.
email_been_used=Alamat email telah digunakan.
username_password_incorrect=Nama pengguna atau sandi tidak benar.
auth_source_mismatch=The authentication source selected is not associated with the user.
auth_source_mismatch=Sumber autentikasi yang dipilih tidak terkait dengan pengguna.
enterred_invalid_repo_name=Pastikan bahwa nama repositori yang Anda masukkan benar.
enterred_invalid_owner_name=Pastikan bahwa nama pemilik yang Anda masukkan benar.
enterred_invalid_password=Harap pastikan bahwa sandi yang Anda masukkan benar.
@@ -240,7 +240,7 @@ last_org_owner=Menghapus pengguna terakhir dari tim pemilik tidak diperbolehkan,
invalid_ssh_key=Maaf, kami tidak dapat memverifikasi kunci SSH Anda: %s
unable_verify_ssh_key=Gogs tidak dapat memverifikasi kunci SSH Anda, tetapi kita menganggap bahwa itu sah, silakan periksa kembali.
auth_failed=Otentikasi gagal: %v
auth_failed=Autentikasi gagal: %v
still_own_repo=Akun Anda masih memiliki kepemilikan atas setidaknya satu repositori, Anda harus menghapus atau mentransfernya terlebih dahulu.
still_has_org=Akun Anda masih memiliki keanggotaan dalam setidaknya satu organisasi, Anda harus meninggalkan atau menghapus keanggotaan Anda terlebih dahulu.
@@ -274,7 +274,7 @@ applications=Aplikasi
delete=Menghapus akun
public_profile=Profil publik
profile_desc=Alamat email Anda bersifat publik dan akan digunakan untuk setiap akun pemberitahuan terkait, dan setiap operasi berbasis web yang dilakukan melalui situs.
profile_desc=Alamat email Anda bersifat publik dan akan digunakan untuk setiap akun yang terkait pemberitahuan dan setiap operasi berbasis web yang dilakukan melalui situs.
password_username_disabled=Pengguna jenis bebas-lokal tidak diperbolehkan untuk mengubah nama pengguna mereka.
full_name=Nama lengkap
website=Situs web
@@ -288,7 +288,7 @@ cancel=Batal
lookup_avatar_by_mail=Cari avatar dari email
federated_avatar_lookup=Aktifkan Pencarian Avatar Representasi
enable_custom_avatar=Mengaktifkan avatar kustom
enable_custom_avatar=Gunakan Avatar Kostum
choose_new_avatar=Pilih avatar baru
update_avatar=Ubah pengaturan avatar
delete_current_avatar=Hapus avatar terkini
@@ -320,7 +320,7 @@ add_email_success=Alamat email barumu telah berhasil ditambahkan.
manage_ssh_keys=Kelola Kunci SSH
add_key=Tambah kunci
ssh_desc=Ini adalah daftar kunci SSH yang terkait dengan akun Anda. Karena kunci ini memungkinkan seseorang menggunakannya untuk mendapatkan akses ke repositori Anda, sangat penting bagi Anda untuk memastikan Anda mengenalinya.
ssh_helper=<strong>Nggak tau gimana?</strong> Cek arahannya GitHub buat<a href="%s">bikin kunci SSH-mu sendiri</a> atau benerin <a href="%s">masalah yang umum</a> yang mungkin sedang kamu alami dengan SSH-mu.
ssh_helper=<strong>Tidak tahu caranya?</strong> Kunjungi petunjuk GitHub untuk <a href="%s">membuat kunci SSH Anda sendiri</a> atau perbaiki <a href="%s">masalah umum</a> yang mungkin sedang Anda alami dengan SSH.
add_new_key=Tambah kunci SSH
ssh_key_been_used=Public key telah digunakan.
ssh_key_name_used=Public key dengan nama itu udah pernah ada.
@@ -337,7 +337,7 @@ no_activity=Tidak ada aktifitas terakhir
key_state_desc=Kunci ini digunakan dalam 7 hari terakhir
token_state_desc=Token ini digunakan dalam 7 hari terakhir
two_factor=Otentikasi dua faktor
two_factor=Autentikasi dua faktor
two_factor_status=Status:
two_factor_on=Nyala
two_factor_off=Mati
@@ -345,21 +345,21 @@ two_factor_enable=Aktifkan
two_factor_disable=Nonaktifkan
two_factor_view_recovery_codes=Lihat dan simpan <a href="%s%s"> kode pemulihan anda</a> di tempat yang aman. Anda dapat menggunakannya sebagai kode akses jika Anda kehilangan akses otentikasi aplikasi.
two_factor_http=Untuk operasi HTTP/HTTPS, Anda tidak lagi mampu menggunakan nama pengguna dan kata sandi. Silakan membuat dan menggunakan <a href="%[1]s%[2]s"> Token akses pribadi</a> sebagai kredensial Anda, misalnya <code>%[3]s</code>.
two_factor_enable_title=Aktifkan Otentikasi Dua-faktor
two_factor_enable_title=Aktifkan Autentikasi Dua Faktor
two_factor_scan_qr=Silakan gunakan aplikasi autentikasi Anda untuk memindai gambar:
two_factor_or_enter_secret=Atau masukkan rahasianya:
two_factor_then_enter_passcode=Masukan kode akses:
two_factor_then_enter_passcode=Kemudian, masukkan kode akses:
two_factor_verify=Verifikasi
two_factor_invalid_passcode=Kode akses yang Anda masukan tidak sah, silahkan coba lagi!
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
two_factor_enable_error=Aktifkan Autentikasi dua faktor gagal: %v
two_factor_enable_success=Autentikasi dua faktor telah memungkinkan akun Anda berhasil!
two_factor_recovery_codes_title=Kode Pemulihan Otentikasi dua faktor
two_factor_invalid_passcode=Kode akses yang Anda masukkan tidak sah, silakan coba lagi!
two_factor_reused_passcode=Kode akses yang Anda masukkan sudah digunakan, coba yang lain!
two_factor_enable_error=Gagal mengaktifkan autentikasi Dua Faktor: %v
two_factor_enable_success=Autentikasi Dua faktor untuk akun Anda berhasil diaktifkan!
two_factor_recovery_codes_title=Kode Pemulihan Autentikasi Dua Faktor
two_factor_recovery_codes_desc=Kode pemulihan digunakan saat Anda sementara kehilangan akses ke aplikasi autentikasi Anda. Setiap kode pemulihan hanya dapat digunakan satu kali, <b> simpan kode ini di tempat yang aman </ b>.
two_factor_regenerate_recovery_codes=Regenerate Recovery Codes
two_factor_regenerate_recovery_codes_error=Regenerasi kode pemulihan gagal: %v
two_factor_regenerate_recovery_codes_success=Kode pemulihan baru telah berhasil dibuat!
two_factor_disable_title=Nonaktifkan Otentikasi Dua Faktor
two_factor_disable_title=Nonaktifkan Autentikasi Dua Faktor
two_factor_disable_desc=Tingkat keamanan akun Anda akan menurun setelah autentikasi dua faktor dinonaktifkan. Apakah Anda ingin melanjutkan?
two_factor_disable_success=Autentikasi dua faktor telah berhasil dilakukan!
@@ -422,7 +422,7 @@ watchers=Watchers
stargazers=Stargazers
forks=Forks
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
repo_description_length=Karakter tersedia
form.reach_limit_of_creation=Pemiliknya telah mencapai batas pembuatan maksimum %d repositori.
form.name_reserved=Nama repositori '%s' dicadangkan.
@@ -520,7 +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.fail_to_delete_file=Gagal menghapus file '%s' dengan 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'
@@ -641,7 +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.commit_description=Deskripsi Commit
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
@@ -992,7 +992,7 @@ dashboard=Dasbor
users=Pengguna
organizations=Organisasi
repositories=Repositori
authentication=Otentikasi
authentication=Autentikasi
config=Konfigurasi
notices=Pemberitahuan sistem
monitor=Pemantauan
@@ -1064,16 +1064,16 @@ users.created=Dibuat
users.send_register_notify=Kirim Pemberitahuan Pendaftaran ke Pengguna
users.new_success=Akun baru '%s' telah berhasil dibuat.
users.edit=Edit
users.auth_source=Sumber Otentikasi
users.auth_source=Sumber Autentikasi
users.local=Lokal
users.auth_login_name=Nama login otentikasi
users.auth_login_name=Nama Masuk Autentikasi
users.password_helper=Biarkan kosong agar tetap tidak berubah.
users.update_profile_success=Profil akun telah berhasil diupdate.
users.edit_account=Mengedit akun
users.max_repo_creation=Maximum Repository Creation Limit
users.max_repo_creation_desc=(Set -1 untuk menggunakan batas default global)
users.is_activated=Akun ini diaktifkan
users.prohibit_login=Akun ini dilarang masuk
users.prohibit_login=Akun ini tidak diperbolekan masuk
users.is_admin=Akun ini memiliki izin administrator
users.allow_git_hook=Akun ini memiliki izin untuk membuat kait Git
users.allow_import_local=Akun ini memiliki izin untuk mengimpor repositori lokal
@@ -1097,7 +1097,7 @@ repos.stars=Bintang
repos.issues=Masalah
repos.size=Ukuran
auths.auth_sources=Authentication Sources
auths.auth_sources=Sumber Autentikasi
auths.new=Tambahkan Sumber Baru
auths.name=Nama
auths.type=Mengetik
@@ -1105,7 +1105,7 @@ auths.enabled=Diaktifkan
auths.default=Default
auths.updated=Diperbarui
auths.auth_type=Jenis Autentikasi
auths.auth_name=Nama Otentikasi
auths.auth_name=Nama Autentikasi
auths.security_protocol=Protokol Keamanan
auths.domain=Domain
auths.host=Tuan rumah
@@ -1130,7 +1130,7 @@ auths.attributes_in_bind=Ambil atribut dalam konteks Bind DN
auths.filter=Pengguna saringan
auths.admin_filter=Admin Filter
auths.ms_ad_sa=Ms Ad SA
auths.smtp_auth=SMTP Authentication Type
auths.smtp_auth=Autentikasi tipe SMTP
auths.smtphost=Host SMTP
auths.smtpport=Port SMTP
auths.allowed_domains=Domains di izinkan
@@ -1139,18 +1139,18 @@ auths.enable_tls=Enable TLS Encryption
auths.skip_tls_verify=Skip TLS Verify
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
auths.delete=Hapus otentikasi ini
auths.delete_auth_title=Authentication Deletion
auths.delete_auth_desc=Otentikasi ini akan dihapus, apakah anda ingin melanjutkan?
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.edit=Ubah Pengaturan Autentikasi
auths.activated=Autentikasi ini diaktifkan
auths.default_auth=Autentikasi ini adalah sumber masuk bawaan
auths.new_success=Autentikasi baru %s berhasil ditambahkan.
auths.update_success=Pengaturan autentikasi berhasil diperbarui.
auths.update=Perbarui Pengaturan Autentikasi
auths.delete=Hapus Autentikasi Ini
auths.delete_auth_title=Penghapusan Autentikasi
auths.delete_auth_desc=Autentikasi ini akan dihapus, apakah Anda ingin melanjutkan?
auths.still_in_used=Autentikasi ini masih digunakan oleh pengguna lain, silakan hapus atau ubah pengguna tersebut ke tipe masuk lainnya.
auths.deletion_success=Autentikasi berhasil dihapus!
auths.login_source_exist=Sumber masuk %s sudah tersedia.
config.not_set=(tidak diterapkan)
config.server_config=Server Configuration
@@ -1165,7 +1165,7 @@ config.run_mode=Run Mode
config.git_version=Git Version
config.static_file_root_path=Static File Root Path
config.log_file_root_path=Log File Root Path
config.reverse_auth_user=Reverse Authentication User
config.reverse_auth_user=Mengembalikan Pengguna Autentikasi
config.ssh_config=SSH Configuration
config.ssh_enabled=Diaktifkan

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
@@ -152,7 +152,7 @@ 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=Fonte di autenticazione
local=Local
local=Locale
remember_me=Ricordami
forgot_password=Password dimenticata
forget_password=Password dimenticata?
@@ -174,10 +174,10 @@ non_local_account=Gli account non locali non possono modificare le password tram
login_two_factor=Autenticazione in Due Passaggi
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=Recupero a due fattori
login_two_factor_recovery_code=Recupera il codice
login_two_factor_enter_passcode=Enter a two-factor passcode
login_two_factor_invalid_recovery_code=Recovery code has been used or does not valid.
login_two_factor_enter_passcode=Inserisci un codice di accesso a due fattori
login_two_factor_invalid_recovery_code=Il codice di recupero è stato utilizzato o non è valido.
[mail]
activate_account=Per favore attiva il tuo account
@@ -214,7 +214,7 @@ Content=Contenuto
require_error=` non può essere vuoto.`
alpha_dash_error=` ammessi solo caratteri alfanumerici o trattini(-_).`
alpha_dash_dot_error=` ammessi solo caratteri alfanumerici o trattini(-_) o punti.`
alpha_dash_dot_slash_error=` must be valid alpha or numeric or dash(-_) or dot characters or slashes.`
alpha_dash_dot_slash_error=` ammessi solo caratteri alfanumerici o trattini(-_) o punti o slash.`
size_error='deve essere %s.'
min_size_error=` deve contenere almeno %s caratteri.`
max_size_error=` deve contenere massimo %s caratteri.`
@@ -231,7 +231,7 @@ org_name_been_taken=Il nome dell'Organizzazione è già utlizzato.
team_name_been_taken=Il nome del Team è già utilizzato.
email_been_used=L'indirizzo E-mail è già utilizzato.
username_password_incorrect=Nome utente o password incorretti.
auth_source_mismatch=The authentication source selected is not associated with the user.
auth_source_mismatch=La sorgente di autenticazione selezionata non è associata all'utente.
enterred_invalid_repo_name=Si prega di assicurarsi che il nome del repository inserito sia corretto.
enterred_invalid_owner_name=Si prega di assicurarsi che il nome del proprietario inserito sia corretto.
enterred_invalid_password=Verificare che la password inserita sia corretta.
@@ -344,7 +344,7 @@ two_factor_off=Non attivo
two_factor_enable=Abilita
two_factor_disable=Disattivata
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_http=Per le operazioni HTTP/HTTPS, non sei più in grado di utilizzare nome utente e password. Si prega di creare e utilizzare <a href="%[1]s%[2]s">Token di accesso personale</a> come credenziali, ad esempio. <code>%[3]s</code>.
two_factor_enable_title=Abilita l'autenticazione in due passaggi
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:
@@ -353,9 +353,9 @@ two_factor_verify=Verifica
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_enable_success=Autenticazione a due fattori abilitata per il tuo account con successo!
two_factor_recovery_codes_title=Codici di recupero autenticazione a due fattori
two_factor_recovery_codes_desc=I codici di recupero vengono utilizzati quando si perde temporaneamente l'accesso all'applicazione di autenticazione. Ogni codice di recupero può essere utilizzato solo una volta, <b>si prega di mantenere questi codici in un posto sicuro</b>.
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!
@@ -380,9 +380,9 @@ 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_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!
repos.leave_title=Lascia il repository
repos.leave_desc=Perderai l'accesso al repository dopo che hai lasciato. Vuoi continuare?
repos.leave_success=Hai lasciato il repository '%s' con successo!
delete_account=Elimina Account
delete_prompt=L'operazione eliminerà permanentemente l'account e <strong>NON POTRÀ</strong> essere annullata!
@@ -422,7 +422,7 @@ watchers=Osservatori
stargazers=Fan
forks=Fork
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
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.
@@ -641,10 +641,10 @@ pulls.cannot_auto_merge_desc=Questa pull request non può essere mergiata automa
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=Effettua un Rebase prima del Merge
pulls.commit_description=Commit Description
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
@@ -692,32 +692,32 @@ 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
@@ -899,7 +899,7 @@ 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!

View File

@@ -14,10 +14,10 @@ page=ページ
template=テンプレート
language=言語
create_new=作成...
user_profile_and_more=ユーザープロファイルなど
user_profile_and_more=ユーザープロフィールなど
signed_in_as=サインイン済み
username=ユーザ名
username=ユーザ
email=メールアドレス
password=パスワード
re_type=再入力
@@ -52,13 +52,13 @@ requite_db_desc=Gogs は、MySQL、PostgreSQL、SQLite3 または TiDB が必要
db_title=データベース設定
db_type=データベースの種類
host=ホスト
user=ユーザ
user=ユーザ
password=パスワード
db_name=データベース名
db_helper=MySQLではエンジンがINNODB、文字セットがutf8_general_ciである必要があります。
ssl_mode=SSL モード
path=パス
sqlite_helper=SQLite3データベースのファイルパスです。<br>serviceとして起動する場合は、絶対パスを使用してください。
sqlite_helper=SQLite3かTiDBのデータベースのファイルパス。<br>サービスとして開始する際には絶対パスを用してください。
err_empty_db_path=SQLite3 データベースのPATHを空にすることはできません。
no_admin_and_disable_registration=管理者アカウントを作成せずに登録を無効にすることはできません。
err_empty_admin_password=管理者パスワードは空白にできません。
@@ -68,7 +68,7 @@ app_name=アプリケーション名
app_name_helper=素晴らしい組織名を入れてください!
repo_path=リポジトリのルートパス
repo_path_helper=すべての Git リモート リポジトリはこのディレクトリに保存されます。
run_user=実行ユーザ
run_user=実行ユーザ
run_user_helper=ユーザーはリポジトリのルートパスへのアクセス権限、及び Gogs の実行権限を持っている必要があります。
domain=ドメイン
domain_helper=これはSSH用クローンURLに影響します。
@@ -109,7 +109,7 @@ require_sign_in_view=サインインしたユーザのみページ閲覧を許
require_sign_in_view_popup=サインインしたユーザのみがページを閲覧できます。ビジターはサインインもしくはサインアップページのみ見られます。
admin_setting_desc=今管理者アカウントを作成する必要はありません。ID = 1のユーザ は自動的に管理者の権限を獲得します。
admin_title=管理者アカウントの設定
admin_name=ユーザ名
admin_name=ユーザ
admin_password=パスワード
confirm_password=パスワード確認
admin_email=管理者の電子メール
@@ -118,7 +118,7 @@ test_git_failed='Git' コマンドテストに失敗: %v
sqlite3_not_available=このリリース バージョンは SQLite3 をサポートしていません。gobuild バージョンではない、公式のバイナリ バージョンを %s からダウンロードしてください。
invalid_db_setting=データベースの設定が正しくありません: %v
invalid_repo_path=リポジトリのルートパスが無効です: %v
run_user_not_match=実行ユーザーは現在のユーザーではない: %s-> %s
run_user_not_match=実行ユーザーは現在のユーザーではありません: %s -> %s
smtp_host_missing_port=SMTPホストのポートが見つかりません。
invalid_smtp_from=SMTP From フィールドの値が有効ではありません: %v
save_config_failed=構成の保存に失敗した: %v
@@ -129,7 +129,7 @@ invalid_log_root_path=ログのルートパスがむこうです: %v
[home]
uname_holder=ユーザー名またはEメール
password_holder=パスワード
switch_dashboard_context=ダッシュ ボードコンテキスト切替
switch_dashboard_context=ダッシュボードコンテキスト切替
my_repos=自分のリポジトリ
show_more_repos=リポジトリをさらに表示…
collaborative_repos=共同リポジトリ
@@ -141,7 +141,7 @@ issues.in_your_repos=あなたのリポジトリ
[explore]
repos=リポジトリ
users=ユーザ
users=ユーザ
organizations=組織
search=検索
@@ -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=入力したパスワードが正しいか確認してください。
@@ -260,7 +260,7 @@ follow=フォロー
unfollow=フォロー解除
form.name_reserved=ユーザー名 '%s' は使用されています。
form.name_pattern_not_allowed=ユーザ名のパターン '%s' は許可されていません。
form.name_pattern_not_allowed=ユーザ名のパターン '%s' は許可されていません。
[settings]
profile=プロフィール
@@ -275,7 +275,7 @@ delete=アカウントを削除
public_profile=パブリック プロフィール
profile_desc=あなたのメールアドレスは公開され、任意のアカウント関連の通知に使用されます。また、Webベースの操作はサイトを介して行います。
password_username_disabled=ローカルユーザ以外はユーザ名を変更できません。
password_username_disabled=ローカルユーザ以外はユーザ名を変更できません。
full_name=フルネーム
website=WEBサイト
location=ロケーション
@@ -301,7 +301,7 @@ new_password=新しいパスワード
retype_new_password=新しいパスワードを再入力します。
password_incorrect=現在のパスワードが正しくありません。
change_password_success=パスワードが正常に変更されました。今すぐ新しいパスワードを使用してサインインすることができます。
password_change_disabled=ローカルユーザ以外はパスワードを変更できません。
password_change_disabled=ローカルユーザ以外はパスワードを変更できません。
emails=メールアドレス
manage_emails=メールアドレスを管理
@@ -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=2段階認証の有効化に失敗しました: %v
two_factor_enable_success=2段階認証があなたのアカウントで有効化されました
two_factor_recovery_codes_title=2段階認証のリカバリーコード
@@ -416,13 +416,13 @@ mirror_prune=Prune
mirror_prune_desc=リモートに存在しないリモート追跡参照を削除する
mirror_interval=ミラー 間隔(時)
mirror_address=ミラー アドレス
mirror_address_desc=アドレスに必要なユーザー資格情報を入力してください。
mirror_address_desc=必要なユーザー資格情報をアドレスに含めてください。
mirror_last_synced=最終同期
watchers=ウォッチャー
stargazers=スターゲイザー
forks=フォーク
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
repo_description_helper=リポジトリの説明 (512文字以内)
repo_description_length=利用可能な文字
form.reach_limit_of_creation=リポジトリの最大作成数 %d にすでに達しています。
form.name_reserved=リポジトリ名 '%s' は使用されています。
@@ -445,11 +445,11 @@ copy_link=コピー
copy_link_success=コピーされました!
copy_link_error=⌘ C または Ctrl-C キーを押してコピー
copied=コピー成功
unwatch=Unwatch
watch=Watch
unstar=Unstar
star=Star
fork=Fork
unwatch=ウォッチ解除
watch=ウォッチ
unstar=スターを外す
star=スター
fork=フォーク
no_desc=説明なし
quick_guide=クイック ガイド
@@ -520,7 +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.fail_to_delete_file=ファイル '%s' エラーを削除できませんでした: %v
editor.add_subdir=サブディレクトリを追加...
editor.unable_to_upload_files='%s' へのファイルアップロード中にエラーが発生し、失敗しました: %v
editor.upload_files_to_dir='%s' にファイルをアップロード
@@ -633,7 +633,7 @@ pulls.tab_commits=コミット
pulls.tab_files=変更されたファイル
pulls.reopen_to_merge=マージ操作を実行するには、このプルリクエストを再び開いてください。
pulls.merged=マージされた
pulls.has_merged=このプルプルリクエストは正常にマージされました!
pulls.has_merged=このプルリクエストは正常にマージされました!
pulls.data_broken=フォーク情報の削除によってこのプルリクエストのデータは壊れています。
pulls.is_checking=コンフリクトが発生していないかチェック中です、しばらく待ったのちページを更新してください。
pulls.can_auto_merge_desc=このプルリクエストは自動的にマージできます。
@@ -641,7 +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.commit_description=コミットの説明
pulls.merge_pull_request=プルリクエストをマージします。
pulls.open_unmerged_pull_exists=`同じリポジトリに同じマージ情報持つ未解決のプルリクエスト (#%d) が存在するため再び開くことができません。`
pulls.delete_branch=ブランチの削除
@@ -746,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=Enable pull requests to accept contributions between repositories and branches
settings.pulls_desc=プルリクエストを有効にし、リポジトリとブランチ間のコントリビューションを受け入れる
settings.pulls.ignore_whitespace=空白の変更を無視する
settings.pulls.allow_rebase_merge=コミットをマージするためのリベースの使用を許可する
settings.danger_zone=危険地帯
@@ -758,7 +758,7 @@ settings.convert_notices_1=- この操作によりリポジトリはミラーリ
settings.convert_confirm=変更を確認
settings.convert_succeed=リポジトリは正常に通常リポジトリへ変更されました。
settings.transfer=オーナー移転
settings.transfer_desc=リポジトリをあなたが管理者権限を持っている別のユーザーまた組織に譲します。
settings.transfer_desc=このリポジトリを、別のユーザーまたはあなたが管理者権限を所持している組織に譲します。
settings.transfer_notices_1=-新しい所有者が個人ユーザーの場合、あなたがアクセスできなくなります。
settings.transfer_notices_2=- 新しい所有者が組織で、あなたがその組織の所有者である場合はアクセス権が残ります。
settings.transfer_form_title=操作を確認するために、以下の情報を入力してください。
@@ -810,7 +810,7 @@ settings.payload_url=ペイロードの URL
settings.content_type=コンテンツ タイプ
settings.secret=秘密
settings.secret_desc=秘密キーは、 <code>X-Gogs-Signature</code> ヘッダーを介してペイロードの HMAC SHA256 六角ダイジェストとして送信されます。
settings.slack_username=ユーザ名
settings.slack_username=ユーザ
settings.slack_icon_url=アイコン URL
settings.slack_color=カラー
settings.event_desc=どのイベントをこの Webhook のトリガーにしますか?
@@ -860,8 +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
settings.description_desc=リポジトリの説明(512文字以内)
settings.description_length=利用可能な文字
diff.browse_source=ソースを参照
diff.parent=
@@ -989,7 +989,7 @@ teams.add_nonexistent_repo=追加しようとしているリポジトリは存
[admin]
dashboard=ダッシュボード
users=ユーザ
users=ユーザ
organizations=組織
repositories=リポジトリ
authentication=認証
@@ -1003,7 +1003,7 @@ total=合計: %d
dashboard.statistic=統計
dashboard.operations=操作
dashboard.system_status=システム モニターのステータス
dashboard.statistic_info=Gogs データベースは <b>%d</b> ユーザー, <b>%d</b> 組織, <b>%d</b> 公開鍵, <b>%d</b> リポジトリ, <b>%d</b> ウォッチ, <b>%d</b> スター, <b>%d</b> 行動, <b>%d</b> アクセス, <b>%d</b> 課題, <b>%d</b> コメント, <b>%d</b> ソーシャルアカウント, <b>%d</b> フォロー, <b>%d</b> ミラー, <b>%d</b> リリース, <b>%d</b> ログイン元, <b>%d</b> webhook, <b>%d</b> マイルストーン, <b>%d</b> ラベル, <b>%d</b> フックタスク, <b>%d</b> チーム, <b>%d</b> アップデートタスク, <b>%d</b> 添付ファイル の情報を持っています。
dashboard.statistic_info=Gogs データベースは <b>%d</b> 人のユーザー<b>%d</b> 個の組織、<b>%d</b> 個の公開鍵<b>%d</b> 個のリポジトリ<b>%d</b> 個のウォッチ<b>%d</b> 個のスター<b>%d</b> 回のアクション、<b>%d</b> 回のアクセス<b>%d</b> 個の課題、<b>%d</b> 個のコメント<b>%d</b> 個のソーシャルアカウント<b>%d</b> 個のフォロー<b>%d</b> 個のミラー<b>%d</b> 個のリリース<b>%d</b> 個のログイン元<b>%d</b> 個のwebフック、<b>%d</b> 個のマイルストーン<b>%d</b> 個のラベル<b>%d</b> 個のフックタスク<b>%d</b> 個のチーム<b>%d</b> 更新タスク<b>%d</b> 個の添付ファイルの情報を保持しています。
dashboard.operation_name=操作の名前
dashboard.operation_switch=スイッチ
dashboard.operation_run=実行
@@ -1092,17 +1092,17 @@ repos.repo_manage_panel=リポジトリの管理パネル
repos.owner=オーナー
repos.name=名前
repos.private=非公開
repos.watches=Watches
repos.stars=Stars
repos.watches=ウォッチ
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.default=デフォルト
auths.updated=更新しました
auths.auth_type=認証タイプ
auths.auth_name=認証名
@@ -1114,7 +1114,7 @@ auths.bind_dn=バインド DN
auths.bind_dn_helper='%s'はユーザー名のプレースホルダとして使用できます。 例DOM \%s
auths.bind_password=バインド パスワード
auths.bind_password_helper=警告: このパスワードは暗号化されずに格納されます。特権を持つアカウントに使用しないでください。
auths.user_base=ユーザ検索ベース
auths.user_base=ユーザ検索ベース
auths.user_dn=User DN
auths.attribute_username=ユーザー名属性
auths.attribute_username_placeholder=ログインフォームの値を使う場合は空にしてください。
@@ -1127,7 +1127,7 @@ auths.group_filter=グループ フィルター
auths.group_attribute_contain_user_list=ユーザーのリストを含むグループ属性
auths.user_attribute_listed_in_group=グループのユーザー属性
auths.attributes_in_bind=属性をバインドDNのコンテクストから取得する
auths.filter=User フィルター
auths.filter=ユーザーフィルター
auths.admin_filter=Admin フィルター
auths.ms_ad_sa=Ms Ad SA
auths.smtp_auth=SMTP 認証の種類
@@ -1141,7 +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.default_auth=この認証を、既定のログイン ソースとする
auths.new_success=新しい認証 '%s' が正常に追加されました。
auths.update_success=認証の設定が正常に更新されました。
auths.update=認証設定を更新
@@ -1160,12 +1160,12 @@ config.app_url=アプリケーションの URL
config.domain=ドメイン
config.offline_mode=オフラインモード
config.disable_router_log=ルーターのログを無効にする
config.run_user=実行ユーザ
config.run_user=実行ユーザ
config.run_mode=実行モード
config.git_version=Git バージョン
config.static_file_root_path=静的ファイルのルートパス
config.log_file_root_path=ログファイルのルートパス
config.reverse_auth_user=リバース認証ユーザ
config.reverse_auth_user=リバース認証ユーザ
config.ssh_config=SSH設定
config.ssh_enabled=有効
@@ -1197,7 +1197,7 @@ config.db_config=データベース設定
config.db_type=タイプ
config.db_host=ホスト
config.db_name=名前
config.db_user=ユーザ
config.db_user=ユーザ
config.db_ssl_mode=SSL モード
config.db_ssl_mode_helper=(「postgres」のみ
config.db_path=パス
@@ -1224,7 +1224,7 @@ config.mailer_enabled=有効にした
config.mailer_disable_helo=HELOコマンド無効
config.mailer_subject_prefix=件名プレフィックス
config.mailer_host=ホスト
config.mailer_user=ユーザ
config.mailer_user=ユーザ
config.send_test_mail=テストメールの送信
config.test_mail_failed='%s' 宛のテストメールの送信に失敗しました: %v
config.test_mail_sent=テストメールが '%s' に送信されました。
@@ -1313,7 +1313,7 @@ push_tag=が <a href="%[1]s">%[3]s</a> にタグ <a href="%[1]s/src/%[2]s">%[2]s
delete_tag=<a href="%[1]s">%[3]s</a> のタグ <code>%[2]s</code> を削除しました
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_create=新しい参照<a href="%s/src/%s">%[2]s</a><a href="%[1]s">%[3]s</a>にミラーから反映しました
mirror_sync_delete=synced and deleted reference <code>%[2]s</code> at <a href="%[1]s">%[3]s</a> from mirror
[tool]

View File

@@ -151,7 +151,7 @@ register_hepler_msg=이미 계정을 가지고 계신가요? 로그인하세요!
social_register_hepler_msg=계정을 가지고 계신가요? 연결하세요!
disable_register_prompt=죄송합니다, 가입이 비활성화 되어있습니다. 사이트 관리자에게 문의 해주세요.
disable_register_mail=죄송합니다. 메일 등록이 비활성화 되었습니다.
auth_source=Authentication Source
auth_source=인증 소스 편집
local=로컬
remember_me=자동 로그인
forgot_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=입력한 비밀번호가 올바른지 확인하십시오.

View File

@@ -119,7 +119,7 @@ sqlite3_not_available=Jūsu versija neatbalsta SQLite3, lūdzu lejupielādējiet
invalid_db_setting=Datu bāzes iestatījums nav pareizs: %v
invalid_repo_path=Repozitorija atrašanās vieta ir nekorekta: %v
run_user_not_match=Izpildes lietotājs nav pašreizējais lietotājs: %s -> %s
smtp_host_missing_port=SMTP Host is missing port in address.
smtp_host_missing_port=SMTP adresē nav norādīts ports.
invalid_smtp_from=SMTP sūtītāja lauks ir nekorekts: %v
save_config_failed=Neizdevās saglabāt konfigurāciju: %v
invalid_admin_setting=Nekorekts admin konta iestatījums: %v
@@ -151,7 +151,7 @@ register_hepler_msg=Jau ir konts? Pieraksties tagad!
social_register_hepler_msg=Jau ir konts? Sasaisti tagad!
disable_register_prompt=Atvainojiet, reģistrācija ir atspējota. Lūdzu, sazinieties ar vietnes administratoru.
disable_register_mail=Atvainojiet, reģistrācijas e-pasta apstiprināšana ir atspējota.
auth_source=Authentication Source
auth_source=Autentificēšanas avots
local=Local
remember_me=Atcerēties mani
forgot_password=Aizmirsu paroli
@@ -214,7 +214,7 @@ Content=Saturs
require_error=` nedrīkst būt tukšs.`
alpha_dash_error=` drīkst saturēt tikai latīņu alfabēta burtus, ciparus vai domuzīmes (-_).`
alpha_dash_dot_error=` drīkst saturēt tikai latīņu alfabēta burtus, ciparus, domuzīmes (-_) vai punktu.`
alpha_dash_dot_slash_error=` must be valid alpha or numeric or dash(-_) or dot characters or slashes.`
alpha_dash_dot_slash_error=` drīkst saturēt tikai latīņu alfabēta burtus, ciparus, domuzīmes (-_), slīpsvītru vai punktu.`
size_error=` jābūt %s simbolus garam.`
min_size_error=` jabūt vismaz %s simbolu garumā.`
max_size_error=` jabūt ne mazāk kā %s simbolu garumā.`
@@ -231,7 +231,7 @@ org_name_been_taken=Organizācijas nosaukums ir jau aizņemts.
team_name_been_taken=Komandas nosaukums ir jau aizņemts.
email_been_used=E-pasta adrese jau tiek izmantota.
username_password_incorrect=Lietotājvārds vai parole nav pareiza.
auth_source_mismatch=The authentication source selected is not associated with the user.
auth_source_mismatch=Izvēlētais autentificēšanas avots nav saistīts ar lietotāju.
enterred_invalid_repo_name=Lūdzu, pārliecinieties, vai ievadītā repozitorija nosaukums ir pareizs.
enterred_invalid_owner_name=Lūdzu, pārliecinieties, vai ievadītā īpašnieka vārds ir pareizs.
enterred_invalid_password=Lūdzu pārliecinieties, vai Jūsu ievadītā parole ir pareiza.
@@ -350,9 +350,9 @@ two_factor_scan_qr=Please use your authentication application to scan the image:
two_factor_or_enter_secret=Vai ievadiet noslēpumu:
two_factor_then_enter_passcode=Pēc tam ievadiet kodu:
two_factor_verify=Pārbaudīt
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=Ievadītais piekļuves kods nav derīgs. Lūdzu mēģiniet vēlreiz!
two_factor_reused_passcode=Ievadītais piekļuves kods jau ir izmantots. Lūdzu mēģiniet citu!
two_factor_enable_error=Divu faktoru autentifikācijas iespējošana neizdevās: %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>.
@@ -361,7 +361,7 @@ 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=Atspējot divu faktoru autentifikāciju
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_success=Divu faktoru autentificēšana ir atspējota!
manage_access_token=Pārvaldīt personīgos piekļuves talonus
generate_new_token=Ģenerēt jaunu talonu
@@ -375,7 +375,7 @@ access_token_deletion=Personīgā piekļuves talona dzēšana
access_token_deletion_desc=Dzēšot personīgo piekļuves talonu, tiks liegta piekļuve aplikācijām, kas to izmanto. Vai vēlaties turpināt?
delete_token_success=Personīgās piekļuves talons veiksmīgi izdzēsts! Neaizmirstiet nomainīt uz citu aplikācijās, kas to izmantoja.
orgs.none=You are not a member of any organizations.
orgs.none=Jūs neesat nevienas organizācijas dalībnieks.
orgs.leave_title=Pamest organizāciju
orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue?
@@ -421,8 +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
repo_description_helper=Repozitorija apraksts. Maksimālais garums 512 rakstzīmes.
repo_description_length=Pieejamās rakstzīmes
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.
@@ -476,13 +476,13 @@ file_history=Vēsture
file_view_raw=Rādīt neapstrādātu
file_permalink=Patstāvīgā saite
file_too_large=Šis fails ir par lielu, lai to parādītu
video_not_supported_in_browser=Your browser doesn't support HTML5 video tag.
video_not_supported_in_browser=Jūsu pārlūks neatbalsta HTML5 video.
branches.overview=Pārskats
branches.active_branches=Aktīvie atzari
branches.stale_branches=Pamests atzars
branches.all=Visi atzari
branches.updated_by=Updated %[1]s by %[2]s
branches.updated_by=%[2]s atjaunoja %[1]s
branches.change_default_branch=Mainīt noklusēto atzaru
editor.new_file=Jauns fails
@@ -520,7 +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.fail_to_delete_file=Neizdevās dzēst failu '%s', kļūda: %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'
@@ -747,7 +747,7 @@ 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=Enable pull requests to accept contributions between repositories and branches
settings.pulls.ignore_whitespace=Ignore changes in whitespace
settings.pulls.ignore_whitespace=Ignorēt atstarpju izmaiņas
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
settings.danger_zone=Bīstamā zona
settings.cannot_fork_to_same_owner=You cannot fork a repository to its original owner.
@@ -769,7 +769,7 @@ settings.wiki_deletion_success=Repozitorija Vikivietnes dati tika veiksmīgi izd
settings.delete=Dzēst šo repozitoriju
settings.delete_desc=Dzēšot repozitoriju, tā datus vairs nebūs iespējams atgūt. Pirms dzēšanas pārliecinieites vai patiešām vēlaties to darīt.
settings.delete_notices_1=- Šī darbība ir <strong>NEATGRIEZENISKA</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=- Šī darbība neatgriezeniski izdzēsīs visus šī repozitorija datus, tai skaitā Git datus, problēmu ziņojumus, komentārus un definētās piekļuves tiesības.
settings.delete_notices_fork_1=- Visi atdalītie repozitoriji kļūs neatkarīgi pēc dzēšanas.
settings.deletion_success=Repozitorijs tika veiksmīgi dzēsts!
settings.update_settings_success=Repozitorija opcijas ir veiksmīgi saglabātas.
@@ -1118,11 +1118,11 @@ auths.user_base=Lietotāja pamatnosacījumi
auths.user_dn=Lietotāja DN
auths.attribute_username=Lietotājvārda atribūts
auths.attribute_username_placeholder=Atstājiet tukšu, lai izmantotu lietotājvārdu ar kuru autorizējaties.
auths.attribute_name=First Name Attribute
auths.attribute_name=Vārda atribūts
auths.attribute_surname=Uzvārda atribūts
auths.attribute_mail=E-pasta atribūts
auths.verify_group_membership=Verify group membership
auths.group_search_base_dn=Group Search Base DN
auths.verify_group_membership=Pārbaudīt grupas piederību
auths.group_search_base_dn=Grupas meklēšanas pamata DN
auths.group_filter=Group Filter
auths.group_attribute_contain_user_list=Group Attribute Containing List of Users
auths.user_attribute_listed_in_group=User Attribute Listed in Group
@@ -1152,7 +1152,7 @@ auths.still_in_used=Daži lietotāji joprojām izmanto šo autentifikācijas vei
auths.deletion_success=Autentifikācija tika veiksmīgi izdzēsta!
auths.login_source_exist=Pieteikšanās avots '%s' jau eksistē.
config.not_set=(not set)
config.not_set=(nav noteikts)
config.server_config=Servera konfigurācija
config.app_name=Lietotnes nosaukums
config.app_ver=Lietotnes versija
@@ -1190,7 +1190,7 @@ config.disable_http_git=Atspējot HTTP Git
config.enable_local_path_migration=Atļaut migrāciju no lokāla ceļa
config.commits_fetch_concurrency=Commits Fetch Concurrency
config.http_config=HTTP Configuration
config.http_config=HTTP konfigurācija
config.http_access_control_allow_origin=Access Control Allow Origin
config.db_config=Datu bāzes konfigurācija

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]
@@ -456,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
@@ -464,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
@@ -565,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
@@ -735,14 +735,14 @@ 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.
@@ -1094,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
@@ -1300,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

@@ -421,8 +421,8 @@ mirror_last_synced=Ostatnia synchronizacja
watchers=Obserwujący
stargazers=Polubienia
forks=Forki
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
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.
@@ -520,7 +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=Failed to delete file '%s' with error: %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'
@@ -641,7 +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=Commit Description
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łąź
@@ -746,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=Enable pull requests to accept contributions between repositories and branches
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
@@ -860,8 +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=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
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
@@ -1102,7 +1102,7 @@ auths.new=Dodaj nowe źródło
auths.name=Nazwa
auths.type=Typ
auths.enabled=Włączono
auths.default=Default
auths.default=Domyślne
auths.updated=Zaktualizowano
auths.auth_type=Typ uwierzytelniania
auths.auth_name=Nazwa uwierzytelniania
@@ -1141,7 +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=This authentication is default login source
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
@@ -1174,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
@@ -1312,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

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

File diff suppressed because it is too large Load Diff

View File

@@ -223,7 +223,7 @@ url_error=` не является допустимым URL-адресом.`
include_error=` должен содержать '%s'.`
unknown_error=Неизвестная ошибка:
captcha_incorrect=Капча не пройдена.
password_not_match=Пароли не совпадают.
password_not_match=Пароль и подтверждение отличаются.
username_been_taken=Имя пользователя занято.
repo_name_been_taken=Имя репозитория занято.
@@ -421,8 +421,8 @@ mirror_last_synced=Последняя синхронизация
watchers=Наблюдатели
stargazers=Звездочеты
forks=Ответвления
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
repo_description_helper=Описание репозитория. Максимальная длина 512 символов.
repo_description_length=Доступные символы
form.reach_limit_of_creation=У владельца достигнут максимальный предел в %d создаваемых репозиториев.
form.name_reserved=Имя репозитория '%s' зарезервировано.
@@ -464,7 +464,7 @@ tree=Дерево
filter_branch_and_tag=Фильтр по ветке или тегу
branches=Ветки
tags=Метки
issues=Обсуждения
issues=Задачи
pulls=Запросы на слияние
labels=Метки
milestones=Этапы
@@ -520,7 +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.fail_to_delete_file=Не удалось удалить файл «%s» из-за ошибки: %v
editor.add_subdir=Добавьте подкаталог...
editor.unable_to_upload_files=Не удалось загрузить файлы в «%s» из-за ошибки: %v
editor.upload_files_to_dir=Загрузить файлы '%s'
@@ -538,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=Очистить этап
@@ -641,7 +641,7 @@ pulls.cannot_auto_merge_desc=Этот запрос на слияние не мо
pulls.cannot_auto_merge_helper=Пожалуйста, совершите слияние вручную для урегулирования конфликтов.
pulls.create_merge_commit=Создать коммит на слияние
pulls.rebase_before_merging=Выполнить rebase перед слиянием
pulls.commit_description=Commit Description
pulls.commit_description=Описание коммита
pulls.merge_pull_request=Слить пулл-реквест
pulls.open_unmerged_pull_exists=`Вы не можете снова открыть, поскольку уже существует запрос на слияние (#%d) из того же репозитория с той же информацией о слиянии и ожидающий слияния. `
pulls.delete_branch=Удалить ветку
@@ -746,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=Enable pull requests to accept contributions between repositories and branches
settings.pulls_desc=Разрешить пул-запросы для принятия изменений между репозиториями и ветками
settings.pulls.ignore_whitespace=Игнорировать изменения в пробельных символах
settings.pulls.allow_rebase_merge=Разрешить rebase-слияние
settings.danger_zone=Опасная зона
@@ -825,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=Запрос слияния открыт, закрыт, переоткрыт, изменён, назначен, снят, метка обновлена, метка убрана, добавлен промежуточный этап, убран промежуточный этап или синхронизирован.
@@ -860,8 +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
settings.description_desc=Описание репозитория. Максимальная длина 512 символов.
settings.description_length=Доступные символы
diff.browse_source=Просмотр исходного кода
diff.parent=Родитель
@@ -1102,7 +1102,7 @@ auths.new=Добавить новый источник
auths.name=Имя
auths.type=Тип
auths.enabled=Включено
auths.default=Default
auths.default=По умолчанию
auths.updated=Обновлено
auths.auth_type=Тип аутентификации
auths.auth_name=Имя аутентификации
@@ -1141,7 +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.default_auth=Эта аутентификация является источником входа по умолчанию
auths.new_success=Новый канал аутентификации '%s' успешно создан.
auths.update_success=Настройки канала аутентификации успешно сохранены.
auths.update=Обновить параметры аутентификации
@@ -1327,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,8 +421,8 @@ mirror_last_synced=Naposledy synchronizované
watchers=Pozorovatelia
stargazers=Sledujúci
forks=Forky
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
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ý.
@@ -520,7 +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=Failed to delete file '%s' with error: %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'
@@ -641,7 +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=Commit Description
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
@@ -769,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é.
@@ -860,8 +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=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
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č
@@ -1097,12 +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=Default
auths.default=Predvolený
auths.updated=Aktualizované
auths.auth_type=Typ overenia
auths.auth_name=Názov overenia
@@ -1174,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
@@ -1222,7 +1222,7 @@ config.skip_tls_verify=Preskočiť overenie TLS
config.mailer_config=Nastavenie mailera
config.mailer_enabled=Povolený
config.mailer_disable_helo=Zakázať HELO
config.mailer_subject_prefix=Subject Prefix
config.mailer_subject_prefix=Predpona predmetu
config.mailer_host=Host
config.mailer_user=Používateľ
config.send_test_mail=Odoslať testovací E-mail

View File

@@ -421,8 +421,8 @@ mirror_last_synced=Задње синхронизовано
watchers=Посматрачи
stargazers=Пратиоци
forks=Огранци
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
repo_description_helper=Опис спремишта. Максимум 512 карактера.
repo_description_length=Доступни карактери
form.reach_limit_of_creation=Власник има максимум број %d спремишта.
form.name_reserved=Име спремишта '%s' је резервирано.
@@ -520,7 +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.fail_to_delete_file=Фајл '%s' није успешно обрисан, разлог грешке: %v
editor.add_subdir=Додај поддиректоријуми...
editor.unable_to_upload_files=Учитање датотеке '%s' није успело са грешкном: %v
editor.upload_files_to_dir=Пошаљи датотеке на '%s'
@@ -641,7 +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.commit_description=Опис ревизије
pulls.merge_pull_request=Обави спајање
pulls.open_unmerged_pull_exists=`Неможете поново отворити јер већ постоји захтев за спајање (#%d) из истог спремишта са истим информацијама о спајању и чека спајање.`
pulls.delete_branch=Избришите грану
@@ -860,8 +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
settings.description_desc=Опис спремишта. Максимум 512 карактера.
settings.description_length=Доступни карактери
diff.browse_source=Преглед изворни кода
diff.parent=родитељ

View File

@@ -151,8 +151,8 @@ register_hepler_msg=Bir hesabınız var mı? Şimdi giriş yapın!
social_register_hepler_msg=Zaten bir hesabınız var mı? Şimdi bağlanın!
disable_register_prompt=Üzgünüz, kaydolma devre dışı bırakıldı. Lütfen site yöneticisiyle irtibata geçin.
disable_register_mail=Üzgünüz, kayıt doğrulama e-postası devre dışı bırakıldı.
auth_source=Authentication Source
local=Local
auth_source=Yetkilendirme Kaynağı
local=Yerel
remember_me=Beni Hatırla
forgot_password=Parolamı Unuttum
forget_password=Parolanızı mı unuttunuz?
@@ -231,7 +231,7 @@ org_name_been_taken=Bu organizasyon adı zaten alınmış.
team_name_been_taken=Bu takım adı zaten alınmış.
email_been_used=Bu e-posta adresi zaten kullanımda.
username_password_incorrect=Kullanıcı adı veya parola hatalı.
auth_source_mismatch=The authentication source selected is not associated with the user.
auth_source_mismatch=Seçilen kimlik doğrulama kaynağı kullanıcı ile ilişkili değil.
enterred_invalid_repo_name=Lütfen girdiğiniz depo isminin doğru olduğundan emin olun.
enterred_invalid_owner_name=Lütfen girdiğiniz depo sahibi isminin doğru olduğundan emin olun.
enterred_invalid_password=Lütfen girdiğiniz parolanın doğru olduğundan emin olun.
@@ -351,7 +351,7 @@ two_factor_or_enter_secret=Veya parola girin:
two_factor_then_enter_passcode=Daha sonra şifre kodunu girin:
two_factor_verify=Doğrula
two_factor_invalid_passcode=Girdiğiniz şifre kodu geçersiz,lütfen tekrar deneyin!
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
two_factor_reused_passcode=Girdiğiniz şifre zaten kullanılmış, lütfen başka bir tane deneyin!
two_factor_enable_error=İki faktörlü kimlik doğrulama etkinleştirmesi başarısız :%v
two_factor_enable_success=Hesabınız için iki faktörlü kimlik doğrulama başarıyla devre dışı bırakıldı!
two_factor_recovery_codes_title=İki faktörlü Kimlik doğrulama Kurtarma Kodları
@@ -421,8 +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
repo_description_helper=Depo açıklaması. Maksimum 512 karakter uzunluğu.
repo_description_length=Mevcut karakterler
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ış.
@@ -520,7 +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.fail_to_delete_file='%s' dosyası hatalı bir şekilde silinemedi: %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
@@ -641,7 +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.commit_description=Taahhüt Açıklaması
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
@@ -740,17 +740,17 @@ settings.use_internal_issue_tracker=Yerleşik hafif sorun izleyici kullanma
settings.allow_public_issues_desc=Depo özel olduğunda toplulukların herkese açık olarak erişmesine izin ver
settings.use_external_issue_tracker=Harici sorun takipçisi kullan
settings.external_tracker_url=Harici Konu İzleyici URL'si
settings.external_tracker_url_desc=Visitors will be redirected to URL when they click on the tab.
settings.external_tracker_url_desc=Ziyaretçiler, sekmeye tıkladıklarında bağlantıya yönlendirilecektir.
settings.tracker_url_format=Harici Sorun Takipçisi Bağlantı Formatı
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=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.pulls_desc=Depolar ve Şubeler arasındaki katkıları kabul etmek için çekme isteklerini etkinleştir
settings.pulls.ignore_whitespace=Boşluktaki değişiklikleri yoksay
settings.pulls.allow_rebase_merge=Taahhütleri birleştirmek için yeniden tabanın kullanmasına izin ver
settings.danger_zone=Tehlike Alanı
settings.cannot_fork_to_same_owner=You cannot fork a repository to its original owner.
settings.cannot_fork_to_same_owner=Bir depoyu orijinal sahibine ayıramazsınız.
settings.new_owner_has_same_repo=Yeni sahibin aynı isimde başka bir deposu var. Lütfen farklı bir isim seçin.
settings.convert=Düzenli Depoya Dönüştür
settings.convert_desc=Bu yansıyı düzenli bir depoya dönüştürebilirsiniz. Bu işlem geri alınamaz.
@@ -769,7 +769,7 @@ settings.wiki_deletion_success=Deponun Wiki verisi başarıyla silindi.
settings.delete=Bu Depoyu Sil
settings.delete_desc=Bir depoyu bir kez sildiğiniz taktirde geri getiremezsiniz. Lütfen emin olun.
settings.delete_notices_1=- Bu işlem geri <strong>ALINAMAZ</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=- Bu işlem, git verileri, sorunlar, yorumlar ve işbirlikçi erişimi de dahil olmak üzere bu depodaki her şeyi kalıcı olarak siler.
settings.delete_notices_fork_1=Silme işleminden sonra bütün çatallar bağımsız hale gelir.
settings.deletion_success=Depo başarıyla silindi!
settings.update_settings_success=Depo seçenekleri başarıyla güncellendi.
@@ -793,8 +793,8 @@ settings.webhook_deletion_success=Web isteği başarıyla silindi!
settings.webhook.test_delivery=Test Dağıtımı
settings.webhook.test_delivery_desc=Web isteği ayarlarınızı test etmek için sahte bir anlık olay gönderin
settings.webhook.test_delivery_success=Test web isteği, dağıtım kuyruğuna eklendi. Bunun dağıtım geçmişinde görünmesi birkaç saniye sürebilir.
settings.webhook.redelivery=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=Yeniden teslimat
settings.webhook.redelivery_success=Kanca görev '%s' teslim kuyruğuna eklenmiştir. Bu tarihte teslim durumunu güncellemek birkaç saniye sürebilir.
settings.webhook.request=İstekler
settings.webhook.response=Cevaplar
settings.webhook.headers=Başlıklar
@@ -809,7 +809,7 @@ settings.add_webhook_desc=Gogs, meydana gelen olay ile birlikte belirttiğiniz b
settings.payload_url=Yük Bağlantısı
settings.content_type=İçerik Türü
settings.secret=Gizli
settings.secret_desc=Secret will be sent as SHA256 HMAC hex digest of payload via <code>X-Gogs-Signature</code> header.
settings.secret_desc=Gizli, <code>X-Gogs-Signature</code> başlığı ile SHA256 hmac hexdigest yükü olarak gönderilecektir.
settings.slack_username=Kullanıcı Adı
settings.slack_icon_url=Simge Bağlantısı
settings.slack_color=Renk
@@ -819,20 +819,20 @@ settings.event_send_everything=<strong>Her şeye</strong> ihtiyacım var.
settings.event_choose=Neye ihtiyacım olduğunu seçtir.
settings.event_create=Oluştur
settings.event_create_desc=Dal veya biçim imi oluşturuldu
settings.event_delete=Delete
settings.event_delete_desc=Branch or tag deleted
settings.event_fork=Fork
settings.event_fork_desc=Repository forked
settings.event_delete=Sil
settings.event_delete_desc=Dal veya etiket silindi
settings.event_fork=Çatalla
settings.event_fork_desc=Depo çatallandı
settings.event_push=Push
settings.event_push_desc=Bir depoya git push
settings.event_issues=Issues
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_desc=Release published in a repository.
settings.event_issues=Sorunlar
settings.event_issues_desc=Sorun açıldı, kapatıldı, yeniden açıldı, düzenlendi, atandı, atanmadı, etiket güncellendi, etiket silindi, dönüm noktası yapıldı ya da iptal edildi.
settings.event_pull_request=İstek Çek
settings.event_pull_request_desc=Çekme isteği açıldı, kapatıldı, yeniden açıldı, düzenlendi, atandı, atanmamış, etiket güncellendi, etiket silindi, kilometre taşları, dönüm noktası veya senkronize edildi.
settings.event_issue_comment=Sorun Yorumu
settings.event_issue_comment_desc=Konu yorumu eklendi, düzenlendi veya silindi.
settings.event_release=Yayın
settings.event_release_desc=Bir depoda yayınlanan sürüm.
settings.active=Aktif
settings.active_helper=Bu isteği tetikleyen olaya ilişkin detaylar da gönderilecektir.
settings.add_hook_success=Yeni web isteği eklendi.
@@ -842,13 +842,13 @@ settings.delete_webhook=Web İsteğini Sil
settings.recent_deliveries=Son Dağıtımlar
settings.hook_type=İstek Türü
settings.add_slack_hook_desc=Deponuza <a href="%s">Slack</a> entegrasyonunu ekleyin.
settings.add_discord_hook_desc=Add <a href="%s">Discord</a> integration to your repository.
settings.add_dingtalk_hook_desc=Add <a href="%s">Dingtalk</a> integration to your repository.
settings.add_discord_hook_desc=Deponuza <a href="%s">Discord</a> entegrasyonu ekleyin.
settings.add_dingtalk_hook_desc=Deponuza <a href="%s">Dingtalk</a> entegrasyonu ekleyin.
settings.slack_token=Erişim Anahtarı
settings.slack_domain=Alan Adı
settings.slack_channel=Kanal
settings.deploy_keys=Dağıtım Anahtarları
settings.deploy_keys_helper=<b>Common Gotcha!</b> If you're looking for adding personal public keys, please add them in your <a href="%s%s">account settings</a>.
settings.deploy_keys_helper=<b>Ortak Gotcha!</b> Kişisel ortak anahtarlar eklemek istiyorsanız lütfen bunları <a href="%s%s">hesap ayarlarınıza</a> ekleyin.
settings.add_deploy_key=Dağıtım Anahtarı Ekle
settings.deploy_key_desc=Dağıtım anahtarlarının yalnızca okuma izni vardır. Kişisel hesapların SSH anahtarlarıyla aynı değillerdir.
settings.no_deploy_keys=Herhangi bir dağıtım anahtarı eklemediniz.
@@ -860,8 +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
settings.description_desc=Depo açıklaması. Maksimum 512 karakter uzunluğu.
settings.description_length=Mevcut karakterler
diff.browse_source=Kaynağa Gözat
diff.parent=ebeveyn
@@ -928,7 +928,7 @@ team_permission_desc=Bu takım, ne gibi bir izin seviyesine sahiptir?
form.name_reserved=Organizasyon adı '%s' başka birisine ayrılmış.
form.name_pattern_not_allowed=Organizasyon adı modeli '%s' geçersiz.
form.team_name_reserved=Team name '%s' is reserved.
form.team_name_reserved='%s' takım ismi başka birine ayrılmış.
settings=Ayarlar
settings.options=Seçenekler
@@ -1019,8 +1019,8 @@ dashboard.git_gc_repos=Depolarda çöp toplama işlemini gerçekleştir
dashboard.git_gc_repos_success=Tüm depolarda çöp toplama işlemi başarıyla gerçekleştirildi.
dashboard.resync_all_sshkeys='.ssh/authorized_keys' dosyasını yeniden yaz (dikkat: Gogs'un olmayan anahtarlar silinecektir)
dashboard.resync_all_sshkeys_success=Tüm genel anahtarlar başarıyla yeniden yazıldı.
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=Tüm depoların yeniden alımı, güncellemesi ve gönderi alım kancalarını yeniden senkronize et
dashboard.resync_all_hooks_success=Tüm depoların önceden alımı, güncellemesi ve gönderi alımı kancaları başarıyla senkronize edildi.
dashboard.reinit_missing_repos=Git dosyalarını kaybetmiş tüm depoları yeniden oluştur
dashboard.reinit_missing_repos_success=Git dosyalarını kaybetmiş tüm depolar başarıyla yeniden oluşturuldu.
@@ -1095,14 +1095,14 @@ repos.private=Özel
repos.watches=İzlemeler
repos.stars=Yıldızlar
repos.issues=Sorunlar
repos.size=Size
repos.size=Boyut
auths.auth_sources=Authentication Sources
auths.auth_sources=Yetkilendirme Kaynakları
auths.new=Yeni Kaynak Ekle
auths.name=İsim
auths.type=Tür
auths.enabled=Aktifleştirilmiş
auths.default=Default
auths.default=Varsayılan
auths.updated=Güncellendi
auths.auth_type=Yetki Türü
auths.auth_name=Yetki İsmi
@@ -1111,21 +1111,21 @@ auths.domain=Alan Adı
auths.host=Sunucu
auths.port=Port
auths.bind_dn=Bağlama DN'i
auths.bind_dn_helper=You can use '%s' as placeholder for username, e.g. DOM\%s
auths.bind_dn_helper=Kullanıcı adı için yer tutucu olarak '%s' kullanabilirsiniz, Örneğin DOM\%s
auths.bind_password=Bağlama Parolası
auths.bind_password_helper=Uyarı: Bu parola, ham halde bir metin dosyası içerisinde saklanacaktır. Yüksek izinli bir hesap kullanmayın.
auths.user_base=Kullanıcı Arama Tabanı
auths.user_dn=Kullanıcı DN'i
auths.attribute_username=Kullanıcı özelliği
auths.attribute_username_placeholder=Kullanıcı adı için giriş yapma form alanı kullanmak için boş bırakın.
auths.attribute_name=First Name Attribute
auths.attribute_name=İlk Ad Özelliği
auths.attribute_surname=Soyad özelliği
auths.attribute_mail=E-posta özelliği
auths.verify_group_membership=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
auths.user_attribute_listed_in_group=User Attribute Listed in Group
auths.verify_group_membership=Grup üyeliğini doğrula
auths.group_search_base_dn=Grup Arama Tabanı DN
auths.group_filter=Grup Filtresi
auths.group_attribute_contain_user_list=Kullanıcı Listesi İçeren Grup Özelliği
auths.user_attribute_listed_in_group=Grupta Listelenen Kullanıcı Özelliği
auths.attributes_in_bind=Bağlı DN tabanındaki özellikleri çek
auths.filter=Kullanıcı Filtresi
auths.admin_filter=Yönetici Filtresi
@@ -1141,7 +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.default_auth=Bu kimlik doğrulama varsayılan giriş kaynağıdır
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
@@ -1150,9 +1150,9 @@ auths.delete_auth_title=Yetkilendirme Silme
auths.delete_auth_desc=Bu yetkilendirme silinecek. Devam etmek istiyor musunuz?
auths.still_in_used=Bu yetkilendirme hala bazı kullanıcılar tarafından kullanılıyor. Lütfen öncelikle bunları silin ya da başka oturum açma türlerine çevirin.
auths.deletion_success=Yetkilendirme başarıyla silindi!
auths.login_source_exist=Login source '%s' already exists.
auths.login_source_exist='%s' giriş kaynağı zaten mevcut.
config.not_set=(not set)
config.not_set=(ayarlı değil)
config.server_config=Sunucu Yapılandırması
config.app_name=Uygulama Adı
config.app_ver=Uygulama Sürümü
@@ -1162,7 +1162,7 @@ config.offline_mode=Çevrim Dışı Modu
config.disable_router_log=Yönlendirici Log'larını Devre Dışı Bırak
config.run_user=Çalıştırma Kullanıcısı
config.run_mode=Çalıştırma Modu
config.git_version=Git Version
config.git_version=Git Sürümü
config.static_file_root_path=Sabit Dosya Kök Yolu
config.log_file_root_path=Log Dosyası Kök Yolu
config.reverse_auth_user=Tersine Yetkilendirme Kullanıcısı
@@ -1174,24 +1174,24 @@ config.ssh_domain=Alan Adı
config.ssh_port=Port
config.ssh_listen_port=Port'u Dinle
config.ssh_root_path=Kök Yol
config.ssh_rewrite_authorized_keys_at_start=Rewrite authorized_keys At Start
config.ssh_rewrite_authorized_keys_at_start=Başlangıçta yetkili anahtarları yeniden yaz
config.ssh_key_test_path=Anahtar Test Yolu
config.ssh_keygen_path=Keygen ('ssh-keygen') Yolu
config.ssh_minimum_key_size_check=Minimum Anahtar Uzunluğu Kontrolü
config.ssh_minimum_key_sizes=Minimum Anahtar Uzunlukları
config.repo_config=Repository Configuration
config.repo_config=Depo Yapılandırması
config.repo_root_path=Depo Kök Yolu
config.script_type=Betik Türü
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.commits_fetch_concurrency=Commits Fetch Concurrency
config.repo_force_private=Özel Kuvvet
config.max_creation_limit=Maksimum Oluşturma Sınırı
config.preferred_licenses=Tercih Edilen Lisanslar
config.disable_http_git=HTTP Git'i devre dışı bırak
config.enable_local_path_migration=Yerel Yol Geçişi Etkinleştir
config.commits_fetch_concurrency=Eşzamanlılık Alma Taahhüdü
config.http_config=HTTP Configuration
config.http_access_control_allow_origin=Access Control Allow Origin
config.http_config=HTTP Yapılandırması
config.http_access_control_allow_origin=Erişim Kontrolü Kaynağına İzin Ver
config.db_config=Veritabanı Yapılandırması
config.db_type=Türü
@@ -1222,7 +1222,7 @@ config.skip_tls_verify=TLS Doğrulamasını Atla
config.mailer_config=Mailer Yapılandırması
config.mailer_enabled=Aktif
config.mailer_disable_helo=HELO'yu Devre Dışı Bırak
config.mailer_subject_prefix=Subject Prefix
config.mailer_subject_prefix=Konu Öneki
config.mailer_host=Sunucu
config.mailer_user=Kullanıcı
config.send_test_mail=Test E-Postası Gönder
@@ -1250,9 +1250,9 @@ config.cookie_life_time=Çerez Yaşam Zamanı
config.picture_config=Resim Yapılandırması
config.picture_service=Resim Servisi
config.disable_gravatar=Gravatar Hizmet Dışı
config.enable_federated_avatar=Enable Federated Avatars
config.enable_federated_avatar=Birleştirilmiş Avatarları Etkinleştir
config.git_config=Git Configuration
config.git_config=Git Yapılandırması
config.git_disable_diff_highlight=Diff İşlemi Sözdizimini Devre Dışı Bırak
config.git_max_diff_lines=Maksimum Ayırma Hatları (tek bir dosya için)
config.git_max_diff_line_characters=Maksimum Ayırma Karakterleri(tek bir hat için)

View File

@@ -421,8 +421,8 @@ mirror_last_synced=Востаннє синхронізовано
watchers=Спостерігачі
stargazers=Шанувальники
forks=Відгалуження
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
repo_description_helper=Опис репозиторію. До 512-ти символів довжиною.
repo_description_length=Доступні символи
form.reach_limit_of_creation=Власник досягнув максимальної кількості у %d створених репозиторіїв.
form.name_reserved=Назва репозиторія '%s' зарезервовано.
@@ -520,7 +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.fail_to_delete_file=Не вдалося видалити файл '%s' через помилку: %v
editor.add_subdir=Додати підкаталогу...
editor.unable_to_upload_files=Не вдалося завантажити файли до '%s' через помилку: %v
editor.upload_files_to_dir=Завантажувати файли до '%s'
@@ -641,7 +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.commit_description=Опис коміту
pulls.merge_pull_request=Влити запрос на злиття
pulls.open_unmerged_pull_exists=`Ви не можете перевідкрити, бо вже існує запрос на злиття (#%d) з того самого репозиторію, з тією самою інформацією про злиття, та він очікує на влиття.`
pulls.delete_branch=Видалити гілку
@@ -746,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=Enable pull requests to accept contributions between repositories and branches
settings.pulls_desc=Увімкнути запити на злиття щоб дозволити внески між репозиторіями й гілками
settings.pulls.ignore_whitespace=Ігнорувати зміни у пробільних символах
settings.pulls.allow_rebase_merge=Дозволити перебазування для merge-комітів
settings.danger_zone=Небезпечна зона
@@ -860,8 +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
settings.description_desc=Опис репозиторію. До 512-ти символів довжиною.
settings.description_length=Доступні символи
diff.browse_source=Переглянути джерело
diff.parent=батько
@@ -1102,7 +1102,7 @@ auths.new=Додати нове джерело
auths.name=Назва
auths.type=Тип
auths.enabled=Увімкнено
auths.default=Default
auths.default=За замовчанням
auths.updated=Оновлено
auths.auth_type=Тип автентифікації
auths.auth_name=Назва автентифікації
@@ -1141,7 +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.default_auth=Це метод автентифікації за замовчанням
auths.new_success=Нову автентифікацію '%s' було успішно додано.
auths.update_success=Налаштування автентифікації було успішно оновлено.
auths.update=Оновити налаштування автентифікації

View File

@@ -421,8 +421,8 @@ mirror_last_synced=上次同步
watchers=關注者
stargazers=稱讚者
forks=派生倉庫
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
repo_description_helper=儲存庫的說明文字。最長 512 個字元。
repo_description_length=可用字元
form.reach_limit_of_creation=擁有者已達到儲存庫最大的新增上限 %d。
form.name_reserved=倉庫名稱 '%s' 是被保留的。
@@ -520,7 +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=Failed to delete file '%s' with error: %v
editor.fail_to_delete_file=無法刪除檔案「%s」錯誤訊息%v
editor.add_subdir=新增子目錄...
editor.unable_to_upload_files=上傳檔案失敗到 '%s', 錯誤訊息: %v
editor.upload_files_to_dir=上傳檔案到 '%s'
@@ -641,7 +641,7 @@ pulls.cannot_auto_merge_desc=由於存在衝突,不能自動合併這推送請
pulls.cannot_auto_merge_helper=請手動合併來解決衝突。
pulls.create_merge_commit=創建一個合併提交
pulls.rebase_before_merging=合併前先 Rebase
pulls.commit_description=Commit Description
pulls.commit_description=提交記錄說明
pulls.merge_pull_request=合併請求
pulls.open_unmerged_pull_exists=`由於已經存在來自相同倉庫和合併信息的未合併請求(#%d您無法執行重新開啟操作。`
pulls.delete_branch=刪除分支
@@ -746,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=Enable pull requests to accept contributions between repositories and branches
settings.pulls_desc=啟用「合併請求」功能,接受版本庫與分支之間的貢獻
settings.pulls.ignore_whitespace=忽略空白符號的更改
settings.pulls.allow_rebase_merge=允許使用 rebase 合併提交
settings.danger_zone=危險操作區
@@ -860,8 +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
settings.description_desc=儲存庫的說明文字。最長 512 個字元。
settings.description_length=可用字元
diff.browse_source=瀏覽代碼
diff.parent=父節點
@@ -1102,7 +1102,7 @@ auths.new=添加新認證源
auths.name=認證名稱
auths.type=認證類型
auths.enabled=已啟用
auths.default=Default
auths.default=預設
auths.updated=最後更新時間
auths.auth_type=認證類型
auths.auth_name=認證名稱
@@ -1141,7 +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.default_auth=此認證方式為預設登入來源
auths.new_success=新的認證源 "%s" 添加成功!
auths.update_success=認證設置更新成功!
auths.update=更新認證設置

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

@@ -19,8 +19,8 @@ ln -sfn /data/gogs/data ./data
# Backward Compatibility with Gogs Container v0.6.15
ln -sfn /data/git /home/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
# Only chown for the first time, owner of '/data' is 'git' inside Docker after installation
if [ $(stat -c '%U' /data) != 'git' ]; then
chown -R git:git /data /app/gogs ~git/
fi
chmod 0755 /data /data/gogs ~git/

View File

@@ -11,6 +11,5 @@ HostKey /data/ssh/ssh_host_ed25519_key
PermitRootLogin no
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
UsePrivilegeSeparation no
PermitUserEnvironment yes
AllowUsers 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,17 +16,17 @@ import (
"github.com/gogs/gogs/pkg/setting"
)
const APP_VER = "0.11.66.0916"
const Version = "0.11.91.0811"
func init() {
setting.AppVer = APP_VER
setting.AppVer = Version
}
func main() {
app := cli.NewApp()
app.Name = "Gogs"
app.Usage = "A painless self-hosted Git service"
app.Version = APP_VER
app.Version = Version
app.Commands = []cli.Command{
cmd.Web,
cmd.Serv,

View File

@@ -59,7 +59,7 @@ type Access struct {
Mode AccessMode
}
func accessLevel(e Engine, userID int64, repo *Repository) (AccessMode, error) {
func userAccessMode(e Engine, userID int64, repo *Repository) (AccessMode, error) {
mode := ACCESS_MODE_NONE
// Everyone has read access to public repository
if !repo.IsPrivate {
@@ -84,14 +84,13 @@ func accessLevel(e Engine, userID int64, repo *Repository) (AccessMode, error) {
return access.Mode, nil
}
// AccessLevel returns the Access a user has to a repository. Will return NoneAccess if the
// user does not have access.
func AccessLevel(userID int64, repo *Repository) (AccessMode, error) {
return accessLevel(x, userID, repo)
// UserAccessMode returns the access mode of given user to the repository.
func UserAccessMode(userID int64, repo *Repository) (AccessMode, error) {
return userAccessMode(x, userID, repo)
}
func hasAccess(e Engine, userID int64, repo *Repository, testMode AccessMode) (bool, error) {
mode, err := accessLevel(e, userID, repo)
mode, err := userAccessMode(e, userID, repo)
return mode >= testMode, err
}

View File

@@ -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 {
@@ -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)
}
}
}
@@ -606,6 +604,7 @@ func CommitRepoAction(opts CommitRepoActionOptions) error {
if err = PrepareWebhooks(repo, HOOK_EVENT_CREATE, &api.CreatePayload{
Ref: refName,
RefType: "tag",
Sha: opts.NewCommitID,
DefaultBranch: repo.DefaultBranch,
Repo: apiRepo,
Sender: apiPusher,

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"
)
@@ -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)
}
}
}

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

@@ -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,8 +402,8 @@ 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 {
@@ -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])

View File

@@ -92,7 +92,7 @@ func NewMailerIssue(issue *Issue) mailer.Issue {
// mailIssueCommentToParticipants can be used for both new issue creation and comment.
// This functions sends two list of emails:
// 1. Repository watchers and users who are participated in comments.
// 1. Repository watchers, users who participated in comments and the assignee.
// 2. Users who are not in 1. but get mentioned in current issue/comment.
func mailIssueCommentToParticipants(issue *Issue, doer *User, mentions []string) error {
if !setting.Service.EnableNotifyMail {
@@ -142,6 +142,12 @@ func mailIssueCommentToParticipants(issue *Issue, doer *User, mentions []string)
tos = append(tos, participants[i].Email)
names = append(names, participants[i].Name)
}
if issue.Assignee != nil && issue.Assignee.ID != doer.ID {
if !com.IsSliceContainsStr(names, issue.Assignee.Name) {
tos = append(tos, issue.Assignee.Email)
names = append(names, issue.Assignee.Name)
}
}
mailer.SendIssueCommentMail(NewMailerIssue(issue), NewMailerRepo(issue.Repo), NewMailerUser(doer), tos)
// Mail mentioned people and exclude watchers.

View File

@@ -2,6 +2,7 @@
// 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 (
@@ -24,6 +25,7 @@ import (
"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 {
@@ -106,6 +111,18 @@ func (cfg *PAMConfig) ToDB() ([]byte, error) {
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.
type AuthSourceFile struct {
abspath string
@@ -174,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))
}
@@ -209,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) ||
@@ -249,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 {
@@ -488,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)
}
@@ -727,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}
@@ -739,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

@@ -5,6 +5,7 @@
package models
import (
"container/list"
"fmt"
"net/url"
"strings"
@@ -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{
@@ -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

@@ -13,6 +13,7 @@ import (
"os"
"path"
"strings"
"time"
"github.com/Unknwon/com"
_ "github.com/denisenkom/go-mssqldb"
@@ -156,14 +157,14 @@ func getEngine() (*xorm.Engine, error) {
connStr = fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;", host, port, DbCfg.Name, DbCfg.User, DbCfg.Passwd)
case "sqlite3":
if !EnableSQLite3 {
return nil, errors.New("This binary version does not build support for SQLite3.")
return nil, errors.New("this binary version does not build support for SQLite3")
}
if err := os.MkdirAll(path.Dir(DbCfg.Path), os.ModePerm); err != nil {
return nil, fmt.Errorf("Fail to create directories: %v", err)
return nil, fmt.Errorf("create directories: %v", err)
}
connStr = "file:" + DbCfg.Path + "?cache=shared&mode=rwc"
default:
return nil, fmt.Errorf("Unknown database type: %s", DbCfg.Type)
return nil, fmt.Errorf("unknown database type: %s", DbCfg.Type)
}
return xorm.NewEngine(DbCfg.Type, connStr)
}
@@ -171,7 +172,7 @@ func getEngine() (*xorm.Engine, error) {
func NewTestEngine(x *xorm.Engine) (err error) {
x, err = getEngine()
if err != nil {
return fmt.Errorf("Connect to database: %v", err)
return fmt.Errorf("connect to database: %v", err)
}
x.SetMapper(core.GonicMapper{})
@@ -181,7 +182,7 @@ func NewTestEngine(x *xorm.Engine) (err error) {
func SetEngine() (err error) {
x, err = getEngine()
if err != nil {
return fmt.Errorf("Fail to connect to database: %v", err)
return fmt.Errorf("connect to database: %v", err)
}
x.SetMapper(core.GonicMapper{})
@@ -197,9 +198,14 @@ func SetEngine() (err error) {
MaxDays: sec.Key("MAX_DAYS").MustInt64(3),
})
if err != nil {
return fmt.Errorf("Fail to create 'xorm.log': %v", err)
return fmt.Errorf("create 'xorm.log': %v", err)
}
// To prevent mystery "MySQL: invalid connection" error,
// see https://github.com/gogs/gogs/issues/5532.
x.SetMaxIdleConns(0)
x.SetConnMaxLifetime(time.Second)
if setting.ProdMode {
x.SetLogger(xorm.NewSimpleLogger3(logger, xorm.DEFAULT_LOG_PREFIX, xorm.DEFAULT_LOG_FLAG, core.LOG_WARNING))
} else {
@@ -219,7 +225,7 @@ func NewEngine() (err error) {
}
if err = x.StoreEngine("InnoDB").Sync2(tables...); err != nil {
return fmt.Errorf("sync database struct error: %v\n", err)
return fmt.Errorf("sync structs to database tables: %v\n", err)
}
return nil
@@ -281,14 +287,14 @@ func DumpDatabase(dirPath string) (err error) {
tableFile := path.Join(dirPath, tableName+".json")
f, err := os.Create(tableFile)
if err != nil {
return fmt.Errorf("fail to create JSON file: %v", err)
return fmt.Errorf("create JSON file: %v", err)
}
if err = x.Asc("id").Iterate(table, func(idx int, bean interface{}) (err error) {
return jsoniter.NewEncoder(f).Encode(bean)
}); err != nil {
f.Close()
return fmt.Errorf("fail to dump table '%s': %v", tableName, err)
return fmt.Errorf("dump table '%s': %v", tableName, err)
}
f.Close()
}
@@ -346,6 +352,8 @@ 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)
}

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.

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"
@@ -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
}
@@ -290,7 +291,7 @@ func getTeamByID(e Engine, teamID int64) (*Team, error) {
if err != nil {
return nil, err
} else if !has {
return nil, ErrTeamNotExist
return nil, errors.TeamNotExist{teamID, ""}
}
return t, nil
}

View File

@@ -1924,7 +1924,7 @@ func GitFsck() {
repo := bean.(*Repository)
repoPath := repo.RepoPath()
if err := git.Fsck(repoPath, setting.Cron.RepoHealthCheck.Timeout, setting.Cron.RepoHealthCheck.Args...); err != nil {
desc := fmt.Sprintf("Fail to health check repository '%s': %v", repoPath, err)
desc := fmt.Sprintf("Failed to perform health check on repository '%s': %v", repoPath, err)
log.Warn(desc)
if err = CreateRepositoryNotice(desc); err != nil {
log.Error(3, "CreateRepositoryNotice: %v", err)

View File

@@ -13,6 +13,7 @@ import (
"os/exec"
"path"
"path/filepath"
"strings"
"time"
"github.com/Unknwon/com"
@@ -326,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,
@@ -438,6 +443,11 @@ type UploadRepoFileOptions struct {
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) {
if len(opts.Files) == 0 {
return nil
@@ -467,14 +477,19 @@ 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)
}

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

@@ -132,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(),

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

@@ -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"
// FIXME: move this constant to github.com/gogs/go-gogs-client
const DocURL = "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,16 +38,42 @@ 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)
}
c.JSON(status, map[string]string{
"message": message,
"url": DOC_URL,
"url": DocURL,
})
}
// 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)
@@ -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

@@ -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
@@ -138,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.
@@ -227,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
@@ -252,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>
@@ -259,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
}
@@ -278,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
@@ -296,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"])
@@ -310,6 +327,8 @@ func Contexter() macaron.Handler {
c.Data["ShowFooterBranding"] = setting.ShowFooterBranding
c.Data["ShowFooterVersion"] = setting.ShowFooterVersion
c.renderNoticeBanner()
ctx.Map(c)
}
}

62
pkg/context/notice.go Normal file
View File

@@ -0,0 +1,62 @@
// Copyright 2019 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 (
"os"
"path"
"github.com/Unknwon/com"
log "gopkg.in/clog.v1"
"github.com/gogs/gogs/pkg/markup"
"github.com/gogs/gogs/pkg/setting"
"github.com/gogs/gogs/pkg/tool"
)
// renderNoticeBanner checks if a notice banner file exists and loads the message to display
// on all pages.
func (c *Context) renderNoticeBanner() {
fpath := path.Join(setting.CustomPath, "notice", "banner.md")
if !com.IsExist(fpath) {
return
}
f, err := os.Open(fpath)
if err != nil {
log.Error(2, "Failed to open file %q: %v", fpath, err)
return
}
defer f.Close()
fi, err := f.Stat()
if err != nil {
log.Error(2, "Failed to stat file %q: %v", fpath, err)
return
}
// Limit size to prevent very large messages from breaking pages
var maxSize int64 = 1024
if fi.Size() > maxSize { // Refuse to print very long messages
log.Warn("Notice banner file %q size too large [%d > %d]: refusing to render", fpath, fi.Size(), maxSize)
return
}
buf := make([]byte, maxSize)
n, err := f.Read(buf)
if err != nil {
log.Error(2, "Failed to read file %q: %v", fpath, err)
return
}
buf = buf[:n]
if !tool.IsTextFile(buf) {
log.Warn("Notice banner file %q does not appear to be a text file: aborting", fpath)
return
}
c.Data["ServerNotice"] = string(markup.RawMarkdown(buf, ""))
}

View File

@@ -160,9 +160,9 @@ func RepoAssignment(pages ...bool) macaron.Handler {
if c.IsLogged && c.User.IsAdmin {
c.Repo.AccessMode = models.ACCESS_MODE_OWNER
} else {
mode, err := models.AccessLevel(c.UserID(), repo)
mode, err := models.UserAccessMode(c.UserID(), repo)
if err != nil {
c.ServerError("AccessLevel", err)
c.ServerError("UserAccessMode", err)
return
}
c.Repo.AccessMode = mode

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
@@ -41,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

@@ -173,7 +173,7 @@ func composeTplData(subject, body, link string) map[string]interface{} {
func composeIssueMessage(issue Issue, repo Repository, doer User, tplName string, tos []string, info string) *Message {
subject := issue.MailSubject()
body := string(markup.RenderSpecialLink([]byte(issue.Content()), repo.HTMLURL(), repo.ComposeMetas()))
body := string(markup.Markdown([]byte(issue.Content()), repo.HTMLURL(), repo.ComposeMetas()))
data := composeTplData(subject, body, issue.HTMLURL())
data["Doer"] = doer
content, err := mailRender.HTMLString(tplName, data)

View File

@@ -39,16 +39,24 @@ func NewMessageFrom(to []string, from, subject, htmlBody string) *Message {
contentType := "text/html"
body := htmlBody
if setting.MailService.UsePlainText {
switchedToPlaintext := false
if setting.MailService.UsePlainText || setting.MailService.AddPlainTextAlt {
plainBody, err := html2text.FromString(htmlBody)
if err != nil {
log.Error(2, "html2text.FromString: %v", err)
} else {
contentType = "text/plain"
body = plainBody
switchedToPlaintext = true
}
}
msg.SetBody(contentType, body)
if switchedToPlaintext && setting.MailService.AddPlainTextAlt && !setting.MailService.UsePlainText {
// The AddAlternative method name is confusing - adding html as an "alternative" will actually cause mail
// clients to show it as first priority, and the text "main body" is the 2nd priority fallback.
// See: https://godoc.org/gopkg.in/gomail.v2#Message.AddAlternative
msg.AddAlternative("text/html", htmlBody)
}
return &Message{
Message: msg,
confirmChan: make(chan struct{}),

View File

@@ -190,6 +190,12 @@ func wrapImgWithLink(urlPrefix string, buf *bytes.Buffer, token html.Token) {
return
}
// Skip in case the "src" is data url
if strings.HasPrefix(src, "data:") {
buf.WriteString(token.String())
return
}
// Prepend repository base URL for internal links
needPrepend := !isLink([]byte(src))
if needPrepend {

View File

@@ -36,6 +36,9 @@ func NewSanitizer() {
sanitizer.policy.AllowAttrs("type").Matching(regexp.MustCompile(`^checkbox$`)).OnElements("input")
sanitizer.policy.AllowAttrs("checked", "disabled").OnElements("input")
// Data URLs
sanitizer.policy.AllowURLSchemes("data")
// Custom URL-Schemes
sanitizer.policy.AllowURLSchemes(setting.Markdown.CustomURLSchemes...)
})

View File

@@ -61,6 +61,7 @@ var (
AppSubURLDepth int // Number of slashes
AppPath string
AppDataPath string
HostAddress string // AppURL without protocol and slashes
// Server settings
Protocol Scheme
@@ -463,6 +464,7 @@ func NewContext() {
// This value is empty if site does not have sub-url.
AppSubURL = strings.TrimSuffix(url.Path, "/")
AppSubURLDepth = strings.Count(AppSubURL, "/")
HostAddress = url.Host
Protocol = SCHEME_HTTP
if sec.Key("PROTOCOL").String() == "https" {
@@ -859,6 +861,7 @@ type Mailer struct {
UseCertificate bool
CertFile, KeyFile string
UsePlainText bool
AddPlainTextAlt bool
}
var (
@@ -874,18 +877,19 @@ func newMailService() {
}
MailService = &Mailer{
QueueLength: sec.Key("SEND_BUFFER_LEN").MustInt(100),
SubjectPrefix: sec.Key("SUBJECT_PREFIX").MustString("[" + AppName + "] "),
Host: sec.Key("HOST").String(),
User: sec.Key("USER").String(),
Passwd: sec.Key("PASSWD").String(),
DisableHelo: sec.Key("DISABLE_HELO").MustBool(),
HeloHostname: sec.Key("HELO_HOSTNAME").String(),
SkipVerify: sec.Key("SKIP_VERIFY").MustBool(),
UseCertificate: sec.Key("USE_CERTIFICATE").MustBool(),
CertFile: sec.Key("CERT_FILE").String(),
KeyFile: sec.Key("KEY_FILE").String(),
UsePlainText: sec.Key("USE_PLAIN_TEXT").MustBool(),
QueueLength: sec.Key("SEND_BUFFER_LEN").MustInt(100),
SubjectPrefix: sec.Key("SUBJECT_PREFIX").MustString("[" + AppName + "] "),
Host: sec.Key("HOST").String(),
User: sec.Key("USER").String(),
Passwd: sec.Key("PASSWD").String(),
DisableHelo: sec.Key("DISABLE_HELO").MustBool(),
HeloHostname: sec.Key("HELO_HOSTNAME").String(),
SkipVerify: sec.Key("SKIP_VERIFY").MustBool(),
UseCertificate: sec.Key("USE_CERTIFICATE").MustBool(),
CertFile: sec.Key("CERT_FILE").String(),
KeyFile: sec.Key("KEY_FILE").String(),
UsePlainText: sec.Key("USE_PLAIN_TEXT").MustBool(),
AddPlainTextAlt: sec.Key("ADD_PLAIN_TEXT_ALT").MustBool(),
}
MailService.From = sec.Key("FROM").MustString(MailService.User)

View File

@@ -166,7 +166,7 @@ func Listen(host string, port int, ciphers []string) {
keyPath := filepath.Join(setting.AppDataPath, "ssh/gogs.rsa")
if !com.IsExist(keyPath) {
os.MkdirAll(filepath.Dir(keyPath), os.ModePerm)
_, stderr, err := com.ExecCmd(setting.SSH.KeygenPath, "-f", keyPath, "-t", "rsa", "-N", "")
_, stderr, err := com.ExecCmd(setting.SSH.KeygenPath, "-f", keyPath, "-t", "rsa", "-m", "PEM", "-N", "")
if err != nil {
panic(fmt.Sprintf("Fail to generate private key: %v - %s", err, stderr))
}
@@ -175,11 +175,11 @@ func Listen(host string, port int, ciphers []string) {
privateBytes, err := ioutil.ReadFile(keyPath)
if err != nil {
panic("SSH: Fail to load private key")
panic("SSH: Fail to load private key: " + err.Error())
}
private, err := ssh.ParsePrivateKey(privateBytes)
if err != nil {
panic("SSH: Fail to parse private key")
panic("SSH: Fail to parse private key: " + err.Error())
}
config.AddHostKey(private)

View File

@@ -33,6 +33,9 @@ func NewFuncMap() []template.FuncMap {
"GoVer": func() string {
return strings.Title(runtime.Version())
},
"Year": func() int {
return time.Now().Year()
},
"UseHTTPS": func() bool {
return strings.HasPrefix(setting.AppURL, "https")
},
@@ -64,7 +67,7 @@ func NewFuncMap() []template.FuncMap {
"AppendAvatarSize": tool.AppendAvatarSize,
"Safe": Safe,
"Sanitize": bluemonday.UGCPolicy().Sanitize,
"Str2html": Str2html,
"Str2HTML": Str2HTML,
"NewLine2br": NewLine2br,
"TimeSince": tool.TimeSince,
"RawTimeSince": tool.RawTimeSince,
@@ -94,13 +97,13 @@ func NewFuncMap() []template.FuncMap {
}
return str[start:end]
},
"Join": strings.Join,
"EllipsisString": tool.EllipsisString,
"DiffTypeToStr": DiffTypeToStr,
"DiffLineTypeToStr": DiffLineTypeToStr,
"Sha1": Sha1,
"ShortSHA1": tool.ShortSHA1,
"MD5": tool.MD5,
"Join": strings.Join,
"EllipsisString": tool.EllipsisString,
"DiffTypeToStr": DiffTypeToStr,
"DiffLineTypeToStr": DiffLineTypeToStr,
"Sha1": Sha1,
"ShortSHA1": tool.ShortSHA1,
"MD5": tool.MD5,
"ActionContent2Commits": ActionContent2Commits,
"EscapePound": EscapePound,
"RenderCommitMessage": RenderCommitMessage,
@@ -127,7 +130,7 @@ func Safe(raw string) template.HTML {
return template.HTML(raw)
}
func Str2html(raw string) template.HTML {
func Str2HTML(raw string) template.HTML {
return template.HTML(markup.Sanitize(raw))
}
@@ -176,12 +179,14 @@ func ToUTF8WithErr(content []byte) (error, string) {
return err, result
}
// FIXME: Unused function
func ToUTF8(content string) string {
_, res := ToUTF8WithErr([]byte(content))
return res
}
// Replaces all prefixes 'old' in 's' with 'new'.
// FIXME: Unused function
func ReplaceLeft(s, old, new string) string {
old_len, new_len, i, n := len(old), len(new), 0, 0
for ; i < len(s) && strings.HasPrefix(s[i:], old); n += 1 {
@@ -206,16 +211,16 @@ func ReplaceLeft(s, old, new string) string {
return string(replacement)
}
// RenderCommitMessage renders commit message with XSS-safe and special links.
func RenderCommitMessage(full bool, msg, urlPrefix string, metas map[string]string) template.HTML {
// RenderCommitMessage renders commit message with special links.
func RenderCommitMessage(full bool, msg, urlPrefix string, metas map[string]string) string {
cleanMsg := template.HTMLEscapeString(msg)
fullMessage := string(markup.RenderIssueIndexPattern([]byte(cleanMsg), urlPrefix, metas))
msgLines := strings.Split(strings.TrimSpace(fullMessage), "\n")
numLines := len(msgLines)
if numLines == 0 {
return template.HTML("")
return ""
} else if !full {
return template.HTML(msgLines[0])
return msgLines[0]
} else if numLines == 1 || (numLines >= 2 && len(msgLines[1]) == 0) {
// First line is a header, standalone or followed by empty line
header := fmt.Sprintf("<h3>%s</h3>", msgLines[0])
@@ -228,7 +233,7 @@ func RenderCommitMessage(full bool, msg, urlPrefix string, metas map[string]stri
// Non-standard git message, there is no header line
fullMessage = fmt.Sprintf("<h4>%s</h4>", strings.Join(msgLines, "<br>"))
}
return template.HTML(fullMessage)
return fullMessage
}
type Actioner interface {

23
pkg/tool/path.go Normal file
View File

@@ -0,0 +1,23 @@
// 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 tool
import (
"path/filepath"
"strings"
)
// IsSameSiteURLPath returns true if the URL path belongs to the same site, false otherwise.
// False: //url, http://url, /\url
// True: /url
func IsSameSiteURLPath(url string) bool {
return len(url) >= 2 && url[0] == '/' && url[1] != '/' && url[1] != '\\'
}
// IsMaliciousPath returns true if given path is an absolute path or contains malicious content
// which has potential to traverse upper level directories.
func IsMaliciousPath(path string) bool {
return filepath.IsAbs(path) || strings.Contains(path, "..")
}

53
pkg/tool/path_test.go Normal file
View File

@@ -0,0 +1,53 @@
// 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 tool
import (
"testing"
. "github.com/smartystreets/goconvey/convey"
)
func Test_IsSameSiteURLPath(t *testing.T) {
Convey("Check if a path belongs to the same site", t, func() {
testCases := []struct {
url string
expect bool
}{
{"//github.com", false},
{"http://github.com", false},
{"https://github.com", false},
{"/\\github.com", false},
{"/admin", true},
{"/user/repo", true},
}
for _, tc := range testCases {
So(IsSameSiteURLPath(tc.url), ShouldEqual, tc.expect)
}
})
}
func Test_IsMaliciousPath(t *testing.T) {
Convey("Detects malicious path", t, func() {
testCases := []struct {
path string
expect bool
}{
{"../../../../../../../../../data/gogs/data/sessions/a/9/a9f0ab6c3ef63dd8", true},
{"..\\/..\\/../data/gogs/data/sessions/a/9/a9f0ab6c3ef63dd8", true},
{"data/gogs/../../../../../../../../../data/sessions/a/9/a9f0ab6c3ef63dd8", true},
{"..\\..\\..\\..\\..\\..\\..\\..\\..\\data\\gogs\\data\\sessions\\a\\9\\a9f0ab6c3ef63dd8", true},
{"data\\gogs\\..\\..\\..\\..\\..\\..\\..\\..\\..\\data\\sessions\\a\\9\\a9f0ab6c3ef63dd8", true},
{"data/sessions/a/9/a9f0ab6c3ef63dd8", false},
{"data\\sessions\\a\\9\\a9f0ab6c3ef63dd8", false},
}
for _, tc := range testCases {
So(IsMaliciousPath(tc.path), ShouldEqual, tc.expect)
}
})
}

View File

@@ -6,6 +6,11 @@
</head>
<body>
<table id="jslicense-labels1">
<tr>
<td><a href="/js/jquery-1.11.3.min.js">jquery-1.11.3.min.js</a></td>
<td><a href="http://www.freebsd.org/copyright/freebsd-license.html">Expat</a></td>
<td><a href="https://code.jquery.com/jquery-1.11.3.js">jquery-1.11.3.js</a></td>
</tr>
<tr>
<td><a href="/js/libs/jquery.are-you-sure.js">jquery.are-you-sure.js</a></td>
<td>

View File

@@ -1,6 +1,6 @@
{
"CodeKitInfo": "This is a CodeKit 2.x project configuration file. It is designed to sync project settings across multiple machines. MODIFYING THE CONTENTS OF THIS FILE IS A POOR LIFE DECISION. If you do so, you will likely cause CodeKit to crash. This file is not useful unless accompanied by the project that created it in CodeKit 2. This file is not backwards-compatible with CodeKit 1.x. For more information, see: http:\/\/incident57.com\/codekit",
"creatorBuild": "19115",
"creatorBuild": "19127",
"files": {
"\/css\/github.min.css": {
"fileType": 16,

View File

@@ -296,7 +296,7 @@ code.wrap {
border-top: none;
line-height: 1em;
color: rgba(0, 0, 0, 0.8);
padding: .71428571em 1.14285714em !important;
padding: 0.71428571em 1.14285714em !important;
font-size: 1rem;
text-transform: none;
font-weight: 400;
@@ -347,6 +347,9 @@ footer .ui.language .menu {
.hide {
display: none;
}
.display.inline {
display: inline;
}
.center {
text-align: center;
}
@@ -941,8 +944,8 @@ footer .ui.language .menu {
}
.form .help {
color: #999999;
padding-top: .6em;
padding-bottom: .6em;
padding-top: 0.6em;
padding-bottom: 0.6em;
display: inline-block;
word-break: break-word;
}
@@ -1211,7 +1214,7 @@ footer .ui.language .menu {
.repository .filter.menu .label.color {
border-radius: 3px;
margin-left: 15px;
padding: 0 8px;
padding: 0 10px;
}
.repository .filter.menu .octicon {
float: left;
@@ -1243,18 +1246,20 @@ footer .ui.language .menu {
.repository #clone-panel {
margin-top: -8px;
margin-left: 5px;
width: 350px;
width: auto;
}
.repository #clone-panel input {
border-radius: 0;
padding: 5px 10px;
max-width: 190px;
width: 190px;
}
.repository #clone-panel .clone.button {
font-size: 13px;
padding: 0 5px;
}
.repository #clone-panel .clone.button:first-child {
border-radius: .28571429rem 0 0 .28571429rem;
border-radius: 0.28571429rem 0 0 0.28571429rem;
}
.repository #clone-panel .icon.button {
padding: 0 10px;
@@ -1425,7 +1430,7 @@ footer .ui.language .menu {
background-color: #f5f2f0;
font-family: Consolas, Monaco, 'Andale Mono', monospace;
padding: 1em;
margin: .5em 0;
margin: 0.5em 0;
}
.repository.file.list #file-content #ipython-notebook .nb-input:before,
.repository.file.list #file-content #ipython-notebook .nb-output:before {
@@ -2175,7 +2180,7 @@ footer .ui.language .menu {
}
.repository .diff-file-box .code-diff tbody tr.tag-code td {
background-color: #F0F0F0 !important;
border-color: #D2CECE!important;
border-color: #D2CECE !important;
padding-top: 4px;
padding-bottom: 4px;
}
@@ -2239,7 +2244,7 @@ footer .ui.language .menu {
font-weight: normal;
}
.repository.quickstart .guide .clone.button:first-child {
border-radius: .28571429rem 0 0 .28571429rem;
border-radius: 0.28571429rem 0 0 0.28571429rem;
}
.repository.quickstart .guide .ui.action.small.input {
width: 100%;
@@ -2520,10 +2525,10 @@ footer .ui.language .menu {
}
.issue.list > .item .desc a.milestone {
padding-left: 5px;
color: #999!important;
color: #999 !important;
}
.issue.list > .item .desc a.milestone:hover {
color: #000!important;
color: #000 !important;
}
.issue.list > .item .desc .assignee {
margin-top: -5px;
@@ -2934,6 +2939,9 @@ footer .ui.language .menu {
margin-top: 5px;
margin-right: 8px;
}
.user.profile .ui.card .profile-avatar {
height: 287px;
}
.user.profile .ui.card .header {
word-break: break-all;
}
@@ -3034,6 +3042,7 @@ footer .ui.language .menu {
}
.feeds .news p {
line-height: 1em;
overflow-wrap: break-word;
}
.feeds .news .time-since {
font-size: 13px;

View File

@@ -9,11 +9,11 @@ function initCommentPreviewTab($form) {
$tabMenu.find('.item[data-tab="' + $tabMenu.data('preview') + '"]').click(function () {
var $this = $(this);
$.post($this.data('url'), {
"_csrf": csrf,
"mode": "gfm",
"context": $this.data('context'),
"text": $form.find('.tab.segment[data-tab="' + $tabMenu.data('write') + '"] textarea').val()
},
"_csrf": csrf,
"mode": "gfm",
"context": $this.data('context'),
"text": $form.find('.tab.segment[data-tab="' + $tabMenu.data('write') + '"] textarea').val()
},
function (data) {
var $previewPanel = $form.find('.tab.segment[data-tab="' + $tabMenu.data('preview') + '"]');
$previewPanel.html(data);
@@ -39,11 +39,11 @@ function initEditPreviewTab($form) {
$previewTab.click(function () {
var $this = $(this);
$.post($this.data('url'), {
"_csrf": csrf,
"mode": "gfm",
"context": $this.data('context'),
"text": $form.find('.tab.segment[data-tab="' + $tabMenu.data('write') + '"] textarea').val()
},
"_csrf": csrf,
"mode": "gfm",
"context": $this.data('context'),
"text": $form.find('.tab.segment[data-tab="' + $tabMenu.data('write') + '"] textarea').val()
},
function (data) {
var $previewPanel = $form.find('.tab.segment[data-tab="' + $tabMenu.data('preview') + '"]');
$previewPanel.html(data);
@@ -63,9 +63,9 @@ function initEditDiffTab($form) {
$tabMenu.find('.item[data-tab="' + $tabMenu.data('diff') + '"]').click(function () {
var $this = $(this);
$.post($this.data('url'), {
"_csrf": csrf,
"content": $form.find('.tab.segment[data-tab="' + $tabMenu.data('write') + '"] textarea').val()
},
"_csrf": csrf,
"content": $form.find('.tab.segment[data-tab="' + $tabMenu.data('write') + '"] textarea').val()
},
function (data) {
var $diffPreviewPanel = $form.find('.tab.segment[data-tab="' + $tabMenu.data('diff') + '"]');
$diffPreviewPanel.html(data);
@@ -221,7 +221,7 @@ function initRepository() {
window.location.href = $choice.data('url');
console.log($choice.data('url'))
},
message: {noResults: $dropdown.data('no-results')}
message: { noResults: $dropdown.data('no-results') }
});
}
@@ -346,9 +346,9 @@ function initRepository() {
}
$.post($(this).data('update-url'), {
"_csrf": csrf,
"title": $editInput.val()
},
"_csrf": csrf,
"title": $editInput.val()
},
function (data) {
$editInput.val(data.title);
$issueTitle.text(data.title);
@@ -390,10 +390,10 @@ function initRepository() {
$editContentZone.hide();
$.post($editContentZone.data('update-url'), {
"_csrf": csrf,
"content": $textarea.val(),
"context": $editContentZone.data('context')
},
"_csrf": csrf,
"content": $textarea.val(),
"context": $editContentZone.data('context')
},
function (data) {
if (data.length == 0) {
$renderContent.html($('#no-content').html());
@@ -500,14 +500,14 @@ function initRepository() {
initFilterSearchDropdown('.choose.branch .dropdown');
}
if ($('.repository.view.pull').length > 0) {
$('.comment.merge.box input[name=merge_style]').change(function () {
if ($(this).val() === 'create_merge_commit') {
$('.commit.description.field').show();
} else {
$('.commit.description.field').hide();
}
})
}
$('.comment.merge.box input[name=merge_style]').change(function () {
if ($(this).val() === 'create_merge_commit') {
$('.commit.description.field').show();
} else {
$('.commit.description.field').hide();
}
})
}
}
function initWikiForm() {
@@ -521,11 +521,11 @@ function initWikiForm() {
setTimeout(function () {
// FIXME: still send render request when return back to edit mode
$.post($editArea.data('url'), {
"_csrf": csrf,
"mode": "gfm",
"context": $editArea.data('context'),
"text": plainText
},
"_csrf": csrf,
"mode": "gfm",
"context": $editArea.data('context'),
"text": plainText
},
function (data) {
preview.innerHTML = '<div class="markdown">' + data + '</div>';
emojify.run($('.editor-preview')[0]);
@@ -603,11 +603,11 @@ function setSimpleMDE($editArea) {
setTimeout(function () {
// FIXME: still send render request when return back to edit mode
$.post($editArea.data('url'), {
"_csrf": csrf,
"mode": "gfm",
"context": $editArea.data('context'),
"text": plainText
},
"_csrf": csrf,
"mode": "gfm",
"context": $editArea.data('context'),
"text": plainText
},
function (data) {
preview.innerHTML = '<div class="markdown">' + data + '</div>';
emojify.run($('.editor-preview')[0]);
@@ -652,10 +652,10 @@ function initEditor() {
$('.js-quick-pull-choice-option').change(function () {
if ($(this).val() == 'commit-to-new-branch') {
$('.quick-pull-branch-name').show();
$('.quick-pull-branch-name input').prop('required',true);
$('.quick-pull-branch-name input').prop('required', true);
} else {
$('.quick-pull-branch-name').hide();
$('.quick-pull-branch-name input').prop('required',false);
$('.quick-pull-branch-name input').prop('required', false);
}
});
@@ -705,7 +705,7 @@ function initEditor() {
var tree_path = parts.join('/');
$('#tree_path').val(tree_path);
$('#preview-tab').data('context', $('#preview-tab').data('root-context') + tree_path.substring(0, tree_path.lastIndexOf("/")+1));
$('#preview-tab').data('context', $('#preview-tab').data('root-context') + tree_path.substring(0, tree_path.lastIndexOf("/") + 1));
}).trigger('keyup');
var $editArea = $('.repository.editor textarea#edit_area');
@@ -775,7 +775,7 @@ function initEditor() {
value = value.split('/');
value = value[value.length - 1];
$.getJSON($editFilename.data('ec-url-prefix')+value, function(editorconfig) {
$.getJSON($editFilename.data('ec-url-prefix') + value, function (editorconfig) {
if (editorconfig.indent_style === 'tab') {
codeMirrorEditor.setOption("indentWithTabs", true);
codeMirrorEditor.setOption('extraKeys', {});
@@ -785,7 +785,7 @@ function initEditor() {
// - https://github.com/codemirror/CodeMirror/issues/988
// - https://codemirror.net/doc/manual.html#keymaps
codeMirrorEditor.setOption('extraKeys', {
Tab: function(cm) {
Tab: function (cm) {
var spaces = Array(parseInt(cm.getOption("indentUnit")) + 1).join(" ");
cm.replaceSelection(spaces);
}
@@ -860,6 +860,7 @@ function initAdmin() {
$('.dldap').hide();
$('.smtp').hide();
$('.pam').hide();
$('.github').hide();
$('.has-tls').hide();
var authType = $(this).val();
@@ -877,7 +878,10 @@ function initAdmin() {
case '5': // LDAP
$('.dldap').show();
break;
}
case '6': //GITHUB
$('.github').show();
break;
}
if (authType == '2' || authType == '5') {
onSecurityProtocolChange()
@@ -1131,7 +1135,7 @@ function initWebhookSettings() {
$($(this).data('target') + ' .nohighlight').each(function () {
var $this = $(this);
$this.removeClass('nohighlight');
setTimeout(function(){ hljs.highlightBlock($this[0]) }, 500);
setTimeout(function () { hljs.highlightBlock($this[0]) }, 500);
})
})
@@ -1213,7 +1217,7 @@ $(document).ready(function () {
var filenameDict = {};
$dropzone.dropzone({
url: $dropzone.data('upload-url'),
headers: {"X-Csrf-Token": csrf},
headers: { "X-Csrf-Token": csrf },
maxFiles: $dropzone.data('max-file'),
maxFilesize: $dropzone.data('max-size'),
acceptedFiles: ($dropzone.data('accepts') === '*/*') ? null : $dropzone.data('accepts'),
@@ -1336,6 +1340,10 @@ $(document).ready(function () {
window.location.href = $this.data('done-url');
});
});
// To make arbitrary form element to behave like a submit button
$('.submit-button').click(function () {
$($(this).data('form')).submit();
});
// Check or select on option to enable/disable target region
$('.enable-system').change(function () {
@@ -1459,7 +1467,7 @@ $(function () {
$('form').areYouSure();
});
// getByteLen counts bytes in a string's UTF-8 representation.
// getByteLen counts bytes in a string's UTF-8 representation.
function getByteLen(normalVal) {
// Force string type
normalVal = String(normalVal);
@@ -1467,19 +1475,19 @@ function getByteLen(normalVal) {
var byteLen = 0;
for (var i = 0; i < normalVal.length; i++) {
var c = normalVal.charCodeAt(i);
byteLen += c < (1 << 7) ? 1 :
c < (1 << 11) ? 2 :
c < (1 << 16) ? 3 :
c < (1 << 21) ? 4 :
c < (1 << 26) ? 5 :
c < (1 << 31) ? 6 : Number.NaN;
byteLen += c < (1 << 7) ? 1 :
c < (1 << 11) ? 2 :
c < (1 << 16) ? 3 :
c < (1 << 21) ? 4 :
c < (1 << 26) ? 5 :
c < (1 << 31) ? 6 : Number.NaN;
}
return byteLen;
}
function showMessageMaxLength(maxLen, textElemId, counterId) {
var $msg = $('#'+textElemId);
$('#'+counterId).html(maxLen - getByteLen($msg.val()));
var $msg = $('#' + textElemId);
$('#' + counterId).html(maxLen - getByteLen($msg.val()));
var onMessageKey = function (e) {
var $msg = $(this);
@@ -1492,7 +1500,7 @@ function showMessageMaxLength(maxLen, textElemId, counterId) {
remainder = 0;
}
$('#'+counterId).html(remainder);
$('#' + counterId).html(remainder);
};
$msg.keyup(onMessageKey).keydown(onMessageKey);

View File

@@ -384,6 +384,11 @@ footer {
.hide {
display: none;
}
.display {
&.inline {
display: inline;
}
}
.center {
text-align: center;
}

View File

@@ -61,6 +61,7 @@
}
p {
line-height: 1em;
overflow-wrap: break-word;
}
.time-since {
font-size: 13px;

View File

@@ -91,7 +91,7 @@
.label.color {
border-radius: 3px;
margin-left: 15px;
padding: 0 8px;
padding: 0 10px;
}
.octicon {
float: left;
@@ -128,11 +128,13 @@
#clone-panel {
margin-top: -8px;
margin-left: 5px;
width: 350px;
width: auto;
input {
border-radius: 0;
padding: 5px 10px;
max-width: 190px;
width: 190px;
}
.clone.button {

View File

@@ -60,6 +60,9 @@
&.profile {
.ui.card {
.profile-avatar {
height: 287px;
}
.header {
word-break: break-all;
}

View File

@@ -6,6 +6,8 @@ package admin
import (
"fmt"
"net/http"
"strings"
"github.com/Unknwon/com"
"github.com/go-xorm/core"
@@ -51,6 +53,7 @@ var (
{models.LoginNames[models.LOGIN_DLDAP], models.LOGIN_DLDAP},
{models.LoginNames[models.LOGIN_SMTP], models.LOGIN_SMTP},
{models.LoginNames[models.LOGIN_PAM], models.LOGIN_PAM},
{models.LoginNames[models.LOGIN_GITHUB], models.LOGIN_GITHUB},
}
securityProtocols = []dropdownItem{
{models.SecurityProtocolNames[ldap.SECURITY_PROTOCOL_UNENCRYPTED], ldap.SECURITY_PROTOCOL_UNENCRYPTED},
@@ -138,8 +141,12 @@ func NewAuthSourcePost(c *context.Context, f form.Authentication) {
config = &models.PAMConfig{
ServiceName: f.PAMServiceName,
}
case models.LOGIN_GITHUB:
config = &models.GitHubConfig{
APIEndpoint: strings.TrimSuffix(f.GitHubAPIEndpoint, "/") + "/",
}
default:
c.Error(400)
c.Error(http.StatusBadRequest)
return
}
c.Data["HasTLS"] = hasTLS
@@ -157,7 +164,7 @@ func NewAuthSourcePost(c *context.Context, f form.Authentication) {
Cfg: config,
}); err != nil {
if models.IsErrLoginSourceAlreadyExist(err) {
c.Data["Err_Name"] = true
c.FormErr("Name")
c.RenderWithErr(c.Tr("admin.auths.login_source_exist", err.(models.ErrLoginSourceAlreadyExist).Name), AUTH_NEW, f)
} else {
c.ServerError("CreateSource", err)
@@ -220,8 +227,12 @@ func EditAuthSourcePost(c *context.Context, f form.Authentication) {
config = &models.PAMConfig{
ServiceName: f.PAMServiceName,
}
case models.LOGIN_GITHUB:
config = &models.GitHubConfig{
APIEndpoint: strings.TrimSuffix(f.GitHubAPIEndpoint, "/") + "/",
}
default:
c.Error(400)
c.Error(http.StatusBadRequest)
return
}

View File

@@ -12,7 +12,6 @@ import (
"github.com/gogs/gogs/routes/api/v1/user"
)
// https://github.com/gogs/go-gogs-client/wiki/Administration-Organizations#create-a-new-organization
func CreateOrg(c *context.APIContext, form api.CreateOrgOption) {
org.CreateOrgForUser(c, form, user.GetUserByParams(c))
}

View File

@@ -13,11 +13,7 @@ import (
func GetRepositoryByParams(c *context.APIContext) *models.Repository {
repo, err := models.GetRepositoryByName(c.Org.Team.OrgID, c.Params(":reponame"))
if err != nil {
if errors.IsRepoNotExist(err) {
c.Status(404)
} else {
c.Error(500, "GetRepositoryByName", err)
}
c.NotFoundOrServerError("GetRepositoryByName", errors.IsRepoNotExist, err)
return nil
}
return repo
@@ -29,11 +25,11 @@ func AddTeamRepository(c *context.APIContext) {
return
}
if err := c.Org.Team.AddRepository(repo); err != nil {
c.Error(500, "AddRepository", err)
c.ServerError("AddRepository", err)
return
}
c.Status(204)
c.NoContent()
}
func RemoveTeamRepository(c *context.APIContext) {
@@ -42,9 +38,9 @@ func RemoveTeamRepository(c *context.APIContext) {
return
}
if err := c.Org.Team.RemoveRepository(repo.ID); err != nil {
c.Error(500, "RemoveRepository", err)
c.ServerError("RemoveRepository", err)
return
}
c.Status(204)
c.NoContent()
}

View File

@@ -5,6 +5,8 @@
package admin
import (
"net/http"
api "github.com/gogs/go-gogs-client"
"github.com/gogs/gogs/models"
@@ -22,14 +24,14 @@ func CreateTeam(c *context.APIContext, form api.CreateTeamOption) {
}
if err := models.NewTeam(team); err != nil {
if models.IsErrTeamAlreadyExist(err) {
c.Error(422, "", err)
c.Error(http.StatusUnprocessableEntity, "", err)
} else {
c.Error(500, "NewTeam", err)
c.ServerError("NewTeam", err)
}
return
}
c.JSON(201, convert.ToTeam(team))
c.JSON(http.StatusCreated, convert.ToTeam(team))
}
func AddTeamMember(c *context.APIContext) {
@@ -38,11 +40,11 @@ func AddTeamMember(c *context.APIContext) {
return
}
if err := c.Org.Team.AddMember(u.ID); err != nil {
c.Error(500, "AddMember", err)
c.ServerError("AddMember", err)
return
}
c.Status(204)
c.NoContent()
}
func RemoveTeamMember(c *context.APIContext) {
@@ -52,9 +54,9 @@ func RemoveTeamMember(c *context.APIContext) {
}
if err := c.Org.Team.RemoveMember(u.ID); err != nil {
c.Error(500, "RemoveMember", err)
c.ServerError("RemoveMember", err)
return
}
c.Status(204)
c.NoContent()
}

View File

@@ -12,7 +12,6 @@ import (
"github.com/gogs/gogs/routes/api/v1/user"
)
// https://github.com/gogs/go-gogs-client/wiki/Administration-Repositories#create-a-new-repository
func CreateRepo(c *context.APIContext, form api.CreateRepoOption) {
owner := user.GetUserByParams(c)
if c.Written() {

View File

@@ -5,6 +5,8 @@
package admin
import (
"net/http"
log "gopkg.in/clog.v1"
api "github.com/gogs/go-gogs-client"
@@ -25,9 +27,9 @@ func parseLoginSource(c *context.APIContext, u *models.User, sourceID int64, log
source, err := models.GetLoginSourceByID(sourceID)
if err != nil {
if errors.IsLoginSourceNotExist(err) {
c.Error(422, "", err)
c.Error(http.StatusUnprocessableEntity, "", err)
} else {
c.Error(500, "GetLoginSourceByID", err)
c.ServerError("GetLoginSourceByID", err)
}
return
}
@@ -37,7 +39,6 @@ func parseLoginSource(c *context.APIContext, u *models.User, sourceID int64, log
u.LoginName = loginName
}
// https://github.com/gogs/go-gogs-client/wiki/Administration-Users#create-a-new-user
func CreateUser(c *context.APIContext, form api.CreateUserOption) {
u := &models.User{
Name: form.Username,
@@ -58,23 +59,22 @@ func CreateUser(c *context.APIContext, form api.CreateUserOption) {
models.IsErrEmailAlreadyUsed(err) ||
models.IsErrNameReserved(err) ||
models.IsErrNamePatternNotAllowed(err) {
c.Error(422, "", err)
c.Error(http.StatusUnprocessableEntity, "", err)
} else {
c.Error(500, "CreateUser", err)
c.ServerError("CreateUser", err)
}
return
}
log.Trace("Account created by admin (%s): %s", c.User.Name, u.Name)
log.Trace("Account created by admin %q: %s", c.User.Name, u.Name)
// Send email notification.
if form.SendNotify && setting.MailService != nil {
mailer.SendRegisterNotifyMail(c.Context.Context, models.NewMailerUser(u))
}
c.JSON(201, u.APIFormat())
c.JSON(http.StatusCreated, u.APIFormat())
}
// https://github.com/gogs/go-gogs-client/wiki/Administration-Users#edit-an-existing-user
func EditUser(c *context.APIContext, form api.EditUserOption) {
u := user.GetUserByParams(c)
if c.Written() {
@@ -90,7 +90,7 @@ func EditUser(c *context.APIContext, form api.EditUserOption) {
u.Passwd = form.Password
var err error
if u.Salt, err = models.GetUserSalt(); err != nil {
c.Error(500, "UpdateUser", err)
c.ServerError("GetUserSalt", err)
return
}
u.EncodePasswd()
@@ -119,18 +119,17 @@ func EditUser(c *context.APIContext, form api.EditUserOption) {
if err := models.UpdateUser(u); err != nil {
if models.IsErrEmailAlreadyUsed(err) {
c.Error(422, "", err)
c.Error(http.StatusUnprocessableEntity, "", err)
} else {
c.Error(500, "UpdateUser", err)
c.ServerError("UpdateUser", err)
}
return
}
log.Trace("Account profile updated by admin (%s): %s", c.User.Name, u.Name)
log.Trace("Account profile updated by admin %q: %s", c.User.Name, u.Name)
c.JSON(200, u.APIFormat())
c.JSONSuccess(u.APIFormat())
}
// https://github.com/gogs/go-gogs-client/wiki/Administration-Users#delete-a-user
func DeleteUser(c *context.APIContext) {
u := user.GetUserByParams(c)
if c.Written() {
@@ -140,18 +139,17 @@ func DeleteUser(c *context.APIContext) {
if err := models.DeleteUser(u); err != nil {
if models.IsErrUserOwnRepos(err) ||
models.IsErrUserHasOrgs(err) {
c.Error(422, "", err)
c.Error(http.StatusUnprocessableEntity, "", err)
} else {
c.Error(500, "DeleteUser", err)
c.ServerError("DeleteUser", err)
}
return
}
log.Trace("Account deleted by admin(%s): %s", c.User.Name, u.Name)
c.Status(204)
c.NoContent()
}
// https://github.com/gogs/go-gogs-client/wiki/Administration-Users#create-a-public-key-for-user
func CreatePublicKey(c *context.APIContext, form api.CreateKeyOption) {
u := user.GetUserByParams(c)
if c.Written() {

View File

@@ -5,6 +5,7 @@
package v1
import (
"net/http"
"strings"
"github.com/go-macaron/binding"
@@ -23,103 +24,58 @@ import (
"github.com/gogs/gogs/routes/api/v1/user"
)
// repoAssignment extracts information from URL parameters to retrieve the repository,
// and makes sure the context user has at least the read access to the repository.
func repoAssignment() macaron.Handler {
return func(c *context.APIContext) {
userName := c.Params(":username")
repoName := c.Params(":reponame")
username := c.Params(":username")
reponame := c.Params(":reponame")
var (
owner *models.User
err error
)
var err error
var owner *models.User
// Check if the user is the same as the repository owner.
if c.IsLogged && c.User.LowerName == strings.ToLower(userName) {
// Check if the context user is the repository owner.
if c.IsLogged && c.User.LowerName == strings.ToLower(username) {
owner = c.User
} else {
owner, err = models.GetUserByName(userName)
owner, err = models.GetUserByName(username)
if err != nil {
if errors.IsUserNotExist(err) {
c.Status(404)
} else {
c.Error(500, "GetUserByName", err)
}
c.NotFoundOrServerError("GetUserByName", errors.IsUserNotExist, err)
return
}
}
c.Repo.Owner = owner
// Get repository.
repo, err := models.GetRepositoryByName(owner.ID, repoName)
r, err := models.GetRepositoryByName(owner.ID, reponame)
if err != nil {
if errors.IsRepoNotExist(err) {
c.Status(404)
} else {
c.Error(500, "GetRepositoryByName", err)
}
c.NotFoundOrServerError("GetRepositoryByName", errors.IsRepoNotExist, err)
return
} else if err = repo.GetOwner(); err != nil {
c.Error(500, "GetOwner", err)
} else if err = r.GetOwner(); err != nil {
c.ServerError("GetOwner", err)
return
}
if c.IsLogged && c.User.IsAdmin {
if c.IsTokenAuth && c.User.IsAdmin {
c.Repo.AccessMode = models.ACCESS_MODE_OWNER
} else {
mode, err := models.AccessLevel(c.User.ID, repo)
mode, err := models.UserAccessMode(c.UserID(), r)
if err != nil {
c.Error(500, "AccessLevel", err)
c.ServerError("UserAccessMode", err)
return
}
c.Repo.AccessMode = mode
}
if !c.Repo.HasAccess() {
c.Status(404)
c.NotFound()
return
}
c.Repo.Repository = repo
}
}
// Contexter middleware already checks token for user sign in process.
func reqToken() macaron.Handler {
return func(c *context.Context) {
if !c.IsLogged {
c.Error(401)
return
}
}
}
func reqBasicAuth() macaron.Handler {
return func(c *context.Context) {
if !c.IsBasicAuth {
c.Error(401)
return
}
}
}
func reqAdmin() macaron.Handler {
return func(c *context.Context) {
if !c.IsLogged || !c.User.IsAdmin {
c.Error(403)
return
}
}
}
func reqRepoWriter() macaron.Handler {
return func(c *context.Context) {
if !c.Repo.IsWriter() {
c.Error(403)
return
}
c.Repo.Repository = r
}
}
// orgAssignment extracts information from URL parameters to retrieve the organization or team.
func orgAssignment(args ...bool) macaron.Handler {
var (
assignOrg bool
@@ -138,11 +94,7 @@ func orgAssignment(args ...bool) macaron.Handler {
if assignOrg {
c.Org.Organization, err = models.GetUserByName(c.Params(":orgname"))
if err != nil {
if errors.IsUserNotExist(err) {
c.Status(404)
} else {
c.Error(500, "GetUserByName", err)
}
c.NotFoundOrServerError("GetUserByName", errors.IsUserNotExist, err)
return
}
}
@@ -150,25 +102,71 @@ func orgAssignment(args ...bool) macaron.Handler {
if assignTeam {
c.Org.Team, err = models.GetTeamByID(c.ParamsInt64(":teamid"))
if err != nil {
if errors.IsUserNotExist(err) {
c.Status(404)
} else {
c.Error(500, "GetTeamById", err)
}
c.NotFoundOrServerError("GetTeamByID", errors.IsTeamNotExist, err)
return
}
}
}
}
// reqToken makes sure the context user is authorized via access token.
func reqToken() macaron.Handler {
return func(c *context.Context) {
if !c.IsTokenAuth {
c.Error(http.StatusUnauthorized)
return
}
}
}
// reqBasicAuth makes sure the context user is authorized via HTTP Basic Auth.
func reqBasicAuth() macaron.Handler {
return func(c *context.Context) {
if !c.IsBasicAuth {
c.Error(http.StatusUnauthorized)
return
}
}
}
// reqAdmin makes sure the context user is a site admin.
func reqAdmin() macaron.Handler {
return func(c *context.Context) {
if !c.IsLogged || !c.User.IsAdmin {
c.Error(http.StatusForbidden)
return
}
}
}
// reqRepoWriter makes sure the context user has at least write access to the repository.
func reqRepoWriter() macaron.Handler {
return func(c *context.Context) {
if !c.Repo.IsWriter() {
c.Error(http.StatusForbidden)
return
}
}
}
// reqRepoWriter makes sure the context user has at least admin access to the repository.
func reqRepoAdmin() macaron.Handler {
return func(c *context.Context) {
if !c.Repo.IsAdmin() {
c.Error(http.StatusForbidden)
return
}
}
}
func mustEnableIssues(c *context.APIContext) {
if !c.Repo.Repository.EnableIssues || c.Repo.Repository.EnableExternalTracker {
c.Status(404)
c.NotFound()
return
}
}
// RegisterRoutes registers all v1 APIs routes to web application.
// RegisterRoutes registers all routes in API v1 to the web application.
// FIXME: custom form error response
func RegisterRoutes(m *macaron.Macaron) {
bind := binding.Bind
@@ -189,7 +187,8 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Get("", user.GetInfo)
m.Group("/tokens", func() {
m.Combo("").Get(user.ListAccessTokens).
m.Combo("").
Get(user.ListAccessTokens).
Post(bind(api.CreateAccessTokenOption{}), user.CreateAccessToken)
}, reqBasicAuth())
})
@@ -209,54 +208,68 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Group("/user", func() {
m.Get("", user.GetAuthenticatedUser)
m.Combo("/emails").Get(user.ListEmails).
m.Combo("/emails").
Get(user.ListEmails).
Post(bind(api.CreateEmailOption{}), user.AddEmail).
Delete(bind(api.CreateEmailOption{}), user.DeleteEmail)
m.Get("/followers", user.ListMyFollowers)
m.Group("/following", func() {
m.Get("", user.ListMyFollowing)
m.Combo("/:username").Get(user.CheckMyFollowing).Put(user.Follow).Delete(user.Unfollow)
m.Combo("/:username").
Get(user.CheckMyFollowing).
Put(user.Follow).
Delete(user.Unfollow)
})
m.Group("/keys", func() {
m.Combo("").Get(user.ListMyPublicKeys).
m.Combo("").
Get(user.ListMyPublicKeys).
Post(bind(api.CreateKeyOption{}), user.CreatePublicKey)
m.Combo("/:id").Get(user.GetPublicKey).
m.Combo("/:id").
Get(user.GetPublicKey).
Delete(user.DeletePublicKey)
})
m.Combo("/issues").Get(repo.ListUserIssues)
m.Get("/issues", repo.ListUserIssues)
}, reqToken())
// Repositories
m.Get("/users/:username/repos", reqToken(), repo.ListUserRepositories)
m.Get("/orgs/:org/repos", reqToken(), repo.ListOrgRepositories)
m.Combo("/user/repos", reqToken()).Get(repo.ListMyRepos).
m.Combo("/user/repos", reqToken()).
Get(repo.ListMyRepos).
Post(bind(api.CreateRepoOption{}), repo.Create)
m.Post("/org/:org/repos", reqToken(), bind(api.CreateRepoOption{}), repo.CreateOrgRepo)
m.Group("/repos", func() {
m.Get("/search", repo.Search)
m.Get("/:username/:reponame", repoAssignment(), repo.Get)
})
m.Group("/repos", func() {
m.Post("/migrate", bind(form.MigrateRepo{}), repo.Migrate)
m.Combo("/:username/:reponame", repoAssignment()).Get(repo.Get).
Delete(repo.Delete)
m.Delete("/:username/:reponame", repoAssignment(), repo.Delete)
m.Group("/:username/:reponame", func() {
m.Group("/hooks", func() {
m.Combo("").Get(repo.ListHooks).
m.Combo("").
Get(repo.ListHooks).
Post(bind(api.CreateHookOption{}), repo.CreateHook)
m.Combo("/:id").Patch(bind(api.EditHookOption{}), repo.EditHook).
m.Combo("/:id").
Patch(bind(api.EditHookOption{}), repo.EditHook).
Delete(repo.DeleteHook)
})
}, reqRepoAdmin())
m.Group("/collaborators", func() {
m.Get("", repo.ListCollaborators)
m.Combo("/:collaborator").Get(repo.IsCollaborator).Put(bind(api.AddCollaboratorOption{}), repo.AddCollaborator).
m.Combo("/:collaborator").
Get(repo.IsCollaborator).
Put(bind(api.AddCollaboratorOption{}), repo.AddCollaborator).
Delete(repo.DeleteCollaborator)
})
}, reqRepoAdmin())
m.Get("/raw/*", context.RepoRef(), repo.GetRawFile)
m.Get("/archive/*", repo.GetArchive)
m.Get("/forks", repo.ListForks)
@@ -264,51 +277,77 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Get("", repo.ListBranches)
m.Get("/*", repo.GetBranch)
})
m.Group("/keys", func() {
m.Combo("").Get(repo.ListDeployKeys).
Post(bind(api.CreateKeyOption{}), repo.CreateDeployKey)
m.Combo("/:id").Get(repo.GetDeployKey).
Delete(repo.DeleteDeploykey)
m.Group("/commits", func() {
m.Get("/:sha", repo.GetSingleCommit)
m.Get("/*", repo.GetReferenceSHA)
})
m.Group("/keys", func() {
m.Combo("").
Get(repo.ListDeployKeys).
Post(bind(api.CreateKeyOption{}), repo.CreateDeployKey)
m.Combo("/:id").
Get(repo.GetDeployKey).
Delete(repo.DeleteDeploykey)
}, reqRepoAdmin())
m.Group("/issues", func() {
m.Combo("").Get(repo.ListIssues).Post(bind(api.CreateIssueOption{}), repo.CreateIssue)
m.Combo("").
Get(repo.ListIssues).
Post(bind(api.CreateIssueOption{}), repo.CreateIssue)
m.Group("/comments", func() {
m.Get("", repo.ListRepoIssueComments)
m.Combo("/:id").Patch(bind(api.EditIssueCommentOption{}), repo.EditIssueComment)
m.Patch("/:id", bind(api.EditIssueCommentOption{}), repo.EditIssueComment)
})
m.Group("/:index", func() {
m.Combo("").Get(repo.GetIssue).Patch(bind(api.EditIssueOption{}), repo.EditIssue)
m.Combo("").
Get(repo.GetIssue).
Patch(bind(api.EditIssueOption{}), repo.EditIssue)
m.Group("/comments", func() {
m.Combo("").Get(repo.ListIssueComments).Post(bind(api.CreateIssueCommentOption{}), repo.CreateIssueComment)
m.Combo("/:id").Patch(bind(api.EditIssueCommentOption{}), repo.EditIssueComment).
m.Combo("").
Get(repo.ListIssueComments).
Post(bind(api.CreateIssueCommentOption{}), repo.CreateIssueComment)
m.Combo("/:id").
Patch(bind(api.EditIssueCommentOption{}), repo.EditIssueComment).
Delete(repo.DeleteIssueComment)
})
m.Get("/labels", repo.ListIssueLabels)
m.Group("/labels", func() {
m.Combo("").Get(repo.ListIssueLabels).
m.Combo("").
Post(bind(api.IssueLabelsOption{}), repo.AddIssueLabels).
Put(bind(api.IssueLabelsOption{}), repo.ReplaceIssueLabels).
Delete(repo.ClearIssueLabels)
m.Delete("/:id", repo.DeleteIssueLabel)
})
}, reqRepoWriter())
})
}, mustEnableIssues)
m.Group("/labels", func() {
m.Combo("").Get(repo.ListLabels).
Post(bind(api.CreateLabelOption{}), repo.CreateLabel)
m.Combo("/:id").Get(repo.GetLabel).Patch(bind(api.EditLabelOption{}), repo.EditLabel).
m.Get("", repo.ListLabels)
m.Get("/:id", repo.GetLabel)
})
m.Group("/labels", func() {
m.Post("", bind(api.CreateLabelOption{}), repo.CreateLabel)
m.Combo("/:id").
Patch(bind(api.EditLabelOption{}), repo.EditLabel).
Delete(repo.DeleteLabel)
}, reqRepoWriter())
m.Group("/milestones", func() {
m.Get("", repo.ListMilestones)
m.Get("/:id", repo.GetMilestone)
})
m.Group("/milestones", func() {
m.Combo("").Get(repo.ListMilestones).
Post(reqRepoWriter(), bind(api.CreateMilestoneOption{}), repo.CreateMilestone)
m.Combo("/:id").Get(repo.GetMilestone).
Patch(reqRepoWriter(), bind(api.EditMilestoneOption{}), repo.EditMilestone).
Delete(reqRepoWriter(), repo.DeleteMilestone)
})
m.Post("/mirror-sync", repo.MirrorSync)
m.Post("", bind(api.CreateMilestoneOption{}), repo.CreateMilestone)
m.Combo("/:id").
Patch(bind(api.EditMilestoneOption{}), repo.EditMilestone).
Delete(repo.DeleteMilestone)
}, reqRepoWriter())
m.Patch("/issue-tracker", reqRepoWriter(), bind(api.EditIssueTrackerOption{}), repo.IssueTracker)
m.Post("/mirror-sync", reqRepoWriter(), repo.MirrorSync)
m.Get("/editorconfig/:filename", context.RepoRef(), repo.GetEditorconfig)
}, repoAssignment())
}, reqToken())
@@ -316,24 +355,25 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Get("/issues", reqToken(), repo.ListUserIssues)
// Organizations
m.Combo("/user/orgs", reqToken()).Get(org.ListMyOrgs).Post(bind(api.CreateOrgOption{}), org.CreateMyOrg)
m.Combo("/user/orgs", reqToken()).
Get(org.ListMyOrgs).
Post(bind(api.CreateOrgOption{}), org.CreateMyOrg)
m.Get("/users/:username/orgs", org.ListUserOrgs)
m.Group("/orgs/:orgname", func() {
m.Combo("").Get(org.Get).Patch(bind(api.EditOrgOption{}), org.Edit)
m.Combo("/teams").Get(org.ListTeams)
m.Combo("").
Get(org.Get).
Patch(bind(api.EditOrgOption{}), org.Edit)
m.Get("/teams", org.ListTeams)
}, orgAssignment(true))
m.Any("/*", func(c *context.Context) {
c.Error(404)
})
m.Group("/admin", func() {
m.Group("/users", func() {
m.Post("", bind(api.CreateUserOption{}), admin.CreateUser)
m.Group("/:username", func() {
m.Combo("").Patch(bind(api.EditUserOption{}), admin.EditUser).
m.Combo("").
Patch(bind(api.EditUserOption{}), admin.EditUser).
Delete(admin.DeleteUser)
m.Post("/keys", bind(api.CreateKeyOption{}), admin.CreatePublicKey)
m.Post("/orgs", bind(api.CreateOrgOption{}), admin.CreateOrg)
@@ -346,12 +386,21 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Post("", orgAssignment(true), bind(api.CreateTeamOption{}), admin.CreateTeam)
})
})
m.Group("/teams", func() {
m.Group("/:teamid", func() {
m.Combo("/members/:username").Put(admin.AddTeamMember).Delete(admin.RemoveTeamMember)
m.Combo("/repos/:reponame").Put(admin.AddTeamRepository).Delete(admin.RemoveTeamRepository)
m.Combo("/members/:username").
Put(admin.AddTeamMember).
Delete(admin.RemoveTeamMember)
m.Combo("/repos/:reponame").
Put(admin.AddTeamRepository).
Delete(admin.RemoveTeamRepository)
}, orgAssignment(false, true))
})
}, reqAdmin())
m.Any("/*", func(c *context.Context) {
c.NotFound()
})
}, context.APIContexter())
}

View File

@@ -5,16 +5,17 @@
package misc
import (
"net/http"
api "github.com/gogs/go-gogs-client"
"github.com/gogs/gogs/pkg/context"
"github.com/gogs/gogs/pkg/markup"
)
// https://github.com/gogs/go-gogs-client/wiki/Miscellaneous#render-an-arbitrary-markdown-document
func Markdown(c *context.APIContext, form api.MarkdownOption) {
if c.HasApiError() {
c.Error(422, "", c.GetErrMsg())
c.Error(http.StatusUnprocessableEntity, "", c.GetErrMsg())
return
}
@@ -31,11 +32,10 @@ func Markdown(c *context.APIContext, form api.MarkdownOption) {
}
}
// https://github.com/gogs/go-gogs-client/wiki/Miscellaneous#render-a-markdown-document-in-raw-mode
func MarkdownRaw(c *context.APIContext) {
body, err := c.Req.Body().Bytes()
if err != nil {
c.Error(422, "", err)
c.Error(http.StatusUnprocessableEntity, "", err)
return
}
c.Write(markup.RawMarkdown(body, ""))

View File

@@ -5,6 +5,8 @@
package org
import (
"net/http"
api "github.com/gogs/go-gogs-client"
"github.com/gogs/gogs/models"
@@ -31,9 +33,9 @@ func CreateOrgForUser(c *context.APIContext, apiForm api.CreateOrgOption, user *
if models.IsErrUserAlreadyExist(err) ||
models.IsErrNameReserved(err) ||
models.IsErrNamePatternNotAllowed(err) {
c.Error(422, "", err)
c.Error(http.StatusUnprocessableEntity, "", err)
} else {
c.Error(500, "CreateOrganization", err)
c.ServerError("CreateOrganization", err)
}
return
}
@@ -43,7 +45,7 @@ func CreateOrgForUser(c *context.APIContext, apiForm api.CreateOrgOption, user *
func listUserOrgs(c *context.APIContext, u *models.User, all bool) {
if err := u.GetOrganizations(all); err != nil {
c.Error(500, "GetOrganizations", err)
c.ServerError("GetOrganizations", err)
return
}
@@ -51,20 +53,17 @@ func listUserOrgs(c *context.APIContext, u *models.User, all bool) {
for i := range u.Orgs {
apiOrgs[i] = convert.ToOrganization(u.Orgs[i])
}
c.JSON(200, &apiOrgs)
c.JSONSuccess(&apiOrgs)
}
// https://github.com/gogs/go-gogs-client/wiki/Organizations#list-your-organizations
func ListMyOrgs(c *context.APIContext) {
listUserOrgs(c, c.User, true)
}
// https://github.com/gogs/go-gogs-client/wiki/Organizations#create-your-organization
func CreateMyOrg(c *context.APIContext, apiForm api.CreateOrgOption) {
CreateOrgForUser(c, apiForm, c.User)
}
// https://github.com/gogs/go-gogs-client/wiki/Organizations#list-user-organizations
func ListUserOrgs(c *context.APIContext) {
u := user.GetUserByParams(c)
if c.Written() {
@@ -73,16 +72,14 @@ func ListUserOrgs(c *context.APIContext) {
listUserOrgs(c, u, false)
}
// https://github.com/gogs/go-gogs-client/wiki/Organizations#get-an-organization
func Get(c *context.APIContext) {
c.JSON(200, convert.ToOrganization(c.Org.Organization))
c.JSONSuccess(convert.ToOrganization(c.Org.Organization))
}
// https://github.com/gogs/go-gogs-client/wiki/Organizations#edit-an-organization
func Edit(c *context.APIContext, form api.EditOrgOption) {
org := c.Org.Organization
if !org.IsOwnedBy(c.User.ID) {
c.Status(403)
c.Status(http.StatusForbidden)
return
}
@@ -91,9 +88,9 @@ func Edit(c *context.APIContext, form api.EditOrgOption) {
org.Website = form.Website
org.Location = form.Location
if err := models.UpdateUser(org); err != nil {
c.Error(500, "UpdateUser", err)
c.ServerError("UpdateUser", err)
return
}
c.JSON(200, convert.ToOrganization(org))
c.JSONSuccess(convert.ToOrganization(org))
}

View File

@@ -15,11 +15,7 @@ import (
func ListCollaborators(c *context.APIContext) {
collaborators, err := c.Repo.Repository.GetCollaborators()
if err != nil {
if errors.IsUserNotExist(err) {
c.Error(422, "", err)
} else {
c.Error(500, "GetCollaborators", err)
}
c.ServerError("GetCollaborators", err)
return
}
@@ -27,7 +23,7 @@ func ListCollaborators(c *context.APIContext) {
for i := range collaborators {
apiCollaborators[i] = collaborators[i].APIFormat()
}
c.JSON(200, &apiCollaborators)
c.JSONSuccess(&apiCollaborators)
}
func AddCollaborator(c *context.APIContext, form api.AddCollaboratorOption) {

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