mirror of
https://github.com/gogs/gogs.git
synced 2026-07-18 23:51:43 +02:00
Compare commits
117 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c154721f4a | ||
|
|
48cdae2829 | ||
|
|
9571a9b53d | ||
|
|
f1e0ebfe93 | ||
|
|
c7ba519af2 | ||
|
|
04de977855 | ||
|
|
591a05caa3 | ||
|
|
82700ea95a | ||
|
|
a36b29c25c | ||
|
|
c3af3ff1d0 | ||
|
|
1592e578ed | ||
|
|
e640683c97 | ||
|
|
e6bddd3ed2 | ||
|
|
bd0549caea | ||
|
|
08a53e5eca | ||
|
|
025972ef64 | ||
|
|
00a3e368b4 | ||
|
|
6b2465746a | ||
|
|
35e2cee5c5 | ||
|
|
d775fe7936 | ||
|
|
dc13eb6df0 | ||
|
|
798636c95b | ||
|
|
25fdf6cb16 | ||
|
|
044a45db2e | ||
|
|
0aec2df74f | ||
|
|
4f9c5b60c5 | ||
|
|
bd13df972e | ||
|
|
a971910723 | ||
|
|
b8a6fee6d6 | ||
|
|
0bfa981e70 | ||
|
|
070bdda011 | ||
|
|
e19c026083 | ||
|
|
8b383f86de | ||
|
|
9ebd62f676 | ||
|
|
2c3e2b701e | ||
|
|
16f95123cd | ||
|
|
0a176df6fb | ||
|
|
d862c43be0 | ||
|
|
a452767e34 | ||
|
|
f0aeef82a1 | ||
|
|
06b6eaba06 | ||
|
|
713a7d518d | ||
|
|
5702e4bc24 | ||
|
|
9b37b1569c | ||
|
|
5f1f1bb5ed | ||
|
|
9ff2df78f0 | ||
|
|
74f26bb667 | ||
|
|
1f11c1f71a | ||
|
|
8c8c37a66b | ||
|
|
d4f9fd7204 | ||
|
|
e70e72e025 | ||
|
|
e2ce6a0dab | ||
|
|
657ea2686f | ||
|
|
311df9c521 | ||
|
|
ff93d9dbda | ||
|
|
86ada87529 | ||
|
|
d74437af57 | ||
|
|
c82ac420fc | ||
|
|
f91cb9321e | ||
|
|
cc1a168aa0 | ||
|
|
ee82d35ed8 | ||
|
|
8bca30cfe4 | ||
|
|
fe9a5d3159 | ||
|
|
f43d21d0af | ||
|
|
8e2c3b315b | ||
|
|
9079fb6a0d | ||
|
|
db3f0048d8 | ||
|
|
d3d8284985 | ||
|
|
f545faa06d | ||
|
|
458aadbb10 | ||
|
|
f2ec0d80a8 | ||
|
|
be6bb5314e | ||
|
|
98114944fc | ||
|
|
6690023555 | ||
|
|
a7e8187a0d | ||
|
|
0c1b72616a | ||
|
|
945a378e55 | ||
|
|
29c5be47ed | ||
|
|
e0f18b2255 | ||
|
|
e755aafe29 | ||
|
|
e1b3a25008 | ||
|
|
69c1cd3f38 | ||
|
|
ce13fbb98a | ||
|
|
084d9e0009 | ||
|
|
3db9b06a6e | ||
|
|
e9be8016e6 | ||
|
|
1f9e21ebd5 | ||
|
|
a91d9054ad | ||
|
|
6c90d12a0c | ||
|
|
38e8ccac92 | ||
|
|
1d19a58424 | ||
|
|
f47f9ceade | ||
|
|
81effe674d | ||
|
|
831251bcaa | ||
|
|
f4630f9044 | ||
|
|
dae311ea9d | ||
|
|
4677b46904 | ||
|
|
a4dd2b1916 | ||
|
|
3d117b8964 | ||
|
|
6a083e9561 | ||
|
|
044d359a7e | ||
|
|
f35d4164d6 | ||
|
|
3058f8fd69 | ||
|
|
5129ed215e | ||
|
|
b93079f1c1 | ||
|
|
a1098384c0 | ||
|
|
43bca4df40 | ||
|
|
82269e4b8c | ||
|
|
14e49614e6 | ||
|
|
a221b2807f | ||
|
|
0d66b1cc1c | ||
|
|
1843354d88 | ||
|
|
bd7d1e2f16 | ||
|
|
aff0bbcc32 | ||
|
|
33e009bedb | ||
|
|
f94dc67a43 | ||
|
|
091f63fd4e |
5
.github/ISSUE_TEMPLATE.md
vendored
5
.github/ISSUE_TEMPLATE.md
vendored
@@ -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
50
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal 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`):
|
||||
26
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
26
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal 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.
|
||||
13
.pkgr.yml
13
.pkgr.yml
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -20,7 +20,8 @@ RUN chmod +x /usr/sbin/gosu \
|
||||
s6 \
|
||||
shadow \
|
||||
socat \
|
||||
tzdata
|
||||
tzdata \
|
||||
rsync
|
||||
|
||||
ENV GOGS_CUSTOM /data/gogs
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
1
Makefile
1
Makefile
@@ -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
|
||||
|
||||
|
||||
13
README.md
13
README.md
@@ -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.
|
||||
|
||||
[](https://app.fossa.io/projects/git%2Bgithub.com%2Fgogs%2Fgogs?ref=badge_small)
|
||||
|
||||
11
README_ZH.md
11
README_ZH.md
@@ -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 支持。
|
||||
|
||||
## 贡献成员
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
10
cmd/web.go
10
cmd/web.go
@@ -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)
|
||||
|
||||
@@ -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
|
||||
```
|
||||
27
conf/app.ini
27
conf/app.ini
@@ -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
|
||||
|
||||
10
conf/auth.d/github.conf.example
Normal file
10
conf/auth.d/github.conf.example
Normal 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
76
conf/gitignore/UnrealEngine
vendored
Normal 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/*
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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í
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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=ارسال ایمیل تست
|
||||
|
||||
@@ -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 n’y 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 l’erreur : %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]
|
||||
|
||||
@@ -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!
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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!
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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=입력한 비밀번호가 올바른지 확인하십시오.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>`
|
||||
|
||||
@@ -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
1345
conf/locale/locale_pt-PT.ini
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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=секунд
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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=родитељ
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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=Оновити налаштування автентифікації
|
||||
|
||||
@@ -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=更新認證設置
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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/
|
||||
|
||||
@@ -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
|
||||
|
||||
8
gogs.go
8
gogs.go
@@ -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,
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
21
models/errors/org.go
Normal 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)
|
||||
}
|
||||
@@ -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])
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
34
models/repo_editor_test.go
Normal file
34
models/repo_editor_test.go
Normal 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)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -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(),
|
||||
|
||||
@@ -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
50
pkg/auth/github/github.go
Normal 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
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
62
pkg/context/notice.go
Normal 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, ""))
|
||||
}
|
||||
@@ -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
30
pkg/context/user.go
Normal 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})
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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{}),
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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...)
|
||||
})
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
23
pkg/tool/path.go
Normal 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
53
pkg/tool/path_test.go
Normal 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)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -384,6 +384,11 @@ footer {
|
||||
.hide {
|
||||
display: none;
|
||||
}
|
||||
.display {
|
||||
&.inline {
|
||||
display: inline;
|
||||
}
|
||||
}
|
||||
.center {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
@@ -61,6 +61,7 @@
|
||||
}
|
||||
p {
|
||||
line-height: 1em;
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
.time-since {
|
||||
font-size: 13px;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -60,6 +60,9 @@
|
||||
|
||||
&.profile {
|
||||
.ui.card {
|
||||
.profile-avatar {
|
||||
height: 287px;
|
||||
}
|
||||
.header {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
|
||||
@@ -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, ""))
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user