mirror of
https://github.com/gogs/gogs.git
synced 2026-02-28 17:20:59 +01:00
Compare commits
143 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
3a4c981e31 | ||
|
|
0d48344f93 | ||
|
|
21ceba6cfd | ||
|
|
f8302c5470 | ||
|
|
7a7e07a57c | ||
|
|
520530dfcf | ||
|
|
31c18b4bc7 | ||
|
|
1ec365de25 | ||
|
|
99f3eabb1b | ||
|
|
32479744f6 | ||
|
|
b68de2330d | ||
|
|
68a6579852 | ||
|
|
798798f7ab | ||
|
|
54e9442a14 | ||
|
|
f7b9f35ce1 | ||
|
|
068e6ce2c9 | ||
|
|
5d4bb4d6f8 | ||
|
|
a05c19682e | ||
|
|
5caa7436d8 | ||
|
|
512a900202 | ||
|
|
ba7b2cc1f6 | ||
|
|
ac73d43444 | ||
|
|
33434a40d7 | ||
|
|
844d69143f | ||
|
|
77275a9b31 | ||
|
|
de10d9be08 | ||
|
|
3c227af508 | ||
|
|
4c1a479a60 | ||
|
|
cc95d251d6 | ||
|
|
1f247cf813 | ||
|
|
c9bb33afc3 | ||
|
|
97fb9d283f | ||
|
|
66016b8499 | ||
|
|
8bbf0293f5 | ||
|
|
87b229d280 | ||
|
|
2a86b3e31d | ||
|
|
436dd6c0a4 | ||
|
|
f6bdefe3f3 | ||
|
|
cd71077c6a | ||
|
|
029b33c650 | ||
|
|
f4f4edf276 | ||
|
|
992ea5802a | ||
|
|
376a629c9f | ||
|
|
303fa37b60 | ||
|
|
ef02414d7e | ||
|
|
bcf83ea792 | ||
|
|
86a27cf16d | ||
|
|
08ae0dd74b | ||
|
|
93f3a7f96a | ||
|
|
7856b1202d | ||
|
|
e5ddbcab7d | ||
|
|
f9bc980b0b | ||
|
|
806754b512 | ||
|
|
4d18df204a | ||
|
|
04b4431bc0 | ||
|
|
dfd494c113 | ||
|
|
57897cc8c2 | ||
|
|
459c8be94f | ||
|
|
5e158b51db | ||
|
|
fbecc18e2e | ||
|
|
b538c5345e | ||
|
|
694208865b | ||
|
|
a75c435245 | ||
|
|
53c8e4263b | ||
|
|
078549518d | ||
|
|
4c844081f3 |
@@ -1,5 +1,3 @@
|
||||
.git
|
||||
.git/**
|
||||
packager
|
||||
packager/**
|
||||
scripts
|
||||
|
||||
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.
|
||||
@@ -1,19 +1,14 @@
|
||||
language: go
|
||||
go:
|
||||
- 1.6.x
|
||||
- 1.7.x
|
||||
- 1.8.x
|
||||
- 1.9.x
|
||||
- 1.10.x
|
||||
- master
|
||||
- 1.11.x
|
||||
|
||||
before_install:
|
||||
- sudo apt-get update -qq
|
||||
- sudo apt-get install -y libpam-dev
|
||||
|
||||
env:
|
||||
- GO15VENDOREXPERIMENT=1
|
||||
|
||||
script:
|
||||
script:
|
||||
- go build -v -tags "pam"
|
||||
- go test -v -cover -race ./...
|
||||
|
||||
24
Dockerfile
24
Dockerfile
@@ -1,7 +1,13 @@
|
||||
FROM alpine:3.5
|
||||
FROM golang:alpine AS binarybuilder
|
||||
# Install build deps
|
||||
RUN apk --no-cache --no-progress add --virtual build-deps build-base git linux-pam-dev
|
||||
WORKDIR /go/src/github.com/gogs/gogs
|
||||
COPY . .
|
||||
RUN make build TAGS="sqlite cert pam"
|
||||
|
||||
FROM alpine:latest
|
||||
# Install system utils & Gogs runtime dependencies
|
||||
ADD https://github.com/tianon/gosu/releases/download/1.9/gosu-amd64 /usr/sbin/gosu
|
||||
ADD https://github.com/tianon/gosu/releases/download/1.10/gosu-amd64 /usr/sbin/gosu
|
||||
RUN chmod +x /usr/sbin/gosu \
|
||||
&& echo http://dl-2.alpinelinux.org/alpine/edge/community/ >> /etc/apk/repositories \
|
||||
&& apk --no-cache --no-progress add \
|
||||
@@ -20,16 +26,14 @@ ENV GOGS_CUSTOM /data/gogs
|
||||
|
||||
# Configure LibC Name Service
|
||||
COPY docker/nsswitch.conf /etc/nsswitch.conf
|
||||
COPY docker /app/gogs/docker
|
||||
COPY templates /app/gogs/templates
|
||||
COPY public /app/gogs/public
|
||||
|
||||
WORKDIR /app/gogs/build
|
||||
COPY . .
|
||||
WORKDIR /app/gogs
|
||||
COPY docker ./docker
|
||||
COPY templates ./templates
|
||||
COPY public ./public
|
||||
COPY --from=binarybuilder /go/src/github.com/gogs/gogs/gogs .
|
||||
|
||||
RUN ./docker/build-go.sh \
|
||||
&& ./docker/build.sh \
|
||||
&& ./docker/finalize.sh
|
||||
RUN ./docker/finalize.sh
|
||||
|
||||
# Configure Docker Container
|
||||
VOLUME ["/data"]
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
FROM arm64v8/alpine:3.6
|
||||
FROM arm64v8/alpine:3.8
|
||||
|
||||
ENV GOGS_CUSTOM /data/gogs
|
||||
ENV QEMU_EXECVE 1
|
||||
@@ -17,13 +17,17 @@ RUN [ "cross-build-start" ]
|
||||
#######################
|
||||
|
||||
# Install system utils & Gogs runtime dependencies
|
||||
ADD https://github.com/tianon/gosu/releases/download/1.9/gosu-arm64 /usr/sbin/gosu
|
||||
ADD https://github.com/tianon/gosu/releases/download/1.10/gosu-arm64 /usr/sbin/gosu
|
||||
RUN chmod +x /usr/sbin/gosu \
|
||||
&& apk --no-cache --no-progress add ca-certificates bash git linux-pam s6 curl openssh socat tzdata go
|
||||
&& apk --no-cache --no-progress add ca-certificates bash git linux-pam s6 curl openssh shadow socat tzdata go=1.10.1-r0
|
||||
|
||||
|
||||
COPY . /app/gogs/build
|
||||
|
||||
COPY docker /app/gogs/docker
|
||||
COPY templates /app/gogs/templates
|
||||
COPY public /app/gogs/public
|
||||
WORKDIR /app/gogs/build
|
||||
COPY . .
|
||||
|
||||
RUN ./docker/build.sh \
|
||||
&& ./docker/finalize.sh
|
||||
|
||||
3
Makefile
3
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
|
||||
|
||||
@@ -62,7 +61,7 @@ pkg/bindata/bindata.go: $(DATA_FILES)
|
||||
less: public/css/gogs.css
|
||||
|
||||
public/css/gogs.css: $(LESS_FILES)
|
||||
lessc $< $@
|
||||
@type lessc >/dev/null 2>&1 && lessc $< >$@ || echo "lessc command not found, skipped."
|
||||
|
||||
clean:
|
||||
go clean -i ./...
|
||||
|
||||
10
README.md
10
README.md
@@ -22,9 +22,9 @@ Gogs [](https:
|
||||
|
||||
[简体中文](README_ZH.md)
|
||||
|
||||
## Purpose
|
||||
## Vision
|
||||
|
||||
The goal of this project is to make the easiest, fastest, and most painless way of setting up a self-hosted Git service. With Go, this can be done with an independent binary distribution across **ALL platforms** that Go supports, including Linux, macOS, Windows and ARM.
|
||||
This project aims to build a simple, stable and extensible self-hosted Git service that can be setup in the most painless way. With Go, this can be done with an independent binary distribution across **ALL platforms** that Go supports, including Linux, macOS, Windows and ARM.
|
||||
|
||||
## Overview
|
||||
|
||||
@@ -52,7 +52,7 @@ The goal of this project is to make the easiest, fastest, and most painless way
|
||||
- Mail service
|
||||
- Administration panel
|
||||
- Supports MySQL, PostgreSQL, SQLite3, MSSQL and [TiDB](https://github.com/pingcap/tidb) (via MySQL protocol)
|
||||
- Multi-language support ([29 languages](https://crowdin.com/project/gogs))
|
||||
- Multi-language support ([30 languages](https://crowdin.com/project/gogs))
|
||||
|
||||
## Hardware Requirements
|
||||
|
||||
@@ -125,7 +125,7 @@ There are 5 ways to install Gogs:
|
||||
|
||||
- Thanks [Egon Elbre](https://twitter.com/egonelbre) for designing logo.
|
||||
- Thanks [Crowdin](https://crowdin.com/project/gogs) for sponsoring open source translation plan.
|
||||
- Thanks [DigitalOcean](https://www.digitalocean.com) for sponsoring VPS service.
|
||||
- Thanks [DigitalOcean](https://www.digitalocean.com) and [VPSServer](https://www.vpsserver.com/) for sponsoring VPS service.
|
||||
- Thanks [KeyCDN](https://www.keycdn.com/) for sponsoring CDN service.
|
||||
|
||||
## Contributors
|
||||
@@ -136,3 +136,5 @@ There are 5 ways to install Gogs:
|
||||
## License
|
||||
|
||||
This project is under the MIT License. See the [LICENSE](https://github.com/gogs/gogs/blob/master/LICENSE) file for the full license text.
|
||||
|
||||
[](https://app.fossa.io/projects/git%2Bgithub.com%2Fgogs%2Fgogs?ref=badge_small)
|
||||
|
||||
@@ -3,9 +3,9 @@ Gogs [](https:
|
||||
|
||||
Gogs 是一款极易搭建的自助 Git 服务。
|
||||
|
||||
## 开发目的
|
||||
## 项目愿景
|
||||
|
||||
Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务。使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发,并且支持 Go 语言支持的 **所有平台**,包括 Linux、macOS、Windows 以及 ARM 平台。
|
||||
本项目旨在打造一个以最简便的方式搭建简单、稳定和可扩展的自助 Git 服务。使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发,并且支持 Go 语言支持的 **所有平台**,包括 Linux、macOS、Windows 以及 ARM 平台。
|
||||
|
||||
## 项目概览
|
||||
|
||||
@@ -33,7 +33,7 @@ Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自
|
||||
- 支持邮件服务
|
||||
- 支持后台管理面板
|
||||
- 支持 MySQL、PostgreSQL、SQLite3、MSSQL 和 [TiDB](https://github.com/pingcap/tidb)(通过 MySQL 协议)数据库
|
||||
- 支持多语言本地化([29 种语言]([more](https://crowdin.com/project/gogs)))
|
||||
- 支持多语言本地化([30 种语言]([more](https://crowdin.com/project/gogs)))
|
||||
|
||||
## 硬件要求
|
||||
|
||||
@@ -94,7 +94,7 @@ Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自
|
||||
|
||||
- 感谢 [Egon Elbre](https://twitter.com/egonelbre) 设计的 Logo。
|
||||
- 感谢 [Crowdin](https://crowdin.com/project/gogs) 提供免费的开源项目本地化支持。
|
||||
- 感谢 [DigitalOcean](https://www.digitalocean.com) 提供主站和体验站点的服务器赞助。
|
||||
- 感谢 [DigitalOcean](https://www.digitalocean.com) 和 [VPSServer](https://www.vpsserver.com/) 提供服务器赞助。
|
||||
- 感谢 [KeyCDN](https://www.keycdn.com/) 提供 CDN 服务赞助。
|
||||
|
||||
## 贡献成员
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -39,6 +39,7 @@ portable among all supported database engines.`,
|
||||
},
|
||||
}
|
||||
|
||||
const _CURRENT_BACKUP_FORMAT_VERSION = 1
|
||||
const _ARCHIVE_ROOT_DIR = "gogs-backup"
|
||||
|
||||
func runBackup(c *cli.Context) error {
|
||||
@@ -63,7 +64,7 @@ func runBackup(c *cli.Context) error {
|
||||
// Metadata
|
||||
metaFile := path.Join(rootDir, "metadata.ini")
|
||||
metadata := ini.Empty()
|
||||
metadata.Section("").Key("VERSION").SetValue("1")
|
||||
metadata.Section("").Key("VERSION").SetValue(com.ToStr(_CURRENT_BACKUP_FORMAT_VERSION))
|
||||
metadata.Section("").Key("DATE_TIME").SetValue(time.Now().String())
|
||||
metadata.Section("").Key("GOGS_VERSION").SetValue(setting.AppVer)
|
||||
if err = metadata.SaveTo(metaFile); err != nil {
|
||||
@@ -99,7 +100,7 @@ func runBackup(c *cli.Context) error {
|
||||
|
||||
// Data files
|
||||
if !c.Bool("database-only") {
|
||||
for _, dir := range []string{"attachments", "avatars"} {
|
||||
for _, dir := range []string{"attachments", "avatars", "repo-avatars"} {
|
||||
dirPath := path.Join(setting.AppDataPath, dir)
|
||||
if !com.IsDir(dirPath) {
|
||||
continue
|
||||
|
||||
35
cmd/hook.go
35
cmd/hook.go
@@ -27,7 +27,6 @@ import (
|
||||
"github.com/gogs/gogs/pkg/mailer"
|
||||
"github.com/gogs/gogs/pkg/setting"
|
||||
"github.com/gogs/gogs/pkg/template"
|
||||
http "github.com/gogs/gogs/routes/repo"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -71,7 +70,7 @@ func runHookPreReceive(c *cli.Context) error {
|
||||
}
|
||||
setup(c, "hooks/pre-receive.log", true)
|
||||
|
||||
isWiki := strings.Contains(os.Getenv(http.ENV_REPO_CUSTOM_HOOKS_PATH), ".wiki.git/")
|
||||
isWiki := strings.Contains(os.Getenv(models.ENV_REPO_CUSTOM_HOOKS_PATH), ".wiki.git/")
|
||||
|
||||
buf := bytes.NewBuffer(nil)
|
||||
scanner := bufio.NewScanner(os.Stdin)
|
||||
@@ -92,7 +91,7 @@ func runHookPreReceive(c *cli.Context) error {
|
||||
branchName := strings.TrimPrefix(string(fields[2]), git.BRANCH_PREFIX)
|
||||
|
||||
// Branch protection
|
||||
repoID := com.StrTo(os.Getenv(http.ENV_REPO_ID)).MustInt64()
|
||||
repoID := com.StrTo(os.Getenv(models.ENV_REPO_ID)).MustInt64()
|
||||
protectBranch, err := models.GetProtectBranchOfRepoByName(repoID, branchName)
|
||||
if err != nil {
|
||||
if errors.IsErrBranchNotExist(err) {
|
||||
@@ -108,7 +107,7 @@ func runHookPreReceive(c *cli.Context) error {
|
||||
bypassRequirePullRequest := false
|
||||
|
||||
// Check if user is in whitelist when enabled
|
||||
userID := com.StrTo(os.Getenv(http.ENV_AUTH_USER_ID)).MustInt64()
|
||||
userID := com.StrTo(os.Getenv(models.ENV_AUTH_USER_ID)).MustInt64()
|
||||
if protectBranch.EnableWhitelist {
|
||||
if !models.IsUserInProtectBranchWhitelist(repoID, userID, branchName) {
|
||||
fail(fmt.Sprintf("Branch '%s' is protected and you are not in the push whitelist", branchName), "")
|
||||
@@ -129,7 +128,7 @@ func runHookPreReceive(c *cli.Context) error {
|
||||
|
||||
// Check force push
|
||||
output, err := git.NewCommand("rev-list", "--max-count=1", oldCommitID, "^"+newCommitID).
|
||||
RunInDir(models.RepoPath(os.Getenv(http.ENV_REPO_OWNER_NAME), os.Getenv(http.ENV_REPO_NAME)))
|
||||
RunInDir(models.RepoPath(os.Getenv(models.ENV_REPO_OWNER_NAME), os.Getenv(models.ENV_REPO_NAME)))
|
||||
if err != nil {
|
||||
fail("Internal error", "Fail to detect force push: %v", err)
|
||||
} else if len(output) > 0 {
|
||||
@@ -137,7 +136,7 @@ func runHookPreReceive(c *cli.Context) error {
|
||||
}
|
||||
}
|
||||
|
||||
customHooksPath := filepath.Join(os.Getenv(http.ENV_REPO_CUSTOM_HOOKS_PATH), "pre-receive")
|
||||
customHooksPath := filepath.Join(os.Getenv(models.ENV_REPO_CUSTOM_HOOKS_PATH), "pre-receive")
|
||||
if !com.IsFile(customHooksPath) {
|
||||
return nil
|
||||
}
|
||||
@@ -148,7 +147,7 @@ func runHookPreReceive(c *cli.Context) error {
|
||||
} else {
|
||||
hookCmd = exec.Command(customHooksPath)
|
||||
}
|
||||
hookCmd.Dir = models.RepoPath(os.Getenv(http.ENV_REPO_OWNER_NAME), os.Getenv(http.ENV_REPO_NAME))
|
||||
hookCmd.Dir = models.RepoPath(os.Getenv(models.ENV_REPO_OWNER_NAME), os.Getenv(models.ENV_REPO_NAME))
|
||||
hookCmd.Stdout = os.Stdout
|
||||
hookCmd.Stdin = buf
|
||||
hookCmd.Stderr = os.Stderr
|
||||
@@ -171,7 +170,7 @@ func runHookUpdate(c *cli.Context) error {
|
||||
fail("First argument 'refName' is empty", "First argument 'refName' is empty")
|
||||
}
|
||||
|
||||
customHooksPath := filepath.Join(os.Getenv(http.ENV_REPO_CUSTOM_HOOKS_PATH), "update")
|
||||
customHooksPath := filepath.Join(os.Getenv(models.ENV_REPO_CUSTOM_HOOKS_PATH), "update")
|
||||
if !com.IsFile(customHooksPath) {
|
||||
return nil
|
||||
}
|
||||
@@ -182,7 +181,7 @@ func runHookUpdate(c *cli.Context) error {
|
||||
} else {
|
||||
hookCmd = exec.Command(customHooksPath, args...)
|
||||
}
|
||||
hookCmd.Dir = models.RepoPath(os.Getenv(http.ENV_REPO_OWNER_NAME), os.Getenv(http.ENV_REPO_NAME))
|
||||
hookCmd.Dir = models.RepoPath(os.Getenv(models.ENV_REPO_OWNER_NAME), os.Getenv(models.ENV_REPO_NAME))
|
||||
hookCmd.Stdout = os.Stdout
|
||||
hookCmd.Stdin = os.Stdin
|
||||
hookCmd.Stderr = os.Stderr
|
||||
@@ -205,7 +204,7 @@ func runHookPostReceive(c *cli.Context) error {
|
||||
mailer.InitMailRender(path.Join(setting.StaticRootPath, "templates/mail"),
|
||||
path.Join(setting.CustomPath, "templates/mail"), template.NewFuncMap())
|
||||
|
||||
isWiki := strings.Contains(os.Getenv(http.ENV_REPO_CUSTOM_HOOKS_PATH), ".wiki.git/")
|
||||
isWiki := strings.Contains(os.Getenv(models.ENV_REPO_CUSTOM_HOOKS_PATH), ".wiki.git/")
|
||||
|
||||
buf := bytes.NewBuffer(nil)
|
||||
scanner := bufio.NewScanner(os.Stdin)
|
||||
@@ -227,10 +226,10 @@ func runHookPostReceive(c *cli.Context) error {
|
||||
OldCommitID: string(fields[0]),
|
||||
NewCommitID: string(fields[1]),
|
||||
RefFullName: string(fields[2]),
|
||||
PusherID: com.StrTo(os.Getenv(http.ENV_AUTH_USER_ID)).MustInt64(),
|
||||
PusherName: os.Getenv(http.ENV_AUTH_USER_NAME),
|
||||
RepoUserName: os.Getenv(http.ENV_REPO_OWNER_NAME),
|
||||
RepoName: os.Getenv(http.ENV_REPO_NAME),
|
||||
PusherID: com.StrTo(os.Getenv(models.ENV_AUTH_USER_ID)).MustInt64(),
|
||||
PusherName: os.Getenv(models.ENV_AUTH_USER_NAME),
|
||||
RepoUserName: os.Getenv(models.ENV_REPO_OWNER_NAME),
|
||||
RepoName: os.Getenv(models.ENV_REPO_NAME),
|
||||
}
|
||||
if err := models.PushUpdate(options); err != nil {
|
||||
log.Error(2, "PushUpdate: %v", err)
|
||||
@@ -239,8 +238,8 @@ func runHookPostReceive(c *cli.Context) error {
|
||||
// Ask for running deliver hook and test pull request tasks
|
||||
reqURL := setting.LocalURL + options.RepoUserName + "/" + options.RepoName + "/tasks/trigger?branch=" +
|
||||
template.EscapePound(strings.TrimPrefix(options.RefFullName, git.BRANCH_PREFIX)) +
|
||||
"&secret=" + os.Getenv(http.ENV_REPO_OWNER_SALT_MD5) +
|
||||
"&pusher=" + os.Getenv(http.ENV_AUTH_USER_ID)
|
||||
"&secret=" + os.Getenv(models.ENV_REPO_OWNER_SALT_MD5) +
|
||||
"&pusher=" + os.Getenv(models.ENV_AUTH_USER_ID)
|
||||
log.Trace("Trigger task: %s", reqURL)
|
||||
|
||||
resp, err := httplib.Head(reqURL).SetTLSClientConfig(&tls.Config{
|
||||
@@ -256,7 +255,7 @@ func runHookPostReceive(c *cli.Context) error {
|
||||
}
|
||||
}
|
||||
|
||||
customHooksPath := filepath.Join(os.Getenv(http.ENV_REPO_CUSTOM_HOOKS_PATH), "post-receive")
|
||||
customHooksPath := filepath.Join(os.Getenv(models.ENV_REPO_CUSTOM_HOOKS_PATH), "post-receive")
|
||||
if !com.IsFile(customHooksPath) {
|
||||
return nil
|
||||
}
|
||||
@@ -267,7 +266,7 @@ func runHookPostReceive(c *cli.Context) error {
|
||||
} else {
|
||||
hookCmd = exec.Command(customHooksPath)
|
||||
}
|
||||
hookCmd.Dir = models.RepoPath(os.Getenv(http.ENV_REPO_OWNER_NAME), os.Getenv(http.ENV_REPO_NAME))
|
||||
hookCmd.Dir = models.RepoPath(os.Getenv(models.ENV_REPO_OWNER_NAME), os.Getenv(models.ENV_REPO_NAME))
|
||||
hookCmd.Stdout = os.Stdout
|
||||
hookCmd.Stdin = buf
|
||||
hookCmd.Stderr = os.Stderr
|
||||
|
||||
@@ -39,6 +39,10 @@ be skipped and remain unchanged.`,
|
||||
},
|
||||
}
|
||||
|
||||
// lastSupportedVersionOfFormat returns the last supported version of the backup archive
|
||||
// format that is able to import.
|
||||
var lastSupportedVersionOfFormat = map[int]string{}
|
||||
|
||||
func runRestore(c *cli.Context) error {
|
||||
zip.Verbose = c.Bool("verbose")
|
||||
|
||||
@@ -49,9 +53,10 @@ func runRestore(c *cli.Context) error {
|
||||
|
||||
log.Info("Restore backup from: %s", c.String("from"))
|
||||
if err := zip.ExtractTo(c.String("from"), tmpDir); err != nil {
|
||||
log.Fatal(0, "Fail to extract backup archive: %v", err)
|
||||
log.Fatal(0, "Failed to extract backup archive: %v", err)
|
||||
}
|
||||
archivePath := path.Join(tmpDir, _ARCHIVE_ROOT_DIR)
|
||||
defer os.RemoveAll(archivePath)
|
||||
|
||||
// Check backup version
|
||||
metaFile := path.Join(archivePath, "metadata.ini")
|
||||
@@ -60,12 +65,20 @@ func runRestore(c *cli.Context) error {
|
||||
}
|
||||
metadata, err := ini.Load(metaFile)
|
||||
if err != nil {
|
||||
log.Fatal(0, "Fail to load metadata '%s': %v", metaFile, err)
|
||||
log.Fatal(0, "Failed to load metadata '%s': %v", metaFile, err)
|
||||
}
|
||||
backupVersion := metadata.Section("").Key("GOGS_VERSION").MustString("999.0")
|
||||
if version.Compare(setting.AppVer, backupVersion, "<") {
|
||||
log.Fatal(0, "Current Gogs version is lower than backup version: %s < %s", setting.AppVer, backupVersion)
|
||||
}
|
||||
formatVersion := metadata.Section("").Key("VERSION").MustInt()
|
||||
if formatVersion == 0 {
|
||||
log.Fatal(0, "Failed to determine the backup format version from metadata '%s': %s", metaFile, "VERSION is not presented")
|
||||
}
|
||||
if formatVersion != _CURRENT_BACKUP_FORMAT_VERSION {
|
||||
log.Fatal(0, "Backup format version found is %d but this binary only supports %d\nThe last known version that is able to import your backup is %s",
|
||||
formatVersion, _CURRENT_BACKUP_FORMAT_VERSION, lastSupportedVersionOfFormat[formatVersion])
|
||||
}
|
||||
|
||||
// If config file is not present in backup, user must set this file via flag.
|
||||
// Otherwise, it's optional to set config file flag.
|
||||
@@ -84,25 +97,25 @@ func runRestore(c *cli.Context) error {
|
||||
// Database
|
||||
dbDir := path.Join(archivePath, "db")
|
||||
if err = models.ImportDatabase(dbDir, c.Bool("verbose")); err != nil {
|
||||
log.Fatal(0, "Fail to import database: %v", err)
|
||||
log.Fatal(0, "Failed to import database: %v", err)
|
||||
}
|
||||
|
||||
// Custom files
|
||||
if !c.Bool("database-only") {
|
||||
if com.IsExist(setting.CustomPath) {
|
||||
if err = os.Rename(setting.CustomPath, setting.CustomPath+".bak"); err != nil {
|
||||
log.Fatal(0, "Fail to backup current 'custom': %v", err)
|
||||
log.Fatal(0, "Failed to backup current 'custom': %v", err)
|
||||
}
|
||||
}
|
||||
if err = os.Rename(path.Join(archivePath, "custom"), setting.CustomPath); err != nil {
|
||||
log.Fatal(0, "Fail to import 'custom': %v", err)
|
||||
log.Fatal(0, "Failed to import 'custom': %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// Data files
|
||||
if !c.Bool("database-only") {
|
||||
os.MkdirAll(setting.AppDataPath, os.ModePerm)
|
||||
for _, dir := range []string{"attachments", "avatars"} {
|
||||
for _, dir := range []string{"attachments", "avatars", "repo-avatars"} {
|
||||
// Skip if backup archive does not have corresponding data
|
||||
srcPath := path.Join(archivePath, "data", dir)
|
||||
if !com.IsDir(srcPath) {
|
||||
@@ -112,11 +125,11 @@ func runRestore(c *cli.Context) error {
|
||||
dirPath := path.Join(setting.AppDataPath, dir)
|
||||
if com.IsExist(dirPath) {
|
||||
if err = os.Rename(dirPath, dirPath+".bak"); err != nil {
|
||||
log.Fatal(0, "Fail to backup current 'data': %v", err)
|
||||
log.Fatal(0, "Failed to backup current 'data': %v", err)
|
||||
}
|
||||
}
|
||||
if err = os.Rename(srcPath, dirPath); err != nil {
|
||||
log.Fatal(0, "Fail to import 'data': %v", err)
|
||||
log.Fatal(0, "Failed to import 'data': %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -125,11 +138,10 @@ func runRestore(c *cli.Context) error {
|
||||
reposPath := path.Join(archivePath, "repositories.zip")
|
||||
if !c.Bool("exclude-repos") && !c.Bool("database-only") && com.IsExist(reposPath) {
|
||||
if err := zip.ExtractTo(reposPath, path.Dir(setting.RepoRootPath)); err != nil {
|
||||
log.Fatal(0, "Fail to extract 'repositories.zip': %v", err)
|
||||
log.Fatal(0, "Failed to extract 'repositories.zip': %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
os.RemoveAll(path.Join(tmpDir, _ARCHIVE_ROOT_DIR))
|
||||
log.Info("Restore succeed!")
|
||||
log.Shutdown()
|
||||
return nil
|
||||
|
||||
@@ -19,7 +19,6 @@ import (
|
||||
"github.com/gogs/gogs/models"
|
||||
"github.com/gogs/gogs/models/errors"
|
||||
"github.com/gogs/gogs/pkg/setting"
|
||||
http "github.com/gogs/gogs/routes/repo"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -252,7 +251,7 @@ func runServ(c *cli.Context) error {
|
||||
gitCmd = exec.Command(verb, repoFullName)
|
||||
}
|
||||
if requestMode == models.ACCESS_MODE_WRITE {
|
||||
gitCmd.Env = append(os.Environ(), http.ComposeHookEnvs(http.ComposeHookEnvsOptions{
|
||||
gitCmd.Env = append(os.Environ(), models.ComposeHookEnvs(models.ComposeHookEnvsOptions{
|
||||
AuthUser: user,
|
||||
OwnerName: owner.Name,
|
||||
OwnerSalt: owner.Salt,
|
||||
|
||||
43
cmd/web.go
43
cmd/web.go
@@ -25,6 +25,7 @@ import (
|
||||
"github.com/go-macaron/session"
|
||||
"github.com/go-macaron/toolbox"
|
||||
"github.com/mcuadros/go-version"
|
||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||||
"github.com/urfave/cli"
|
||||
log "gopkg.in/clog.v1"
|
||||
"gopkg.in/macaron.v1"
|
||||
@@ -64,7 +65,7 @@ func checkVersion() {
|
||||
if err != nil {
|
||||
log.Fatal(2, "Fail to read 'templates/.VERSION': %v", err)
|
||||
}
|
||||
tplVer := string(data)
|
||||
tplVer := strings.TrimSpace(string(data))
|
||||
if tplVer != setting.AppVer {
|
||||
if version.Compare(tplVer, setting.AppVer, ">") {
|
||||
log.Fatal(2, "Binary version is lower than template file version, did you forget to recompile Gogs?")
|
||||
@@ -96,7 +97,14 @@ func newMacaron() *macaron.Macaron {
|
||||
m.Use(macaron.Static(
|
||||
setting.AvatarUploadPath,
|
||||
macaron.StaticOptions{
|
||||
Prefix: "avatars",
|
||||
Prefix: models.USER_AVATAR_URL_PREFIX,
|
||||
SkipLogging: setting.DisableRouterLog,
|
||||
},
|
||||
))
|
||||
m.Use(macaron.Static(
|
||||
setting.RepositoryAvatarUploadPath,
|
||||
macaron.StaticOptions{
|
||||
Prefix: models.REPO_AVATAR_URL_PREFIX,
|
||||
SkipLogging: setting.DisableRouterLog,
|
||||
},
|
||||
))
|
||||
@@ -249,15 +257,15 @@ func runWeb(c *cli.Context) error {
|
||||
m.Get("/email2user", user.Email2User)
|
||||
m.Get("/forget_password", user.ForgotPasswd)
|
||||
m.Post("/forget_password", user.ForgotPasswdPost)
|
||||
m.Get("/logout", user.SignOut)
|
||||
m.Post("/logout", user.SignOut)
|
||||
})
|
||||
// ***** END: User *****
|
||||
|
||||
adminReq := context.Toggle(&context.ToggleOptions{SignInRequired: true, AdminRequired: true})
|
||||
reqAdmin := context.Toggle(&context.ToggleOptions{SignInRequired: true, AdminRequired: true})
|
||||
|
||||
// ***** START: Admin *****
|
||||
m.Group("/admin", func() {
|
||||
m.Get("", adminReq, admin.Dashboard)
|
||||
m.Get("", admin.Dashboard)
|
||||
m.Get("/config", admin.Config)
|
||||
m.Post("/config/test_mail", admin.SendTestMail)
|
||||
m.Get("/monitor", admin.Monitor)
|
||||
@@ -291,7 +299,7 @@ func runWeb(c *cli.Context) error {
|
||||
m.Post("/delete", admin.DeleteNotices)
|
||||
m.Get("/empty", admin.EmptyNotices)
|
||||
})
|
||||
}, adminReq)
|
||||
}, reqAdmin)
|
||||
// ***** END: Admin *****
|
||||
|
||||
m.Group("", func() {
|
||||
@@ -300,7 +308,7 @@ func runWeb(c *cli.Context) error {
|
||||
m.Get("/followers", user.Followers)
|
||||
m.Get("/following", user.Following)
|
||||
m.Get("/stars", user.Stars)
|
||||
})
|
||||
}, context.InjectParamsUser())
|
||||
|
||||
m.Get("/attachments/:uuid", func(c *context.Context) {
|
||||
attach, err := models.GetAttachmentByUUID(c.Params(":uuid"))
|
||||
@@ -332,8 +340,8 @@ func runWeb(c *cli.Context) error {
|
||||
}, ignSignIn)
|
||||
|
||||
m.Group("/:username", func() {
|
||||
m.Get("/action/:action", user.Action)
|
||||
}, reqSignIn)
|
||||
m.Post("/action/:action", user.Action)
|
||||
}, reqSignIn, context.InjectParamsUser())
|
||||
|
||||
if macaron.Env == macaron.DEV {
|
||||
m.Get("/template/*", dev.TemplatePreview)
|
||||
@@ -419,6 +427,9 @@ func runWeb(c *cli.Context) error {
|
||||
m.Group("/settings", func() {
|
||||
m.Combo("").Get(repo.Settings).
|
||||
Post(bindIgnErr(form.RepoSetting{}), repo.SettingsPost)
|
||||
m.Combo("/avatar").Get(repo.SettingsAvatar).
|
||||
Post(binding.MultipartForm(form.Avatar{}), repo.SettingsAvatarPost)
|
||||
m.Post("/avatar/delete", repo.SettingsDeleteAvatar)
|
||||
m.Group("/collaboration", func() {
|
||||
m.Combo("").Get(repo.SettingsCollaboration).Post(repo.SettingsCollaborationPost)
|
||||
m.Post("/access_mode", repo.ChangeCollaborationAccessMode)
|
||||
@@ -473,7 +484,7 @@ func runWeb(c *cli.Context) error {
|
||||
})
|
||||
}, reqSignIn, context.RepoAssignment(), reqRepoAdmin, context.RepoRef())
|
||||
|
||||
m.Get("/:username/:reponame/action/:action", reqSignIn, context.RepoAssignment(), repo.Action)
|
||||
m.Post("/:username/:reponame/action/:action", reqSignIn, context.RepoAssignment(), repo.Action)
|
||||
m.Group("/:username/:reponame", func() {
|
||||
m.Get("/issues", repo.RetrieveLabels, repo.Issues)
|
||||
m.Get("/issues/:index", repo.ViewIssue)
|
||||
@@ -649,6 +660,18 @@ func runWeb(c *cli.Context) error {
|
||||
apiv1.RegisterRoutes(m)
|
||||
}, ignSignIn)
|
||||
|
||||
m.Group("/-", func() {
|
||||
if setting.Prometheus.Enabled {
|
||||
m.Get("/metrics", func(c *context.Context) {
|
||||
if !setting.Prometheus.EnableBasicAuth {
|
||||
return
|
||||
}
|
||||
|
||||
c.RequireBasicAuth(setting.Prometheus.BasicAuthUsername, setting.Prometheus.BasicAuthPassword)
|
||||
}, promhttp.Handler())
|
||||
}
|
||||
})
|
||||
|
||||
// robots.txt
|
||||
m.Get("/robots.txt", func(c *context.Context) {
|
||||
if setting.HasRobotsTxt {
|
||||
|
||||
@@ -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
|
||||
```
|
||||
35
conf/app.ini
35
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
|
||||
@@ -286,6 +288,8 @@ CSRF_COOKIE_NAME = _csrf
|
||||
[picture]
|
||||
; Path to store user uploaded avatars
|
||||
AVATAR_UPLOAD_PATH = data/avatars
|
||||
; Path to store repository uploaded avatars
|
||||
REPOSITORY_AVATAR_UPLOAD_PATH = data/repo-avatars
|
||||
; Chinese users can choose "duoshuo"
|
||||
; or a custom avatar source, like: http://cn.gravatar.com/avatar/
|
||||
GRAVATAR_SOURCE = gravatar
|
||||
@@ -328,13 +332,13 @@ LEVEL = Trace
|
||||
|
||||
; For "console" mode only
|
||||
[log.console]
|
||||
; leave empty to inherit
|
||||
LEVEL =
|
||||
; Comment out to inherit
|
||||
; LEVEL =
|
||||
|
||||
; For "file" mode only
|
||||
[log.file]
|
||||
; leave empty to inherit
|
||||
LEVEL =
|
||||
; Comment out to inherit
|
||||
; LEVEL =
|
||||
; This enables automated log rotate (switch of following options)
|
||||
LOG_ROTATE = true
|
||||
; Segment log daily
|
||||
@@ -348,14 +352,14 @@ MAX_DAYS = 7
|
||||
|
||||
; For "slack" mode only
|
||||
[log.slack]
|
||||
; leave empty to inherit
|
||||
LEVEL =
|
||||
; Comment out to inherit
|
||||
; LEVEL =
|
||||
; Webhook URL
|
||||
URL =
|
||||
|
||||
[log.discord]
|
||||
; leave empty to inherit
|
||||
LEVEL =
|
||||
; Comment out to inherit
|
||||
; LEVEL =
|
||||
; Webhook URL
|
||||
URL =
|
||||
; Username displayed in webhook
|
||||
@@ -462,9 +466,15 @@ NEWS_FEED_PAGING_NUM = 20
|
||||
; Number of commits that are showed in one page
|
||||
COMMITS_PAGING_NUM = 30
|
||||
|
||||
[prometheus]
|
||||
ENABLED = true
|
||||
ENABLE_BASIC_AUTH = false
|
||||
BASIC_AUTH_USERNAME =
|
||||
BASIC_AUTH_PASSWORD =
|
||||
|
||||
[i18n]
|
||||
LANGS = en-US,zh-CN,zh-HK,zh-TW,de-DE,fr-FR,nl-NL,lv-LV,ru-RU,ja-JP,es-ES,pt-BR,pl-PL,bg-BG,it-IT,fi-FI,tr-TR,cs-CZ,sr-SP,sv-SE,ko-KR,gl-ES,uk-UA,en-GB,hu-HU,sk-SK,id-ID,fa-IR,vi-VN
|
||||
NAMES = English,简体中文,繁體中文(香港),繁體中文(臺灣),Deutsch,français,Nederlands,latviešu,русский,日本語,español,português do Brasil,polski,български,italiano,suomi,Türkçe,čeština,српски,svenska,한국어,galego,українська,English (United Kingdom),Magyar,Slovenčina,Indonesian,Persian,Vietnamese
|
||||
LANGS = en-US,zh-CN,zh-HK,zh-TW,de-DE,fr-FR,nl-NL,lv-LV,ru-RU,ja-JP,es-ES,pt-BR,pl-PL,bg-BG,it-IT,fi-FI,tr-TR,cs-CZ,sr-SP,sv-SE,ko-KR,gl-ES,uk-UA,en-GB,hu-HU,sk-SK,id-ID,fa-IR,vi-VN,pt-PT
|
||||
NAMES = English,简体中文,繁體中文(香港),繁體中文(臺灣),Deutsch,français,Nederlands,latviešu,русский,日本語,español,português do Brasil,polski,български,italiano,suomi,Türkçe,čeština,српски,svenska,한국어,galego,українська,English (United Kingdom),Magyar,Slovenčina,Indonesian,Persian,Vietnamese,Português
|
||||
|
||||
; Used for datetimepicker
|
||||
[i18n.datelang]
|
||||
@@ -497,6 +507,7 @@ sk-SK = sk
|
||||
id-ID = id
|
||||
fa-IR = fa
|
||||
vi-VN = vi
|
||||
pt-PT = pt
|
||||
|
||||
; Extension mapping to highlight class
|
||||
; e.g. .toml=ini
|
||||
|
||||
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/
|
||||
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=Последна синхр.
|
||||
watchers=Наблюдаващи
|
||||
stargazers=Харесващи
|
||||
forks=Разклонения
|
||||
repo_description_helper=Description of repository. Maximum 512 characters length.
|
||||
repo_description_length=Available characters
|
||||
|
||||
form.reach_limit_of_creation=Притежателят е достигнал настроения лимит от %d брой хранилища.
|
||||
form.name_reserved=Името на хранилището '%s' е запазено.
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Съдържанието на файла е б
|
||||
editor.file_already_exists=Файл с име '%s' вече съществува в това хранилище.
|
||||
editor.no_changes_to_show=Няма промени.
|
||||
editor.fail_to_update_file=Невъзможно модифициране/създаване на файл '%s' заради грешка: %v
|
||||
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
|
||||
editor.add_subdir=Добави поддиректория...
|
||||
editor.unable_to_upload_files=Невъзможно качване на файлове в '%s' заради грешка: %v
|
||||
editor.upload_files_to_dir=Качи файлове в '%s'
|
||||
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Не може да се извърши обедин
|
||||
pulls.cannot_auto_merge_helper=Моля, използвайте инструменти на командния ред за да разрешите конфликтите.
|
||||
pulls.create_merge_commit=Create a merge commit
|
||||
pulls.rebase_before_merging=Rebase before merging
|
||||
pulls.commit_description=Commit Description
|
||||
pulls.merge_pull_request=Обедини заявка за сливане
|
||||
pulls.open_unmerged_pull_exists=`Невъзможно повторно отваряне, защото вече съществува заявка за сливане (#%d) от същото хранилище със същата информация за обединяване, която чака да бъде извършена`
|
||||
pulls.delete_branch=Изтрий клон
|
||||
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Стил на именуване на външна
|
||||
settings.tracker_issue_style.numeric=Цифров
|
||||
settings.tracker_issue_style.alphanumeric=Символен
|
||||
settings.tracker_url_format_desc=Можете да използвате текстови маркери <code>{user} {repo} {index}</code> за потребителско име, име на хранилище и индекс на задача съответно.
|
||||
settings.pulls_desc=Включва заявки за сливане за да може да се приемат външни доработки
|
||||
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
|
||||
settings.pulls.ignore_whitespace=Ignore changes in whitespace
|
||||
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
|
||||
settings.danger_zone=Опасна зона
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=Новият ключ за внедряване '%s' е
|
||||
settings.deploy_key_deletion=Изтрий ключ за внедряване
|
||||
settings.deploy_key_deletion_desc=При изтриването на този ключ за внедряване ще се премахнат свързаните права за достъп до това хранилище. Желаете ли да продължите?
|
||||
settings.deploy_key_deletion_success=Ключът за внедряване е изтрит успешно!
|
||||
settings.description_desc=Description of repository. Maximum 512 characters length.
|
||||
settings.description_length=Available characters
|
||||
|
||||
diff.browse_source=Преглед на файлове
|
||||
diff.parent=родител
|
||||
@@ -1096,6 +1102,7 @@ auths.new=Добави нов начин на удостоверяване
|
||||
auths.name=Име
|
||||
auths.type=Тип
|
||||
auths.enabled=Активно
|
||||
auths.default=Default
|
||||
auths.updated=Последна модификация
|
||||
auths.auth_type=Тип на удостоверяване
|
||||
auths.auth_name=Име на удостоверяване
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Име на PAM услуга
|
||||
auths.enable_auto_register=Включи автоматична регистрация
|
||||
auths.edit=Редактирай настройки за удостоверяване
|
||||
auths.activated=Това удостоверяване е активно
|
||||
auths.default_auth=This authentication is default login source
|
||||
auths.new_success=Новото удостоверяване '%s' е добавено успешно.
|
||||
auths.update_success=Настройките за удостоверяване са запазени успешно.
|
||||
auths.update=Запази настройки за удостоверяване
|
||||
|
||||
@@ -23,10 +23,10 @@ password=Heslo
|
||||
re_type=Znovu zadat
|
||||
captcha=CAPTCHA
|
||||
|
||||
repository=Repositář
|
||||
repository=Repozitář
|
||||
organization=Organizace
|
||||
mirror=Zrcadlo
|
||||
new_repo=Nový repositář
|
||||
new_repo=Nový repozitář
|
||||
new_migrate=Nové přenesení
|
||||
new_mirror=Nové zrcadlo
|
||||
new_fork=Nový repositář rozštěpení
|
||||
@@ -39,7 +39,7 @@ your_profile=Váš profil
|
||||
your_settings=Vaše nastavení
|
||||
|
||||
activities=Aktivity
|
||||
pull_requests=Pull Requesty
|
||||
pull_requests=Požadavky na natažení
|
||||
issues=Úkoly
|
||||
|
||||
cancel=Zrušit
|
||||
@@ -72,7 +72,7 @@ run_user=Účet pro spouštění
|
||||
run_user_helper=Tento uživatel musí mít přístup do kořenového adresáře repositářů a právo spustit Gogs.
|
||||
domain=Doména
|
||||
domain_helper=Toto ovlivňuje URL klonů skrze SSH.
|
||||
ssh_port=SSH port
|
||||
ssh_port=Port SSH
|
||||
ssh_port_helper=Číslo portu, které používá váš SSH server. Nechte jej prázdné pro vypnutí používání SSH.
|
||||
use_builtin_ssh_server=Použít vestavěný SSH server
|
||||
use_builtin_ssh_server_popup=Pro Git operace spustit vestavěný SSH server, aby byl rozpoznán od systémové SSH služby.
|
||||
@@ -151,8 +151,8 @@ register_hepler_msg=Již máte účet? Přihlašte se!
|
||||
social_register_hepler_msg=Již máte účet? Připojte se!
|
||||
disable_register_prompt=Omlouváme se, ale registrace jsou vypnuty. Kontaktujte správce systému.
|
||||
disable_register_mail=Omlouváme se, ale e-mailové služby jsou vypnuté. Kontaktujte správce systému.
|
||||
auth_source=Authentication Source
|
||||
local=Local
|
||||
auth_source=Zdroj ověření
|
||||
local=Lokální
|
||||
remember_me=Zapamatovat si mne
|
||||
forgot_password=Zapomenuté heslo
|
||||
forget_password=Zapomněli jste heslo?
|
||||
@@ -231,7 +231,7 @@ org_name_been_taken=Název organizace je již obsazen.
|
||||
team_name_been_taken=Název týmu je již obsazen.
|
||||
email_been_used=E-mailová adresa je již použita.
|
||||
username_password_incorrect=Chybné uživatelské jméno nebo heslo.
|
||||
auth_source_mismatch=The authentication source selected is not associated with the user.
|
||||
auth_source_mismatch=Vybraný zdroj ověření není propojen s uživatelem.
|
||||
enterred_invalid_repo_name=Ujistěte se, prosím, že zadaný název repositáře je správný.
|
||||
enterred_invalid_owner_name=Ujistěte se, prosím, že jméno vlastníka je zadáno správně.
|
||||
enterred_invalid_password=Ujistěte se, prosím, že zadané heslo je správné.
|
||||
@@ -251,7 +251,7 @@ target_branch_not_exist=Cílová větev neexistuje.
|
||||
[user]
|
||||
change_avatar=Změnit vaši uživatelskou ikonu
|
||||
join_on=Zaregistroval se dne
|
||||
repositories=Repositáře
|
||||
repositories=Repozitáře
|
||||
activity=Veřejná aktivita
|
||||
followers=Sledující
|
||||
starred=Oblíbené repositáře
|
||||
@@ -319,7 +319,7 @@ add_email_success=Vaše nová e-mailová adresa byla přidána.
|
||||
|
||||
manage_ssh_keys=Správa SSH klíčů
|
||||
add_key=Přidat klíč
|
||||
ssh_desc=Toto je seznam SSH klíčů vašeho účtu. Tyto klíče umožňují plný přístup k vašim repositářům, proto je velmi důležité, abyste jste si byli jistí, že jsou skutečně vaše.
|
||||
ssh_desc=Toto je seznam SSH klíčů vašeho účtu. Jelikož SSH klíče umožňují komukoliv plný přístup k vašim repositářům, je velmi důležité, abyste si byli jistí, že jsou skutečně vaše.
|
||||
ssh_helper=<strong>Nevíte jak?</strong> Podívejte se do příručky GitHubu jak si <a href="%s">vytvořit vlastní SSH klíč</a>, nebo na <a href="%s">řešení častých problémů</a>, na které můžete narazit při používání SSH.
|
||||
add_new_key=Přidat SSH klíč
|
||||
ssh_key_been_used=Obsah veřejného klíče byl použit.
|
||||
@@ -329,8 +329,8 @@ key_content=Obsah
|
||||
add_key_success=Byl přidán nový SSH klíč '%s'!
|
||||
delete_key=Smazat
|
||||
ssh_key_deletion=Smazání SSH klíče
|
||||
ssh_key_deletion_desc=Smazání tohoto SSH klíče odstraní všechny související přístupy k vašemu účtu. Chcete pokračovat?
|
||||
ssh_key_deletion_success=SSH klíč úspěšně odstraněn!
|
||||
ssh_key_deletion_desc=Smazání tohoto klíče SSH odstraní všechny související přístupy k vašemu účtu. Chcete pokračovat?
|
||||
ssh_key_deletion_success=SSH klíč byl úspěšně smazán!
|
||||
add_on=Přidán dne
|
||||
last_used=Naposledy použit dne
|
||||
no_activity=Žádná aktuální aktivita
|
||||
@@ -351,7 +351,7 @@ two_factor_or_enter_secret=Nebo zadejte tajný kód:
|
||||
two_factor_then_enter_passcode=Pak zadejte přístupový kód:
|
||||
two_factor_verify=Ověřit
|
||||
two_factor_invalid_passcode=Zadaný přístupový kód není platný, prosím, zkuste to znova!
|
||||
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
|
||||
two_factor_reused_passcode=Kód, který jste zadali už byl použit. Prosím, zkuste jiný!
|
||||
two_factor_enable_error=Povolení dvoufaktorového ověření selhalo: %v
|
||||
two_factor_enable_success=Dvoufaktorové ověření bylo pro váš účet povoleno!
|
||||
two_factor_recovery_codes_title=Obnovovací kódy dvoufaktorového ověření
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=Naposledy synchronizováno
|
||||
watchers=Sledující
|
||||
stargazers=Sledující
|
||||
forks=Rozštěpení
|
||||
repo_description_helper=Popis repozitáře. Maximální délka 512 znaků.
|
||||
repo_description_length=Dostupné znaky
|
||||
|
||||
form.reach_limit_of_creation=Vlastník dosáhl maximálního počtu %d vytvořených repositořů.
|
||||
form.name_reserved=Název repositáře '%s' je rezervován.
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Obsah souboru se změnil od začátku úprav.
|
||||
editor.file_already_exists=Soubor '%s' již v tomto repositáři existuje.
|
||||
editor.no_changes_to_show=Žádné změny k zobrazení.
|
||||
editor.fail_to_update_file=Vytvoření nebo změna souboru '%s' skončila chybou: %v
|
||||
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
|
||||
editor.add_subdir=Přidat podadresář...
|
||||
editor.unable_to_upload_files=Nepodařilo se nahrát soubor do '%s'. Chyba: %v
|
||||
editor.upload_files_to_dir=Nahrát soubory do '%s'
|
||||
@@ -620,7 +623,7 @@ pulls.compare_compare=porovnat
|
||||
pulls.filter_branch=Filtrovat větev
|
||||
pulls.no_results=Nebyly nalezeny žádné výsledky.
|
||||
pulls.nothing_to_compare=Není co porovnávat, protože základ a hlavní větve jsou shodné.
|
||||
pulls.nothing_merge_base=There is nothing to compare because two branches have completely different history.
|
||||
pulls.nothing_merge_base=Není co porovnávat, protože tyto dvě větve mají úplně jinou historii.
|
||||
pulls.has_pull_request=`Požadavek na natažení mezi těmito větvemi již existuje: <a href="%[1]s/pulls/%[3]d">%[2]s#%[3]d</a>`
|
||||
pulls.create=Vytvořit požadavek na natažení
|
||||
pulls.title_desc=chce sloučit %[1]d revizí z větve <code>%[2]s</code> do větve <code>%[3]s</code>
|
||||
@@ -636,8 +639,9 @@ pulls.is_checking=Kontrola rozporů stále pokračuje, prosím obnovte za někol
|
||||
pulls.can_auto_merge_desc=Tento požadavek na natažení může být automaticky sloučen.
|
||||
pulls.cannot_auto_merge_desc=Tento požadavek na natažení nemůže být automaticky sloučen, neboť se v něm nachází rozpory.
|
||||
pulls.cannot_auto_merge_helper=Prosím proveďte sloučení ručně, aby byly vyřešeny rozpory.
|
||||
pulls.create_merge_commit=Create a merge commit
|
||||
pulls.create_merge_commit=Vytvořit slučovací commit
|
||||
pulls.rebase_before_merging=Rebase before merging
|
||||
pulls.commit_description=Popis Commitu
|
||||
pulls.merge_pull_request=Sloučit požadavek na natažení
|
||||
pulls.open_unmerged_pull_exists=`Nemůžete znovuotevřít požadavek na natažení, neboť požadavek na natažení ze stejného repositáře se stejnými informacemi pro sloučení již existuje (#%d) a čeká na sloučení.`
|
||||
pulls.delete_branch=Smazat větev
|
||||
@@ -742,9 +746,9 @@ settings.tracker_issue_style=Styl pojmenování úkolů v externím systému úk
|
||||
settings.tracker_issue_style.numeric=Číselný
|
||||
settings.tracker_issue_style.alphanumeric=Alfanumerický
|
||||
settings.tracker_url_format_desc=Můžete použít zástupné výrazy <code>{user} {repo} {index}</code> pro uživatelské jméno, název repositáře a číslo úkolu.
|
||||
settings.pulls_desc=Povolit požadavky na natažení, aby mohly být příspěvky veřejnosti akceptovány
|
||||
settings.pulls.ignore_whitespace=Ignore changes in whitespace
|
||||
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
|
||||
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
|
||||
settings.pulls.ignore_whitespace=Ignorovat změny v netisknutelných znacích
|
||||
settings.pulls.allow_rebase_merge=Povolit použití reabse pro slučovací commity
|
||||
settings.danger_zone=Nebezpečná zóna
|
||||
settings.cannot_fork_to_same_owner=Nemůžete rozštěpit repositář jejímu vlastníkovi.
|
||||
settings.new_owner_has_same_repo=Nový vlastník již repositář se stejným názvem má. Vyberte, prosím, jiné jméno.
|
||||
@@ -765,7 +769,7 @@ settings.wiki_deletion_success=Data Wiki tohoto repositáře byla smazána.
|
||||
settings.delete=Smazat tento repositář
|
||||
settings.delete_desc=Jakmile smažete repositář, není možné se vrátit. Buďte si, prosím, jist.
|
||||
settings.delete_notices_1=- Tuto operaci <strong>nelze</strong> zvrátit.
|
||||
settings.delete_notices_2=- This operation will permanently delete everything in this repository, including Git data, issues, comments and collaborator access.
|
||||
settings.delete_notices_2=Tato operace permanentně smaže vše v tomto repositáři, včetně dat Gitu, úkolů, komentářů a přístupu spolupracovníků.
|
||||
settings.delete_notices_fork_1=- Po smazání se všechny forky se stanou nezávislé.
|
||||
settings.deletion_success=Repositář byl smazán!
|
||||
settings.update_settings_success=Možnosti repositáře byly změněny.
|
||||
@@ -839,14 +843,14 @@ settings.recent_deliveries=Nedávné dodávky
|
||||
settings.hook_type=Typ háčku
|
||||
settings.add_slack_hook_desc=Přidat integraci <a href="%s">Slacku</a> do vašeho repositáře.
|
||||
settings.add_discord_hook_desc=Přidat integraci <a href="%s">Discord</a> do vašeho repositáře.
|
||||
settings.add_dingtalk_hook_desc=Add <a href="%s">Dingtalk</a> integration to your repository.
|
||||
settings.add_dingtalk_hook_desc=Přidat integraci <a href="%s">Dingtalk</a> do vašeho repositáře.
|
||||
settings.slack_token=Poukázka
|
||||
settings.slack_domain=Doména
|
||||
settings.slack_channel=Kanál
|
||||
settings.deploy_keys=Klíče pro nasazení
|
||||
settings.deploy_keys_helper=<b>Přichycen při činu!</b> Pokud chcete přidat osobní veřejné klíče, zadejte je prosím v <a href="%s%s">nastavení vašeho účtu</a>.
|
||||
settings.add_deploy_key=Přidat klíč pro nasazení
|
||||
settings.deploy_key_desc=Klíče pro nasazení mají pouze přístup ke čtení. Nejsou stejné jako osobní SSH klíče.
|
||||
settings.deploy_key_desc=Klíče pro nasazení mají pouze přístup ke čtení. Nejsou stejné jako SSH klíče osobního účtu.
|
||||
settings.no_deploy_keys=Žádné klíče pro nasazení nebyly ještě přidány.
|
||||
settings.title=Název
|
||||
settings.deploy_key_content=Obsah
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=Nový klíč pro nasazení '%s' byl přidán!
|
||||
settings.deploy_key_deletion=Smazat klíč pro nasazení
|
||||
settings.deploy_key_deletion_desc=Smazání toho klíče pro nasazení smaže také veškerý k němu svázaný přístup do tohoto repositáře. Chcete pokračovat?
|
||||
settings.deploy_key_deletion_success=Klíč pro nasazení byl smazán!
|
||||
settings.description_desc=Description of repository. Maximum 512 characters length.
|
||||
settings.description_length=Dostupné znaky
|
||||
|
||||
diff.browse_source=Procházet zdrojové kódy
|
||||
diff.parent=rodič
|
||||
@@ -911,7 +917,7 @@ people=Lidé
|
||||
invite_someone=Přizvěte někoho
|
||||
teams=Týmy
|
||||
lower_members=členové
|
||||
lower_repositories=repositáře
|
||||
lower_repositories=repozitáře
|
||||
create_new_team=Vytvořit nový tým
|
||||
org_desc=Popis
|
||||
team_name=Název týmu
|
||||
@@ -975,9 +981,9 @@ teams.delete_team_success=Daný tým byl smazán.
|
||||
teams.read_permission_desc=Členství v tom týmu poskytuje právo <strong>čtení</strong>: členové mohou číst z a vytvářet klony repositářů týmu.
|
||||
teams.write_permission_desc=Členství v tom týmu poskytuje právo <strong>zápisu</strong>: členové mohou číst z a odesílat do repositářů týmu.
|
||||
teams.admin_permission_desc=Členství v tom týmu poskytuje právo <strong>správce</strong>: členové mohou číst z, odesílat do a přidávat spolupracovníky do repositářů týmu.
|
||||
teams.repositories=Repositáře týmu
|
||||
teams.repositories=Repozitáře týmu
|
||||
teams.search_repo_placeholder=Hledat repositář...
|
||||
teams.add_team_repository=Přidat repositář týmu
|
||||
teams.add_team_repository=Přidat repozitář týmu
|
||||
teams.remove_repo=Odstranit
|
||||
teams.add_nonexistent_repo=Repositář, který se snažíte přidat, neexistuje. Nejdříve jej vytvořte, prosím.
|
||||
|
||||
@@ -985,7 +991,7 @@ teams.add_nonexistent_repo=Repositář, který se snažíte přidat, neexistuje.
|
||||
dashboard=Přehled
|
||||
users=Uživatelé
|
||||
organizations=Organizace
|
||||
repositories=Repositáře
|
||||
repositories=Repozitáře
|
||||
authentication=Způsoby ověření
|
||||
config=Nastavení
|
||||
notices=Systémová oznámení
|
||||
@@ -1091,11 +1097,12 @@ repos.stars=Oblíbení
|
||||
repos.issues=Úkoly
|
||||
repos.size=Velikost
|
||||
|
||||
auths.auth_sources=Authentication Sources
|
||||
auths.auth_sources=Zdroje ověření
|
||||
auths.new=Přidat nový zdroj
|
||||
auths.name=Název
|
||||
auths.type=Typ
|
||||
auths.enabled=Povolený
|
||||
auths.default=Výchozí
|
||||
auths.updated=Změněné
|
||||
auths.auth_type=Typ ověření
|
||||
auths.auth_name=Název ověření
|
||||
@@ -1104,7 +1111,7 @@ auths.domain=Doména
|
||||
auths.host=Server
|
||||
auths.port=Port
|
||||
auths.bind_dn=Připojení DN
|
||||
auths.bind_dn_helper=You can use '%s' as placeholder for username, e.g. DOM\%s
|
||||
auths.bind_dn_helper=Můžete použít '%s' jako zástupný znak pro uživatelské jméno, například DOM\%s
|
||||
auths.bind_password=Heslo připojení
|
||||
auths.bind_password_helper=Upozornění: Toto heslo je ukládáno nešifrované. Nepoužívejte pro správcovské účty.
|
||||
auths.user_base=Výchozí místo hledání uživatelů
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Název služby PAM
|
||||
auths.enable_auto_register=Povolit zaregistrování se
|
||||
auths.edit=Upravit nastavení ověřování
|
||||
auths.activated=Tento způsob ověřování je aktivní
|
||||
auths.default_auth=This authentication is default login source
|
||||
auths.new_success=Nový způsob ověřování '%s' byl přidán.
|
||||
auths.update_success=Nastavení ověřování bylo změněno.
|
||||
auths.update=Změnit nastavení ověřování
|
||||
@@ -1144,7 +1152,7 @@ auths.still_in_used=Tento způsob ověřování je stále používán některým
|
||||
auths.deletion_success=Způsob ověřování byl smazán!
|
||||
auths.login_source_exist=Zdroj přihlášení '%s' již existuje.
|
||||
|
||||
config.not_set=(not set)
|
||||
config.not_set=(není nastaveno)
|
||||
config.server_config=Nastavení serveru
|
||||
config.app_name=Název aplikace
|
||||
config.app_ver=Verze aplikace
|
||||
@@ -1166,7 +1174,7 @@ config.ssh_domain=Doména
|
||||
config.ssh_port=Port
|
||||
config.ssh_listen_port=Port pro naslouchání
|
||||
config.ssh_root_path=Kořenová cesta
|
||||
config.ssh_rewrite_authorized_keys_at_start=Rewrite authorized_keys At Start
|
||||
config.ssh_rewrite_authorized_keys_at_start=Přepsat authorized_keys při startu
|
||||
config.ssh_key_test_path=Cesta testu klíčů
|
||||
config.ssh_keygen_path=Cesta ke generátoru klíčů ('ssh-keygen')
|
||||
config.ssh_minimum_key_size_check=Kontrola minimální velikosti klíčů
|
||||
@@ -1182,7 +1190,7 @@ config.disable_http_git=Vypnout HTTP Git
|
||||
config.enable_local_path_migration=Povolit migraci z místní cesty
|
||||
config.commits_fetch_concurrency=Souběžnost vyzvednutí revizí
|
||||
|
||||
config.http_config=HTTP Configuration
|
||||
config.http_config=Nastavení HTTP
|
||||
config.http_access_control_allow_origin=Access Control Allow Origin
|
||||
|
||||
config.db_config=Nastavení databáze
|
||||
|
||||
@@ -151,8 +151,8 @@ register_hepler_msg=Haben Sie bereits ein Konto? Jetzt anmelden!
|
||||
social_register_hepler_msg=Haben Sie bereits ein Konto? Jetzt verknüpfen!
|
||||
disable_register_prompt=Es tut uns leid, die Registrierung wurde deaktiviert. Bitte wenden Sie sich an den Administrator.
|
||||
disable_register_mail=Es tut uns leid, die Bestätigung der Registrierungs-E-Mail wurde deaktiviert.
|
||||
auth_source=Authentication Source
|
||||
local=Local
|
||||
auth_source=Authentifizierungsquelle
|
||||
local=Lokalisierung
|
||||
remember_me=Angemeldet bleiben
|
||||
forgot_password=Passwort vergessen
|
||||
forget_password=Passwort vergessen?
|
||||
@@ -231,7 +231,7 @@ org_name_been_taken=Organisationsname ist bereits vergeben.
|
||||
team_name_been_taken=Teamname ist bereits vergeben.
|
||||
email_been_used=E-Mail-Adresse wird bereits verwendet.
|
||||
username_password_incorrect=Benutzername oder Passwort ist nicht korrekt.
|
||||
auth_source_mismatch=The authentication source selected is not associated with the user.
|
||||
auth_source_mismatch=Die ausgewählte Authentifizierungsquelle ist dem Benutzer nicht zugeordnet.
|
||||
enterred_invalid_repo_name=Bitte achten Sie darauf, dass der von Ihnen eingegebene Repository-Name korrekt ist.
|
||||
enterred_invalid_owner_name=Bitte achten Sie darauf, dass der eingegebene Name des Besitzers korrekt ist.
|
||||
enterred_invalid_password=Bitte achten Sie darauf, dass das eingegebene Passwort richtig ist.
|
||||
@@ -351,7 +351,7 @@ two_factor_or_enter_secret=Oder geben Sie Ihren Geheim-Code ein:
|
||||
two_factor_then_enter_passcode=Geben Sie die PIN ein:
|
||||
two_factor_verify=Bestätigen
|
||||
two_factor_invalid_passcode=Die eingegebene PIN ist ungültig. Bitte versuchen Sie es erneut!
|
||||
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
|
||||
two_factor_reused_passcode=Der von dir eingegebene Passcode wurde bereits verwendet, bitte probiere einen anderen!
|
||||
two_factor_enable_error=Einschalten der Zwei-Faktor-Authentifizierung ist fehlgeschlagen: %v
|
||||
two_factor_enable_success=Die Zwei-Faktor-Authentifizierung wurde für Ihr Konto erfolgreich aktiviert!
|
||||
two_factor_recovery_codes_title=Zwei-Faktor-Authentifizierung-Wiederherstellungscodes
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=Zuletzt synchronisiert
|
||||
watchers=Beobachter
|
||||
stargazers=In Favoriten von
|
||||
forks=Forks
|
||||
repo_description_helper=Beschreibung des Repository. Maximal 512 Zeichen.
|
||||
repo_description_length=Verfügbare Zeichen
|
||||
|
||||
form.reach_limit_of_creation=Der Besitzer hat die maximale Anzahl von %d erstellbaren Repositories erreicht.
|
||||
form.name_reserved=Repository-Name '%s' ist reserviert.
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Seit dem Start der Bearbeitung hat sich die Da
|
||||
editor.file_already_exists=Eine Datei mit dem Namen '%s' existiert bereits in diesem Repository.
|
||||
editor.no_changes_to_show=Keine Änderungen vorhanden.
|
||||
editor.fail_to_update_file=Fehler beim Ändern/Erstellen der Datei '%s'. Fehler: %v
|
||||
editor.fail_to_delete_file=Fehler beim Löschen der Datei '%s'. Fehler: %v
|
||||
editor.add_subdir=Unterverzeichnis erstellen...
|
||||
editor.unable_to_upload_files=Fehler beim Hochladen der Dateien zu '%s'. Fehler: %v
|
||||
editor.upload_files_to_dir=Dateien hochladen nach '%s'
|
||||
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Dieser Pull-Request kann nicht automatisch zusammen
|
||||
pulls.cannot_auto_merge_helper=Bitte manuell zusammenführen, um die Konflikte zu lösen.
|
||||
pulls.create_merge_commit=Erstelle einen Merge-Commit
|
||||
pulls.rebase_before_merging=Rebase vor dem Zusammenführen
|
||||
pulls.commit_description=Commit Beschreibung
|
||||
pulls.merge_pull_request=Pull-Request zusammenführen
|
||||
pulls.open_unmerged_pull_exists=`Sie können diesen Pull-Request nicht wieder öffnen, da bereits ein offener Pull-Request (#%d) aus dem selben Repository mit den gleichen Merge-Informationen existiert und auf das Zusammenführen wartet.`
|
||||
pulls.delete_branch=Zweig löschen
|
||||
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Namenskonvention des externen Issue-Trackers:
|
||||
settings.tracker_issue_style.numeric=Numerisch
|
||||
settings.tracker_issue_style.alphanumeric=Alphanumerisch
|
||||
settings.tracker_url_format_desc=Sie können die Platzhalter <code>{user} {repo} {index}</code> für den Benutzernamen, den Namen des Repositories und die Issue-Nummer verwenden.
|
||||
settings.pulls_desc=Pull-Requests aktivieren, um öffentliche Mitwirkung zu ermöglichen
|
||||
settings.pulls_desc=Erlaube Pull-Requests zur Zusammenarbeit von Repositories und Branches
|
||||
settings.pulls.ignore_whitespace=Ignoriere whitespace Änderungen
|
||||
settings.pulls.allow_rebase_merge=Die Verwendung von Rebase erlauben, um Commits zu mergen
|
||||
settings.danger_zone=Gefahrenzone
|
||||
@@ -765,7 +769,7 @@ settings.wiki_deletion_success=Repository Wiki Daten erfolgreich gelöscht.
|
||||
settings.delete=Dieses Repository löschen
|
||||
settings.delete_desc=Wenn dieses Repository gelöscht wurde, gibt es keinen Weg zurück. Bitte seien Sie vorsichtig.
|
||||
settings.delete_notices_1=- Diese Operation kann <strong>NICHT</strong> rückgängig gemacht werden.
|
||||
settings.delete_notices_2=- This operation will permanently delete everything in this repository, including Git data, issues, comments and collaborator access.
|
||||
settings.delete_notices_2=- Die Operation wird alles, was mit diesem Git-Repository verbunden ist, dauerhaft löschen, inklusive der Daten, Issues, Kommentare und Zugriffsrechte von Mitarbeitern.
|
||||
settings.delete_notices_fork_1=- Nach dem Löschen werden alle Forks unabhängig.
|
||||
settings.deletion_success=Repository wurde erfolgreich gelöscht!
|
||||
settings.update_settings_success=Repository-Optionen aktualisiert.
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=Der Deploy-Schlüssel '%s' wurde erfolgreich hinzugefü
|
||||
settings.deploy_key_deletion=Deploy-Schlüssel löschen
|
||||
settings.deploy_key_deletion_desc=Nach dem Löschen dieses Deploy-Schlüssels werden entsprechende Zugriffe auf dieses Repository nicht mehr möglich sein. Möchten Sie wirklich fortfahren?
|
||||
settings.deploy_key_deletion_success=Deploy-Schlüssel wurde erfolgreich gelöscht!
|
||||
settings.description_desc=Beschreibung des Repository. Maximal 512 Zeichen.
|
||||
settings.description_length=Verfügbare Zeichen
|
||||
|
||||
diff.browse_source=Quellcode durchsuchen
|
||||
diff.parent=Ursprung
|
||||
@@ -1091,11 +1097,12 @@ repos.stars=Favoriten
|
||||
repos.issues=Issues
|
||||
repos.size=Größe
|
||||
|
||||
auths.auth_sources=Authentication Sources
|
||||
auths.auth_sources=Authentifizierungsquelle
|
||||
auths.new=Neue Quelle hinzufügen
|
||||
auths.name=Name
|
||||
auths.type=Typ
|
||||
auths.enabled=Aktiviert
|
||||
auths.default=Standard
|
||||
auths.updated=Aktualisiert
|
||||
auths.auth_type=Authentifizierungstyp
|
||||
auths.auth_name=Authentifizierungsname
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAM Dienstname
|
||||
auths.enable_auto_register=Automatische Registrierung aktivieren
|
||||
auths.edit=Authentifizierungseinstellungen bearbeiten
|
||||
auths.activated=Diese Authentifizierung ist aktiv
|
||||
auths.default_auth=Diese Authentifizierungsmethode ist die Vorgabe
|
||||
auths.new_success=Neue Authentifizierung '%s' wurde erfolgreich hinzugefügt.
|
||||
auths.update_success=Die Authentifizierungseinstellungen wurden erfolgreich aktualisiert.
|
||||
auths.update=Authentifizierungseinstellungen aktualisieren
|
||||
@@ -1166,7 +1174,7 @@ config.ssh_domain=Domain
|
||||
config.ssh_port=Port
|
||||
config.ssh_listen_port=Listen Port
|
||||
config.ssh_root_path=Verzeichnis
|
||||
config.ssh_rewrite_authorized_keys_at_start=Rewrite authorized_keys At Start
|
||||
config.ssh_rewrite_authorized_keys_at_start=Beim Start authorized_keys umschreiben
|
||||
config.ssh_key_test_path=Schlüssel-Test-Pfad
|
||||
config.ssh_keygen_path=Keygen ('ssh-keygen') Pfad
|
||||
config.ssh_minimum_key_size_check=Prüfung der Mindestschlüssellänge
|
||||
@@ -1298,13 +1306,13 @@ comment_issue=`hat Issue <a href="%s/issues/%s">%s#%[2]s</a> kommentiert`
|
||||
create_pull_request=`hat Pull-Request <a href="%s/pulls/%s">%s#%[2]s</a> erstellt`
|
||||
close_pull_request=`hat Pull-Request <a href="%s/pulls/%s">%s#%[2]s</a> geschlossen`
|
||||
reopen_pull_request=`hat den Pull-Request <a href="%s/pulls/%s">%s#%[2]s</a> wieder geöffnet`
|
||||
merge_pull_request=`hat Pull-Request <a href="%s/pulls/%s">%s#%[2]s</a> zuammengeführt`
|
||||
merge_pull_request=`hat Pull-Request <a href="%s/pulls/%s">%s#%[2]s</a> zusammengeführt`
|
||||
create_branch=hat neuen Branch <a href="%[1]s/src/%[2]s">%[3]s</a> in <a href="%[1]s">%[4]s</a> angelegt
|
||||
delete_branch=hat Branch <code>%[2]s</code> in <a href="%[1]s">%[3]s</a> gelöscht
|
||||
push_tag=hat Tag <a href="%s/src/%s">%[2]s</a> auf <a href="%[1]s">%[3]s</a> gepusht
|
||||
delete_tag=hat Tag <code>%[2]s</code> in <a href="%[1]s">%[3]s</a> gelöscht
|
||||
fork_repo=hat das Repository nach <a href="%s">%s</a> geforkt
|
||||
mirror_sync_push=synced commits to <a href="%[1]s/src/%[2]s">%[3]s</a> at <a href="%[1]s">%[4]s</a> from mirror
|
||||
mirror_sync_push=hat auf <a href="%[1]s/src/%[2]s">%[3]s</a> in <a href="%[1]s">%[4]s</a> gepusht
|
||||
mirror_sync_create=synced new reference <a href="%s/src/%s">%[2]s</a> to <a href="%[1]s">%[3]s</a> from mirror
|
||||
mirror_sync_delete=synced and deleted reference <code>%[2]s</code> at <a href="%[1]s">%[3]s</a> from mirror
|
||||
|
||||
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=Last Synced
|
||||
watchers=Watchers
|
||||
stargazers=Stargazers
|
||||
forks=Forks
|
||||
repo_description_helper=Description of repository. Maximum 512 characters length.
|
||||
repo_description_length=Available characters
|
||||
|
||||
form.reach_limit_of_creation=The owner has reached maximum creation limit of %d repositories.
|
||||
form.name_reserved=Repository name '%s' is reserved.
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=File content has been changed since you starte
|
||||
editor.file_already_exists=A file with name '%s' already exists in this repository.
|
||||
editor.no_changes_to_show=There are no changes to show.
|
||||
editor.fail_to_update_file=Failed to update/create file '%s' with error: %v
|
||||
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
|
||||
editor.add_subdir=Add subdirectory...
|
||||
editor.unable_to_upload_files=Failed to upload files to '%s' with error: %v
|
||||
editor.upload_files_to_dir=Upload files to '%s'
|
||||
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=This pull request can't be merged automatically bec
|
||||
pulls.cannot_auto_merge_helper=Please merge manually in order to resolve the conflicts.
|
||||
pulls.create_merge_commit=Create a merge commit
|
||||
pulls.rebase_before_merging=Rebase before merging
|
||||
pulls.commit_description=Commit Description
|
||||
pulls.merge_pull_request=Merge Pull Request
|
||||
pulls.open_unmerged_pull_exists=`You can't perform reopen operation because there is already an open pull request (#%d) from same repository with same merge information and is waiting for merging.`
|
||||
pulls.delete_branch=Delete Branch
|
||||
@@ -742,7 +746,7 @@ settings.tracker_issue_style=External Issue Tracker Naming Style:
|
||||
settings.tracker_issue_style.numeric=Numeric
|
||||
settings.tracker_issue_style.alphanumeric=Alphanumeric
|
||||
settings.tracker_url_format_desc=You can use placeholder <code>{user} {repo} {index}</code> for user name, repository name and issue index.
|
||||
settings.pulls_desc=Enable pull requests to accept public contributions
|
||||
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
|
||||
settings.pulls.ignore_whitespace=Ignore changes in whitespace
|
||||
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
|
||||
settings.danger_zone=Danger Zone
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=New deploy key '%s' has been added successfully!
|
||||
settings.deploy_key_deletion=Delete Deploy Key
|
||||
settings.deploy_key_deletion_desc=Deleting this deploy key will remove all related accesses for this repository. Do you want to continue?
|
||||
settings.deploy_key_deletion_success=Deploy key has been deleted successfully!
|
||||
settings.description_desc=Description of repository. Maximum 512 characters length.
|
||||
settings.description_length=Available characters
|
||||
|
||||
diff.browse_source=Browse Source
|
||||
diff.parent=parent
|
||||
@@ -1096,6 +1102,7 @@ auths.new=Add New Source
|
||||
auths.name=Name
|
||||
auths.type=Type
|
||||
auths.enabled=Enabled
|
||||
auths.default=Default
|
||||
auths.updated=Updated
|
||||
auths.auth_type=Authentication Type
|
||||
auths.auth_name=Authentication Name
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAM Service Name
|
||||
auths.enable_auto_register=Enable Auto Registration
|
||||
auths.edit=Edit Authentication Setting
|
||||
auths.activated=This authentication is activated
|
||||
auths.default_auth=This authentication is default login source
|
||||
auths.new_success=New authentication '%s' has been added successfully.
|
||||
auths.update_success=Authentication setting has been updated successfully.
|
||||
auths.update=Update Authentication Setting
|
||||
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced = Last Synced
|
||||
watchers = Watchers
|
||||
stargazers = Stargazers
|
||||
forks = Forks
|
||||
repo_description_helper = Description of repository. Maximum 512 characters length.
|
||||
repo_description_length = Available characters
|
||||
|
||||
form.reach_limit_of_creation = The owner has reached maximum creation limit of %d repositories.
|
||||
form.name_reserved = Repository name '%s' is reserved.
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing = File content has been changed since you star
|
||||
editor.file_already_exists = A file with name '%s' already exists in this repository.
|
||||
editor.no_changes_to_show = There are no changes to show.
|
||||
editor.fail_to_update_file = Failed to update/create file '%s' with error: %v
|
||||
editor.fail_to_delete_file = Failed to delete file '%s' with error: %v
|
||||
editor.add_subdir = Add subdirectory...
|
||||
editor.unable_to_upload_files = Failed to upload files to '%s' with error: %v
|
||||
editor.upload_files_to_dir = Upload files to '%s'
|
||||
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc = This pull request can't be merged automatically b
|
||||
pulls.cannot_auto_merge_helper = Please merge manually in order to resolve the conflicts.
|
||||
pulls.create_merge_commit = Create a merge commit
|
||||
pulls.rebase_before_merging = Rebase before merging
|
||||
pulls.commit_description = Commit Description
|
||||
pulls.merge_pull_request = Merge Pull Request
|
||||
pulls.open_unmerged_pull_exists = `You can't perform reopen operation because there is already an open pull request (#%d) from same repository with same merge information and is waiting for merging.`
|
||||
pulls.delete_branch = Delete Branch
|
||||
@@ -742,7 +746,7 @@ settings.tracker_issue_style = External Issue Tracker Naming Style:
|
||||
settings.tracker_issue_style.numeric = Numeric
|
||||
settings.tracker_issue_style.alphanumeric = Alphanumeric
|
||||
settings.tracker_url_format_desc = You can use placeholder <code>{user} {repo} {index}</code> for user name, repository name and issue index.
|
||||
settings.pulls_desc = Enable pull requests to accept public contributions
|
||||
settings.pulls_desc = Enable pull requests to accept contributions between repositories and branches
|
||||
settings.pulls.ignore_whitespace = Ignore changes in whitespace
|
||||
settings.pulls.allow_rebase_merge = Allow use rebase to merge commits
|
||||
settings.danger_zone = Danger Zone
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success = New deploy key '%s' has been added successfully!
|
||||
settings.deploy_key_deletion = Delete Deploy Key
|
||||
settings.deploy_key_deletion_desc = Deleting this deploy key will remove all related accesses for this repository. Do you want to continue?
|
||||
settings.deploy_key_deletion_success = Deploy key has been deleted successfully!
|
||||
settings.description_desc = Description of repository. Maximum 512 characters length.
|
||||
settings.description_length = Available characters
|
||||
|
||||
diff.browse_source = Browse Source
|
||||
diff.parent = parent
|
||||
@@ -1096,6 +1102,7 @@ auths.new = Add New Source
|
||||
auths.name = Name
|
||||
auths.type = Type
|
||||
auths.enabled = Enabled
|
||||
auths.default = Default
|
||||
auths.updated = Updated
|
||||
auths.auth_type = Authentication Type
|
||||
auths.auth_name = Authentication Name
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name = PAM Service Name
|
||||
auths.enable_auto_register = Enable Auto Registration
|
||||
auths.edit = Edit Authentication Setting
|
||||
auths.activated = This authentication is activated
|
||||
auths.default_auth = This authentication is default login source
|
||||
auths.new_success = New authentication '%s' has been added successfully.
|
||||
auths.update_success = Authentication setting has been updated successfully.
|
||||
auths.update = Update Authentication Setting
|
||||
@@ -1143,6 +1151,7 @@ auths.delete_auth_desc = This authentication is going to be deleted, do you want
|
||||
auths.still_in_used = This authentication is still used by some users, please delete or convert these users to another login type first.
|
||||
auths.deletion_success = Authentication has been deleted successfully!
|
||||
auths.login_source_exist = Login source '%s' already exists.
|
||||
auths.github_api_endpoint = API Endpoint
|
||||
|
||||
config.not_set = (not set)
|
||||
config.server_config = Server Configuration
|
||||
|
||||
@@ -345,22 +345,22 @@ two_factor_enable=Activar
|
||||
two_factor_disable=Desactivar
|
||||
two_factor_view_recovery_codes=Guarda <a href="%s%s"> tus códigos de recuperación</a> en un lugar seguro. Podrás usarlos como código de acceso si pierdes el acceso a tu aplicación de autenticación.
|
||||
two_factor_http=Para las operaciones sobre HTTP/HTTPS, no puedes usar un usuario y contraseña. Por favor, cree y utilice <a href="%[1]s%[2]s"> un token de acceso personal</a> como su credencial de acceso, por ejemplo, <code>%[3]s</code>.
|
||||
two_factor_enable_title=Habilitar autenticaciñon en dos pasos
|
||||
two_factor_enable_title=Habilitar autenticación en dos pasos
|
||||
two_factor_scan_qr=Por favor, use su aplicación de autenticación para escanear la imagen:
|
||||
two_factor_or_enter_secret=Or enter the secret:
|
||||
two_factor_or_enter_secret=O introduzca el secreto:
|
||||
two_factor_then_enter_passcode=Introduce el Pin:
|
||||
two_factor_verify=Verificar
|
||||
two_factor_invalid_passcode=¡El Pin que has introducido no es válido, por favor, inténtalo de nuevo!
|
||||
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
|
||||
two_factor_enable_error=Enable Two-factor authentication failed: %v
|
||||
two_factor_enable_success=Two-factor authentication has enabled for your account successfully!
|
||||
two_factor_recovery_codes_title=Two-factor Authentication Recovery Codes
|
||||
two_factor_recovery_codes_desc=Recovery codes are used when you temporarily lose access to your authentication application. Each recovery code can only be used once, <b>please keep these codes in a safe place</b>.
|
||||
two_factor_regenerate_recovery_codes=Regenerate Recovery Codes
|
||||
two_factor_regenerate_recovery_codes_error=Regenerate recovery codes failed: %v
|
||||
two_factor_regenerate_recovery_codes_success=New recovery codes has been generated successfully!
|
||||
two_factor_reused_passcode=¡El pin de autenticación que has introducido ya ha sido usado, por favor intenta con otro!
|
||||
two_factor_enable_error=Ha fallado la activación de la autenticación en dos pasos: %v
|
||||
two_factor_enable_success=¡La autenticación en dos pasos se ha activado en tu cuenta correctamente!
|
||||
two_factor_recovery_codes_title=Códigos de recuperación para la autenticación en dos pasos
|
||||
two_factor_recovery_codes_desc=Los códigos de recuperación se usan cuando pierdes temporalmente el acceso a tu aplicación de autenticación. Cada código de recuperación solo puede utilizarse en una ocasión, <b>por favor, mantén estos códigos en lugar seguro</b>.
|
||||
two_factor_regenerate_recovery_codes=Regenerar códigos de recuperación
|
||||
two_factor_regenerate_recovery_codes_error=Ha fallado la regeneración de códigos de recuperación: %v
|
||||
two_factor_regenerate_recovery_codes_success=¡Nuevos códigos de recuperación han sido generados con éxito!
|
||||
two_factor_disable_title=Deshabilitar autenticación en dos pasos
|
||||
two_factor_disable_desc=Your account security level will decrease after disabled two-factor authentication. Do you want to continue?
|
||||
two_factor_disable_desc=El nivel de seguridad de tu cuenta se verá reducido después de desactivar la autenticación en dos pasos. ¿Deseas continuar?
|
||||
two_factor_disable_success=¡La autenticación en dos pasos ha sido deshabilitada satisfactoriamente!
|
||||
|
||||
manage_access_token=Gestionar los Tokens de Acceso personales
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=Última sincronización
|
||||
watchers=Seguidores
|
||||
stargazers=Fans
|
||||
forks=Forks
|
||||
repo_description_helper=Descripción del repositorio. Longitud máxima de 512 caracteres.
|
||||
repo_description_length=Caracteres disponibles
|
||||
|
||||
form.reach_limit_of_creation=El propietario ha alcanzado el límite máximo de %d repositorios creados.
|
||||
form.name_reserved=El nombre del repositorio '%s' está reservado.
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=El contenido del archivo ha sido modificado de
|
||||
editor.file_already_exists=Ya existe un archivo con nombre '%s' en este repositorio.
|
||||
editor.no_changes_to_show=No existen cambios para mostrar.
|
||||
editor.fail_to_update_file=Error al actualizar/crear el archivo '%s', error: %v
|
||||
editor.fail_to_delete_file=Error al borrar el fichero '%s', error: %v
|
||||
editor.add_subdir=Añadir subdirectorio...
|
||||
editor.unable_to_upload_files=Error al subir archivos a '%s', error: %v
|
||||
editor.upload_files_to_dir=Subir archivos a '%s'
|
||||
@@ -620,7 +623,7 @@ pulls.compare_compare=comparar con
|
||||
pulls.filter_branch=Filtrar rama
|
||||
pulls.no_results=Sin resultados.
|
||||
pulls.nothing_to_compare=Nada que comparar. Las dos ramas coinciden.
|
||||
pulls.nothing_merge_base=There is nothing to compare because two branches have completely different history.
|
||||
pulls.nothing_merge_base=No hay nada que comparar porque las dos ramas tienen una historia completamente distinta.
|
||||
pulls.has_pull_request=`Ya existe un pull request entre estas dos ramas: <a href="%[1]s/pulls/%[3]d">%[2]s#%[3]d</a>`
|
||||
pulls.create=Crear Pull Request
|
||||
pulls.title_desc=desea fusionar %[1]d commits de <code>%[2]s</code> en <code>%[3]s</code>
|
||||
@@ -636,8 +639,9 @@ pulls.is_checking=Se está procediendo a la búsqueda de conflictos, por favor a
|
||||
pulls.can_auto_merge_desc=Este Pull Request puede ser fusionado automáticamente.
|
||||
pulls.cannot_auto_merge_desc=Este Pull Request no puede ser fusionado automáticamente porque hay conflictos.
|
||||
pulls.cannot_auto_merge_helper=Por favor, fusiona manualmente para resolver los conflictos.
|
||||
pulls.create_merge_commit=Create a merge commit
|
||||
pulls.rebase_before_merging=Rebase before merging
|
||||
pulls.create_merge_commit=Crear un commit del fusionado
|
||||
pulls.rebase_before_merging=Hacer rebase antes de fusionar
|
||||
pulls.commit_description=Descripción del commit
|
||||
pulls.merge_pull_request=Fusionar Pull Request
|
||||
pulls.open_unmerged_pull_exists=`Usted no puede realizar la operación de reapertura porque en estos momentos existe una solicitud de pull request (#%d) para el mismo repositorio con la misma información que se encuentra a la espera de aprobación`
|
||||
pulls.delete_branch=Eliminar la rama
|
||||
@@ -697,7 +701,7 @@ settings.branches_bare=No puedes gestionar ramas en un repositorio vacío. Por f
|
||||
settings.default_branch=Rama predeterminada
|
||||
settings.default_branch_desc=Se considera la rama «base» como la rama por defecto para commits de código, las solicitudes pull y edición en línea.
|
||||
settings.update=Actualizar
|
||||
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
|
||||
settings.update_default_branch_unsupported=El cambio de rama por defecto no esta soportado por la versión de Git en el servidor.
|
||||
settings.update_default_branch_success=¡La Rama por defecto de este repositorio ha sido actualizado con éxito!
|
||||
settings.protected_branches=Ramas protegidas
|
||||
settings.protected_branches_desc=Proteger ramas force pushing, de eliminación accidental y lista blanca de committers de código.
|
||||
@@ -714,7 +718,7 @@ settings.protect_whitelist_users=Usuarios que pueden hacer push a esta rama
|
||||
settings.protect_whitelist_search_users=Buscar usuarios
|
||||
settings.protect_whitelist_teams=Equipos cuyos miembros pueden hacer push a esta rama
|
||||
settings.protect_whitelist_search_teams=Buscar equipos
|
||||
settings.update_protect_branch_success=Protect options for this branch has been updated successfully!
|
||||
settings.update_protect_branch_success=¡Las opciones de protección para esta rama se han actualizado con éxito!
|
||||
settings.hooks=Webhooks
|
||||
settings.githooks=Git Hooks
|
||||
settings.basic_settings=Configuración Básica
|
||||
@@ -727,7 +731,7 @@ settings.change_reponame_prompt=Este cambio afectará a los enlaces al repositor
|
||||
settings.advanced_settings=Ajustes avanzados
|
||||
settings.wiki_desc=Activar sistema de wiki
|
||||
settings.use_internal_wiki=Usar wiki integrada
|
||||
settings.allow_public_wiki_desc=Allow public access to wiki when repository is private
|
||||
settings.allow_public_wiki_desc=Permitir acceso público a la wiki cuando el repositorio es privado
|
||||
settings.use_external_wiki=Usar Wiki externa
|
||||
settings.external_wiki_url=URL externa de la Wiki
|
||||
settings.external_wiki_url_desc=Los visitantes serán redireccionados a la URL cuando hagan click en la barra.
|
||||
@@ -742,11 +746,11 @@ settings.tracker_issue_style=Estilo de etiquetado del tracker externo de inciden
|
||||
settings.tracker_issue_style.numeric=Numérico
|
||||
settings.tracker_issue_style.alphanumeric=Alfanumérico
|
||||
settings.tracker_url_format_desc=Puedes usar las plantillas <code>{user} {repo} {index}</code> para el nombre de usuario, nombre del repositorio e índice de la incidencia.
|
||||
settings.pulls_desc=Habilitar Pull Requests para aceptar contribuciones públicas
|
||||
settings.pulls.ignore_whitespace=Ignore changes in whitespace
|
||||
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
|
||||
settings.pulls_desc=Permitir pull requests para aceptar contribuciones entre repositorios y ramas
|
||||
settings.pulls.ignore_whitespace=Ignorar los cambios en el espacio en blanco
|
||||
settings.pulls.allow_rebase_merge=Permite usar rebase para fusionar los commits
|
||||
settings.danger_zone=Zona de Peligro
|
||||
settings.cannot_fork_to_same_owner=You cannot fork a repository to its original owner.
|
||||
settings.cannot_fork_to_same_owner=No puedes hacer fork del repositorio a su propietario original.
|
||||
settings.new_owner_has_same_repo=El nuevo propietario tiene un repositorio con el mismo nombre.
|
||||
settings.convert=Convertir en un repositorio normal
|
||||
settings.convert_desc=Puedes convertir este repositorio en un repositorio normal. Este cambio no se puede deshacer.
|
||||
@@ -765,7 +769,7 @@ settings.wiki_deletion_success=Los datos de la wiki del repositorio han sido bor
|
||||
settings.delete=Eliminar este repositorio
|
||||
settings.delete_desc=Una vez has eliminado un repositorio, no hay vuelta atrás. Por favor, asegúrate de que es lo que quieres.
|
||||
settings.delete_notices_1=- Esta operación <strong>NO PUEDE</strong> revertirse.
|
||||
settings.delete_notices_2=- This operation will permanently delete everything in this repository, including Git data, issues, comments and collaborator access.
|
||||
settings.delete_notices_2=- Esta operación eliminará de manera permanente todo el contenido de este repositorio, incluyendo los datos de Git, las incidencias, los comentarios y los permisos de acceso de los colaboradores.
|
||||
settings.delete_notices_fork_1=- Todos los forks se convertirán en independientes tras el borrado.
|
||||
settings.deletion_success=¡El respositorio ha sido eliminado satisfactoriamente!
|
||||
settings.update_settings_success=Las opciones del repositorio se han actualizado correctamente.
|
||||
@@ -790,7 +794,7 @@ settings.webhook.test_delivery=Test de entrega
|
||||
settings.webhook.test_delivery_desc=Enviar un falso evento Push de entrega para probar tus ajustes de webhook
|
||||
settings.webhook.test_delivery_success=Probar que los webhook han sido añadidos a la cola de entrega. Esto puede tomar algunos segundos antes de aparecer en el historial de entregas.
|
||||
settings.webhook.redelivery=Reenviar
|
||||
settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history.
|
||||
settings.webhook.redelivery_success=La tarea del Hook '%s' ha sido reañadida en la cola de entrega. Puede tardar unos segundos en actualizarse el historial de estado de la cola.
|
||||
settings.webhook.request=Petición
|
||||
settings.webhook.response=Respuesta
|
||||
settings.webhook.headers=Encabezado
|
||||
@@ -805,7 +809,7 @@ settings.add_webhook_desc=Enviaremos una petición <code>POST</code> a la siguie
|
||||
settings.payload_url=URL de Payload
|
||||
settings.content_type=Tipo de contenido
|
||||
settings.secret=Secreto
|
||||
settings.secret_desc=Secret will be sent as SHA256 HMAC hex digest of payload via <code>X-Gogs-Signature</code> header.
|
||||
settings.secret_desc=El secreto será enviado como un payload SHA256 HMAC hex digest vía cabecera <code>X-Gogs-Signature</code>.
|
||||
settings.slack_username=Nombre de usuario
|
||||
settings.slack_icon_url=URL de icono
|
||||
settings.slack_color=Color
|
||||
@@ -839,7 +843,7 @@ settings.recent_deliveries=Envíos Recientes
|
||||
settings.hook_type=Tipo de Hook
|
||||
settings.add_slack_hook_desc=Añade integración con <a href="%s">Slack</a> a tu repositorio.
|
||||
settings.add_discord_hook_desc=Añade integración con <a href="%s">Slack</a> a tu repositorio.
|
||||
settings.add_dingtalk_hook_desc=Add <a href="%s">Dingtalk</a> integration to your repository.
|
||||
settings.add_dingtalk_hook_desc=Añade integración con <a href="%s">Dingtalk</a> a tu repositorio.
|
||||
settings.slack_token=Token
|
||||
settings.slack_domain=Dominio
|
||||
settings.slack_channel=Canal
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=¡La nueva clave de desplieque '%s' ha sido creada con
|
||||
settings.deploy_key_deletion=Eliminar Clave de Despliegue
|
||||
settings.deploy_key_deletion_desc=Al eliminar esta clave de despliegue se perderán el permiso de acceso a este repositorio con dicha clave. ¿Deseas continuar?
|
||||
settings.deploy_key_deletion_success=¡Clave de despliegue eliminada con éxito!
|
||||
settings.description_desc=Descripción del repositorio. Longitud máxima de 512 caracteres.
|
||||
settings.description_length=Caracteres disponibles
|
||||
|
||||
diff.browse_source=Explorar el Código
|
||||
diff.parent=padre
|
||||
@@ -1013,8 +1019,8 @@ dashboard.git_gc_repos=Ejecutar la recolección de basura en los repositorios
|
||||
dashboard.git_gc_repos_success=Todos los repositorios han ejecutado correctamente el recolector de basuras.
|
||||
dashboard.resync_all_sshkeys=Reescribir el fichero '.ssh/authorized_keys'(atención: se perderán las claves que no pertenezcan a Gogs)
|
||||
dashboard.resync_all_sshkeys_success=Todas las claves públicas se han reescrito correctamente.
|
||||
dashboard.resync_all_hooks=Resync pre-receive, update and post-receive hooks of all repositories
|
||||
dashboard.resync_all_hooks_success=All repositories' pre-receive, update and post-receive hooks have been resynced successfully.
|
||||
dashboard.resync_all_hooks=Resincroniza los "hooks" de pre-recepción, actualización y post-recepción en todos los repositorios
|
||||
dashboard.resync_all_hooks_success=Se han vuelto a sincronizar todos los "hooks" de pre-recepción, actualización y post-recepción de los repositorios con éxito.
|
||||
dashboard.reinit_missing_repos=Reinicializar todos los registros del repositorio que tienen archivos Git eliminados
|
||||
dashboard.reinit_missing_repos_success=Todos los registros del repositorio con archivos Git eliminados han sido reinicializados con éxito.
|
||||
|
||||
@@ -1091,11 +1097,12 @@ repos.stars=Estrellas
|
||||
repos.issues=Incidencias
|
||||
repos.size=Tamaño
|
||||
|
||||
auths.auth_sources=Authentication Sources
|
||||
auths.auth_sources=Fuentes de autentificación
|
||||
auths.new=Añadir nuevo origen
|
||||
auths.name=Nombre
|
||||
auths.type=Tipo
|
||||
auths.enabled=Activo
|
||||
auths.default=Por defecto
|
||||
auths.updated=Actualizado
|
||||
auths.auth_type=Tipo de autenticación
|
||||
auths.auth_name=Nombre de autenticación
|
||||
@@ -1104,7 +1111,7 @@ auths.domain=Dominio
|
||||
auths.host=Host
|
||||
auths.port=Puerto
|
||||
auths.bind_dn=Bind DN
|
||||
auths.bind_dn_helper=You can use '%s' as placeholder for username, e.g. DOM\%s
|
||||
auths.bind_dn_helper=Puedes usar '%s' como marcador de posición para el nombre de usuario, ej. DOM\%s
|
||||
auths.bind_password=Contraseña Bind
|
||||
auths.bind_password_helper=Advertencia: La contraseña se almacena como texto plano. No utilice una cuenta con privilegios elevados.
|
||||
auths.user_base=Base de búsqueda de usuarios
|
||||
@@ -1115,10 +1122,10 @@ auths.attribute_name=Atributo nombre
|
||||
auths.attribute_surname=Atributo apellido
|
||||
auths.attribute_mail=Atributo correo electrónico
|
||||
auths.verify_group_membership=Verificar pertenencia a grupo
|
||||
auths.group_search_base_dn=Group Search Base DN
|
||||
auths.group_search_base_dn=Base DN para la búsqueda de grupos
|
||||
auths.group_filter=Filtro de grupo
|
||||
auths.group_attribute_contain_user_list=Group Attribute Containing List of Users
|
||||
auths.user_attribute_listed_in_group=User Attribute Listed in Group
|
||||
auths.group_attribute_contain_user_list=Atributo de grupo que contiene la lista de usuarios
|
||||
auths.user_attribute_listed_in_group=Atributo de usuario listado en grupo
|
||||
auths.attributes_in_bind=Buscar atributos en el contexto del Bind DN
|
||||
auths.filter=Filtro de usuario
|
||||
auths.admin_filter=Filtro de aministrador
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Nombre del Servicio PAM
|
||||
auths.enable_auto_register=Hablilitar Auto-Registro
|
||||
auths.edit=Editar la Configuración de Autenticación
|
||||
auths.activated=Esta autenticación ha sido activada
|
||||
auths.default_auth=Esta autenticación es la fuente de inicio de sesión predeterminada
|
||||
auths.new_success=¡La autenticación '%s' ha sido añadida con éxito!
|
||||
auths.update_success=La configuración de autenticación ha sido actualizada con éxito.
|
||||
auths.update=Actualizar la configuración de autenticación
|
||||
@@ -1144,7 +1152,7 @@ auths.still_in_used=Este método de autentificación aún es utilizado por algun
|
||||
auths.deletion_success=¡La autenticación ha sido eliminada con éxito!
|
||||
auths.login_source_exist=El origen de autenticación '%s' ya existe.
|
||||
|
||||
config.not_set=(not set)
|
||||
config.not_set=(sin definir)
|
||||
config.server_config=Configuración del servidor
|
||||
config.app_name=Nombre de la Aplicación
|
||||
config.app_ver=Versión de la Aplicación
|
||||
@@ -1166,7 +1174,7 @@ config.ssh_domain=Dominio
|
||||
config.ssh_port=Puerto
|
||||
config.ssh_listen_port=Puerto de escucha
|
||||
config.ssh_root_path=Ruta raíz
|
||||
config.ssh_rewrite_authorized_keys_at_start=Rewrite authorized_keys At Start
|
||||
config.ssh_rewrite_authorized_keys_at_start=Reescribir authorized_keys en el arranque
|
||||
config.ssh_key_test_path=Ruta de la clave de prueba
|
||||
config.ssh_keygen_path=Ruta del generador de claves ('ssh-keygen')
|
||||
config.ssh_minimum_key_size_check=Tamaño mínimo de la clave de verificación
|
||||
@@ -1180,9 +1188,9 @@ config.max_creation_limit=Limite máximo de creación
|
||||
config.preferred_licenses=Licencias Preferidas
|
||||
config.disable_http_git=Desactivar HTTP Git
|
||||
config.enable_local_path_migration=Activar la migración de la ruta de acceso Local
|
||||
config.commits_fetch_concurrency=Commits Fetch Concurrency
|
||||
config.commits_fetch_concurrency=Concurrencia de la búsqueda de commits
|
||||
|
||||
config.http_config=HTTP Configuration
|
||||
config.http_config=Configuración HTTP
|
||||
config.http_access_control_allow_origin=Access Control Allow Origin
|
||||
|
||||
config.db_config=Configuración de la Base de Datos
|
||||
@@ -1214,7 +1222,7 @@ config.skip_tls_verify=Omitir la Verificación TLS
|
||||
config.mailer_config=Configuración del servidor de correo
|
||||
config.mailer_enabled=Activado
|
||||
config.mailer_disable_helo=Desactivar HELO
|
||||
config.mailer_subject_prefix=Subject Prefix
|
||||
config.mailer_subject_prefix=Prefijo del asunto
|
||||
config.mailer_host=Host
|
||||
config.mailer_user=Usuario
|
||||
config.send_test_mail=Enviar email de prueba
|
||||
@@ -1298,15 +1306,15 @@ comment_issue=`comentó en la incidencia <a href="%s/issues/%s">%s#%[2]s</a>`
|
||||
create_pull_request=`creado pull request <a href="%s/pulls/%s">%s#%[2]s</a>`
|
||||
close_pull_request=`cerró el pull request <a href="%s/pulls/%s">%s#%[2]s</a>`
|
||||
reopen_pull_request=`reabrió el pull request <a href="%s/pulls/%s">%s#%[2]s</a>`
|
||||
merge_pull_request=`fusionado pull request <a href="%s/pulls/%s">%s#%[2]s</a>`
|
||||
merge_pull_request=`fusionó el pull request <a href="%s/pulls/%s">%s#%[2]s</a>`
|
||||
create_branch=nueva rama <a href="%[1]s/src/%[2]s">%[3]s</a> creada en <a href="%[1]s">%[4]s</a>
|
||||
delete_branch=borrada rama <code>%[2]s</code> at <a href="%[1]s">%[3]s</a>
|
||||
push_tag=hizo push del tag <a href="%s/src/%s">%[2]s</a> a <a href="%[1]s">%[3]s</a>
|
||||
delete_tag=borrada etiqueta <code>%[2]s</code> en <a href="%[1]s">%[3]s</a>
|
||||
fork_repo=ha hecho un Fork en <a href="%s">%s</a>
|
||||
mirror_sync_push=synced commits to <a href="%[1]s/src/%[2]s">%[3]s</a> at <a href="%[1]s">%[4]s</a> from mirror
|
||||
mirror_sync_create=synced new reference <a href="%s/src/%s">%[2]s</a> to <a href="%[1]s">%[3]s</a> from mirror
|
||||
mirror_sync_delete=synced and deleted reference <code>%[2]s</code> at <a href="%[1]s">%[3]s</a> from mirror
|
||||
mirror_sync_push=sincronizados commits a <a href="%[1]s/src/%[2]s">%[3]s</a> en <a href="%[1]s">%[4]s</a> desde la réplica
|
||||
mirror_sync_create=sincronizada nueva referencia <a href="%s/src/%s">%[2]s</a> a <a href="%[1]s">%[3]s</a> desde la réplica
|
||||
mirror_sync_delete=sincronizada y eliminada referencia <code>%[2]s</code> en <a href="%[1]s">%[3]s</a> desde la réplica
|
||||
|
||||
[tool]
|
||||
ago=hace
|
||||
|
||||
@@ -151,8 +151,8 @@ register_hepler_msg=قبلا ثبت نام کردید؟ از اینجا وارد
|
||||
social_register_hepler_msg=تا به حال حسابی داشته اید؟ به ما بپیوندید!
|
||||
disable_register_prompt=با عرض پوزش، ثبت نام غیرفعال شده است. لطفا با مدیر سایت تماس بگیرید.
|
||||
disable_register_mail=با عرض پوزش، تایید ایمیل ثبت نام غیر فعال شده است.
|
||||
auth_source=Authentication Source
|
||||
local=Local
|
||||
auth_source=محل احراز هویت
|
||||
local=محلی
|
||||
remember_me=مرا به خاطر بسپار
|
||||
forgot_password=فراموشی رمز عبور
|
||||
forget_password=رمز عبور خود را فراموش کردهاید؟
|
||||
@@ -231,7 +231,7 @@ org_name_been_taken=نام سازمان قبلا استفاده شده است.
|
||||
team_name_been_taken=نام تیم گرفته شده است.
|
||||
email_been_used=آدرس ایمیل قبلا استفاده شده است.
|
||||
username_password_incorrect=نام کاربری یا رمز عبور صحیح نیست.
|
||||
auth_source_mismatch=The authentication source selected is not associated with the user.
|
||||
auth_source_mismatch=محل احراز هویت انتخاب شده با کاربر در ارتباط نمیباشد.
|
||||
enterred_invalid_repo_name=لطفا مطمئن شوید که نام مخزن وارد شده صحیح است.
|
||||
enterred_invalid_owner_name=لطفا مطمئن شوید که نام مالک وارد شده صحیح است.
|
||||
enterred_invalid_password=لطفا مطمئن شوید که رمز عبور وارد شده صحیح است.
|
||||
@@ -353,7 +353,7 @@ two_factor_or_enter_secret=و یا رمز را پارد کنید:
|
||||
two_factor_then_enter_passcode=سپس رمز عبور را وارد کنید:
|
||||
two_factor_verify=تاییدکنید
|
||||
two_factor_invalid_passcode=رمز عبور وارد شده معتبر نیست, لطفا دوباره سعی کنید!
|
||||
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
|
||||
two_factor_reused_passcode=رمز وارد شده قبلا استفاده شده، لطفا یک عبارت دیگر را امتحان کنید!
|
||||
two_factor_enable_error=فعال کردن احراز هویت دوگانه ناموفق بود: %v
|
||||
two_factor_enable_success=احراز هویت دوگانه با موفقیت برای حساب شما فعال شد!
|
||||
two_factor_recovery_codes_title=کدهای بازیابی احراز هویت دوگانه
|
||||
@@ -423,6 +423,8 @@ mirror_last_synced=آخرین همگام سازی
|
||||
watchers=دنبالکنندگان
|
||||
stargazers=ستاره شناسان
|
||||
forks=انشعاب ها
|
||||
repo_description_helper=توضیحات مخرن. حداکثر طول ۵۱۲ کاراکتر.
|
||||
repo_description_length=کاراکترهای موجود
|
||||
|
||||
form.reach_limit_of_creation=مخزن های دارنده حساب به حداکثر تعداد مجاز %d رسیده است.
|
||||
form.name_reserved=یک مخزن با نام '%s' از قبل وجود دارد.
|
||||
@@ -520,6 +522,7 @@ editor.file_changed_while_editing=محتوای فایل از زمانی که ش
|
||||
editor.file_already_exists=فایلی با نام %s از قبل در مخزن موجود است.
|
||||
editor.no_changes_to_show=تغییری برای نمایش وجود ندارد.
|
||||
editor.fail_to_update_file=خطا در ساخت/به روزرسانی فایل %. خطای رخ داده : %v
|
||||
editor.fail_to_delete_file=خطا در حذف فایل '%s' رخ داده است. خطای رخ داده %v
|
||||
editor.add_subdir=افزودن زیرپوشه...
|
||||
editor.unable_to_upload_files=عدم موفقیت در آپلود فایل به '%s' با خطا: %v
|
||||
editor.upload_files_to_dir=آپلود فایل به '%s'
|
||||
@@ -640,6 +643,7 @@ pulls.cannot_auto_merge_desc=این pull request به علت تداخل نمی
|
||||
pulls.cannot_auto_merge_helper=لطفا عملیات ادغام را به صورت دستی انجام دهید تا این تداخل برطرف شود.
|
||||
pulls.create_merge_commit=ایجاد یک کامیت برای ادغام سازی
|
||||
pulls.rebase_before_merging=Rebase قبل از ادغام
|
||||
pulls.commit_description=توضیحات کامیت
|
||||
pulls.merge_pull_request=ایجاد درخواست ادغام
|
||||
pulls.open_unmerged_pull_exists=`به علت باز بودن pull request (#%d) از مخزنی مشابه و به همراه اطلاعات ادغام مشابه که در انتظار ادغام می باشد، بازگشایی مجدد مقدور نیست`
|
||||
pulls.delete_branch=حذف شاخه
|
||||
@@ -744,7 +748,7 @@ settings.tracker_issue_style=سبک نامگذاری Issue Tracker خارجی:
|
||||
settings.tracker_issue_style.numeric=عددی
|
||||
settings.tracker_issue_style.alphanumeric=عددی و الفبایی
|
||||
settings.tracker_url_format_desc=شما میتوانید از <code>{user} {repo} {index}</code> برای نام کاربری ، نام مخزن و صفحه ی اول بخش مسائل استفاده کنید.
|
||||
settings.pulls_desc=فعال سازی pull request برای پذیرش همکاری های عمومی
|
||||
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
|
||||
settings.pulls.ignore_whitespace=نادیده گرفتن تغییرات در فضاهای خالی
|
||||
settings.pulls.allow_rebase_merge=مجاز کردن rebase برای ادغام کردن کامیت ها
|
||||
settings.danger_zone=منطقه خطر
|
||||
@@ -858,6 +862,8 @@ settings.add_key_success=کلیدDeploy جدید %s با موفقیت افزود
|
||||
settings.deploy_key_deletion=حذف کلید Deploy
|
||||
settings.deploy_key_deletion_desc=با حذف کلید Deploy، تمام دسترسی ها به این مخزن از طریق این کلید از بین میرود. آیا ادامه می دهید؟
|
||||
settings.deploy_key_deletion_success=کلید Deploy با موفقیت حذف شد!
|
||||
settings.description_desc=Description of repository. Maximum 512 characters length.
|
||||
settings.description_length=Available characters
|
||||
|
||||
diff.browse_source=فهرست منبع
|
||||
diff.parent=والد
|
||||
@@ -1093,11 +1099,12 @@ repos.stars=ستاره ها
|
||||
repos.issues=مسائل
|
||||
repos.size=اندازه
|
||||
|
||||
auths.auth_sources=Authentication Sources
|
||||
auths.auth_sources=منابع احراز هویت
|
||||
auths.new=اضافه کردن منبع جدید
|
||||
auths.name=نام
|
||||
auths.type=نوع
|
||||
auths.enabled=فعال شده
|
||||
auths.default=پیش فرض
|
||||
auths.updated=به روز رسانی شده
|
||||
auths.auth_type=نوع تأیید اعتبار
|
||||
auths.auth_name=نام مجوز احراز هویت
|
||||
@@ -1136,6 +1143,7 @@ auths.pam_service_name=نام سرویس PAM
|
||||
auths.enable_auto_register=فعال سازی ثبت نام خودکار
|
||||
auths.edit=ویرایش تنظیمات تأیید اعتبار
|
||||
auths.activated=متد احراز هویت فعال شده است
|
||||
auths.default_auth=این احراز هویت پیش فرض منبع ورود می باشد
|
||||
auths.new_success=متد احرازهویت %s با موفقیت افزوده شد.
|
||||
auths.update_success=تنظیمات سیستم احرازهویت با موفقیت به روز شد.
|
||||
auths.update=به روزرسانی تنظیمات سیستم احراز هویت
|
||||
@@ -1216,7 +1224,7 @@ config.skip_tls_verify=صرف نظر از اعتبار سنجی TLS
|
||||
config.mailer_config=پیکربندی سیستم ایمیلی
|
||||
config.mailer_enabled=فعال شده
|
||||
config.mailer_disable_helo=غیر فعال کردن HELO
|
||||
config.mailer_subject_prefix=Subject Prefix
|
||||
config.mailer_subject_prefix=پيشوند موضوع
|
||||
config.mailer_host=میزبان
|
||||
config.mailer_user=کاربر
|
||||
config.send_test_mail=ارسال ایمیل تست
|
||||
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=Synkronoitu viimeksi
|
||||
watchers=Tarkkailijat
|
||||
stargazers=Tähtiharrastajat
|
||||
forks=Haarat
|
||||
repo_description_helper=Description of repository. Maximum 512 characters length.
|
||||
repo_description_length=Available characters
|
||||
|
||||
form.reach_limit_of_creation=Omistaja on saavuttanut maksimi luontirajan %d repoa.
|
||||
form.name_reserved=Repon nimi '%s' on varattu.
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Tiedoston sisältöä on muutettu aloittamises
|
||||
editor.file_already_exists=Tiedosto '%s' on jo olemassa tässä repossa.
|
||||
editor.no_changes_to_show=Ei muutoksia näytettäväksi.
|
||||
editor.fail_to_update_file=Tiedoston '%s' päivitys/luonti epäonnistui virheeseen: %v
|
||||
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
|
||||
editor.add_subdir=Lisää alikansio...
|
||||
editor.unable_to_upload_files=Tiedostojen lataus epäonnistui kansioon '%s' virheellä: %v
|
||||
editor.upload_files_to_dir=Lataa tiedostoja kansioon '%s'
|
||||
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Tätä pull-pyyntöä ei voi yhdistää automaattis
|
||||
pulls.cannot_auto_merge_helper=Ole hyvä ja yhdistä manuaalisesti konfliktien ratkaisemiseksi.
|
||||
pulls.create_merge_commit=Create a merge commit
|
||||
pulls.rebase_before_merging=Rebase before merging
|
||||
pulls.commit_description=Commit Description
|
||||
pulls.merge_pull_request=Yhdistä Pull-pyyntö
|
||||
pulls.open_unmerged_pull_exists=`Et voi suorittaa uudelleenavaus toimintoa koska on jo olemassa pull-pyyntö (#%d) samasta reposta samoilla yhdistämistiedoilla ja odottaa yhdistämistä.`
|
||||
pulls.delete_branch=Poista haara
|
||||
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Ulkoisen virheenseurannan nimeämistyyli:
|
||||
settings.tracker_issue_style.numeric=Numeerinen
|
||||
settings.tracker_issue_style.alphanumeric=Aakkosnumeerinen
|
||||
settings.tracker_url_format_desc=Voit käyttää paikkamerkkiä <code>{user} {repo} {index}</code> käyttäjänimelle, reponimelle ja vikanumerolle.
|
||||
settings.pulls_desc=Ota käyttöön pull-pyynnöt salliaksesi julkiset koodilahjoitukset
|
||||
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
|
||||
settings.pulls.ignore_whitespace=Ignore changes in whitespace
|
||||
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
|
||||
settings.danger_zone=Vaaravyöhyke
|
||||
@@ -768,7 +772,7 @@ settings.delete_notices_1=- Tätä toimintoa <strong>EI VOI</strong> peruuttaa m
|
||||
settings.delete_notices_2=- This operation will permanently delete everything in this repository, including Git data, issues, comments and collaborator access.
|
||||
settings.delete_notices_fork_1=- Kaikki haarat muuttuvat itsenäisiksi poiston jälkeen.
|
||||
settings.deletion_success=Repo on poistettu onnistuneesti!
|
||||
settings.update_settings_success=Repom asetukset on päivitetty onnistuneesti.
|
||||
settings.update_settings_success=Repon asetukset on päivitetty onnistuneesti.
|
||||
settings.transfer_owner=Uusi omistaja
|
||||
settings.make_transfer=Tee siirto
|
||||
settings.transfer_succeed=Arkiston omistusoikeus on siirretty onnistuneesti.
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=Uusi deploy avain '%s' on lisätty onnistuneesti!
|
||||
settings.deploy_key_deletion=Poista deploy avain
|
||||
settings.deploy_key_deletion_desc=Deploy avaimen poistaminen poistaa myös kaikki liitetyt käyttötiedot tästä reposta. Haluatko jatkaa?
|
||||
settings.deploy_key_deletion_success=Deploy avain on poistettu onnistuneesti!
|
||||
settings.description_desc=Description of repository. Maximum 512 characters length.
|
||||
settings.description_length=Available characters
|
||||
|
||||
diff.browse_source=Selaa lähdekoodia
|
||||
diff.parent=vanhempi
|
||||
@@ -1096,6 +1102,7 @@ auths.new=Lisää uusi lähde
|
||||
auths.name=Nimi
|
||||
auths.type=Tyyppi
|
||||
auths.enabled=Käytössä
|
||||
auths.default=Default
|
||||
auths.updated=Päivitetty
|
||||
auths.auth_type=Todennustyyppi
|
||||
auths.auth_name=Todennusnimi
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAM palvelun nimi
|
||||
auths.enable_auto_register=Ota käyttöön automaattinen rekisteröinti
|
||||
auths.edit=Muokkaa todennusasetusta
|
||||
auths.activated=Tämä todennus on aktivoitu
|
||||
auths.default_auth=This authentication is default login source
|
||||
auths.new_success=Uusi todennus '%s' on luotu onnistuneesti.
|
||||
auths.update_success=Todennusasetus on päivitetty onnistuneesti.
|
||||
auths.update=Päivitä todennusasetus
|
||||
|
||||
@@ -151,8 +151,8 @@ register_hepler_msg=Déjà enregistré ? Connectez-vous !
|
||||
social_register_hepler_msg=Déjà enregistré ? Associez-le !
|
||||
disable_register_prompt=Désolé, les enregistrements ont été désactivés. Veuillez contacter l'administrateur du site.
|
||||
disable_register_mail=Désolé, la confirmation par courriel des enregistrements a été désactivée.
|
||||
auth_source=Authentication Source
|
||||
local=Local
|
||||
auth_source=Sources d'authentification
|
||||
local=Locale
|
||||
remember_me=Se souvenir de moi
|
||||
forgot_password=Mot de passe oublié
|
||||
forget_password=Mot de passe oublié ?
|
||||
@@ -231,7 +231,7 @@ org_name_been_taken=Nom d'organisation déjà pris.
|
||||
team_name_been_taken=Nom d'équipe déjà pris.
|
||||
email_been_used=Adresse e-mail déjà utilisée.
|
||||
username_password_incorrect=Nom d'utilisateur ou mot de passe incorrect.
|
||||
auth_source_mismatch=The authentication source selected is not associated with the user.
|
||||
auth_source_mismatch=La source d’authentification sélectionnée n’est pas associée à l’utilisateur.
|
||||
enterred_invalid_repo_name=Veuillez vérifier que le nom saisi du dépôt soit correct.
|
||||
enterred_invalid_owner_name=Veuillez vérifier que le nom du propriétaire saisi soit correct.
|
||||
enterred_invalid_password=Veuillez vérifier que le mot de passe saisi soit correct.
|
||||
@@ -351,7 +351,7 @@ two_factor_or_enter_secret=Ou entrez la phrase secrète :
|
||||
two_factor_then_enter_passcode=Puis entrez le mot de passe :
|
||||
two_factor_verify=Vérifier
|
||||
two_factor_invalid_passcode=Le mot de passe que vous avez entré n'est pas valide, veuillez réessayer.
|
||||
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
|
||||
two_factor_reused_passcode=Le mot de passe que vous avez entré a déjà été utilisé, veuillez en essayez un autre !
|
||||
two_factor_enable_error=L'activation de l'authentification en deux étapes a échoué : %v
|
||||
two_factor_enable_success=L'authentification en deux étapes a été bien été activée pour votre compte.
|
||||
two_factor_recovery_codes_title=Codes de secours pour l'authentification en deux étapes
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=Dernière synchronisation
|
||||
watchers=Observateurs
|
||||
stargazers=Stargazers
|
||||
forks=Forks
|
||||
repo_description_helper=Description du dépôt. 512 caractères maximum.
|
||||
repo_description_length=Caractères disponibles
|
||||
|
||||
form.reach_limit_of_creation=Le propriétaire a atteint le nombre maximal de %d dépôts créés.
|
||||
form.name_reserved=Le nom de dépôt '%s' est réservé.
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Le contenu du fichier à changé depuis que vo
|
||||
editor.file_already_exists=La branche '%s' existe déjà dans ce dépôt.
|
||||
editor.no_changes_to_show=Il 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=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'
|
||||
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Cette pull request ne peut être fusionnée automat
|
||||
pulls.cannot_auto_merge_helper=Fusionner manuellement afin de résoudre les conflits.
|
||||
pulls.create_merge_commit=Créer un commit de fusion
|
||||
pulls.rebase_before_merging=Rebaser avant la fusion
|
||||
pulls.commit_description=Description du commit
|
||||
pulls.merge_pull_request=Fusionner la Pull Request
|
||||
pulls.open_unmerged_pull_exists=`Vous ne pouvez effectuer une réouverture car il y a déjà une pull-request ouverte (#%d) depuis le même dépôt avec les mêmes informations de fusion et est en attente de fusion.`
|
||||
pulls.delete_branch=Supprimer la branche
|
||||
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Style de nommage des bugs du tracker externe :
|
||||
settings.tracker_issue_style.numeric=Numérique
|
||||
settings.tracker_issue_style.alphanumeric=Alphanumérique
|
||||
settings.tracker_url_format_desc=Vous pouvez utiliser l'espace réservé <code>{user} {repo} {index}</code> pour le nom d'utilisateur, le nom du dépôt et le numéro de bug.
|
||||
settings.pulls_desc=Activer les pull requests pour accepter les contributions publiques
|
||||
settings.pulls_desc=Activer les pull requests pour accepter les contributions depuis des dépôts et des branches
|
||||
settings.pulls.ignore_whitespace=Ignorer les changements quand ce sont des espaces
|
||||
settings.pulls.allow_rebase_merge=Autoriser l'utilisation de rebase pour fusionner les validations
|
||||
settings.danger_zone=Zone de danger
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=La nouvelle clé de déploiement '%s' a été ajoutée
|
||||
settings.deploy_key_deletion=Supprimer la Clé de Déploiement
|
||||
settings.deploy_key_deletion_desc=Supprimer cette clé de déploiement effacera tous les accès relatifs pour ce référentiel. Voulez-vous continuer ?
|
||||
settings.deploy_key_deletion_success=La clé de déploiement a été supprimée avec succès !
|
||||
settings.description_desc=Description du dépôt. 512 caractères maximum.
|
||||
settings.description_length=Caractères disponibles
|
||||
|
||||
diff.browse_source=Parcourir la source
|
||||
diff.parent=Parent
|
||||
@@ -1091,11 +1097,12 @@ repos.stars=Votes
|
||||
repos.issues=Tickets
|
||||
repos.size=Taille
|
||||
|
||||
auths.auth_sources=Authentication Sources
|
||||
auths.auth_sources=Sources d'authentification
|
||||
auths.new=Ajouter une nouvelle source d'authentification
|
||||
auths.name=Nom
|
||||
auths.type=Type
|
||||
auths.enabled=Activé
|
||||
auths.default=Par défaut
|
||||
auths.updated=Mis à jour
|
||||
auths.auth_type=Type d'authentification
|
||||
auths.auth_name=Nom de l'authentification
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Nom du Service PAM
|
||||
auths.enable_auto_register=Connexion Automatique
|
||||
auths.edit=Modifier les paramètres d'authentification
|
||||
auths.activated=Authentification activée
|
||||
auths.default_auth=Cette authentification est la source de connexion par défaut
|
||||
auths.new_success=Nouvelle authentification «%s » a été ajoutée avec succès.
|
||||
auths.update_success=Les paramètre d'authentification a été mis à jour avec succès.
|
||||
auths.update=Mettre à jour les paramètres d'authentifications
|
||||
@@ -1277,7 +1285,7 @@ notices.actions=Actions
|
||||
notices.select_all=Tout Sélectionner
|
||||
notices.deselect_all=Tous déselectionner
|
||||
notices.inverse_selection=Inverser la sélection
|
||||
notices.delete_selected=Supprimé les éléments sélectionnés
|
||||
notices.delete_selected=Supprimer les éléments sélectionnés
|
||||
notices.delete_all=Supprimer toutes les notifications
|
||||
notices.type=Type
|
||||
notices.type_1=Dépôt
|
||||
@@ -1304,9 +1312,9 @@ delete_branch=branche supprimée <code>%[2]s</code> sur <a href="%[1]s">%[3]s</a
|
||||
push_tag=a soumis le tag <a href="%s/src/%s">%[2]s</a> sur <a href="%[1]s">%[3]s</a>
|
||||
delete_tag=étiquette supprimée <code>%[2]s</code> sur <a href="%[1]s">%[3]s</a>
|
||||
fork_repo=a créé sa branche du dépôt vers <a href="%s">%s</a>
|
||||
mirror_sync_push=synced commits to <a href="%[1]s/src/%[2]s">%[3]s</a> at <a href="%[1]s">%[4]s</a> from mirror
|
||||
mirror_sync_create=synced new reference <a href="%s/src/%s">%[2]s</a> to <a href="%[1]s">%[3]s</a> from mirror
|
||||
mirror_sync_delete=synced and deleted reference <code>%[2]s</code> at <a href="%[1]s">%[3]s</a> from mirror
|
||||
mirror_sync_push=a commité dans <a href="%[1]s/src/%[2]s">%[3]s</a> sur <a href="%[1]s">%[4]s</a>
|
||||
mirror_sync_create=a synchronisé la nouvelle référence <a href="%s/src/%s">%[2]s</a> vers <a href="%[1]s">%[3]s</a> depuis le miroir
|
||||
mirror_sync_delete=Référence synchronisés et supprimé <code>%[2]s</code> sur <a href="%[1]s">%[3]s</a>
|
||||
|
||||
[tool]
|
||||
ago=il y a
|
||||
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=Sincronizado por última vez
|
||||
watchers=Seguidores
|
||||
stargazers=Fans
|
||||
forks=Forks
|
||||
repo_description_helper=Description of repository. Maximum 512 characters length.
|
||||
repo_description_length=Available characters
|
||||
|
||||
form.reach_limit_of_creation=El propietario ha alcanzado el límite máximo de %d repositorios creados.=O propietario acadou o límite máximo de %d repositorios creados.
|
||||
form.name_reserved=El nombre del repositorio '%s' está reservado.=O nome do repositorio '%s' está reservado.
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=O contido do arquivo cambiou desde que comezac
|
||||
editor.file_already_exists=Un arquivo co nome '%s' xa existe no repositorio.
|
||||
editor.no_changes_to_show=Non hai cambios que mostrar.
|
||||
editor.fail_to_update_file=Fallou o actualizar/crear o arquivo '%s' co erro: %v
|
||||
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
|
||||
editor.add_subdir=Engadir subdirectorio...
|
||||
editor.unable_to_upload_files=Fallou ao subir arquivos a '%s' co erro: %v
|
||||
editor.upload_files_to_dir=Subir arquivos a '%s'
|
||||
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Este Pull Request non pode ser fusionado automatica
|
||||
pulls.cannot_auto_merge_helper=Por favor, fusiona manualmente para resolver os conflitos.
|
||||
pulls.create_merge_commit=Create a merge commit
|
||||
pulls.rebase_before_merging=Rebase before merging
|
||||
pulls.commit_description=Commit Description
|
||||
pulls.merge_pull_request=Fusionar Pull Request
|
||||
pulls.open_unmerged_pull_exists=`Vostede non pode realizar a operación de reapertura porque nestes momentos existe unha solicitude de pull request (#%d) para o mesmo repositorio coa mesma información que se encontra á espera de aprobación`
|
||||
pulls.delete_branch=Eliminar branch
|
||||
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Estilo de etiquetaxe do tracker externo de incidenc
|
||||
settings.tracker_issue_style.numeric=Numérico
|
||||
settings.tracker_issue_style.alphanumeric=Alfanumérico
|
||||
settings.tracker_url_format_desc=Podes usar os modelos <code>{user} {repo} {index}</code> para o nome de usuario, nome do repositorio e índice da incidencia.
|
||||
settings.pulls_desc=Habilitar Pull Requests para aceptar contribucións públicas
|
||||
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
|
||||
settings.pulls.ignore_whitespace=Ignore changes in whitespace
|
||||
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
|
||||
settings.danger_zone=Zona de perigo
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=A nova clave de despregamento '%s' foi creada con éxit
|
||||
settings.deploy_key_deletion=Eliminar clave de despregamento
|
||||
settings.deploy_key_deletion_desc=Ao eliminar esta clave de despregamento perderase o permiso de acceso a este repositorio coa dita clave. Desexas continuar?
|
||||
settings.deploy_key_deletion_success=Clave de despregamento eliminada con éxito!
|
||||
settings.description_desc=Description of repository. Maximum 512 characters length.
|
||||
settings.description_length=Available characters
|
||||
|
||||
diff.browse_source=Explorar o código
|
||||
diff.parent=pai
|
||||
@@ -1096,6 +1102,7 @@ auths.new=Engadir nova orixe
|
||||
auths.name=Nome
|
||||
auths.type=Tipo
|
||||
auths.enabled=Activo
|
||||
auths.default=Default
|
||||
auths.updated=Actualizado
|
||||
auths.auth_type=Tipo de autenticación
|
||||
auths.auth_name=Nome de autenticación
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Nome do servizo PAM
|
||||
auths.enable_auto_register=Habilitar auto-rexistro
|
||||
auths.edit=Editar a configuración de autenticación
|
||||
auths.activated=Esta autenticación foi activada
|
||||
auths.default_auth=This authentication is default login source
|
||||
auths.new_success=A autenticación '%s' foi engadida con éxito!
|
||||
auths.update_success=A configuración de autenticación foi actualizada con éxito.
|
||||
auths.update=Actualizar a configuración de autenticación
|
||||
|
||||
@@ -151,8 +151,8 @@ register_hepler_msg=Van már felhasználói fiókja? Jelentkezz be!
|
||||
social_register_hepler_msg=Van már fiókod? Csatold most!
|
||||
disable_register_prompt=Elnézést, a regisztrációt kikapcsolták. Kérlek szólj az oldal adminisztrátorának.
|
||||
disable_register_mail=Elnézést, az email regisztráció megerősítését kikapcsolták.
|
||||
auth_source=Authentication Source
|
||||
local=Local
|
||||
auth_source=Hitelesítési forrás
|
||||
local=Helyi
|
||||
remember_me=Emlékezz rám
|
||||
forgot_password=Elfelejtett jelszó
|
||||
forget_password=Elfelejtette a jelszavát?
|
||||
@@ -231,7 +231,7 @@ org_name_been_taken=A szervezet neve már foglalt.
|
||||
team_name_been_taken=Az a csapatnév már foglalt.
|
||||
email_been_used=Ezt az email címet már felhasználták.
|
||||
username_password_incorrect=Felhasználó név vagy jelszó hibás.
|
||||
auth_source_mismatch=The authentication source selected is not associated with the user.
|
||||
auth_source_mismatch=A kijelölt hitelesítési forráshoz nincs társítva a felhasználó.
|
||||
enterred_invalid_repo_name=Kérjük, ellenőrizze, hogy a tároló neve helyes.
|
||||
enterred_invalid_owner_name=Kérjük, ellenőrizze, hogy a tulajdonos neve helyes.
|
||||
enterred_invalid_password=Kérlek ellenőrizd, hogy a beírt jelszó helyes.
|
||||
@@ -351,7 +351,7 @@ two_factor_or_enter_secret=Vagy adja meg a titkos kódot:
|
||||
two_factor_then_enter_passcode=Ezután írja be ezt a jelkódot:
|
||||
two_factor_verify=Ellenőrzés
|
||||
two_factor_invalid_passcode=Érvénytelen a megadott jelkód, próbálja meg újra!
|
||||
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
|
||||
two_factor_reused_passcode=A megadott PIN-kód már használatban van. Kérem válasszon másikat!
|
||||
two_factor_enable_error=Kétlépcsős hitelesítés engedélyezése sikertelen: %v
|
||||
two_factor_enable_success=Kétlépcsős hitelesítés sikeresen engedélyezve a fiókjához!
|
||||
two_factor_recovery_codes_title=Kettőlépcsős hitelesítés helyreállítási kódok
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=Utoljára szinkr.
|
||||
watchers=Figyelők
|
||||
stargazers=Csillagvizsgálók
|
||||
forks=Másolások
|
||||
repo_description_helper=Tároló leírása. Maximum 512 karakter hosszúságú.
|
||||
repo_description_length=Rendelkezésre álló karakterek
|
||||
|
||||
form.reach_limit_of_creation=A tulajdonos túllépte a maximum létrehozható tárolók számát (%d).
|
||||
form.name_reserved=Ez a tároló név ('%s') le van foglalva.
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=A fájl tartalma megváltozott mióta elkezdte
|
||||
editor.file_already_exists=A(z) '%s' nevű fájl már létezik a tárolóban.
|
||||
editor.no_changes_to_show=Nincsen megjeleníthető változás.
|
||||
editor.fail_to_update_file=Nem sikerült frissíteni/létrehozni a következő fájlt: '%s' A hiba oka: %v
|
||||
editor.fail_to_delete_file=Nem sikerült törölni a következő fájlt: '%s' A hiba oka: %v
|
||||
editor.add_subdir=Alkönyvtár hozzáadása...
|
||||
editor.unable_to_upload_files=Nem sikerült feltölteni a fájlokat a "%s" hiba: %v
|
||||
editor.upload_files_to_dir=Fájlok feltöltése '%s'
|
||||
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Ez a beolvasztási kérés ütközések miatt nem e
|
||||
pulls.cannot_auto_merge_helper=Kérlek, egyesítsd kézileg a konfliktusok megoldásához.
|
||||
pulls.create_merge_commit=Eggyesítő commit létrehozása
|
||||
pulls.rebase_before_merging=Rebase eggyesítés előtt
|
||||
pulls.commit_description=Commit leírása
|
||||
pulls.merge_pull_request=Beolvasztási kérés egyesítése
|
||||
pulls.open_unmerged_pull_exists=`Nem tudja újranyitni, mert már van egy nyitott egyesítési kérés (#%d) ugyanebben a tárolóban, ugyanezekket az egyesítési információkkal, és végrehajtásra vár.`
|
||||
pulls.delete_branch=Ág törlése
|
||||
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Külső hibajegykezelő elnevezési stílus:
|
||||
settings.tracker_issue_style.numeric=Numerikus
|
||||
settings.tracker_issue_style.alphanumeric=Alfanumerikus
|
||||
settings.tracker_url_format_desc=Az alábbiak helyettesítik a felhasználónevet, repository nevet és hibajegy számot: <code>{user} {repo} {index}</code>.
|
||||
settings.pulls_desc=Beolvasztási kérések engedélyezése a nyilvános hozzájárulások végett
|
||||
settings.pulls_desc=Beolvasztási kérések engedélyezése tárolók és ágak közi hozzájárulásokhoz
|
||||
settings.pulls.ignore_whitespace=Whitespacek figyelmen kívül hagyása
|
||||
settings.pulls.allow_rebase_merge=Rebase engedélyezése eggyesítő commitokhoz
|
||||
settings.danger_zone=Veszélyes terület
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=Az új deploy kulcsot ('%s') sikeresen hozzáadtuk!
|
||||
settings.deploy_key_deletion=Deploy Kulcs Törlése
|
||||
settings.deploy_key_deletion_desc=A deploy kulcs törlése minden kapcsolódó hozzáférést töröl a repository-ból. Biztosan folytatod?
|
||||
settings.deploy_key_deletion_success=A deploy kulcs sikeresen törölve!
|
||||
settings.description_desc=Tároló leírása. Maximum 512 karakter hosszúságú.
|
||||
settings.description_length=Rendelkezésre álló karakterek
|
||||
|
||||
diff.browse_source=Forráskód Böngészése
|
||||
diff.parent=szülő
|
||||
@@ -1091,11 +1097,12 @@ repos.stars=Csillagok
|
||||
repos.issues=Problémák
|
||||
repos.size=Méret
|
||||
|
||||
auths.auth_sources=Authentication Sources
|
||||
auths.auth_sources=Hitelesítési források
|
||||
auths.new=Új forrás hozzáadása
|
||||
auths.name=Név
|
||||
auths.type=Típus
|
||||
auths.enabled=Engedélyezett
|
||||
auths.default=Alapértelmezett
|
||||
auths.updated=Frissítve
|
||||
auths.auth_type=Hitelesítés típusa
|
||||
auths.auth_name=Hitelesítési név
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAM szolgáltatás neve
|
||||
auths.enable_auto_register=Automatikus regisztráció engedélyezése
|
||||
auths.edit=Hitelesítési beállítások szerkesztése
|
||||
auths.activated=Ez a hitelesítés mód aktiválva van
|
||||
auths.default_auth=This authentication is default login source
|
||||
auths.new_success=Az új hitelesítési mód '%s' sikeresen hozzáadva.
|
||||
auths.update_success=A hitelesítési beállítások sikeresen firssítve lettek.
|
||||
auths.update=Hitelesítési forrás frissítése
|
||||
@@ -1314,14 +1322,14 @@ from_now=mostantól
|
||||
now=most
|
||||
1s=1 másodperce %s
|
||||
1m=1 perce %s
|
||||
1h=1 órája
|
||||
1h=1 órája %s
|
||||
1d=1 napja %s
|
||||
1w=1 hete %s
|
||||
1mon=1 hónapja %s
|
||||
1y=1 éve %s
|
||||
seconds=%d másodperce %s
|
||||
minutes=%d perce %s
|
||||
hours=%d órája
|
||||
hours=%d órája %s
|
||||
days=%d napja %s
|
||||
weeks=%d hete %s
|
||||
months=%d hónapja %s
|
||||
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=Terakhir disinkronkan
|
||||
watchers=Watchers
|
||||
stargazers=Stargazers
|
||||
forks=Forks
|
||||
repo_description_helper=Description of repository. Maximum 512 characters length.
|
||||
repo_description_length=Available characters
|
||||
|
||||
form.reach_limit_of_creation=Pemiliknya telah mencapai batas pembuatan maksimum %d repositori.
|
||||
form.name_reserved=Nama repositori '%s' dicadangkan.
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Konten file telah berubah sejak Anda mulai men
|
||||
editor.file_already_exists=File dengan nama '%s' sudah ada di repositori ini.
|
||||
editor.no_changes_to_show=Tidak ada perubahan untuk ditunjukkan.
|
||||
editor.fail_to_update_file=Gagal memperbarui / membuat file '%s' dengan error: %v
|
||||
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
|
||||
editor.add_subdir=Tambahkan subdirektori...
|
||||
editor.unable_to_upload_files=Gagal mengunggah file ke '%s' dengan kesalahan: %v
|
||||
editor.upload_files_to_dir=Upload file ke '%s'
|
||||
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Permintaan tarik ini tidak bisa digabungkan secara
|
||||
pulls.cannot_auto_merge_helper=Silahkan bergabung secara manual untuk menyelesaikan konflik.
|
||||
pulls.create_merge_commit=Membuat komit penggabungan
|
||||
pulls.rebase_before_merging=Rebase sebelum penggabungan
|
||||
pulls.commit_description=Commit Description
|
||||
pulls.merge_pull_request=Permintaan tarik gabungan
|
||||
pulls.open_unmerged_pull_exists='Anda tidak dapat melakukan operasi membuka kembali karena sudah ada permintaan tarik terbuka (#%d) dari repositori yang sama dengan penggabungan informasi yang sama dan menunggu penggabungan. '
|
||||
pulls.delete_branch=Menghapus cabang
|
||||
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Isu Penamaan Tracker Isu Eksternal:
|
||||
settings.tracker_issue_style.numeric=Numerik
|
||||
settings.tracker_issue_style.alphanumeric=Alfanumerik
|
||||
settings.tracker_url_format_desc=Anda dapat menggunakan placeholder <code>{user}{repo}{index</code> untuk nama pengguna, nama repositori dan indeks masalah.
|
||||
settings.pulls_desc=Aktifkan permintaan tarik untuk menerima kontribusi publik
|
||||
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
|
||||
settings.pulls.ignore_whitespace=Abaikan perubahan di spasi
|
||||
settings.pulls.allow_rebase_merge=Izinkan gunakan rebase untuk menggabungkan komit
|
||||
settings.danger_zone=Zona Bahaya
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=Kunci penerapan baru '%s' telah berhasil ditambahkan!
|
||||
settings.deploy_key_deletion=Hapus Kunci Deploy
|
||||
settings.deploy_key_deletion_desc=Menghapus kunci penggelaran ini akan menghapus semua akses yang terkait untuk repositori ini. Apakah Anda ingin melanjutkan?
|
||||
settings.deploy_key_deletion_success=Kunci penempatan telah berhasil dihapus!
|
||||
settings.description_desc=Description of repository. Maximum 512 characters length.
|
||||
settings.description_length=Available characters
|
||||
|
||||
diff.browse_source=Jelajahi Sumber
|
||||
diff.parent=induk
|
||||
@@ -1096,6 +1102,7 @@ auths.new=Tambahkan Sumber Baru
|
||||
auths.name=Nama
|
||||
auths.type=Mengetik
|
||||
auths.enabled=Diaktifkan
|
||||
auths.default=Default
|
||||
auths.updated=Diperbarui
|
||||
auths.auth_type=Jenis Autentikasi
|
||||
auths.auth_name=Nama Otentikasi
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Nama layanan PAM
|
||||
auths.enable_auto_register=Mengaktifkan pendaftaran otomatis
|
||||
auths.edit=Mengubah pengaturan pembuktian
|
||||
auths.activated=This authentication is activated
|
||||
auths.default_auth=This authentication is default login source
|
||||
auths.new_success=New authentication '%s' has been added successfully.
|
||||
auths.update_success=Authentication setting has been updated successfully.
|
||||
auths.update=Memperbarui pengetahuan otentikasi
|
||||
|
||||
@@ -119,7 +119,7 @@ sqlite3_not_available=Questa versione non supporta SQLite3, si prega di scaricar
|
||||
invalid_db_setting=La configurazione del database non è corretta: %v
|
||||
invalid_repo_path=Percorso root del repository invalido: %v
|
||||
run_user_not_match=Run user non è l'utente corrente: %s -> %s
|
||||
smtp_host_missing_port=SMTP Host is missing port in address.
|
||||
smtp_host_missing_port=All'Host SMTP manca la porta nell'indirizzo.
|
||||
invalid_smtp_from=Campo SMTP From non valido: %v
|
||||
save_config_failed=Fallito il salvataggio della configurazione: %v
|
||||
invalid_admin_setting=Impostazioni account Admin non valide: %v
|
||||
@@ -151,8 +151,8 @@ register_hepler_msg=Hai già un account? Accedi ora!
|
||||
social_register_hepler_msg=Hai già un account? Associalo ora!
|
||||
disable_register_prompt=Siamo spiacenti, registrazione è stata disabilitata. Si prega di contattare l'amministratore del sito.
|
||||
disable_register_mail=Siamo spiacenti, la conferma di registrazione via Mail è stata disattivata.
|
||||
auth_source=Authentication Source
|
||||
local=Local
|
||||
auth_source=Fonte di autenticazione
|
||||
local=Locale
|
||||
remember_me=Ricordami
|
||||
forgot_password=Password dimenticata
|
||||
forget_password=Password dimenticata?
|
||||
@@ -172,7 +172,7 @@ password_too_short=La lunghezza della password non può essere meno 6 caratteri.
|
||||
non_local_account=Gli account non locali non possono modificare le password tramite Gogs.
|
||||
|
||||
login_two_factor=Autenticazione in Due Passaggi
|
||||
login_two_factor_passcode=Authentication Passcode
|
||||
login_two_factor_passcode=Codice di autenticazione
|
||||
login_two_factor_enter_recovery_code=Inserisci il codice di recupero dell'Autenticazione a due Fattori
|
||||
login_two_factor_recovery=Two-factor Recovery
|
||||
login_two_factor_recovery_code=Recupera il codice
|
||||
@@ -267,7 +267,7 @@ profile=Profilo
|
||||
password=Password
|
||||
avatar=Avatar
|
||||
ssh_keys=Chiavi SSH
|
||||
security=Security
|
||||
security=Sicurezza
|
||||
repos=Repository
|
||||
orgs=Organizzazioni
|
||||
applications=Applicazioni
|
||||
@@ -338,30 +338,30 @@ key_state_desc=Hai utilizzato questa chiave negli ultimi 7 giorni
|
||||
token_state_desc=Questo token e' satato utilizzato negli ultimi 7 giorni
|
||||
|
||||
two_factor=Autenticazione in Due Passaggi
|
||||
two_factor_status=Status:
|
||||
two_factor_status=Stato:
|
||||
two_factor_on=Attiva
|
||||
two_factor_off=Off
|
||||
two_factor_enable=Enable
|
||||
two_factor_off=Non attivo
|
||||
two_factor_enable=Abilita
|
||||
two_factor_disable=Disattivata
|
||||
two_factor_view_recovery_codes=View and save <a href="%s%s">your recovery codes</a> in a safe place. You can use them as passcode if you lose access to your authentication application.
|
||||
two_factor_view_recovery_codes=Visualizza e memorizza i tuoi <a href="%s%s">codici di recupero</a> in un posto sicuro. Puoi utilizzarli come codice di sicurezza se perdi gli accessi all'applicazione di autenticazione.
|
||||
two_factor_http=For HTTP/HTTPS operations, you are no longer able to use plain username and password. Please create and use <a href="%[1]s%[2]s">Personal Access Token</a> as your credential, e.g. <code>%[3]s</code>.
|
||||
two_factor_enable_title=Abilita l'autenticazione in due passaggi
|
||||
two_factor_scan_qr=Please use your authentication application to scan the image:
|
||||
two_factor_or_enter_secret=Or enter the secret:
|
||||
two_factor_then_enter_passcode=Then enter passcode:
|
||||
two_factor_scan_qr=Per favore, utilizza la tua applicazione di autenticazione per scansionare l'immagine:
|
||||
two_factor_or_enter_secret=O inserisci la chiave segreta:
|
||||
two_factor_then_enter_passcode=Poi inserisci la chiave di sicurezza:
|
||||
two_factor_verify=Verifica
|
||||
two_factor_invalid_passcode=The passcode you entered is not valid, please try again!
|
||||
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
|
||||
two_factor_enable_error=Enable Two-factor authentication failed: %v
|
||||
two_factor_invalid_passcode=La chiave di sicurezza che hai inserito non è valida, riprova!
|
||||
two_factor_reused_passcode=La chiave di sicurezza che hai inserito è già stata utilizzata, provane un'altra!
|
||||
two_factor_enable_error=Impossibile abilitare l'autenticazione a due fattori: %v
|
||||
two_factor_enable_success=Two-factor authentication has enabled for your account successfully!
|
||||
two_factor_recovery_codes_title=Two-factor Authentication Recovery Codes
|
||||
two_factor_recovery_codes_desc=Recovery codes are used when you temporarily lose access to your authentication application. Each recovery code can only be used once, <b>please keep these codes in a safe place</b>.
|
||||
two_factor_regenerate_recovery_codes=Regenerate Recovery Codes
|
||||
two_factor_regenerate_recovery_codes_error=Regenerate recovery codes failed: %v
|
||||
two_factor_regenerate_recovery_codes_success=New recovery codes has been generated successfully!
|
||||
two_factor_disable_title=Disable Two-factor Authentication
|
||||
two_factor_disable_desc=Your account security level will decrease after disabled two-factor authentication. Do you want to continue?
|
||||
two_factor_disable_success=Two-factor authentication has disabled successfully!
|
||||
two_factor_regenerate_recovery_codes=Rigenera codici di recupero
|
||||
two_factor_regenerate_recovery_codes_error=Impossibile rigenerare codici di recupero: %v
|
||||
two_factor_regenerate_recovery_codes_success=I nuovi codici di recupero sono stati generati correttamente!
|
||||
two_factor_disable_title=Disabilita autenticazione a due fattori
|
||||
two_factor_disable_desc=Il livello di sicurezza del tuo account diminuirà disabilitando l'autenticazione a due fattori. Vuoi continuare?
|
||||
two_factor_disable_success=L'autenticazione a due fattori è stata disabilitata!
|
||||
|
||||
manage_access_token=Gestisci i Token di Accesso Personale
|
||||
generate_new_token=Genera Nuovo Token
|
||||
@@ -380,7 +380,7 @@ orgs.leave_title=Abbandona una organizzazione
|
||||
orgs.leave_desc=Abbandonando l'organizzazione perderai l'accesso a tutti i repository e i gruppi. Confermi?
|
||||
|
||||
repos.leave=Abbandona
|
||||
repos.leave_title=Leave repository
|
||||
repos.leave_title=Lascia il repository
|
||||
repos.leave_desc=You will lose access to the repository after you left. Do you want to continue?
|
||||
repos.leave_success=You have left repository '%s' successfully!
|
||||
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=Ultimo aggiornamento
|
||||
watchers=Osservatori
|
||||
stargazers=Fan
|
||||
forks=Fork
|
||||
repo_description_helper=Description of repository. Maximum 512 characters length.
|
||||
repo_description_length=Caratteri disponibili
|
||||
|
||||
form.reach_limit_of_creation=Il proprietario ha raggiunto il limite massimo di %d repository creati.
|
||||
form.name_reserved=Il nome repository %s è riservato.
|
||||
@@ -467,7 +469,7 @@ pulls=Pull Requests
|
||||
labels=Etichette
|
||||
milestones=Traguardi
|
||||
commits=Commit
|
||||
git_branches=Branches
|
||||
git_branches=Rami (Branch)
|
||||
releases=Rilasci
|
||||
file_raw=Originale
|
||||
file_history=Cronologia
|
||||
@@ -476,12 +478,12 @@ file_permalink=Permalink
|
||||
file_too_large=Questo file è troppo grande per essere mostrato
|
||||
video_not_supported_in_browser=Il tuo browser non supporta i tag "video" di HTML5.
|
||||
|
||||
branches.overview=Overview
|
||||
branches.active_branches=Active Branches
|
||||
branches.overview=Panoramica
|
||||
branches.active_branches=Rami (Branch) attivi
|
||||
branches.stale_branches=Stale Branches
|
||||
branches.all=All Branches
|
||||
branches.all=Tutti i rami (branch)
|
||||
branches.updated_by=Updated %[1]s by %[2]s
|
||||
branches.change_default_branch=Change Default Branch
|
||||
branches.change_default_branch=Cambia branch di default
|
||||
|
||||
editor.new_file=Nuovo file
|
||||
editor.upload_file=Carica File
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Il file è stato cambiato in un'altra posizion
|
||||
editor.file_already_exists=Un file di nome '%s' esiste già in questo repository.
|
||||
editor.no_changes_to_show=Nessuna modifica da mostrare.
|
||||
editor.fail_to_update_file=La creazione o la modifica del file '%s' è fallita: %v
|
||||
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
|
||||
editor.add_subdir=Aggiungi sottocartella...
|
||||
editor.unable_to_upload_files=È fallito il caricamento dei file su '%s': %v
|
||||
editor.upload_files_to_dir=Carica file su '%s'
|
||||
@@ -580,8 +583,8 @@ issues.next=Pagina successiva
|
||||
issues.open_title=Aperto
|
||||
issues.closed_title=Chiuso
|
||||
issues.num_comments=%d commenti
|
||||
issues.commented_at=`commented <a href="#%s">%s</a>`
|
||||
issues.delete_comment_confirm=Are you sure you want to delete this comment?
|
||||
issues.commented_at=`ha commentato <a href="#%s">%s</a>`
|
||||
issues.delete_comment_confirm=Sei sicuro/a di voler eliminare questo commento?
|
||||
issues.no_content=Non ci sono ancora contenuti.
|
||||
issues.close_issue=Chiudi
|
||||
issues.close_comment_issue=Commenta e chiudi
|
||||
@@ -637,10 +640,11 @@ pulls.can_auto_merge_desc=La pull request può essere mergiata automaticamente.
|
||||
pulls.cannot_auto_merge_desc=Questa pull request non può essere mergiata automaticamente perchè ci sono dei conflitti.
|
||||
pulls.cannot_auto_merge_helper=Effettua il merge manualmente per risolvere i conflitti.
|
||||
pulls.create_merge_commit=Create a merge commit
|
||||
pulls.rebase_before_merging=Rebase before merging
|
||||
pulls.rebase_before_merging=Effettua un Rebase prima del Merge
|
||||
pulls.commit_description=Descrizione del Commit
|
||||
pulls.merge_pull_request=Unisci Pull Request
|
||||
pulls.open_unmerged_pull_exists=`You can't perform reopen operation because there is already an open pull request (#%d) from same repository with same merge information and is waiting for merging.`
|
||||
pulls.delete_branch=Delete Branch
|
||||
pulls.delete_branch=Elimina Ramo
|
||||
pulls.delete_branch_has_new_commits=Branch cannot be deleted because it has new commits after mergence.
|
||||
|
||||
milestones.new=Nuova Milestone
|
||||
@@ -688,62 +692,62 @@ wiki.last_updated=Ultimo aggiornamento: %s
|
||||
settings=Impostazioni
|
||||
settings.options=Opzioni
|
||||
settings.collaboration=Collaborazione
|
||||
settings.collaboration.admin=Admin
|
||||
settings.collaboration.write=Write
|
||||
settings.collaboration.read=Read
|
||||
settings.collaboration.undefined=Undefined
|
||||
settings.branches=Branches
|
||||
settings.collaboration.admin=Amministratore
|
||||
settings.collaboration.write=Scrivi
|
||||
settings.collaboration.read=Leggi
|
||||
settings.collaboration.undefined=Indefinito
|
||||
settings.branches=Divisioni
|
||||
settings.branches_bare=You cannot manage branches for bare repository. Please push some content first.
|
||||
settings.default_branch=Default Branch
|
||||
settings.default_branch=Ramo di default
|
||||
settings.default_branch_desc=The default branch is considered the "base" branch for code commits, pull requests and online editing.
|
||||
settings.update=Aggiorna
|
||||
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
|
||||
settings.update_default_branch_success=Default branch of this repository has been updated successfully!
|
||||
settings.protected_branches=Branch protetti
|
||||
settings.protected_branches_desc=Protect branches from force pushing, accidental deletion and whitelist code committers.
|
||||
settings.choose_a_branch=Choose a branch...
|
||||
settings.branch_protection=Branch Protection
|
||||
settings.choose_a_branch=Scegli un ramo...
|
||||
settings.branch_protection=Protezione Ramo
|
||||
settings.branch_protection_desc=Please choose protect options for branch <b>%s</b>.
|
||||
settings.protect_this_branch=Protect this branch
|
||||
settings.protect_this_branch=Proteggere questo ramo
|
||||
settings.protect_this_branch_desc=Disable force pushes and prevent from deletion.
|
||||
settings.protect_require_pull_request=Require pull request instead direct pushing
|
||||
settings.protect_require_pull_request_desc=Enable this option to disable direct pushing to this branch. Commits have to be pushed to another non-protected branch and merged to this branch through pull request.
|
||||
settings.protect_whitelist_committers=Whitelist who can push to this branch
|
||||
settings.protect_whitelist_committers_desc=Add people or teams to whitelist of direct push to this branch. Users in whitelist will bypass require pull request check.
|
||||
settings.protect_whitelist_users=Users who can push to this branch
|
||||
settings.protect_whitelist_search_users=Search users
|
||||
settings.protect_whitelist_search_users=Cerca utenti
|
||||
settings.protect_whitelist_teams=Teams for which members of them can push to this branch
|
||||
settings.protect_whitelist_search_teams=Search teams
|
||||
settings.protect_whitelist_search_teams=Cerca Teams
|
||||
settings.update_protect_branch_success=Protect options for this branch has been updated successfully!
|
||||
settings.hooks=Webhooks
|
||||
settings.githooks=Git Hooks
|
||||
settings.basic_settings=Impostazioni di Base
|
||||
settings.mirror_settings=Mirror Settings
|
||||
settings.sync_mirror=Sync Now
|
||||
settings.mirror_sync_in_progress=Mirror syncing is in progress, please refresh page in about a minute.
|
||||
settings.mirror_settings=Impostazioni mirror
|
||||
settings.sync_mirror=Sincronizza ora
|
||||
settings.mirror_sync_in_progress=Sincronizzazione del mirror in corso, aggiorna la pagina tra un minuto.
|
||||
settings.site=Sito Ufficiale
|
||||
settings.update_settings=Aggiorna Impostazioni
|
||||
settings.change_reponame_prompt=Questa modifica influirà i link al repository.
|
||||
settings.advanced_settings=Opzioni avanzate
|
||||
settings.wiki_desc=Enable wiki system
|
||||
settings.use_internal_wiki=Use builtin wiki
|
||||
settings.wiki_desc=Abilita wiki
|
||||
settings.use_internal_wiki=Usa wiki incorporato
|
||||
settings.allow_public_wiki_desc=Allow public access to wiki when repository is private
|
||||
settings.use_external_wiki=Usa Wiki esterno
|
||||
settings.external_wiki_url=URL Wiki esterno
|
||||
settings.external_wiki_url_desc=I visitatori verranno reindirizzati all'URL quando cliccano sulla scheda.
|
||||
settings.issues_desc=Enable issue tracker
|
||||
settings.use_internal_issue_tracker=Use builtin lightweight issue tracker
|
||||
settings.issues_desc=Abilita tracking problemi
|
||||
settings.use_internal_issue_tracker=Utilizza il segnalatore di problemi integrato (molto leggero)
|
||||
settings.allow_public_issues_desc=Allow public access to issues when repository is private
|
||||
settings.use_external_issue_tracker=Utilizza gestore di problemi esterno
|
||||
settings.external_tracker_url=External Issue Tracker URL
|
||||
settings.external_tracker_url_desc=Visitors will be redirected to URL when they click on the tab.
|
||||
settings.external_tracker_url=URL di un segnalatore di problemi esterno
|
||||
settings.external_tracker_url_desc=I visitatori verranno reindirizzati all'URL quando faranno click sulla scheda.
|
||||
settings.tracker_url_format=Formato URL Gestore Problemi Esterno
|
||||
settings.tracker_issue_style=External Issue Tracker Naming Style:
|
||||
settings.tracker_issue_style.numeric=Numeric
|
||||
settings.tracker_issue_style.alphanumeric=Alphanumeric
|
||||
settings.tracker_issue_style.numeric=Numerico
|
||||
settings.tracker_issue_style.alphanumeric=Alfanumerico
|
||||
settings.tracker_url_format_desc=You can use placeholder <code>{user} {repo} {index}</code> for user name, repository name and issue index.
|
||||
settings.pulls_desc=Abilita le pull requests per accettare contributi pubblici
|
||||
settings.pulls.ignore_whitespace=Ignore changes in whitespace
|
||||
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
|
||||
settings.pulls.ignore_whitespace=Ignora cambiamenti di spazi bianchi
|
||||
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
|
||||
settings.danger_zone=Zona Pericolosa
|
||||
settings.cannot_fork_to_same_owner=You cannot fork a repository to its original owner.
|
||||
@@ -815,19 +819,19 @@ settings.event_send_everything=Ho bisogno di <strong>tutto</strong>.
|
||||
settings.event_choose=Lasciami scegliere ciò di cui ho bisogno.
|
||||
settings.event_create=Crea
|
||||
settings.event_create_desc=Branch, o tag creato
|
||||
settings.event_delete=Delete
|
||||
settings.event_delete_desc=Branch or tag deleted
|
||||
settings.event_delete=Elimina
|
||||
settings.event_delete_desc=Branch o tag eliminato
|
||||
settings.event_fork=Forka
|
||||
settings.event_fork_desc=Repository Forkata
|
||||
settings.event_push=Push
|
||||
settings.event_push_desc=Git push in un repository
|
||||
settings.event_issues=Issues
|
||||
settings.event_issues=Problemi
|
||||
settings.event_issues_desc=Issue opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, or demilestoned.
|
||||
settings.event_pull_request=Pull request
|
||||
settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, demilestoned, or synchronized.
|
||||
settings.event_issue_comment=Issue Comment
|
||||
settings.event_issue_comment_desc=Issue comment created, edited, or deleted.
|
||||
settings.event_release=Release
|
||||
settings.event_release=Versione
|
||||
settings.event_release_desc=Release published in a repository.
|
||||
settings.active=Attivo
|
||||
settings.active_helper=Anche i dettagli riguardanti l'evento che ha innescato l'hook saranno inviati.
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=La nuova deploy key '%s' è stata aggiunta con successo
|
||||
settings.deploy_key_deletion=Elimina Deploy Key
|
||||
settings.deploy_key_deletion_desc=Cancellando questa deploy key verrà rismosso ogni accesso relativo a questa repository. Vuoi continuare?
|
||||
settings.deploy_key_deletion_success=Deploy key eliminata con successo!
|
||||
settings.description_desc=Description of repository. Maximum 512 characters length.
|
||||
settings.description_length=Available characters
|
||||
|
||||
diff.browse_source=Sfoglia il codice sorgente
|
||||
diff.parent=parent
|
||||
@@ -893,12 +899,12 @@ release.cancel=Annulla
|
||||
release.publish=Pubblica Rilascio
|
||||
release.save_draft=Salva Bozza
|
||||
release.edit_release=Modifica Rilascio
|
||||
release.delete_release=Cancela questa Release
|
||||
release.delete_release=Cancella questa Release
|
||||
release.deletion=Eliminazione Release
|
||||
release.deletion_desc=Eliminando questa release cancellarai anche i tag Git corrispondenti. Vuoi continuare?
|
||||
release.deletion_success=La release è stata eliminata con successo!
|
||||
release.tag_name_already_exist=Un rilascio con questo tag esiste già.
|
||||
release.tag_name_invalid=Tag name is not valid.
|
||||
release.tag_name_invalid=Il nome del Tag non è valido.
|
||||
release.downloads=Download
|
||||
|
||||
[org]
|
||||
@@ -922,7 +928,7 @@ team_permission_desc=Quale livello di autorizzazione dovrebbe avere questa squad
|
||||
|
||||
form.name_reserved=Il nome organizzazione '%s' è riservato.
|
||||
form.name_pattern_not_allowed=La struttura del nome dell'organizzazione '%s' non è consentita.
|
||||
form.team_name_reserved=Team name '%s' is reserved.
|
||||
form.team_name_reserved=Non puoi utilizzare '%s' come nome del Team.
|
||||
|
||||
settings=Impostazioni
|
||||
settings.options=Opzioni
|
||||
@@ -1089,13 +1095,14 @@ repos.private=Privati
|
||||
repos.watches=Segue
|
||||
repos.stars=Voti
|
||||
repos.issues=Problemi
|
||||
repos.size=Size
|
||||
repos.size=Dimensione
|
||||
|
||||
auths.auth_sources=Authentication Sources
|
||||
auths.new=Aggiungi Nuova Origine
|
||||
auths.name=Nome
|
||||
auths.type=Tipo
|
||||
auths.enabled=Attivo
|
||||
auths.default=Default
|
||||
auths.updated=Aggiornato
|
||||
auths.auth_type=Tipo di autenticazione
|
||||
auths.auth_name=Nome di autenticazione
|
||||
@@ -1114,7 +1121,7 @@ auths.attribute_username_placeholder=Se vuoto, verrà usato il nome di login del
|
||||
auths.attribute_name=First Name Attribute
|
||||
auths.attribute_surname=Attributo Cognome
|
||||
auths.attribute_mail=Attributo Email
|
||||
auths.verify_group_membership=Verify group membership
|
||||
auths.verify_group_membership=Verifica gruppo di appartenenza
|
||||
auths.group_search_base_dn=Group Search Base DN
|
||||
auths.group_filter=Group Filter
|
||||
auths.group_attribute_contain_user_list=Group Attribute Containing List of Users
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Nome del Servizio PAM
|
||||
auths.enable_auto_register=Abilitare Registrazione Automatica
|
||||
auths.edit=Modifica impostazioni di autenticazione
|
||||
auths.activated=Questa Autenticazione è stata attivata
|
||||
auths.default_auth=This authentication is default login source
|
||||
auths.new_success=Nuovo meccanismo di autenticazione '%s' aggiunto.
|
||||
auths.update_success=Parametro di autenticazione aggiornato.
|
||||
auths.update=Aggiornare le impostazioni di autenticazione
|
||||
@@ -1144,7 +1152,7 @@ auths.still_in_used=Questo meccanismo di autenticazione è ancora attivo per alc
|
||||
auths.deletion_success=Il meccanismo di autenticazione è stato eliminato!
|
||||
auths.login_source_exist=La fonte di autenticazione '%s' esiste già.
|
||||
|
||||
config.not_set=(not set)
|
||||
config.not_set=(non impostata)
|
||||
config.server_config=Configurazione Server
|
||||
config.app_name=Nome Applicazione
|
||||
config.app_ver=Versione Applicazione
|
||||
@@ -1172,17 +1180,17 @@ config.ssh_keygen_path=Percorso Keygen ('ssh-keygen')
|
||||
config.ssh_minimum_key_size_check=Verifica delle dimensioni minime della chiave
|
||||
config.ssh_minimum_key_sizes=Dimensioni minime della chiave
|
||||
|
||||
config.repo_config=Repository Configuration
|
||||
config.repo_config=Configurazione Repository
|
||||
config.repo_root_path=Percorso Root del Repository
|
||||
config.script_type=Tipo di Script
|
||||
config.repo_force_private=Force Private
|
||||
config.max_creation_limit=Max Creation Limit
|
||||
config.preferred_licenses=Preferred Licenses
|
||||
config.disable_http_git=Disable HTTP Git
|
||||
config.enable_local_path_migration=Enable Local Path Migration
|
||||
config.disable_http_git=Disabilita Git in HTTP
|
||||
config.enable_local_path_migration=Abilita migrazioni con path locale
|
||||
config.commits_fetch_concurrency=Commits Fetch Concurrency
|
||||
|
||||
config.http_config=HTTP Configuration
|
||||
config.http_config=Configurazione HTTP
|
||||
config.http_access_control_allow_origin=Access Control Allow Origin
|
||||
|
||||
config.db_config=Configurazione Database
|
||||
@@ -1258,7 +1266,7 @@ config.git_gc_timeout=Timeout per le operazioni di GC
|
||||
|
||||
config.log_config=Configurazione Log
|
||||
config.log_mode=Modalità
|
||||
config.log_options=Options
|
||||
config.log_options=Opzioni
|
||||
|
||||
monitor.cron=Incarici di cron
|
||||
monitor.name=Nome
|
||||
|
||||
@@ -151,8 +151,8 @@ register_hepler_msg=既にアカウントをお持ちですか?今すぐログ
|
||||
social_register_hepler_msg=既にアカウントをお持ちですか?連携しましょう!
|
||||
disable_register_prompt=申し訳ありませんが、現在登録は受け付けておりません。サイトの管理者にお問い合わせください。
|
||||
disable_register_mail=申し訳ありませんが、登録メールの確認機能が無効になっています。
|
||||
auth_source=Authentication Source
|
||||
local=Local
|
||||
auth_source=認証ソース
|
||||
local=ローカル
|
||||
remember_me=ログインしたままにする
|
||||
forgot_password=パスワードを忘れた
|
||||
forget_password=パスワードを忘れましたか?
|
||||
@@ -231,7 +231,7 @@ org_name_been_taken=組織名は既に使用されています。
|
||||
team_name_been_taken=チーム名は既に使用されています。
|
||||
email_been_used=電子メール アドレスは既に使用されています。
|
||||
username_password_incorrect=ユーザー名またはパスワードが正しくありません。
|
||||
auth_source_mismatch=The authentication source selected is not associated with the user.
|
||||
auth_source_mismatch=選択されている認証ソースは、ユーザーに関連付けられていません。
|
||||
enterred_invalid_repo_name=入力したリポジトリの名前が正しいかどうかを確認してください。
|
||||
enterred_invalid_owner_name=入力された所有者名が正しいかどうかを確認してください。
|
||||
enterred_invalid_password=入力したパスワードが正しいか確認してください。
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=最終同期
|
||||
watchers=ウォッチャー
|
||||
stargazers=スターゲイザー
|
||||
forks=フォーク
|
||||
repo_description_helper=Description of repository. Maximum 512 characters length.
|
||||
repo_description_length=Available characters
|
||||
|
||||
form.reach_limit_of_creation=リポジトリの最大作成数 %d にすでに達しています。
|
||||
form.name_reserved=リポジトリ名 '%s' は使用されています。
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=あなたが編集を開始してから、フ
|
||||
editor.file_already_exists=ファイル名 '%s' は、このリポジトリに既に存在します。
|
||||
editor.no_changes_to_show=表示する変更箇所はありません。
|
||||
editor.fail_to_update_file=ファイル '%s' の作成/更新に失敗しました: %v
|
||||
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
|
||||
editor.add_subdir=サブディレクトリを追加...
|
||||
editor.unable_to_upload_files='%s' へのファイルアップロード中にエラーが発生し、失敗しました: %v
|
||||
editor.upload_files_to_dir='%s' にファイルをアップロード
|
||||
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=コンフリクトが発生しているため、こ
|
||||
pulls.cannot_auto_merge_helper=競合を解決するためには、手動でマージする必要があります。
|
||||
pulls.create_merge_commit=マージコミットを作成する
|
||||
pulls.rebase_before_merging=マージする前に再配置します。
|
||||
pulls.commit_description=Commit Description
|
||||
pulls.merge_pull_request=プルリクエストをマージします。
|
||||
pulls.open_unmerged_pull_exists=`同じリポジトリに同じマージ情報持つ未解決のプルリクエスト (#%d) が存在するため再び開くことができません。`
|
||||
pulls.delete_branch=ブランチの削除
|
||||
@@ -742,7 +746,7 @@ settings.tracker_issue_style=外部課題トラッキングシステムの命名
|
||||
settings.tracker_issue_style.numeric=数値
|
||||
settings.tracker_issue_style.alphanumeric=英数字
|
||||
settings.tracker_url_format_desc=ユーザー名、リポジトリ名、課題番号を埋め込むために <code>{user} {repo} {index}</code> が使用できます。
|
||||
settings.pulls_desc=誰でもコントリビュートできるよう、プルリクエストの受け付けを有効にします
|
||||
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
|
||||
settings.pulls.ignore_whitespace=空白の変更を無視する
|
||||
settings.pulls.allow_rebase_merge=コミットをマージするためのリベースの使用を許可する
|
||||
settings.danger_zone=危険地帯
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=新しいデプロイキー '%s'が正常に追加さ
|
||||
settings.deploy_key_deletion=デプロイキーを削除
|
||||
settings.deploy_key_deletion_desc=このデプロイキーを削除すると、このリポジトリに関連するすべてのアクセス権も削除されます。続行しますか。
|
||||
settings.deploy_key_deletion_success=デプロイキーが正常に削除された!
|
||||
settings.description_desc=Description of repository. Maximum 512 characters length.
|
||||
settings.description_length=Available characters
|
||||
|
||||
diff.browse_source=ソースを参照
|
||||
diff.parent=親
|
||||
@@ -1096,6 +1102,7 @@ auths.new=新しいソースを追加
|
||||
auths.name=名前
|
||||
auths.type=タイプ
|
||||
auths.enabled=有効
|
||||
auths.default=Default
|
||||
auths.updated=更新しました
|
||||
auths.auth_type=認証タイプ
|
||||
auths.auth_name=認証名
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAMサービス名
|
||||
auths.enable_auto_register=自動登録を有効にする
|
||||
auths.edit=認証設定を編集
|
||||
auths.activated=認証の有効化
|
||||
auths.default_auth=This authentication is default login source
|
||||
auths.new_success=新しい認証 '%s' が正常に追加されました。
|
||||
auths.update_success=認証の設定が正常に更新されました。
|
||||
auths.update=認証設定を更新
|
||||
|
||||
@@ -152,7 +152,7 @@ social_register_hepler_msg=계정을 가지고 계신가요? 연결하세요!
|
||||
disable_register_prompt=죄송합니다, 가입이 비활성화 되어있습니다. 사이트 관리자에게 문의 해주세요.
|
||||
disable_register_mail=죄송합니다. 메일 등록이 비활성화 되었습니다.
|
||||
auth_source=Authentication Source
|
||||
local=Local
|
||||
local=로컬
|
||||
remember_me=자동 로그인
|
||||
forgot_password=비밀번호 찾기
|
||||
forget_password=비밀번호를 잊으셨습니까?
|
||||
@@ -379,8 +379,8 @@ orgs.none=당신은 어떤 조직의 구성원도 아닙니다.
|
||||
orgs.leave_title=조직 떠나기
|
||||
orgs.leave_desc=조직을 떠난 후에는 모든 리포지토리와 팀에 액세스 할 수 없게 됩니다. 계속 하시겠습니까?
|
||||
|
||||
repos.leave=Leave
|
||||
repos.leave_title=Leave repository
|
||||
repos.leave=나가기
|
||||
repos.leave_title=저장소 나가기
|
||||
repos.leave_desc=You will lose access to the repository after you left. Do you want to continue?
|
||||
repos.leave_success=You have left repository '%s' successfully!
|
||||
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=마지막으로 동기화됨
|
||||
watchers=주시하고 있는 사람들
|
||||
stargazers=별을 준 사람들
|
||||
forks=포크
|
||||
repo_description_helper=Description of repository. Maximum 512 characters length.
|
||||
repo_description_length=Available characters
|
||||
|
||||
form.reach_limit_of_creation=소유자가 저장소 만들기 최대 제한에 (%d개) 도달했습니다.
|
||||
form.name_reserved=저장소 이름 '%s'은 예약 되어 있습니다.
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=편집을 시작한 이후 파일 내용이
|
||||
editor.file_already_exists=이 저장소에 이름이 '%s'인 파일이 이미 존재합니다.
|
||||
editor.no_changes_to_show=표시할 변경사항이 없습니다.
|
||||
editor.fail_to_update_file=파일 '%s'를 변경/추가 하는데 실패하였습니다. 에러: %v
|
||||
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
|
||||
editor.add_subdir=하위 디렉토리 추가...
|
||||
editor.unable_to_upload_files=파일 '%s'를 업로드하는데 실패하였습니다. 에러: %v
|
||||
editor.upload_files_to_dir=파일 업로드 '%s'
|
||||
@@ -638,7 +641,8 @@ pulls.can_auto_merge_desc=이 풀리퀘스트는 자동적으로 머지될 수
|
||||
pulls.cannot_auto_merge_desc=컨플릭이 존재해서 이 풀리퀘스트는 자동을 머지될 수 없습니다.
|
||||
pulls.cannot_auto_merge_helper=컨플릭을 해결하려면 수동으로 머지해 주십시오.
|
||||
pulls.create_merge_commit=Create a merge commit
|
||||
pulls.rebase_before_merging=Rebase before merging
|
||||
pulls.rebase_before_merging=병합 하기 전에 리베이스
|
||||
pulls.commit_description=Commit Description
|
||||
pulls.merge_pull_request=풀리퀘스트 머지
|
||||
pulls.open_unmerged_pull_exists=`같은 리파지토리에서 같은 머지 정보로 만들어진 풀리퀘스트 (#%d) 가 이미 오픈 상태이고 머지를 기다리고 있기 때문에 다시 열기 작업을 할 수 없습니다.`
|
||||
pulls.delete_branch=브랜치 삭제
|
||||
@@ -743,7 +747,7 @@ settings.tracker_issue_style=외부 이슈 트래커 명명 스타일:
|
||||
settings.tracker_issue_style.numeric=숫자
|
||||
settings.tracker_issue_style.alphanumeric=문자 숫자
|
||||
settings.tracker_url_format_desc=<code>{user} {repo} {index}</code> 사용자 명, 저장소 명, 이슈 인덱스를 사용하여 표시자를 사용할 수 있습니다.
|
||||
settings.pulls_desc=끌어오기 요청을 공개적으로 기여받을 수 있도록 활성화합니다.
|
||||
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
|
||||
settings.pulls.ignore_whitespace=Ignore changes in whitespace
|
||||
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
|
||||
settings.danger_zone=위험 설정
|
||||
@@ -857,6 +861,8 @@ settings.add_key_success=새로운 배포 키 '%s'가 성공적으로 추가 되
|
||||
settings.deploy_key_deletion=배포 키 삭제
|
||||
settings.deploy_key_deletion_desc=이 배포키를 삭제하면 이 저장소와 관련된 모든 접근 권한이 삭제됩니다. 계속 하시겠습니까?
|
||||
settings.deploy_key_deletion_success=배포 키가 성공적으로 삭제되었습니다!
|
||||
settings.description_desc=Description of repository. Maximum 512 characters length.
|
||||
settings.description_length=Available characters
|
||||
|
||||
diff.browse_source=소스 검색
|
||||
diff.parent=부모
|
||||
@@ -1090,13 +1096,14 @@ repos.private=비공개
|
||||
repos.watches=지켜보기
|
||||
repos.stars=Stars
|
||||
repos.issues=이슈
|
||||
repos.size=Size
|
||||
repos.size=크기
|
||||
|
||||
auths.auth_sources=Authentication Sources
|
||||
auths.new=새로운 소스를 추가
|
||||
auths.name=이름
|
||||
auths.type=유형
|
||||
auths.enabled=활성화됨
|
||||
auths.default=Default
|
||||
auths.updated=업데이트됨
|
||||
auths.auth_type=인증 유형
|
||||
auths.auth_name=인증 이름
|
||||
@@ -1112,10 +1119,10 @@ auths.user_base=사용자 검색 기준
|
||||
auths.user_dn=사용자 DN
|
||||
auths.attribute_username=유저 명 속성
|
||||
auths.attribute_username_placeholder=사용자 이름에 대한 로그인 폼 필드 값을 사용하려면 비워 둡니다.
|
||||
auths.attribute_name=First Name Attribute
|
||||
auths.attribute_name=첫번째 이름 속성
|
||||
auths.attribute_surname=성씨 속성
|
||||
auths.attribute_mail=이메일 속성
|
||||
auths.verify_group_membership=Verify group membership
|
||||
auths.verify_group_membership=그룹 구성원 자격을 확인
|
||||
auths.group_search_base_dn=Group Search Base DN
|
||||
auths.group_filter=Group Filter
|
||||
auths.group_attribute_contain_user_list=Group Attribute Containing List of Users
|
||||
@@ -1135,6 +1142,7 @@ auths.pam_service_name=PAM 서비스 명
|
||||
auths.enable_auto_register=자동 등록을 활성화
|
||||
auths.edit=인증 설정 편집
|
||||
auths.activated=이 인증정보는 활성화되어있습니다.
|
||||
auths.default_auth=This authentication is default login source
|
||||
auths.new_success=새로운 인증 '%s'가 성공적으로 추가 되었습니다.
|
||||
auths.update_success=인증 설정이 성공적으로 변경되었습니다.
|
||||
auths.update=인증 설정 업데이트
|
||||
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=Pēdējo reizi sinhronizēts
|
||||
watchers=Novērotāji
|
||||
stargazers=Zvaigžņdevēji
|
||||
forks=Atdalītie repozitoriji
|
||||
repo_description_helper=Description of repository. Maximum 512 characters length.
|
||||
repo_description_length=Available characters
|
||||
|
||||
form.reach_limit_of_creation=Īpašnieks sasniedza maksimālu pieļaujamo (%d) izveidoto repozitoriju skaitu.
|
||||
form.name_reserved=Repozitorija nosaukums '%s' ir rezervēts.
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Faila saturs ir mainījies kopš brīža, kad
|
||||
editor.file_already_exists=Fails ar nosaukumu '%s' repozitorijā jau eksistē.
|
||||
editor.no_changes_to_show=Nav izmaiņu, ko rādīt.
|
||||
editor.fail_to_update_file=Neizdevās izmainīt/izveidot failu '%s', kļūda: %v
|
||||
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
|
||||
editor.add_subdir=Pievienot apakšdirektoriju...
|
||||
editor.unable_to_upload_files=Neizdevās augšupielādēt failus uz direktoriju '%s', kļūda: %v
|
||||
editor.upload_files_to_dir=Augšupielādēt failus uz direktoriju '%s'
|
||||
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Šis izmaiņu pieprasījums nevar tikt automātiski
|
||||
pulls.cannot_auto_merge_helper=Lūdzu sapludiniet manuāli, lai atrisinātu konfliktus.
|
||||
pulls.create_merge_commit=Create a merge commit
|
||||
pulls.rebase_before_merging=Rebase before merging
|
||||
pulls.commit_description=Commit Description
|
||||
pulls.merge_pull_request=Izmaiņu pieprasījuma sapludināšana
|
||||
pulls.open_unmerged_pull_exists=`Jūs nevarat veikt atkārtotas atvēršanas darbību, jo jau eksistē izmaiņu pieprasījums (#%d) no šī repozitorija ar tādu pašu sapludināšanas informāciju un gaida sapludināšanu.`
|
||||
pulls.delete_branch=Dzēst atzaru
|
||||
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Ārējā problēmu reģistra nosaukumu stils:
|
||||
settings.tracker_issue_style.numeric=Cipari
|
||||
settings.tracker_issue_style.alphanumeric=Burti un cipari
|
||||
settings.tracker_url_format_desc=Jūs varat izmantot <code>{user}{repo}{index}</code> lietotājvārdam, repozitorija nosaukumam un problēmas identifikātoram.
|
||||
settings.pulls_desc=Iespējot izmaiņu pieprasījumus lai saņemtu publiskus ieguldījumus
|
||||
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
|
||||
settings.pulls.ignore_whitespace=Ignore changes in whitespace
|
||||
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
|
||||
settings.danger_zone=Bīstamā zona
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=Izvietošanas atslēga '%s' tik veiksmīgi pievienota!
|
||||
settings.deploy_key_deletion=Dzēst izvietošanas atslēgu
|
||||
settings.deploy_key_deletion_desc=Dzēšot šo izvietošanas atslēgu tiks noņemta arī ar to saistītā piekļuve šim repozitorijam. Vai vēlaties turpināt?
|
||||
settings.deploy_key_deletion_success=Izvietošanas atslēga tika veiksmīgi izdzēsta!
|
||||
settings.description_desc=Description of repository. Maximum 512 characters length.
|
||||
settings.description_length=Available characters
|
||||
|
||||
diff.browse_source=Pārlūkot izejas kodu
|
||||
diff.parent=vecāks
|
||||
@@ -1096,6 +1102,7 @@ auths.new=Pievienot jaunu avotu
|
||||
auths.name=Nosaukums
|
||||
auths.type=Veids
|
||||
auths.enabled=Iespējota
|
||||
auths.default=Default
|
||||
auths.updated=Atjaunināta
|
||||
auths.auth_type=Autentifikācijas tips
|
||||
auths.auth_name=Autentifikācijas nosaukums
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAM servisa nosaukums
|
||||
auths.enable_auto_register=Iespējot automātisko reģistrāciju
|
||||
auths.edit=Labot autentifikācijas iestatījumus
|
||||
auths.activated=Autentifikācija ir aktivizēta
|
||||
auths.default_auth=This authentication is default login source
|
||||
auths.new_success=Jauna autentifikācija '%s' tika veiksmīgi pievienota.
|
||||
auths.update_success=Autentifikācijas iestatījumi tika veiksmīgi saglabāti.
|
||||
auths.update=Mainīt autentifikācijas iestatījumus
|
||||
|
||||
@@ -40,7 +40,7 @@ your_settings=Uw instellingen
|
||||
|
||||
activities=Activiteiten
|
||||
pull_requests=Pull requests
|
||||
issues=Kwesties
|
||||
issues=Issues
|
||||
|
||||
cancel=Annuleren
|
||||
|
||||
@@ -119,7 +119,7 @@ sqlite3_not_available=Uw versie biedt geen ondersteuning voor SQLite3, download
|
||||
invalid_db_setting=Uw database instellingen zijn niet correct: %v
|
||||
invalid_repo_path=Repositorie basis map is niet correct: %v
|
||||
run_user_not_match=De uitvoerende gebruiker is niet de huidig gebruiker: %s -> %s
|
||||
smtp_host_missing_port=SMTP Host is missing port in address.
|
||||
smtp_host_missing_port=SMTP-Host mist een poort in het adres.
|
||||
invalid_smtp_from=SMTP-van-veld is niet geldig: %v
|
||||
save_config_failed=Kan de configuratie niet opslaan: %v
|
||||
invalid_admin_setting=Uw admin-instellingen zijn niet geldig: %v
|
||||
@@ -152,7 +152,7 @@ social_register_hepler_msg=Heeft u al een account? Koppel nu!
|
||||
disable_register_prompt=Sorry, registratie is uitgeschakeld. Neem contact op met de beheerder van deze site.
|
||||
disable_register_mail=Sorry, bevestiging van registratie per e-mail is uitgeschakeld.
|
||||
auth_source=Authentication Source
|
||||
local=Local
|
||||
local=Lokaal
|
||||
remember_me=Onthoud mij
|
||||
forgot_password=Wachtwoord vergeten
|
||||
forget_password=Wachtwoord vergeten?
|
||||
@@ -173,10 +173,10 @@ non_local_account=Niet lokale accounts mogen hun wachtwoord niet veranderen via
|
||||
|
||||
login_two_factor=Twee-traps authenticatie
|
||||
login_two_factor_passcode=Authenticatie wachtwoord
|
||||
login_two_factor_enter_recovery_code=Enter a two-factor recovery code
|
||||
login_two_factor_recovery=Two-factor Recovery
|
||||
login_two_factor_recovery_code=Recovery Code
|
||||
login_two_factor_enter_passcode=Enter a two-factor passcode
|
||||
login_two_factor_enter_recovery_code=Voer de two-factor herstelcode in
|
||||
login_two_factor_recovery=Two-factor herstel
|
||||
login_two_factor_recovery_code=Herstel code
|
||||
login_two_factor_enter_passcode=Voer een two-factor wachtwoord in
|
||||
login_two_factor_invalid_recovery_code=Recovery code has been used or does not valid.
|
||||
|
||||
[mail]
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=Laatste synchronisatie
|
||||
watchers=Volgers
|
||||
stargazers=Stargazers
|
||||
forks=Forks
|
||||
repo_description_helper=Description of repository. Maximum 512 characters length.
|
||||
repo_description_length=Available characters
|
||||
|
||||
form.reach_limit_of_creation=De eigenaar heeft maximale creatie limiet van %d repositories bereikt.
|
||||
form.name_reserved=Repositorienaam '%s' is gereserveerd.
|
||||
@@ -454,7 +456,7 @@ quick_guide=Snelstart gids
|
||||
clone_this_repo=Kloon deze repositorie
|
||||
create_new_repo_command=Maak een nieuwe repositorie aan vanaf de console
|
||||
push_exist_repo=Push een bestaande repositorie vanaf de console
|
||||
bare_message=This repository does not have any content yet.
|
||||
bare_message=Deze repository bevat nog geen inhoud.
|
||||
|
||||
files=Bestanden
|
||||
branch=Aftakking
|
||||
@@ -462,7 +464,7 @@ tree=Boom
|
||||
filter_branch_and_tag=Filter branch of tag
|
||||
branches=Aftakkingen
|
||||
tags=Labels
|
||||
issues=Kwesties
|
||||
issues=Issues
|
||||
pulls=Pull-aanvragen
|
||||
labels=Labels
|
||||
milestones=Mijlpalen
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=File content has been changed since you starte
|
||||
editor.file_already_exists=A file with name '%s' already exists in this repository.
|
||||
editor.no_changes_to_show=Er zijn geen wijzigingen om weer te geven.
|
||||
editor.fail_to_update_file=Failed to update/create file '%s' with error: %v
|
||||
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
|
||||
editor.add_subdir=Submap toevoegen...
|
||||
editor.unable_to_upload_files=Failed to upload files to '%s' with error: %v
|
||||
editor.upload_files_to_dir=Bestanden uploaden naar '%s'
|
||||
@@ -562,7 +565,7 @@ issues.filter_milestone_no_select=Geen geselecteerde mijlpaal
|
||||
issues.filter_assignee=Aangewezene
|
||||
issues.filter_assginee_no_select=Geen geselecteerde verantwoordelijke
|
||||
issues.filter_type=Type
|
||||
issues.filter_type.all_issues=Alle kwesties
|
||||
issues.filter_type.all_issues=Alle issues
|
||||
issues.filter_type.assigned_to_you=Aan jou toegewezen
|
||||
issues.filter_type.created_by_you=Aangemaakt door jou
|
||||
issues.filter_type.mentioning_you=Vermelden jou
|
||||
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Dit pull-request kan niet worden gemerged omdat er
|
||||
pulls.cannot_auto_merge_helper=Gelieve beide versies manueel samen te voegen om de conflicten op te lossen.
|
||||
pulls.create_merge_commit=Create a merge commit
|
||||
pulls.rebase_before_merging=Rebase before merging
|
||||
pulls.commit_description=Commit Description
|
||||
pulls.merge_pull_request=Samenvoegen van pull verzoek
|
||||
pulls.open_unmerged_pull_exists=U kan de bewerking 'heropenen' niet uitvoeren omdat er al een pull-aanvraag (#%d) is van dezelfde repository met dezelfde informatie. Voeg deze eerst samen.
|
||||
pulls.delete_branch=Aftakking verwijderen
|
||||
@@ -731,18 +735,18 @@ settings.allow_public_wiki_desc=Allow public access to wiki when repository is p
|
||||
settings.use_external_wiki=Externe wiki gebruiken
|
||||
settings.external_wiki_url=Externe wiki-URL
|
||||
settings.external_wiki_url_desc=Bezoekers worden doorgestuurd naar de URL als ze op het tabblad klikken.
|
||||
settings.issues_desc=Kwestietracker inschakelen
|
||||
settings.use_internal_issue_tracker=Gebruik ingebouwde eenvoudige kwestietracker
|
||||
settings.issues_desc=Issuetracker inschakelen
|
||||
settings.use_internal_issue_tracker=Gebruik ingebouwde eenvoudige issuetracker
|
||||
settings.allow_public_issues_desc=Allow public access to issues when repository is private
|
||||
settings.use_external_issue_tracker=Externe issuetracker gebruiken
|
||||
settings.external_tracker_url=URL externe kwestietracker
|
||||
settings.external_tracker_url=URL externe issuetracker
|
||||
settings.external_tracker_url_desc=Bezoekers worden doorgestuurd naar de URL als ze op het tabblad klikken.
|
||||
settings.tracker_url_format=URL-formaat externe issuetracker
|
||||
settings.tracker_issue_style=Naamgevingstijl externe kwestietracker:
|
||||
settings.tracker_issue_style=Naamgevingstijl externe issuetracker:
|
||||
settings.tracker_issue_style.numeric=Nummeriek
|
||||
settings.tracker_issue_style.alphanumeric=Alfanummeriek
|
||||
settings.tracker_url_format_desc=U kan de aanduidingen <code>{user} {repo} {index}</code> gebruiken voor de gebruikersnaam, de naam van de repository en de lijst van open tickets.
|
||||
settings.pulls_desc=Schakel 'pull request' in om publieke bijdragen te mogelijk te maken
|
||||
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
|
||||
settings.pulls.ignore_whitespace=Ignore changes in whitespace
|
||||
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
|
||||
settings.danger_zone=Gevaren zone
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=Nieuwe deploy sleutel '%s' werd succesvol toegevoegd!
|
||||
settings.deploy_key_deletion=Verwijder deploy sleutel
|
||||
settings.deploy_key_deletion_desc=Het verwijderen van deze deploy sleutel zal alle gerelateerde toegang verwijderen voor deze repositorie. Wilt u doorgaan?
|
||||
settings.deploy_key_deletion_success=Deploy sleutel werd met succes verwijderd!
|
||||
settings.description_desc=Description of repository. Maximum 512 characters length.
|
||||
settings.description_length=Available characters
|
||||
|
||||
diff.browse_source=Bladeren bron
|
||||
diff.parent=bovenliggende
|
||||
@@ -1088,7 +1094,7 @@ repos.name=Naam
|
||||
repos.private=Prive
|
||||
repos.watches=Volgers
|
||||
repos.stars=Sterren
|
||||
repos.issues=Kwesties
|
||||
repos.issues=Issues
|
||||
repos.size=Size
|
||||
|
||||
auths.auth_sources=Authentication Sources
|
||||
@@ -1096,6 +1102,7 @@ auths.new=Nieuwe bron toevoegen
|
||||
auths.name=Naam
|
||||
auths.type=Type
|
||||
auths.enabled=Ingeschakeld
|
||||
auths.default=Default
|
||||
auths.updated=Bijgewerkt
|
||||
auths.auth_type=Authenticatietype
|
||||
auths.auth_name=Authenticatienaam
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAM servicenaam
|
||||
auths.enable_auto_register=Activeer automatische registratie
|
||||
auths.edit=Verificatie-instelling bewerken
|
||||
auths.activated=Deze autorisatiemethode is geactiveerd
|
||||
auths.default_auth=This authentication is default login source
|
||||
auths.new_success=Nieuwe authenticatie '%s' werd toegevoegd.
|
||||
auths.update_success=Authenticatie instellingen zijn succesvol gewijzigd.
|
||||
auths.update=Authenticatie-instellingen bijwerken
|
||||
@@ -1292,8 +1300,8 @@ commit_repo=push update naar <a href="%[1]s/src/%[2]s">%[3]s</a> in <a href="%[1
|
||||
compare_commits=Toon vergelijking voor deze %d commits
|
||||
transfer_repo=repositorie verplaatst naar <code>%s</code> naar <a href="%s">%s</a>
|
||||
create_issue=`opende issue in <a href="%s/issues/%s">%s#%[2]s</a>`
|
||||
close_issue=`sloot kwestie <a href="%s/issues/%s">%s#%[2]s</a>`
|
||||
reopen_issue=`heropende kwestie <a href="%s/issues/%s">%s#%[2]s</a>`
|
||||
close_issue=`gesloten issue <a href="%s/issues/%s">%s#%[2]s</a>`
|
||||
reopen_issue=`heropende issue <a href="%s/issues/%s">%s#%[2]s</a>`
|
||||
comment_issue=`reactie op issue <a href="%s/issues/%s">%s#%[2]s</a>`
|
||||
create_pull_request=`maakte pull request <a href="%s/issues/%s">%s#%[2]s</a>`
|
||||
close_pull_request=`sloot pull request <a href="%s/issues/%s">%s#%[2]s</a>`
|
||||
|
||||
@@ -151,8 +151,8 @@ register_hepler_msg=Masz już konto? Zaloguj się teraz!
|
||||
social_register_hepler_msg=Masz już konto? Powiąż je teraz!
|
||||
disable_register_prompt=Przepraszamy rejestracja została wyłączona. Prosimy o kontakt z administratorem serwisu.
|
||||
disable_register_mail=Przepraszamy, potwierdzenia rejestracji zostały wyłączone przez administratora.
|
||||
auth_source=Authentication Source
|
||||
local=Local
|
||||
auth_source=Źródło uwierzytelniania
|
||||
local=Lokalne
|
||||
remember_me=Zapamiętaj mnie
|
||||
forgot_password=Zapomniałem hasła
|
||||
forget_password=Zapomniałeś hasła?
|
||||
@@ -231,7 +231,7 @@ org_name_been_taken=Nazwa organizacji jest już zajęta.
|
||||
team_name_been_taken=Nazwa zespołu jest już zajęta.
|
||||
email_been_used=Adres e-mail jest już zarejestrowany.
|
||||
username_password_incorrect=Nazwa użytkownika lub hasło nie jest prawidłowe.
|
||||
auth_source_mismatch=The authentication source selected is not associated with the user.
|
||||
auth_source_mismatch=Wybrane źródło uwierzytelniania nie jest związane z użytkownikiem.
|
||||
enterred_invalid_repo_name=Upewnij się, że wprowadzona nazwa repozytorium jest poprawna.
|
||||
enterred_invalid_owner_name=Upewnij się, że nazwa właściciela repozytorium jest poprawna.
|
||||
enterred_invalid_password=Proszę upewnij się, że wprowadzono hasło jest poprawne.
|
||||
@@ -351,7 +351,7 @@ two_factor_or_enter_secret=Lub wprowadź sekret:
|
||||
two_factor_then_enter_passcode=Następnie wprowadź kod dostępu:
|
||||
two_factor_verify=Weryfikuj
|
||||
two_factor_invalid_passcode=Wprowadzony kod nie jest prawidłowy, spróbuj ponownie!
|
||||
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
|
||||
two_factor_reused_passcode=Ten kod jest już używany, spróbuj ponownie!
|
||||
two_factor_enable_error=Włączenie dwuetapowego uwierzytelniania nie powiodło się: %v
|
||||
two_factor_enable_success=Uwierzytelnianie dwuetapowe Twojego konta zostało włączone pomyślnie!
|
||||
two_factor_recovery_codes_title=Kody odzyskiwania uwierzytelniania dwuetapowego
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=Ostatnia synchronizacja
|
||||
watchers=Obserwujący
|
||||
stargazers=Polubienia
|
||||
forks=Forki
|
||||
repo_description_helper=Opis repozytorium. Maksymalnie 512 znaków.
|
||||
repo_description_length=Dostępne znaki
|
||||
|
||||
form.reach_limit_of_creation=Właściciel osiągnął limit maksymalnej ilości repozytoriów %d.
|
||||
form.name_reserved=Nazwa repozytorium „%s” jest zarezerwowana.
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Zawartość pliku została zmieniona od rozpoc
|
||||
editor.file_already_exists=Nazwa pliku '%s' już istnieje w tym repozytorium.
|
||||
editor.no_changes_to_show=Brak zmian do pokazania.
|
||||
editor.fail_to_update_file=Tworzenie/aktualizacja pliku '%s' nie powiodła się z błędem: %v
|
||||
editor.fail_to_delete_file=Nie można usunąć pliku '%s' z powodu błędu: %v
|
||||
editor.add_subdir=Dodaj podkatalog...
|
||||
editor.unable_to_upload_files=Wysyłanie plików do '%s' nie powiodło się z błędem: %v
|
||||
editor.upload_files_to_dir=Prześlij pliki do '%s'
|
||||
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Pull request nie może być automatycznie scalony z
|
||||
pulls.cannot_auto_merge_helper=Proszę scalić ręcznie, aby rozwiązać konflikty.
|
||||
pulls.create_merge_commit=Utwórz scalający commit
|
||||
pulls.rebase_before_merging=Rebase przed scaleniem
|
||||
pulls.commit_description=Opis commitu
|
||||
pulls.merge_pull_request=Scal Pull Request
|
||||
pulls.open_unmerged_pull_exists=`Nie można otworzyć ponownie ponieważ już istnieje gotowy do scalenia pull request (#%d) z tego samego repozytorium z tymi samymi informacjami.`
|
||||
pulls.delete_branch=Usuń gałąź
|
||||
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Styl nazw zewnętrznego systemu zgłaszania problem
|
||||
settings.tracker_issue_style.numeric=Numeryczny
|
||||
settings.tracker_issue_style.alphanumeric=Alfanumeryczne
|
||||
settings.tracker_url_format_desc=Symbole zastępcze <code>{user} {repo} {index}</code> mogą być użyte dla nazwy użytkownika, nazwy repozytorium i numeru problemu.
|
||||
settings.pulls_desc=Włącz obsługę pull request, aby akceptować publiczny wkład
|
||||
settings.pulls_desc=Włącz żądania pobierania, aby akceptować wkład pomiędzy repozytoriami i gałęziami
|
||||
settings.pulls.ignore_whitespace=Ignoruj zmiany w białych znakach
|
||||
settings.pulls.allow_rebase_merge=Zezwalaj na użycie rebase do scalenia commitów
|
||||
settings.danger_zone=Strefa niebezpieczeństwa
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=Nowy klucz wdrożenia '%s' został pomyślnie dodany!
|
||||
settings.deploy_key_deletion=Utwórz klucz wdrożenia
|
||||
settings.deploy_key_deletion_desc=Usunięcie tego klucza wdrożenia spowoduje usunięcie powiązanego dostępu do tego repozytorium. Czy chcesz kontynuować?
|
||||
settings.deploy_key_deletion_success=Klucz wdrożenia został pomyślnie usunięty!
|
||||
settings.description_desc=Opis repozytorium. Maksymalnie 512 znaków.
|
||||
settings.description_length=Dostępne znaki
|
||||
|
||||
diff.browse_source=Przeglądaj źródła
|
||||
diff.parent=rodzic
|
||||
@@ -1091,11 +1097,12 @@ repos.stars=Polubienia
|
||||
repos.issues=Problemy
|
||||
repos.size=Rozmiar
|
||||
|
||||
auths.auth_sources=Authentication Sources
|
||||
auths.auth_sources=Źródła uwierzytelniania
|
||||
auths.new=Dodaj nowe źródło
|
||||
auths.name=Nazwa
|
||||
auths.type=Typ
|
||||
auths.enabled=Włączono
|
||||
auths.default=Domyślne
|
||||
auths.updated=Zaktualizowano
|
||||
auths.auth_type=Typ uwierzytelniania
|
||||
auths.auth_name=Nazwa uwierzytelniania
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Nazwa usługi PAM
|
||||
auths.enable_auto_register=Włącz automatyczną rejestrację
|
||||
auths.edit=Edytuj ustawienia uwierzytelniania
|
||||
auths.activated=To uwierzytelnienie zostało aktywowane
|
||||
auths.default_auth=To uwierzytelnianie jest domyślnym źródłem logowania
|
||||
auths.new_success=Pomyślnie dodano nowe uwierzytelnianie '%s'.
|
||||
auths.update_success=Ustawienia uwierzytelnienia zostały zaktualizowane pomyślnie.
|
||||
auths.update=Aktualizuj ustawienia uwierzytelniania
|
||||
@@ -1166,7 +1174,7 @@ config.ssh_domain=Domena
|
||||
config.ssh_port=Port
|
||||
config.ssh_listen_port=Port nasłuchu
|
||||
config.ssh_root_path=Ścieżka katalogu głównego
|
||||
config.ssh_rewrite_authorized_keys_at_start=Rewrite authorized_keys At Start
|
||||
config.ssh_rewrite_authorized_keys_at_start=Przepisz authorized_keys przy uruchomieniu
|
||||
config.ssh_key_test_path=Ścieżka klucza testowego
|
||||
config.ssh_keygen_path=Ścieżka generatora ('ssh-keygen')
|
||||
config.ssh_minimum_key_size_check=Sprawdzanie minimalnej długości klucza
|
||||
@@ -1304,7 +1312,7 @@ delete_branch=usunął gałąź <code>%[2]s</code> at <a href="%[1]s">%[3]s</a>
|
||||
push_tag=taguje <a href="%s/src/%s">%[2]s</a> w <a href="%[1]s">%[3]s</a>
|
||||
delete_tag=usunięty tag <code>%[2]s</code> % <a href="%[1]s">[3]s</a>
|
||||
fork_repo=rozwidlone repozytorium do <a href="%s"> %s</a>
|
||||
mirror_sync_push=synced commits to <a href="%[1]s/src/%[2]s">%[3]s</a> at <a href="%[1]s">%[4]s</a> from mirror
|
||||
mirror_sync_push=zsynchronizowano commit z <a href="%[1]s/src/%[2]s">%[3]s</a> na <a href="%[1]s">%[4]s</a> z kopii lustrzanej
|
||||
mirror_sync_create=synced new reference <a href="%s/src/%s">%[2]s</a> to <a href="%[1]s">%[3]s</a> from mirror
|
||||
mirror_sync_delete=synced and deleted reference <code>%[2]s</code> at <a href="%[1]s">%[3]s</a> from mirror
|
||||
|
||||
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=Última sincronização
|
||||
watchers=Observadores
|
||||
stargazers=Usuários que estrelaram
|
||||
forks=Forks
|
||||
repo_description_helper=Description of repository. Maximum 512 characters length.
|
||||
repo_description_length=Available characters
|
||||
|
||||
form.reach_limit_of_creation=O proprietário atingiu o limite máximo de criação de repositórios de %d.
|
||||
form.name_reserved=O nome de repositório '%s' não pode ser usado.
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=O conteúdo do arquivo mudou desde que você c
|
||||
editor.file_already_exists=Um arquivo com nome '%s' já existe neste repositório.
|
||||
editor.no_changes_to_show=Nenhuma alteração a mostrar.
|
||||
editor.fail_to_update_file=Houve erro ao criar ou atualizar arquivo '%s': %v
|
||||
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
|
||||
editor.add_subdir=Adicionar o subdiretório...
|
||||
editor.unable_to_upload_files=Houve erro ao fazer upload de arquivos para '%s': %v
|
||||
editor.upload_files_to_dir=Enviar arquivos para '%s'
|
||||
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=O merge deste Pull Request não pode ser aplicado a
|
||||
pulls.cannot_auto_merge_helper=Por favor, aplique o merge manualmente para resolver os conflitos.
|
||||
pulls.create_merge_commit=Criar commit de um merge
|
||||
pulls.rebase_before_merging=Rebase before merging
|
||||
pulls.commit_description=Commit Description
|
||||
pulls.merge_pull_request=Solicitação de merge de Pull Request
|
||||
pulls.open_unmerged_pull_exists=`Você não pode executar a operação de reabrir porque já existe um Pull request aberto (#%d) do mesmo repositório com as mesmas informações de merge e está esperando pelo merge.`
|
||||
pulls.delete_branch=Excluir Branch
|
||||
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Estilo de nome de issue tracker externo:
|
||||
settings.tracker_issue_style.numeric=Numérico
|
||||
settings.tracker_issue_style.alphanumeric=Alfanumérico
|
||||
settings.tracker_url_format_desc=Você pode usar o espaço reservado <code>{user} {repo} {index}</code> para o nome do usuário, índice de nome e a questão do repositório.
|
||||
settings.pulls_desc=Habilitar Pull Requests para aceitar contribuições públicas
|
||||
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
|
||||
settings.pulls.ignore_whitespace=Ignorar alterações em espaço em branco
|
||||
settings.pulls.allow_rebase_merge=Permitir rebase para commits via merge
|
||||
settings.danger_zone=Zona de perigo
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=A nova chave de Deploy '%s' foi adicionada com sucesso!
|
||||
settings.deploy_key_deletion=Exclusão de chave de Deploy
|
||||
settings.deploy_key_deletion_desc=Excluir esta chave de Deploy removerá permissões de acesso a este repositório. Quer mesmo continuar?
|
||||
settings.deploy_key_deletion_success=Chave de Deploy excluída com sucesso!
|
||||
settings.description_desc=Description of repository. Maximum 512 characters length.
|
||||
settings.description_length=Available characters
|
||||
|
||||
diff.browse_source=Ver código fonte
|
||||
diff.parent=pai
|
||||
@@ -1096,6 +1102,7 @@ auths.new=Adicionar nova fonte
|
||||
auths.name=Nome
|
||||
auths.type=Tipo
|
||||
auths.enabled=Habilitado
|
||||
auths.default=Default
|
||||
auths.updated=Atualizado
|
||||
auths.auth_type=Tipo de autenticação
|
||||
auths.auth_name=Nome da autenticação
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Nome de Serviço PAM
|
||||
auths.enable_auto_register=Habilitar Registro Automático
|
||||
auths.edit=Editar a configuração de autenticação
|
||||
auths.activated=Esta autenticação foi ativada
|
||||
auths.default_auth=This authentication is default login source
|
||||
auths.new_success=Nova autenticação '%s' foi adicionada com sucesso.
|
||||
auths.update_success=A configuração da autenticação foi atualizada com sucesso.
|
||||
auths.update=Atualizar a configuração da autenticação
|
||||
|
||||
1345
conf/locale/locale_pt-PT.ini
Normal file
1345
conf/locale/locale_pt-PT.ini
Normal file
File diff suppressed because it is too large
Load Diff
@@ -151,8 +151,8 @@ register_hepler_msg=Уже есть аккаунт? Авторизуйтесь!
|
||||
social_register_hepler_msg=Уже есть учетная запись? Свяжите ее с соцсетью!
|
||||
disable_register_prompt=Извините, возможность регистрации отключена. Пожалуйста, свяжитесь с администратором сайта.
|
||||
disable_register_mail=К сожалению подтверждение регистрации по почте отключено.
|
||||
auth_source=Authentication Source
|
||||
local=Local
|
||||
auth_source=Тип аутентификации
|
||||
local=Локальный
|
||||
remember_me=Запомнить меня
|
||||
forgot_password=Забыли пароль
|
||||
forget_password=Забыли пароль?
|
||||
@@ -231,7 +231,7 @@ org_name_been_taken=Название организации занято.
|
||||
team_name_been_taken=Название команды занято.
|
||||
email_been_used=Адрес электронной почты уже используется.
|
||||
username_password_incorrect=Имя пользователя или пароль не правильный.
|
||||
auth_source_mismatch=The authentication source selected is not associated with the user.
|
||||
auth_source_mismatch=Выбранный источник проверки подлинности не связан с пользователем.
|
||||
enterred_invalid_repo_name=Пожалуйста, убедитесь, что введено правильное имя репозитория.
|
||||
enterred_invalid_owner_name=Убедитесь, что введенное имя владельца верное.
|
||||
enterred_invalid_password=Убедитесь, что введенный пароль верен.
|
||||
@@ -351,7 +351,7 @@ two_factor_or_enter_secret=Или введите кодовое слово:
|
||||
two_factor_then_enter_passcode=Затем введите пароль:
|
||||
two_factor_verify=Проверить
|
||||
two_factor_invalid_passcode=Введенные пароли не совпадают; пожалуйста, повторите попытку!
|
||||
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
|
||||
two_factor_reused_passcode=Введенный вами пароль уже используется, пожалуйста, попробуйте другой!
|
||||
two_factor_enable_error=Ошибка активация двухфакторной аутентификации: %v
|
||||
two_factor_enable_success=Двухфакторная аутентификация активирована для вашей учетной записи!
|
||||
two_factor_recovery_codes_title=Коды восстановления для двухфакторная аутентификации
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=Последняя синхронизация
|
||||
watchers=Наблюдатели
|
||||
stargazers=Звездочеты
|
||||
forks=Ответвления
|
||||
repo_description_helper=Описание репозитория. Максимальная длина 512 символов.
|
||||
repo_description_length=Доступные символы
|
||||
|
||||
form.reach_limit_of_creation=У владельца достигнут максимальный предел в %d создаваемых репозиториев.
|
||||
form.name_reserved=Имя репозитория '%s' зарезервировано.
|
||||
@@ -462,7 +464,7 @@ tree=Дерево
|
||||
filter_branch_and_tag=Фильтр по ветке или тегу
|
||||
branches=Ветки
|
||||
tags=Метки
|
||||
issues=Обсуждения
|
||||
issues=Задачи
|
||||
pulls=Запросы на слияние
|
||||
labels=Метки
|
||||
milestones=Этапы
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Содержимое файла изменил
|
||||
editor.file_already_exists=Файл с именем «%s» уже существует в этом репозитории.
|
||||
editor.no_changes_to_show=Нет изменений.
|
||||
editor.fail_to_update_file=Не удалось обновить/создать файл «%s» из-за ошибки: %v
|
||||
editor.fail_to_delete_file=Не удалось удалить файл «%s» из-за ошибки: %v
|
||||
editor.add_subdir=Добавьте подкаталог...
|
||||
editor.unable_to_upload_files=Не удалось загрузить файлы в «%s» из-за ошибки: %v
|
||||
editor.upload_files_to_dir=Загрузить файлы '%s'
|
||||
@@ -535,7 +538,7 @@ commits.newer=Новее
|
||||
issues.new=Новая задача
|
||||
issues.new.labels=Метки
|
||||
issues.new.no_label=Нет меток
|
||||
issues.new.clear_labels=Отчистить метки
|
||||
issues.new.clear_labels=Очистить метки
|
||||
issues.new.milestone=Этап
|
||||
issues.new.no_milestone=Нет этапа
|
||||
issues.new.clear_milestone=Очистить этап
|
||||
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Этот запрос на слияние не мо
|
||||
pulls.cannot_auto_merge_helper=Пожалуйста, совершите слияние вручную для урегулирования конфликтов.
|
||||
pulls.create_merge_commit=Создать коммит на слияние
|
||||
pulls.rebase_before_merging=Выполнить rebase перед слиянием
|
||||
pulls.commit_description=Описание коммита
|
||||
pulls.merge_pull_request=Слить пулл-реквест
|
||||
pulls.open_unmerged_pull_exists=`Вы не можете снова открыть, поскольку уже существует запрос на слияние (#%d) из того же репозитория с той же информацией о слиянии и ожидающий слияния. `
|
||||
pulls.delete_branch=Удалить ветку
|
||||
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Стиль Именования Внешней Си
|
||||
settings.tracker_issue_style.numeric=Цифровой
|
||||
settings.tracker_issue_style.alphanumeric=Буквенноцифровой
|
||||
settings.tracker_url_format_desc=Вы можете использовать шаблон <code>{user} {repo} {index}</code> для имени пользователя, репозитория и номера задачи.
|
||||
settings.pulls_desc=Включить публичные запросы на слияние
|
||||
settings.pulls_desc=Разрешить пул-запросы для принятия изменений между репозиториями и ветками
|
||||
settings.pulls.ignore_whitespace=Игнорировать изменения в пробельных символах
|
||||
settings.pulls.allow_rebase_merge=Разрешить rebase-слияние
|
||||
settings.danger_zone=Опасная зона
|
||||
@@ -821,7 +825,7 @@ settings.event_fork=Ответвить
|
||||
settings.event_fork_desc=Репозиторий склонирован
|
||||
settings.event_push=Push
|
||||
settings.event_push_desc=Push в репозиторий
|
||||
settings.event_issues=Вопросы
|
||||
settings.event_issues=Задачи
|
||||
settings.event_issues_desc=Задача изменена
|
||||
settings.event_pull_request=Запросы на слияние
|
||||
settings.event_pull_request_desc=Запрос слияния открыт, закрыт, переоткрыт, изменён, назначен, снят, метка обновлена, метка убрана, добавлен промежуточный этап, убран промежуточный этап или синхронизирован.
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=Новый ключ развертывания '%s' у
|
||||
settings.deploy_key_deletion=Удалить ключ развертывания
|
||||
settings.deploy_key_deletion_desc=Удаление ключа развертывания приведет к удалению всех связанных прав доступа к репозиторию. Вы хотите продолжить?
|
||||
settings.deploy_key_deletion_success=Ключ развертывания успешно удален!
|
||||
settings.description_desc=Описание репозитория. Максимальная длина 512 символов.
|
||||
settings.description_length=Доступные символы
|
||||
|
||||
diff.browse_source=Просмотр исходного кода
|
||||
diff.parent=Родитель
|
||||
@@ -1091,11 +1097,12 @@ repos.stars=В избранном
|
||||
repos.issues=Задачи
|
||||
repos.size=Размер
|
||||
|
||||
auths.auth_sources=Authentication Sources
|
||||
auths.auth_sources=Типы аутентификации
|
||||
auths.new=Добавить новый источник
|
||||
auths.name=Имя
|
||||
auths.type=Тип
|
||||
auths.enabled=Включено
|
||||
auths.default=По умолчанию
|
||||
auths.updated=Обновлено
|
||||
auths.auth_type=Тип аутентификации
|
||||
auths.auth_name=Имя аутентификации
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Имя службы PAM
|
||||
auths.enable_auto_register=Включить автоматическую регистрацию
|
||||
auths.edit=Изменить параметры канала аутентификации
|
||||
auths.activated=Эта аутентификация активирована
|
||||
auths.default_auth=Эта аутентификация является источником входа по умолчанию
|
||||
auths.new_success=Новый канал аутентификации '%s' успешно создан.
|
||||
auths.update_success=Настройки канала аутентификации успешно сохранены.
|
||||
auths.update=Обновить параметры аутентификации
|
||||
@@ -1304,9 +1312,9 @@ delete_branch=удалил ветку <code>%[2]s</code> в <a href="%[1]s">%[3]
|
||||
push_tag=запушил(а) метку <a href="%s/src/%s">%[2]s</a> в <a href="%[1]s">%[3]s</a>
|
||||
delete_tag=удален тег <code>%[2]s</code> at <a href="%[1]s">%[3]s</a>
|
||||
fork_repo=склонировать репозиторий в <a href="%s">%s</a>
|
||||
mirror_sync_push=synced commits to <a href="%[1]s/src/%[2]s">%[3]s</a> at <a href="%[1]s">%[4]s</a> from mirror
|
||||
mirror_sync_create=synced new reference <a href="%s/src/%s">%[2]s</a> to <a href="%[1]s">%[3]s</a> from mirror
|
||||
mirror_sync_delete=synced and deleted reference <code>%[2]s</code> at <a href="%[1]s">%[3]s</a> from mirror
|
||||
mirror_sync_push=синхронизированные коммиты с <a href="%[1]s/src/%[2]s">%[3]s</a> на <a href="%[1]s">%[4]s</a> из зеркала
|
||||
mirror_sync_create=синхронизированные новые ссылки <a href="%s/src/%s">%[2]s</a> к <a href="%[1]s">%[3]s</a> из зеркала
|
||||
mirror_sync_delete=синхронизированные и удаленные ссылки <code>%[2]s</code> на <a href="%[1]s">%[3]s</a> из зеркала
|
||||
|
||||
[tool]
|
||||
ago=назад
|
||||
@@ -1319,11 +1327,11 @@ now=сейчас
|
||||
1w=1 неделя %s
|
||||
1mon=1 месяц %s
|
||||
1y=1 год %s
|
||||
seconds=секунд %[2]s: %[1]d
|
||||
seconds=%d секунд %s
|
||||
minutes=%d минут %s
|
||||
hours=%d часов %s
|
||||
days=%d дней %s
|
||||
weeks=недель %[2]s: %[1]d
|
||||
weeks=%d недель %s
|
||||
months=%d месяцев %s
|
||||
years=%d лет %s
|
||||
raw_seconds=секунд
|
||||
|
||||
@@ -151,8 +151,8 @@ register_hepler_msg=Máte už účet? Prihláste sa teraz!
|
||||
social_register_hepler_msg=Máte už účet? Bindovať teraz!
|
||||
disable_register_prompt=Ospravedlňujeme sa, ale registrácia bola vypnutá. Obráťte sa na administrátora stránky.
|
||||
disable_register_mail=Ospravedlňujeme sa, potvrdenie registračného e-mailu bolo vypnuté.
|
||||
auth_source=Authentication Source
|
||||
local=Local
|
||||
auth_source=Zdroj overovania
|
||||
local=Lokálny
|
||||
remember_me=Zapamätať prihlásenie
|
||||
forgot_password=Zabudnuté heslo
|
||||
forget_password=Zabudli ste heslo?
|
||||
@@ -231,7 +231,7 @@ org_name_been_taken=Názov organizácie už bol použitý.
|
||||
team_name_been_taken=Názov tímu už bol použitý.
|
||||
email_been_used=E-mailová adresa už bola použitá.
|
||||
username_password_incorrect=Používateľské meno alebo heslo nie je správne.
|
||||
auth_source_mismatch=The authentication source selected is not associated with the user.
|
||||
auth_source_mismatch=Vybraný zdroj overenia nieje prepojený s užívateľom.
|
||||
enterred_invalid_repo_name=Uistite sa prosím, že názov repozitára, ktorý ste zadali je správny.
|
||||
enterred_invalid_owner_name=Uistite sa prosím, že meno vlastníka, ktoré ste zadali je správne.
|
||||
enterred_invalid_password=Uistite sa prosím, že heslo ktoré ste zadali je správne.
|
||||
@@ -351,7 +351,7 @@ two_factor_or_enter_secret=Alebo zadajte tajný kód:
|
||||
two_factor_then_enter_passcode=Potom zadajte prístupový kód:
|
||||
two_factor_verify=Overiť
|
||||
two_factor_invalid_passcode=Zadaný prístupový kód nie je platný, prosím, skúste to znova!
|
||||
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
|
||||
two_factor_reused_passcode=Kód, ktorý ste zadali už bol použitý. Prosím, zkúste iný!
|
||||
two_factor_enable_error=Povolenie dvojfaktorového overenia zlyhalo: %v
|
||||
two_factor_enable_success=Dvojfaktorové overenie bolo pre Váš účet povolené!
|
||||
two_factor_recovery_codes_title=Obnovovacie kódy dvojfaktorového overenia
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=Naposledy synchronizované
|
||||
watchers=Pozorovatelia
|
||||
stargazers=Sledujúci
|
||||
forks=Forky
|
||||
repo_description_helper=Popis repozitára. Maximálna dĺžka 512 znakov.
|
||||
repo_description_length=Dostupné znaky
|
||||
|
||||
form.reach_limit_of_creation=Vlastník dosiahol maximálneho počtu %d vytvorených repozitárov.
|
||||
form.name_reserved=Repozitár s názvom '%s' je vyhradený.
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Obsah súboru sa zmenil od začiatku úprav. <
|
||||
editor.file_already_exists=Súbor '%s' už v tomto repozitári existuje.
|
||||
editor.no_changes_to_show=Žiadne zmeny k zobrazení.
|
||||
editor.fail_to_update_file=Vytvorenie alebo zmena súboru '%s' skončila chybou: '%v'
|
||||
editor.fail_to_delete_file=Vymazanie súboru '%s' skončilo chybou: '%v'
|
||||
editor.add_subdir=Pridať podadresár...
|
||||
editor.unable_to_upload_files=Nepodarilo sa nahrať súbor do '%s'. Chyba: %v
|
||||
editor.upload_files_to_dir=Nahrať súbory do '%s'
|
||||
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Tento pull request nemôže byť automaticky zlúč
|
||||
pulls.cannot_auto_merge_helper=Prosím zlúčte manuálne pre vyriešenie konfliktov.
|
||||
pulls.create_merge_commit=Vytvoriť zlúčenú revíziu
|
||||
pulls.rebase_before_merging=Rebase pred zlúčením
|
||||
pulls.commit_description=Popis Commitu
|
||||
pulls.merge_pull_request=Zlúčiť pull request
|
||||
pulls.open_unmerged_pull_exists=`Nemôžete znovu otvoriť požiadavku na stiahnutie, pretože požiadavka na stiahnutie z rovnakého repozitára s rovnakými informáciami pre zlúčenie už existuje (#%d) a čaká na zlúčenie.`
|
||||
pulls.delete_branch=Odstrániť vetvu
|
||||
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Štýl pomenovania úloh v externom systéme úloh:
|
||||
settings.tracker_issue_style.numeric=Numerická
|
||||
settings.tracker_issue_style.alphanumeric=Alfanumerické
|
||||
settings.tracker_url_format_desc=Môžete použiť zástupné výrazy <code>{user} {repo} {index}</code> pre užívateľské meno, názov repozitára a číslo úlohy.
|
||||
settings.pulls_desc=Povoliť požiadavky na stiahnutie, aby mohli byť príspevky verejnosti akceptované
|
||||
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
|
||||
settings.pulls.ignore_whitespace=Ignorovať zmeny v prázdnom priestore
|
||||
settings.pulls.allow_rebase_merge=Povoliť použitie rebase pre zlúčenie revízií
|
||||
settings.danger_zone=Riziková zóna
|
||||
@@ -765,7 +769,7 @@ settings.wiki_deletion_success=Data Wiki tohoto repozitára boli zmazané.
|
||||
settings.delete=Odstrániť tento repozitár
|
||||
settings.delete_desc=Hneď ako odstránite repozitár, nie je možné vrátiť sa späť, Buďte si prosím istý.
|
||||
settings.delete_notices_1=- Tuto operáciu <strong>nie je možné</strong> vrátiť.
|
||||
settings.delete_notices_2=- This operation will permanently delete everything in this repository, including Git data, issues, comments and collaborator access.
|
||||
settings.delete_notices_2=Táto akcia nenávratne vymaže všetko v tomto repozitári, vrátane dát Gitu, úkolov, komentárov a prístupov spolupracovníkov.
|
||||
settings.delete_notices_fork_1=- Po odstránení sa všetky forky stanú nezávislé.
|
||||
settings.deletion_success=Repozitár bol odstránený!
|
||||
settings.update_settings_success=Možnosti repozitára boli zmenené.
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=Nový deploy kľúč '%s' bol úspešne pridaný!
|
||||
settings.deploy_key_deletion=Odstrániť deploy kľúč
|
||||
settings.deploy_key_deletion_desc=Odstránením tohto deploy kľúča sa odstránia všetky súvisiace prístupy k tomuto repozitáru. Chcete pokračovať?
|
||||
settings.deploy_key_deletion_success=Deploy kľúč bol úspešne odstránený!
|
||||
settings.description_desc=Popis repozitára. Maximálna dĺžka 512 znakov.
|
||||
settings.description_length=Dostupné znaky
|
||||
|
||||
diff.browse_source=Prechádzať zdrojové kódy
|
||||
diff.parent=rodič
|
||||
@@ -1091,11 +1097,12 @@ repos.stars=Hviezdy
|
||||
repos.issues=Issues
|
||||
repos.size=Veľkosť
|
||||
|
||||
auths.auth_sources=Authentication Sources
|
||||
auths.auth_sources=Zdroje overenia
|
||||
auths.new=Pridať nový zdroj
|
||||
auths.name=Názov
|
||||
auths.type=Typ
|
||||
auths.enabled=Povolené
|
||||
auths.default=Predvolený
|
||||
auths.updated=Aktualizované
|
||||
auths.auth_type=Typ overenia
|
||||
auths.auth_name=Názov overenia
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Názov služby PAM
|
||||
auths.enable_auto_register=Povoliť auto registráciu
|
||||
auths.edit=Upraviť nastavenie overovania
|
||||
auths.activated=Tento spôsob overovania je aktívny
|
||||
auths.default_auth=This authentication is default login source
|
||||
auths.new_success=Nový spôsob overovania '%s' bol pridaný.
|
||||
auths.update_success=Nastavenie overovania bolo zmenené.
|
||||
auths.update=Zmeniť nastavenie overovania
|
||||
@@ -1166,7 +1174,7 @@ config.ssh_domain=Doména
|
||||
config.ssh_port=Port
|
||||
config.ssh_listen_port=Port pre poslúchanie
|
||||
config.ssh_root_path=Koreňová cesta
|
||||
config.ssh_rewrite_authorized_keys_at_start=Rewrite authorized_keys At Start
|
||||
config.ssh_rewrite_authorized_keys_at_start=Prepísať authorized_keys pri štarte
|
||||
config.ssh_key_test_path=Cesta testu kľúčov
|
||||
config.ssh_keygen_path=Cesta ku generátoru kľúčov ('ssh-keygen')
|
||||
config.ssh_minimum_key_size_check=Kontrola minimálnej veľkosti kľúčov
|
||||
|
||||
@@ -51,7 +51,7 @@ docker_helper=Ако покрећете Gogs унутар Docker, молимо
|
||||
requite_db_desc=Gogs захтева MySQL, PostgreSQL, SQLite3, MSSQL или TiDB.
|
||||
db_title=Подешавања базе
|
||||
db_type=Тип базе података
|
||||
host=Власник
|
||||
host=Домаћин
|
||||
user=Корисник
|
||||
password=Лозинка
|
||||
db_name=Назив базе података
|
||||
@@ -151,8 +151,8 @@ register_hepler_msg=Већ имате налог? Пријавите се!
|
||||
social_register_hepler_msg=Већ имате налог? Повежите се преко социалне мреже!
|
||||
disable_register_prompt=Извините регистрација је онемогућено. Молимо вас, контактирајте администратора.
|
||||
disable_register_mail=Извините, потврда путем поште је онемогућено.
|
||||
auth_source=Authentication Source
|
||||
local=Local
|
||||
auth_source=Извор аутентикације
|
||||
local=Локално
|
||||
remember_me=Запамти ме
|
||||
forgot_password=Заборављена лозинка
|
||||
forget_password=Заборавили сте лозинку?
|
||||
@@ -231,7 +231,7 @@ org_name_been_taken=Име организације је већ заузето.
|
||||
team_name_been_taken=Име екипе је већ заузето.
|
||||
email_been_used=Адреса е-поште се већ користи.
|
||||
username_password_incorrect=Корисничко име или лозинка није исправна.
|
||||
auth_source_mismatch=The authentication source selected is not associated with the user.
|
||||
auth_source_mismatch=Изабрани извор потврде идентитета није повезан са корисником.
|
||||
enterred_invalid_repo_name=Молимо вас, проверите да је име спремишта тачно унешено.
|
||||
enterred_invalid_owner_name=Молимо вас проверите да сте добро унели име власника.
|
||||
enterred_invalid_password=Молимо вас проверите да сте добро унели лозинку.
|
||||
@@ -351,7 +351,7 @@ two_factor_or_enter_secret=Или унесите тајну шифру:
|
||||
two_factor_then_enter_passcode=Па унесите шифру:
|
||||
two_factor_verify=Проверити
|
||||
two_factor_invalid_passcode=Шифрa коју сте унели није важећа, молим бас пробајте поново!
|
||||
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
|
||||
two_factor_reused_passcode=Љифром који сте унијели се већ користи, молим те пробај опет!
|
||||
two_factor_enable_error=Активација двоструке аутентификације није успела: %v
|
||||
two_factor_enable_success=Двострука аутентификација је успешно активирана за ваш налог!
|
||||
two_factor_recovery_codes_title=Шифра за опоравак за двоструку аутентификацију
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=Задње синхронизовано
|
||||
watchers=Посматрачи
|
||||
stargazers=Пратиоци
|
||||
forks=Огранци
|
||||
repo_description_helper=Description of repository. Maximum 512 characters length.
|
||||
repo_description_length=Available characters
|
||||
|
||||
form.reach_limit_of_creation=Власник има максимум број %d спремишта.
|
||||
form.name_reserved=Име спремишта '%s' је резервирано.
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Садржај датотеке је пром
|
||||
editor.file_already_exists=Датотека са именом '%s' већ постоји у овом спремишту.
|
||||
editor.no_changes_to_show=Нема никаквих промена.
|
||||
editor.fail_to_update_file=Промена над '%s' није успело са грешком: %v
|
||||
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
|
||||
editor.add_subdir=Додај поддиректоријуми...
|
||||
editor.unable_to_upload_files=Учитање датотеке '%s' није успело са грешкном: %v
|
||||
editor.upload_files_to_dir=Пошаљи датотеке на '%s'
|
||||
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Овај захтев за спајање не мо
|
||||
pulls.cannot_auto_merge_helper=Молимо вас, обавите спајање ручно да би сте разрешили сукобе.
|
||||
pulls.create_merge_commit=Направите спајање
|
||||
pulls.rebase_before_merging=Поврат пре обједињавања
|
||||
pulls.commit_description=Commit Description
|
||||
pulls.merge_pull_request=Обави спајање
|
||||
pulls.open_unmerged_pull_exists=`Неможете поново отворити јер већ постоји захтев за спајање (#%d) из истог спремишта са истим информацијама о спајању и чека спајање.`
|
||||
pulls.delete_branch=Избришите грану
|
||||
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Стил именовања на спољном с
|
||||
settings.tracker_issue_style.numeric=Нумерично
|
||||
settings.tracker_issue_style.alphanumeric=Алфанумерично
|
||||
settings.tracker_url_format_desc=Можете да користите шаблон <code>{user} {repo} {index}</code> за корисничко име, спремишта и задатака.
|
||||
settings.pulls_desc=Омогући систем захтева за спајање да би сте преузели јавних доприноса
|
||||
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
|
||||
settings.pulls.ignore_whitespace=Занемарите промене у размаку
|
||||
settings.pulls.allow_rebase_merge=Дозволи употребу поврата да обједините обавезе
|
||||
settings.danger_zone=Опасна зона
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=Нови кључ распоређивање '%s' је
|
||||
settings.deploy_key_deletion=Уклони кључ распоређивањa
|
||||
settings.deploy_key_deletion_desc=Брисање овог кључа за распоређивање ће довести до укидање приступ на овом спремишту. Да ли желите да наставите?
|
||||
settings.deploy_key_deletion_success=Кључ за распоређивање је успешно обрисан!
|
||||
settings.description_desc=Description of repository. Maximum 512 characters length.
|
||||
settings.description_length=Available characters
|
||||
|
||||
diff.browse_source=Преглед изворни кода
|
||||
diff.parent=родитељ
|
||||
@@ -1091,11 +1097,12 @@ repos.stars=Фаворити
|
||||
repos.issues=Задаци
|
||||
repos.size=Величина
|
||||
|
||||
auths.auth_sources=Authentication Sources
|
||||
auths.auth_sources=Извори аутентичности
|
||||
auths.new=Додај нови извор
|
||||
auths.name=Име
|
||||
auths.type=Тип
|
||||
auths.enabled=Омогућено
|
||||
auths.default=Default
|
||||
auths.updated=Ажурирано
|
||||
auths.auth_type=Врста провере аутентичности
|
||||
auths.auth_name=Име провере аутентичности
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Назив PAM сервиса
|
||||
auths.enable_auto_register=Омогући аутоматску регистрацију
|
||||
auths.edit=Промените подешавања канала аутентикације
|
||||
auths.activated=Овај канал аутентикације је активан
|
||||
auths.default_auth=This authentication is default login source
|
||||
auths.new_success=Нови канал аутентикације '%s' је успешно креиран.
|
||||
auths.update_success=Подешавања канала аутентикације су успешно ажурирана.
|
||||
auths.update=Ажурирај подешавања аутентикације
|
||||
@@ -1304,9 +1312,9 @@ delete_branch=избрисана филијалa <code>%[2]s</code> at <a href="
|
||||
push_tag=извршује push са ознаком <a href="%s/src/%s">%[2]s</a> на <a href="%[1]s">%[3]s</a>
|
||||
delete_tag=избрисана ознака <code>%[2]s</code> at <a href="%[1]s">%[3]s</a>
|
||||
fork_repo=отворио спремиште <a href="%s">%s</a>
|
||||
mirror_sync_push=synced commits to <a href="%[1]s/src/%[2]s">%[3]s</a> at <a href="%[1]s">%[4]s</a> from mirror
|
||||
mirror_sync_create=synced new reference <a href="%s/src/%s">%[2]s</a> to <a href="%[1]s">%[3]s</a> from mirror
|
||||
mirror_sync_delete=synced and deleted reference <code>%[2]s</code> at <a href="%[1]s">%[3]s</a> from mirror
|
||||
mirror_sync_push=синхронизује се <a href="%[1]s/src/%[2]s">%[3]s</a> у <a href="%[1]s">%[4]s</a> из огледала
|
||||
mirror_sync_create=синхронизована нова референца <a href="%s/src/%s">%[2]s</a> y <a href="%[1]s">%[3]s</a> из огледала
|
||||
mirror_sync_delete=синхронизоване и избрисане референце <code>%[2]s</code> y <a href="%[1]s">%[3]s</a> из огледала
|
||||
|
||||
[tool]
|
||||
ago=пре
|
||||
|
||||
@@ -152,7 +152,7 @@ social_register_hepler_msg=Har du redan ett konto? Anslut det nu!
|
||||
disable_register_prompt=Tyvärr är användarregistreringen inaktiverad. Vänligen kontakta din administratör.
|
||||
disable_register_mail=Tyvärr så är registreringsbekräftelemailutskick inaktiverat.
|
||||
auth_source=Authentication Source
|
||||
local=Local
|
||||
local=Lokal
|
||||
remember_me=Kom ihåg mig
|
||||
forgot_password=Glömt lösenord
|
||||
forget_password=Glömt lösenordet?
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=Senast synkad
|
||||
watchers=Observerare
|
||||
stargazers=Stjärnmärkare
|
||||
forks=Forks
|
||||
repo_description_helper=Description of repository. Maximum 512 characters length.
|
||||
repo_description_length=Available characters
|
||||
|
||||
form.reach_limit_of_creation=Ägaren har nått maxgränsen av %d skapade repon.
|
||||
form.name_reserved=Namnet '%s' på utvecklingskatalogen är reserverat.
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Filinnhållet har ändrats sedan du började r
|
||||
editor.file_already_exists=En fil med namnet '%s' finns redan i förrådet.
|
||||
editor.no_changes_to_show=Det finns inga ändringar att visa.
|
||||
editor.fail_to_update_file=Uppdateringen/skapandet av filen '%s' misslyckades med felet: %v
|
||||
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
|
||||
editor.add_subdir=Lägg till underkatalog...
|
||||
editor.unable_to_upload_files=Uppladdning av filen '%s' misslyckades med felet: %v
|
||||
editor.upload_files_to_dir=Ladda upp filer till '%s'
|
||||
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Denna pull-förfrågan kan inte sammanfogas automat
|
||||
pulls.cannot_auto_merge_helper=Vänligen sammanfoga manuellt för att lösa konflikter.
|
||||
pulls.create_merge_commit=Create a merge commit
|
||||
pulls.rebase_before_merging=Rebase before merging
|
||||
pulls.commit_description=Commit Description
|
||||
pulls.merge_pull_request=Sammanfoga Pull-förfrågan
|
||||
pulls.open_unmerged_pull_exists=`Du kan inte utföra återöppningsoperationen eftersom det finns redan en öppen pull-förfrågan (#%d) från samma repo med samma sammanfogningsinformation som väntar på sammanfogning.`
|
||||
pulls.delete_branch=Ta bort gren
|
||||
@@ -711,7 +715,7 @@ settings.protect_require_pull_request_desc=Enable this option to disable direct
|
||||
settings.protect_whitelist_committers=Whitelist who can push to this branch
|
||||
settings.protect_whitelist_committers_desc=Add people or teams to whitelist of direct push to this branch. Users in whitelist will bypass require pull request check.
|
||||
settings.protect_whitelist_users=Users who can push to this branch
|
||||
settings.protect_whitelist_search_users=Search users
|
||||
settings.protect_whitelist_search_users=Sök användare
|
||||
settings.protect_whitelist_teams=Teams for which members of them can push to this branch
|
||||
settings.protect_whitelist_search_teams=Search teams
|
||||
settings.update_protect_branch_success=Protect options for this branch has been updated successfully!
|
||||
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Namngivningsstil hos det externa ärendehanteringsy
|
||||
settings.tracker_issue_style.numeric=Numerisk
|
||||
settings.tracker_issue_style.alphanumeric=Alfanumerisk
|
||||
settings.tracker_url_format_desc=Du kan använda platshållaren <code>{user} {repo} {index}</code> för användarnamn, reponamn, och ärendenummer.
|
||||
settings.pulls_desc=Aktivera pullförfrågningar för att ta emot publika bidrag
|
||||
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
|
||||
settings.pulls.ignore_whitespace=Ignore changes in whitespace
|
||||
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
|
||||
settings.danger_zone=Högrisksområde
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=Den nya driftsättningsnyckeln '%s' har lagts till!
|
||||
settings.deploy_key_deletion=Ta bort distribueringsnyckel
|
||||
settings.deploy_key_deletion_desc=Borttagning av detta distributionsnyckel kommer att ta bort all relaterad åtkomst till det här repot. Vill du fortsätta?
|
||||
settings.deploy_key_deletion_success=Distributionsnyckeln har tagits bort!
|
||||
settings.description_desc=Description of repository. Maximum 512 characters length.
|
||||
settings.description_length=Available characters
|
||||
|
||||
diff.browse_source=Bläddra i källkod
|
||||
diff.parent=förälder
|
||||
@@ -1096,6 +1102,7 @@ auths.new=Lägg till ny källa
|
||||
auths.name=Namn
|
||||
auths.type=Typ
|
||||
auths.enabled=Aktiv
|
||||
auths.default=Default
|
||||
auths.updated=Uppdaterad
|
||||
auths.auth_type=Autentiseringstyp
|
||||
auths.auth_name=Autentiseringsnamn
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAM Service Name
|
||||
auths.enable_auto_register=Enable Auto Registration
|
||||
auths.edit=Edit Authentication Setting
|
||||
auths.activated=This authentication is activated
|
||||
auths.default_auth=This authentication is default login source
|
||||
auths.new_success=New authentication '%s' has been added successfully.
|
||||
auths.update_success=Authentication setting has been updated successfully.
|
||||
auths.update=Update Authentication Setting
|
||||
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=Son Eşzamanlama
|
||||
watchers=İzleyenler
|
||||
stargazers=Yıldızlayanlar
|
||||
forks=Çatallamalar
|
||||
repo_description_helper=Description of repository. Maximum 512 characters length.
|
||||
repo_description_length=Available characters
|
||||
|
||||
form.reach_limit_of_creation=Sahip, maksimum %d depo oluşturma limitine ulaşmıştır.
|
||||
form.name_reserved=Depo ismi '%s' başkasına ayrılmış.
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Düzenlemeye başladıktan sonra dosya içeri
|
||||
editor.file_already_exists='% s ' adlı bir dosya mevcutta zaten var.
|
||||
editor.no_changes_to_show=Gösterilecek bir değişiklik mevcut değil.
|
||||
editor.fail_to_update_file='%s' dosyası güncellenemedi / oluşturulamadı : %v hatasıyla
|
||||
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
|
||||
editor.add_subdir=Alt dizin Ekle...
|
||||
editor.unable_to_upload_files='%s' dosyası yüklenemedi : %v hatasıyla
|
||||
editor.upload_files_to_dir=Dosyaları '%s' ye yükle
|
||||
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Çakışmalardan dolayı bu değişiklik isteği ot
|
||||
pulls.cannot_auto_merge_helper=Çakışmaları çözmek için lütfen elle birleştirin.
|
||||
pulls.create_merge_commit=Birleştirme işlemi oluşturma
|
||||
pulls.rebase_before_merging=Birleştirmeden önce yenidenreferans al
|
||||
pulls.commit_description=Commit Description
|
||||
pulls.merge_pull_request=Değişiklik İsteğini Birleştir
|
||||
pulls.open_unmerged_pull_exists=`Yeniden açma işlemini gerçekleştiremezsiniz. Çünkü zaten aynı depodan, aynı birleştirme bilgisiyle açık olan bir değişiklik isteği var (#%d) ve birleştirme bekliyor.`
|
||||
pulls.delete_branch=Şubeyi Sil
|
||||
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Harici Hata İzleyicisi Adlandırma Stili:
|
||||
settings.tracker_issue_style.numeric=Sayısal
|
||||
settings.tracker_issue_style.alphanumeric=Alfanumerik
|
||||
settings.tracker_url_format_desc=Kullanıcı adı, depo ismi ve hata indeksi için <code>{kullanıcı} {depo} {indeks}</code> tutucusunu kullanabilirsiniz.
|
||||
settings.pulls_desc=Herkese açık katkıları kabul etmek için değişiklik isteklerini etkinleştirin
|
||||
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
|
||||
settings.pulls.ignore_whitespace=Ignore changes in whitespace
|
||||
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
|
||||
settings.danger_zone=Tehlike Alanı
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=Yeni dağıtım anahtarı '%s' başarıyla eklendi!
|
||||
settings.deploy_key_deletion=Dağıtım Anahtarını Sil
|
||||
settings.deploy_key_deletion_desc=Bu dağıtım anahtarını silerseniz bu depoya ilişkin tüm erişimler de kaldırılacaktır. Devam etmek istiyor musunuz?
|
||||
settings.deploy_key_deletion_success=Dağıtım anahtarı başarıyla silindi!
|
||||
settings.description_desc=Description of repository. Maximum 512 characters length.
|
||||
settings.description_length=Available characters
|
||||
|
||||
diff.browse_source=Kaynağa Gözat
|
||||
diff.parent=ebeveyn
|
||||
@@ -1096,6 +1102,7 @@ auths.new=Yeni Kaynak Ekle
|
||||
auths.name=İsim
|
||||
auths.type=Tür
|
||||
auths.enabled=Aktifleştirilmiş
|
||||
auths.default=Default
|
||||
auths.updated=Güncellendi
|
||||
auths.auth_type=Yetki Türü
|
||||
auths.auth_name=Yetki İsmi
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAM Servis Adı
|
||||
auths.enable_auto_register=Otomatik Kaydolmayı Aktifleştir
|
||||
auths.edit=Yetkilendirme Ayarlarını Düzenle
|
||||
auths.activated=Bu yetkilendirme aktif
|
||||
auths.default_auth=This authentication is default login source
|
||||
auths.new_success=Yeni yetkilendirme '%s' başarıyla eklendi.
|
||||
auths.update_success=Yetkilendirme ayarları başarıyla güncellendi.
|
||||
auths.update=Yetkilendirme Ayarlarını Güncelle
|
||||
|
||||
@@ -151,8 +151,8 @@ register_hepler_msg=Вже зареєстровані? Увійдіть зара
|
||||
social_register_hepler_msg=Вже зареєстровані? Прив'яжіть зараз!
|
||||
disable_register_prompt=Вибачте, реєстрація відключена. Будь ласка, зв'яжіться з адміністратором сайту.
|
||||
disable_register_mail=На жаль, підтвердження реєстрації на електрону пошту було відключено.
|
||||
auth_source=Authentication Source
|
||||
local=Local
|
||||
auth_source=Джерело автентифікації
|
||||
local=Локальний
|
||||
remember_me=Запам'ятати мене
|
||||
forgot_password=Забув пароль
|
||||
forget_password=Забули пароль?
|
||||
@@ -231,7 +231,7 @@ org_name_been_taken=Назва організаціі вже використо
|
||||
team_name_been_taken=Назва команди вже використовується.
|
||||
email_been_used=Адреса електронної пошти вже використовується.
|
||||
username_password_incorrect=Ім'я користувача або пароль помилкові.
|
||||
auth_source_mismatch=The authentication source selected is not associated with the user.
|
||||
auth_source_mismatch=Обране джерело автентифікації не асоційовано з користувачем.
|
||||
enterred_invalid_repo_name=Переконайтеся, що ви ввели назву сховища правильно.
|
||||
enterred_invalid_owner_name=Переконайтеся, що ви ввели ім'я власника правильно.
|
||||
enterred_invalid_password=Переконайтеся, що ви ввели пароль правильно.
|
||||
@@ -351,7 +351,7 @@ two_factor_or_enter_secret=Або введіть секрет:
|
||||
two_factor_then_enter_passcode=Потім введіть пароль:
|
||||
two_factor_verify=Перевірити
|
||||
two_factor_invalid_passcode=Введений пароль не валідний, будь ласка, спробуйте ще раз!
|
||||
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
|
||||
two_factor_reused_passcode=Введений пасскод вже було використано. Будь ласка, спробуйте інший!
|
||||
two_factor_enable_error=Увімкнення двофакторної автентифікації не вдалося: %v
|
||||
two_factor_enable_success=Двофакторну автентифікацію успішно активовано для вашого акаунту!
|
||||
two_factor_recovery_codes_title=Пароль відновлення для двофакторної автентифікації
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=Востаннє синхронізовано
|
||||
watchers=Спостерігачі
|
||||
stargazers=Шанувальники
|
||||
forks=Відгалуження
|
||||
repo_description_helper=Опис репозиторію. До 512-ти символів довжиною.
|
||||
repo_description_length=Доступні символи
|
||||
|
||||
form.reach_limit_of_creation=Власник досягнув максимальної кількості у %d створених репозиторіїв.
|
||||
form.name_reserved=Назва репозиторія '%s' зарезервовано.
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Вміст файлу було змінено
|
||||
editor.file_already_exists=Файл на ім'я '%s' вже присутній у репозиторії.
|
||||
editor.no_changes_to_show=Нема змін для показу.
|
||||
editor.fail_to_update_file=Не вдалося оновити/створити файл '%s' через помилку: %v
|
||||
editor.fail_to_delete_file=Не вдалося видалити файл '%s' через помилку: %v
|
||||
editor.add_subdir=Додати підкаталогу...
|
||||
editor.unable_to_upload_files=Не вдалося завантажити файли до '%s' через помилку: %v
|
||||
editor.upload_files_to_dir=Завантажувати файли до '%s'
|
||||
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Цей запрос не може бути влит
|
||||
pulls.cannot_auto_merge_helper=Будь ласка влийте вручну щоб врегулювати конфлікти.
|
||||
pulls.create_merge_commit=Створити коміт на злиття
|
||||
pulls.rebase_before_merging=Перебазувати перед об'єднанням
|
||||
pulls.commit_description=Опис коміту
|
||||
pulls.merge_pull_request=Влити запрос на злиття
|
||||
pulls.open_unmerged_pull_exists=`Ви не можете перевідкрити, бо вже існує запрос на злиття (#%d) з того самого репозиторію, з тією самою інформацією про злиття, та він очікує на влиття.`
|
||||
pulls.delete_branch=Видалити гілку
|
||||
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Стиль найменування задач в
|
||||
settings.tracker_issue_style.numeric=Цифровий
|
||||
settings.tracker_issue_style.alphanumeric=Буквено-цифровий
|
||||
settings.tracker_url_format_desc=Ви можете використовувати заповнювач <code>{user} {repo} {index}</code> для ім'я користувача, назви репозиторію на номеру проблеми.
|
||||
settings.pulls_desc=Увімкнути публічні запроси на злиття
|
||||
settings.pulls_desc=Увімкнути запити на злиття щоб дозволити внески між репозиторіями й гілками
|
||||
settings.pulls.ignore_whitespace=Ігнорувати зміни у пробільних символах
|
||||
settings.pulls.allow_rebase_merge=Дозволити перебазування для merge-комітів
|
||||
settings.danger_zone=Небезпечна зона
|
||||
@@ -844,7 +848,7 @@ settings.slack_token=Токен
|
||||
settings.slack_domain=Домен
|
||||
settings.slack_channel=Канал
|
||||
settings.deploy_keys=Ключи для розгортування
|
||||
settings.deploy_keys_helper=<b>Common Gotcha!</b> Якщо ви шукаєте куди додати персональний публічний ключ, додайте його до <a href="%s%s">налаштуань вашого аккаунту</a>.
|
||||
settings.deploy_keys_helper=<b>Common Gotcha!</b> Якщо ви шукаєте куди додати персональний публічний ключ, додайте його до <a href="%s%s">налаштувань вашого аккаунту</a>.
|
||||
settings.add_deploy_key=Додати ключ для розгортування
|
||||
settings.deploy_key_desc=Ключі розгортування доступні лише для читання. Це не те саме, що персональний SSH ключ акаунту.
|
||||
settings.no_deploy_keys=Ви не додали жодного ключа для розгортування.
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=Новий ключ розгортування '%s' у
|
||||
settings.deploy_key_deletion=Видалити ключ для розгортування
|
||||
settings.deploy_key_deletion_desc=Видалення цього ключа для розгортування призведе о видалення усіх пов'язаних прав до цього репозиторію. Ви справді бажаєте продовжити?
|
||||
settings.deploy_key_deletion_success=Ключі для розгортування було успішно видалено!
|
||||
settings.description_desc=Опис репозиторію. До 512-ти символів довжиною.
|
||||
settings.description_length=Доступні символи
|
||||
|
||||
diff.browse_source=Переглянути джерело
|
||||
diff.parent=батько
|
||||
@@ -1091,11 +1097,12 @@ repos.stars=У обраному
|
||||
repos.issues=Питання
|
||||
repos.size=Розмір
|
||||
|
||||
auths.auth_sources=Authentication Sources
|
||||
auths.auth_sources=Джерела автентифікації
|
||||
auths.new=Додати нове джерело
|
||||
auths.name=Назва
|
||||
auths.type=Тип
|
||||
auths.enabled=Увімкнено
|
||||
auths.default=За замовчанням
|
||||
auths.updated=Оновлено
|
||||
auths.auth_type=Тип автентифікації
|
||||
auths.auth_name=Назва автентифікації
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Ім'я служби PAM
|
||||
auths.enable_auto_register=Увімкнути автоматичну реєстрацію
|
||||
auths.edit=Редагувати налаштування автентифікації
|
||||
auths.activated=Цю автентифікацію активовано
|
||||
auths.default_auth=Це метод автентифікації за замовчанням
|
||||
auths.new_success=Нову автентифікацію '%s' було успішно додано.
|
||||
auths.update_success=Налаштування автентифікації було успішно оновлено.
|
||||
auths.update=Оновити налаштування автентифікації
|
||||
@@ -1304,9 +1312,9 @@ delete_branch=видалено гілку <code>%[2]s</code> у <a href="%[1]s">
|
||||
push_tag=заштовхнуто тег <a href="%s/src/%s">%[2]s</a> до <a href="%[1]s">%[3]s</a>
|
||||
delete_tag=видалено мітку <code>%[2]s</code> у <a href="%[1]s">%[3]s</a>
|
||||
fork_repo=відгалуджено репозиторій у <a href="%s">%s</a>
|
||||
mirror_sync_push=synced commits to <a href="%[1]s/src/%[2]s">%[3]s</a> at <a href="%[1]s">%[4]s</a> from mirror
|
||||
mirror_sync_create=synced new reference <a href="%s/src/%s">%[2]s</a> to <a href="%[1]s">%[3]s</a> from mirror
|
||||
mirror_sync_delete=synced and deleted reference <code>%[2]s</code> at <a href="%[1]s">%[3]s</a> from mirror
|
||||
mirror_sync_push=синхронізовано коміт <a href="%[1]s/src/%[2]s">%[3]s</a> в <a href="%[1]s">%[4]s</a> із дзеркала
|
||||
mirror_sync_create=синхронізовано нове посилання <a href="%s/src/%s">%[2]s</a> до <a href="%[1]s">%[3]s</a> із дзеркала
|
||||
mirror_sync_delete=синхронізовано й видалено посилання <code>%[2]s</code> в <a href="%[1]s">%[3]s</a> із дзеркала
|
||||
|
||||
[tool]
|
||||
ago=тому
|
||||
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=Lần đồng bộ cuối
|
||||
watchers=Người theo dõi
|
||||
stargazers=Stargazers
|
||||
forks=Forks
|
||||
repo_description_helper=Description of repository. Maximum 512 characters length.
|
||||
repo_description_length=Available characters
|
||||
|
||||
form.reach_limit_of_creation=Chủ sở hữu đã đạt giới hạn tối đa %d kho.
|
||||
form.name_reserved=Tên kho '%s' đã được dành riêng.
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=File content has been changed since you starte
|
||||
editor.file_already_exists=Tên tập tin '%s' đã tồn tại trong kho này.
|
||||
editor.no_changes_to_show=Không có thay đổi nào.
|
||||
editor.fail_to_update_file=Failed to update/create file '%s' with error: %v
|
||||
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
|
||||
editor.add_subdir=Thêm thư mục con...
|
||||
editor.unable_to_upload_files=Failed to upload files to '%s' with error: %v
|
||||
editor.upload_files_to_dir=Tải tập tin đến '%s'
|
||||
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Yêu cầu kéo này không thể được kết h
|
||||
pulls.cannot_auto_merge_helper=Xin vui lòng nhập theo cách thủ công để giải quyết các cuộc xung đột.
|
||||
pulls.create_merge_commit=Tạo một merge commit
|
||||
pulls.rebase_before_merging=Rebase trước khi sáp nhập
|
||||
pulls.commit_description=Commit Description
|
||||
pulls.merge_pull_request=Merge Pull Request
|
||||
pulls.open_unmerged_pull_exists=' Bạn không thể thực hiện thao tác reopen vì đã có một yêu cầu kéo đang mở (#%d) từ kho lưu trữ cùng với cùng một kết hợp thông tin và chờ đợi cho việc sáp nhập.'
|
||||
pulls.delete_branch=Xóa nhánh
|
||||
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Kiểu Url theo dõi các vấn đề bên ngoài:
|
||||
settings.tracker_issue_style.numeric=Kiểu số
|
||||
settings.tracker_issue_style.alphanumeric=Chữ số
|
||||
settings.tracker_url_format_desc=You can use placeholder <code>{user} {repo} {index}</code> for user name, repository name and issue index.
|
||||
settings.pulls_desc=Cho phép yêu cầu pull để chấp nhận sự đóng góp công cộng
|
||||
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
|
||||
settings.pulls.ignore_whitespace=Bỏ qua sự thay đổi của khoảng trắng
|
||||
settings.pulls.allow_rebase_merge=Cho phép sử dụng rebase để merge các commit
|
||||
settings.danger_zone=Vùng nguy hiểm
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=Bộ nhớ heap đã được phát hành!
|
||||
settings.deploy_key_deletion=Xóa Khóa triển khai
|
||||
settings.deploy_key_deletion_desc=Xóa bỏ điều này triển khai các phím sẽ loại bỏ tất cả liên quan đến truy cập cho các kho lưu trữ này. Bạn có muốn tiếp tục?
|
||||
settings.deploy_key_deletion_success=Deploy key has been deleted successfully!
|
||||
settings.description_desc=Description of repository. Maximum 512 characters length.
|
||||
settings.description_length=Available characters
|
||||
|
||||
diff.browse_source=Browse Source
|
||||
diff.parent=mục cha
|
||||
@@ -1096,6 +1102,7 @@ auths.new=Thêm mới source
|
||||
auths.name=Tên
|
||||
auths.type=Loại
|
||||
auths.enabled=Đã kích hoạt
|
||||
auths.default=Default
|
||||
auths.updated=Đã cập nhật
|
||||
auths.auth_type=Loại xác thực
|
||||
auths.auth_name=Tên đăng nhập xác thực
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Tên dịch vụ PAM
|
||||
auths.enable_auto_register=Cho phép tự động đăng ký
|
||||
auths.edit=Chỉnh sửa cài đặt xác thực
|
||||
auths.activated=Xác thực này đã được kích hoạt
|
||||
auths.default_auth=This authentication is default login source
|
||||
auths.new_success=Xác thực mới '%s' đã được thêm vào thành công.
|
||||
auths.update_success=Cài đặt xác thực đã được cập nhật thành công.
|
||||
auths.update=Cập Nhật cài đặt xác thực
|
||||
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=上次同步时间:
|
||||
watchers=关注者
|
||||
stargazers=称赞者
|
||||
forks=派生仓库
|
||||
repo_description_helper=请输入仓库描述,最多为 512 个字符
|
||||
repo_description_length=剩余字符数
|
||||
|
||||
form.reach_limit_of_creation=该用户已经达到允许创建 %d 个仓库的最大上限。
|
||||
form.name_reserved=仓库名称 '%s' 是被保留的。
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=文件内容在您进行编辑时已经发生
|
||||
editor.file_already_exists=此仓库已经存在名为 '%s' 的文件。
|
||||
editor.no_changes_to_show=没有可以显示的变更。
|
||||
editor.fail_to_update_file=更新/创建文件 '%s' 时发生错误:%v
|
||||
editor.fail_to_delete_file=删除文件 '%s' 时发生错误: %v
|
||||
editor.add_subdir=添加子目录...
|
||||
editor.unable_to_upload_files=上传文件至 '%s' 时发生错误:%v
|
||||
editor.upload_files_to_dir=上传文件至 '%s'
|
||||
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=该合并请求存在冲突,无法进行自动合
|
||||
pulls.cannot_auto_merge_helper=请手动拉取代码变更以解决冲突。
|
||||
pulls.create_merge_commit=创建一个新的合并提交
|
||||
pulls.rebase_before_merging=合并前先进行衍合
|
||||
pulls.commit_description=提交说明
|
||||
pulls.merge_pull_request=合并请求
|
||||
pulls.open_unmerged_pull_exists=`由于已经存在来自相同仓库和合并信息的未合并请求(#%d),您无法执行重新开启操作。`
|
||||
pulls.delete_branch=删除分支
|
||||
@@ -742,7 +746,7 @@ settings.tracker_issue_style=外部工单管理系统命名风格:
|
||||
settings.tracker_issue_style.numeric=纯数字形式
|
||||
settings.tracker_issue_style.alphanumeric=英文字母数字组合形式
|
||||
settings.tracker_url_format_desc=您可以使用 <code>{user} {repo} {index}</code> 分别作为用户名、仓库名和工单索引的占位符。
|
||||
settings.pulls_desc=启用合并请求以接受社区贡献
|
||||
settings.pulls_desc=启用合并请求以接受来自其它仓库或分支的贡献
|
||||
settings.pulls.ignore_whitespace=忽略空白符号的更改
|
||||
settings.pulls.allow_rebase_merge=允许在合并提交时使用衍合
|
||||
settings.danger_zone=危险操作区
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=新的部署密钥 '%s' 添加成功!
|
||||
settings.deploy_key_deletion=删除部署密钥
|
||||
settings.deploy_key_deletion_desc=删除该部署密钥会移除本仓库所以相关的操作权限。是否继续?
|
||||
settings.deploy_key_deletion_success=删除部署密钥成功!
|
||||
settings.description_desc=请输入仓库描述,最多为 512 个字符
|
||||
settings.description_length=剩余字符数
|
||||
|
||||
diff.browse_source=浏览代码
|
||||
diff.parent=父节点
|
||||
@@ -1096,6 +1102,7 @@ auths.new=添加新的源
|
||||
auths.name=认证名称
|
||||
auths.type=认证类型
|
||||
auths.enabled=已启用
|
||||
auths.default=默认
|
||||
auths.updated=最后更新时间
|
||||
auths.auth_type=认证类型
|
||||
auths.auth_name=认证名称
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAM 服务名称
|
||||
auths.enable_auto_register=允许授权用户自动注册
|
||||
auths.edit=编辑认证设置
|
||||
auths.activated=该授权认证已经启用
|
||||
auths.default_auth=该授权认证将作为默认登录源
|
||||
auths.new_success=新的授权源 "%s" 添加成功!
|
||||
auths.update_success=认证设置更新成功!
|
||||
auths.update=更新认证设置
|
||||
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=Last Synced
|
||||
watchers=關注者
|
||||
stargazers=稱讚者
|
||||
forks=派生倉庫
|
||||
repo_description_helper=Description of repository. Maximum 512 characters length.
|
||||
repo_description_length=Available characters
|
||||
|
||||
form.reach_limit_of_creation=擁有者已達到儲存庫最大的新增上限 %d。
|
||||
form.name_reserved=倉庫名稱 '%s' 是被保留的。
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=File content has been changed since you starte
|
||||
editor.file_already_exists=A file with name '%s' already exists in this repository.
|
||||
editor.no_changes_to_show=There are no changes to show.
|
||||
editor.fail_to_update_file=Failed to update/create file '%s' with error: %v
|
||||
editor.fail_to_delete_file=Failed to delete file '%s' with error: %v
|
||||
editor.add_subdir=Add subdirectory...
|
||||
editor.unable_to_upload_files=Failed to upload files to '%s' with error: %v
|
||||
editor.upload_files_to_dir=Upload files to '%s'
|
||||
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=由於存在衝突,不能自動合併這推送請
|
||||
pulls.cannot_auto_merge_helper=請手動合併來解決衝突。
|
||||
pulls.create_merge_commit=Create a merge commit
|
||||
pulls.rebase_before_merging=Rebase before merging
|
||||
pulls.commit_description=Commit Description
|
||||
pulls.merge_pull_request=合併請求
|
||||
pulls.open_unmerged_pull_exists=`由於已經存在來自相同倉庫和合併信息的未合併請求(#%d),您無法執行重新開啟操作。`
|
||||
pulls.delete_branch=Delete Branch
|
||||
@@ -742,7 +746,7 @@ settings.tracker_issue_style=External Issue Tracker Naming Style:
|
||||
settings.tracker_issue_style.numeric=Numeric
|
||||
settings.tracker_issue_style.alphanumeric=Alphanumeric
|
||||
settings.tracker_url_format_desc=您可以使用 <code>{user} {repo} {index}</code> 分別作為用戶名、倉庫名和問題索引的占位符。
|
||||
settings.pulls_desc=啟用合併請求以接受社區貢獻
|
||||
settings.pulls_desc=Enable pull requests to accept contributions between repositories and branches
|
||||
settings.pulls.ignore_whitespace=Ignore changes in whitespace
|
||||
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
|
||||
settings.danger_zone=危險操作區
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=新的部署密鑰 '%s' 添加成功!
|
||||
settings.deploy_key_deletion=刪除部署密鑰
|
||||
settings.deploy_key_deletion_desc=刪除該部署密鑰會移除本倉庫所有相關的操作權限。是否繼續?
|
||||
settings.deploy_key_deletion_success=刪除部署密鑰成功!
|
||||
settings.description_desc=Description of repository. Maximum 512 characters length.
|
||||
settings.description_length=Available characters
|
||||
|
||||
diff.browse_source=瀏覽代碼
|
||||
diff.parent=父節點
|
||||
@@ -1096,6 +1102,7 @@ auths.new=添加新認證源
|
||||
auths.name=認證名稱
|
||||
auths.type=認證類型
|
||||
auths.enabled=已啟用
|
||||
auths.default=Default
|
||||
auths.updated=最後更新時間
|
||||
auths.auth_type=認證類型
|
||||
auths.auth_name=認證名稱
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAM 服務名稱
|
||||
auths.enable_auto_register=允許授權用戶自動註冊
|
||||
auths.edit=編輯認證設置
|
||||
auths.activated=該授權認證已經啟用
|
||||
auths.default_auth=This authentication is default login source
|
||||
auths.new_success=新的認證源 "%s" 添加成功!
|
||||
auths.update_success=認證設置更新成功!
|
||||
auths.update=更新認證設置
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
app_desc=基於 Go 語言的自助 Git 服務
|
||||
app_desc=一款極易搭建的自助 Git 服務
|
||||
|
||||
home=首頁
|
||||
dashboard=控制面版
|
||||
dashboard=控制面板
|
||||
explore=探索
|
||||
help=說明
|
||||
sign_in=登入
|
||||
@@ -35,7 +35,7 @@ manage_org=管理組織
|
||||
admin_panel=管理面板
|
||||
account_settings=帳號設定
|
||||
settings=設定
|
||||
your_profile=個人資料
|
||||
your_profile=個人資訊
|
||||
your_settings=用戶設定
|
||||
|
||||
activities=活動
|
||||
@@ -83,7 +83,7 @@ app_url_helper=該設置影響 HTTP/HTTPS 複製地址和一些郵箱中的連
|
||||
log_root_path=日誌路徑
|
||||
log_root_path_helper=寫入日誌檔目錄
|
||||
enable_console_mode=開啟主控台模式
|
||||
enable_console_mode_popup=In addition to file mode, also print logs to console.
|
||||
enable_console_mode_popup=除了使用檔案模式之外, 還要將日誌列印到控制台。
|
||||
|
||||
optional_title=可選設置
|
||||
email_title=電子郵件服務設定
|
||||
@@ -151,8 +151,8 @@ register_hepler_msg=已經註冊?立即登錄!
|
||||
social_register_hepler_msg=已經註冊?立即綁定!
|
||||
disable_register_prompt=對不起,註冊功能已被關閉。請聯系網站管理員。
|
||||
disable_register_mail=對不起,註冊郵箱確認功能已被關閉。
|
||||
auth_source=Authentication Source
|
||||
local=Local
|
||||
auth_source=認證來源
|
||||
local=本地
|
||||
remember_me=記住登錄
|
||||
forgot_password=忘記密碼
|
||||
forget_password=忘記密碼?
|
||||
@@ -197,7 +197,7 @@ RepoName=儲存庫名稱
|
||||
Email=郵箱地址
|
||||
Password=密碼
|
||||
Retype=確認密碼
|
||||
SSHTitle=SSH 密鑰名稱
|
||||
SSHTitle=SSH 公鑰名稱
|
||||
HttpsUrl=HTTPS URL 地址
|
||||
PayloadUrl=推送地址
|
||||
TeamName=團隊名稱
|
||||
@@ -231,7 +231,7 @@ org_name_been_taken=組織名稱已經被佔用。
|
||||
team_name_been_taken=團隊名稱已經被佔用。
|
||||
email_been_used=郵箱地址已經被使用。
|
||||
username_password_incorrect=用戶名或密碼不正確。
|
||||
auth_source_mismatch=The authentication source selected is not associated with the user.
|
||||
auth_source_mismatch=此用戶未與所用的認證來源相關聯
|
||||
enterred_invalid_repo_name=請檢查您輸入的倉庫名稱是正確。
|
||||
enterred_invalid_owner_name=請檢查您輸入的新所有者用戶名是否正確。
|
||||
enterred_invalid_password=請檢查您輸入的密碼是否正確。
|
||||
@@ -263,7 +263,7 @@ form.name_reserved=用戶名 '%s' 是被保留的。
|
||||
form.name_pattern_not_allowed=用戶名不允許 '%s' 的格式。
|
||||
|
||||
[settings]
|
||||
profile=個人信息
|
||||
profile=個人資訊
|
||||
password=修改密碼
|
||||
avatar=頭像
|
||||
ssh_keys=管理 SSH 密鑰
|
||||
@@ -280,7 +280,7 @@ full_name=自定義名稱
|
||||
website=個人網站
|
||||
location=所在地區
|
||||
update_profile=更新信息
|
||||
update_profile_success=您的個人信息更新成功!
|
||||
update_profile_success=您的個人資訊更新成功!
|
||||
change_username=用戶名將被修改
|
||||
change_username_prompt=該操作將會影響到所有與您帳戶有關的鏈接
|
||||
continue=繼續操作
|
||||
@@ -344,24 +344,24 @@ two_factor_off=關閉
|
||||
two_factor_enable=啟用
|
||||
two_factor_disable=禁用
|
||||
two_factor_view_recovery_codes=在安全的地方查看並保存 <a href="%s%s"> 您的恢復代碼 </a>。如果您失去對身份驗證應用程式的存取權限, 則可以將它們用作密碼。
|
||||
two_factor_http=For HTTP/HTTPS operations, you are no longer able to use plain username and password. Please create and use <a href="%[1]s%[2]s">Personal Access Token</a> as your credential, e.g. <code>%[3]s</code>.
|
||||
two_factor_enable_title=Enable Two-factor Authentication
|
||||
two_factor_http=對於HTTP/HTTPS操作,您不能使用用戶名稱和密碼作為憑據。請創建和使用<a href=“%[1]s%[2]s”>個人操作令牌</a>作為您的憑據,如<code>%[3]s</code>。
|
||||
two_factor_enable_title=啟用兩步驗證
|
||||
two_factor_scan_qr=請使用您的身份驗證應用程式掃描圖像:
|
||||
two_factor_or_enter_secret=或輸入密碼: %s
|
||||
two_factor_then_enter_passcode=然後輸入驗證碼:
|
||||
two_factor_verify=驗證
|
||||
two_factor_invalid_passcode=您輸入的密碼無效,請再試一次。
|
||||
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
|
||||
two_factor_reused_passcode=您输入的验证码已经被使用过了,请换一个重试!
|
||||
two_factor_enable_error=啟用兩步驗證失敗: %v
|
||||
two_factor_enable_success=您帳戶的兩步驗證已成功啟用!
|
||||
two_factor_recovery_codes_title=兩步驗證恢復代碼
|
||||
two_factor_recovery_codes_desc=Recovery codes are used when you temporarily lose access to your authentication application. Each recovery code can only be used once, <b>please keep these codes in a safe place</b>.
|
||||
two_factor_recovery_codes_desc=當您無法存取您的認證應用程式時,可以使用救援代碼。每個救援代碼只能使用一次,因此 <b>請在安全的地方妥善保存您的救援代碼</b>。
|
||||
two_factor_regenerate_recovery_codes=重新生成恢復代碼
|
||||
two_factor_regenerate_recovery_codes_error=重新生成恢復代碼失敗: %v
|
||||
two_factor_regenerate_recovery_codes_success=已成功生成新的恢復代碼!
|
||||
two_factor_disable_title=Disable Two-factor Authentication
|
||||
two_factor_disable_desc=Your account security level will decrease after disabled two-factor authentication. Do you want to continue?
|
||||
two_factor_disable_success=Two-factor authentication has disabled successfully!
|
||||
two_factor_disable_title=停用兩步驗證
|
||||
two_factor_disable_desc=停用兩步驗證後,您的帳戶安全級別將降低。是否繼續?
|
||||
two_factor_disable_success=您帳戶的兩步驗證已成功停用!
|
||||
|
||||
manage_access_token=管理個人操作令牌
|
||||
generate_new_token=生成新的令牌
|
||||
@@ -382,7 +382,7 @@ orgs.leave_desc=離開組織後,所有與組織相關的倉庫和團隊權限
|
||||
repos.leave=離開
|
||||
repos.leave_title=離開存儲庫
|
||||
repos.leave_desc=在你離開後,您將無法進入到存儲庫。你想要繼續嗎?
|
||||
repos.leave_success=You have left repository '%s' successfully!
|
||||
repos.leave_success=您已經成功退出「%s」版本庫!
|
||||
|
||||
delete_account=刪除當前帳戶
|
||||
delete_prompt=刪除操作會永久清除您的帳戶信息,並且 <strong>不可恢復</strong>!
|
||||
@@ -421,6 +421,8 @@ mirror_last_synced=上次同步
|
||||
watchers=關注者
|
||||
stargazers=稱讚者
|
||||
forks=派生倉庫
|
||||
repo_description_helper=儲存庫的說明文字。最長 512 個字元。
|
||||
repo_description_length=可用字元
|
||||
|
||||
form.reach_limit_of_creation=擁有者已達到儲存庫最大的新增上限 %d。
|
||||
form.name_reserved=倉庫名稱 '%s' 是被保留的。
|
||||
@@ -454,7 +456,7 @@ quick_guide=快速幫助
|
||||
clone_this_repo=複製當前倉庫
|
||||
create_new_repo_command=從命令行創建一個新的倉庫
|
||||
push_exist_repo=從命令行推送已經創建的倉庫
|
||||
bare_message=This repository does not have any content yet.
|
||||
bare_message=此版本庫空空如也。
|
||||
|
||||
files=檔案
|
||||
branch=分支
|
||||
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=從您開始編輯已更改檔的內容。<a t
|
||||
editor.file_already_exists=帶有名稱 '%s' 的檔已經存在在這個資料庫中。
|
||||
editor.no_changes_to_show=沒有可以顯示的變更。
|
||||
editor.fail_to_update_file=上傳/創建檔案 '%s' 失敗, 錯誤訊息: %v
|
||||
editor.fail_to_delete_file=無法刪除檔案「%s」,錯誤訊息:%v
|
||||
editor.add_subdir=新增子目錄...
|
||||
editor.unable_to_upload_files=上傳檔案失敗到 '%s', 錯誤訊息: %v
|
||||
editor.upload_files_to_dir=上傳檔案到 '%s'
|
||||
@@ -620,7 +623,7 @@ pulls.compare_compare=對比文件變化
|
||||
pulls.filter_branch=過濾分支
|
||||
pulls.no_results=未找到結果
|
||||
pulls.nothing_to_compare=基準和對比分支代碼已經同步,無需進行對比。
|
||||
pulls.nothing_merge_base=There is nothing to compare because two branches have completely different history.
|
||||
pulls.nothing_merge_base=因為兩個分支有完全不同的提交紀錄,因此無法比較。
|
||||
pulls.has_pull_request=`已經存在目標分支的合併請求:<a href="%[1]s/pulls/%[3]d">%[2]s#%[3]d</a>`
|
||||
pulls.create=創建合併請求
|
||||
pulls.title_desc=請求將 %[1]d 次代碼提交從 <code>%[2]s</code> 合併至 <code>%[3]s</code>
|
||||
@@ -637,7 +640,8 @@ pulls.can_auto_merge_desc=這個拉請求可以自動合併。
|
||||
pulls.cannot_auto_merge_desc=由於存在衝突,不能自動合併這推送請求。
|
||||
pulls.cannot_auto_merge_helper=請手動合併來解決衝突。
|
||||
pulls.create_merge_commit=創建一個合併提交
|
||||
pulls.rebase_before_merging=Rebase before merging
|
||||
pulls.rebase_before_merging=合併前先 Rebase
|
||||
pulls.commit_description=提交記錄說明
|
||||
pulls.merge_pull_request=合併請求
|
||||
pulls.open_unmerged_pull_exists=`由於已經存在來自相同倉庫和合併信息的未合併請求(#%d),您無法執行重新開啟操作。`
|
||||
pulls.delete_branch=刪除分支
|
||||
@@ -693,11 +697,11 @@ settings.collaboration.write=可寫權限
|
||||
settings.collaboration.read=可讀權限
|
||||
settings.collaboration.undefined=未定義
|
||||
settings.branches=分支列表
|
||||
settings.branches_bare=You cannot manage branches for bare repository. Please push some content first.
|
||||
settings.branches_bare=您無法管理空版本庫。請先推送一些內容至版本庫。
|
||||
settings.default_branch=預設分支
|
||||
settings.default_branch_desc=預設分支是程式碼 commit、pull requests 及線上編輯的基準分支。
|
||||
settings.update=更新
|
||||
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
|
||||
settings.update_default_branch_unsupported=伺服器的 Git 版本不支援變更預設分支。
|
||||
settings.update_default_branch_success=這個 repository 的預設分支更新成功!
|
||||
settings.protected_branches=保護分支
|
||||
settings.protected_branches_desc=保護分支不被強制 Push、意外刪除以及限制 Commit 者白名單
|
||||
@@ -727,13 +731,13 @@ settings.change_reponame_prompt=該操作將會影響到所有與該倉庫有關
|
||||
settings.advanced_settings=高級設置
|
||||
settings.wiki_desc=啓用 Wiki 系統
|
||||
settings.use_internal_wiki=使用內建 wiki
|
||||
settings.allow_public_wiki_desc=Allow public access to wiki when repository is private
|
||||
settings.allow_public_wiki_desc=當版本庫為私有狀態時,允許 Wiki 的公開存取。
|
||||
settings.use_external_wiki=使用外部 wiki
|
||||
settings.external_wiki_url=外部 Wiki 連結
|
||||
settings.external_wiki_url_desc=當分頁上按一下,訪客將會重新導到 URL。
|
||||
settings.issues_desc=啟用問題追蹤
|
||||
settings.use_internal_issue_tracker=使用內建輕量級問題追蹤
|
||||
settings.allow_public_issues_desc=Allow public access to issues when repository is private
|
||||
settings.allow_public_issues_desc=當版本庫為私有狀態時,允許議題的公開存取。
|
||||
settings.use_external_issue_tracker=使用外部的問題管理系統
|
||||
settings.external_tracker_url=外部Issue Tracker網址
|
||||
settings.external_tracker_url_desc=當訪客在分頁上按一下,他們將會重新導向到 URL。
|
||||
@@ -742,9 +746,9 @@ settings.tracker_issue_style=外部公單管理系統命名風格:
|
||||
settings.tracker_issue_style.numeric=數字
|
||||
settings.tracker_issue_style.alphanumeric=字母及數字
|
||||
settings.tracker_url_format_desc=您可以使用 <code>{user} {repo} {index}</code> 分別作為用戶名、倉庫名和問題索引的占位符。
|
||||
settings.pulls_desc=啟用合併請求以接受社區貢獻
|
||||
settings.pulls.ignore_whitespace=Ignore changes in whitespace
|
||||
settings.pulls.allow_rebase_merge=Allow use rebase to merge commits
|
||||
settings.pulls_desc=啟用「合併請求」功能,接受版本庫與分支之間的貢獻
|
||||
settings.pulls.ignore_whitespace=忽略空白符號的更改
|
||||
settings.pulls.allow_rebase_merge=允許使用 rebase 合併提交
|
||||
settings.danger_zone=危險操作區
|
||||
settings.cannot_fork_to_same_owner=你不可以 fork 一個 repository 到它的擁有者。
|
||||
settings.new_owner_has_same_repo=新的倉庫擁有者已經存在同名倉庫!
|
||||
@@ -765,7 +769,7 @@ settings.wiki_deletion_success=儲存庫 wiki 資料已成功清除。
|
||||
settings.delete=刪除本倉庫
|
||||
settings.delete_desc=刪除倉庫操作不可逆轉,請三思而後行。
|
||||
settings.delete_notices_1=- 此操作 <strong>不可以</strong> 被回滾。
|
||||
settings.delete_notices_2=- This operation will permanently delete everything in this repository, including Git data, issues, comments and collaborator access.
|
||||
settings.delete_notices_2=- 此動作將永久移除版本庫,包含了 Git 資料、議題、留言與協作者的存取權限。
|
||||
settings.delete_notices_fork_1=- 刪除後所有的派生倉庫將會成為獨立倉庫
|
||||
settings.deletion_success=倉庫刪除成功!
|
||||
settings.update_settings_success=倉庫設置更新成功!
|
||||
@@ -790,7 +794,7 @@ settings.webhook.test_delivery=測試推送
|
||||
settings.webhook.test_delivery_desc=生成並推送一個模擬的 Push 事件
|
||||
settings.webhook.test_delivery_success=測試推送已經加入到隊列,請耐心等待數秒再刷新推送記錄。
|
||||
settings.webhook.redelivery=重新傳送
|
||||
settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history.
|
||||
settings.webhook.redelivery_success=任務「%s」已經重新加入至隊列。可能需要幾秒鐘來更新歷史的隊列狀態
|
||||
settings.webhook.request=請求內容
|
||||
settings.webhook.response=響應內容
|
||||
settings.webhook.headers=標題
|
||||
@@ -839,12 +843,12 @@ settings.recent_deliveries=最近推送記錄
|
||||
settings.hook_type=鉤子類型
|
||||
settings.add_slack_hook_desc=為您的倉庫增加 <a href="%s">Slack</a> 集成。
|
||||
settings.add_discord_hook_desc=Hook <a href="%s">Discord</a> 到你的 repository。
|
||||
settings.add_dingtalk_hook_desc=Add <a href="%s">Dingtalk</a> integration to your repository.
|
||||
settings.add_dingtalk_hook_desc=在您的版本庫增加 <a href="%s">Dingtalk</a> 整合
|
||||
settings.slack_token=令牌
|
||||
settings.slack_domain=域名
|
||||
settings.slack_channel=頻道
|
||||
settings.deploy_keys=管理部署密鑰
|
||||
settings.deploy_keys_helper=<b>噢不!</b> 如果要新增個人的公開金要,請到 <a href="%s%s">用戶設定</a> 新增。
|
||||
settings.deploy_keys_helper=<b>噢不!</b> 如果要新增個人的公開金鑰,請到 <a href="%s%s">用戶設定</a> 新增。
|
||||
settings.add_deploy_key=添加部署密鑰
|
||||
settings.deploy_key_desc=部署密鑰僅具有隻讀權限,它在功能上和個人用戶的公開密鑰有本質區別。
|
||||
settings.no_deploy_keys=您還沒有添加任何部署密鑰。
|
||||
@@ -856,6 +860,8 @@ settings.add_key_success=新的部署密鑰 '%s' 添加成功!
|
||||
settings.deploy_key_deletion=刪除部署密鑰
|
||||
settings.deploy_key_deletion_desc=刪除該部署密鑰會移除本倉庫所有相關的操作權限。是否繼續?
|
||||
settings.deploy_key_deletion_success=刪除部署密鑰成功!
|
||||
settings.description_desc=儲存庫的說明文字。最長 512 個字元。
|
||||
settings.description_length=可用字元
|
||||
|
||||
diff.browse_source=瀏覽代碼
|
||||
diff.parent=父節點
|
||||
@@ -1091,11 +1097,12 @@ repos.stars=讚好數
|
||||
repos.issues=問題數
|
||||
repos.size=大小
|
||||
|
||||
auths.auth_sources=Authentication Sources
|
||||
auths.auth_sources=認證來源
|
||||
auths.new=添加新認證源
|
||||
auths.name=認證名稱
|
||||
auths.type=認證類型
|
||||
auths.enabled=已啟用
|
||||
auths.default=預設
|
||||
auths.updated=最後更新時間
|
||||
auths.auth_type=認證類型
|
||||
auths.auth_name=認證名稱
|
||||
@@ -1104,7 +1111,7 @@ auths.domain=域名
|
||||
auths.host=主機地址
|
||||
auths.port=主機端口
|
||||
auths.bind_dn=綁定DN
|
||||
auths.bind_dn_helper=You can use '%s' as placeholder for username, e.g. DOM\%s
|
||||
auths.bind_dn_helper=可以使用'%s'作為用戶名稱的預留位置,例如:DOM\%s
|
||||
auths.bind_password=綁定密碼
|
||||
auths.bind_password_helper=警告:該密碼將會以明文的形式保存在數據庫中。請不要使用擁有高權限的帳戶!
|
||||
auths.user_base=用戶搜索基準
|
||||
@@ -1115,9 +1122,9 @@ auths.attribute_name=歸納名字
|
||||
auths.attribute_surname=姓氏屬性
|
||||
auths.attribute_mail=電子郵箱屬性
|
||||
auths.verify_group_membership=驗證組成員身份
|
||||
auths.group_search_base_dn=Group Search Base DN
|
||||
auths.group_search_base_dn=組蒐索基準 DN
|
||||
auths.group_filter=組篩選器
|
||||
auths.group_attribute_contain_user_list=Group Attribute Containing List of Users
|
||||
auths.group_attribute_contain_user_list=包含使用者列表的群組屬性
|
||||
auths.user_attribute_listed_in_group=組中列出的使用者屬性
|
||||
auths.attributes_in_bind=從 Bind DN 中獲取屬性信息
|
||||
auths.filter=使用者篩選器
|
||||
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAM 服務名稱
|
||||
auths.enable_auto_register=允許授權用戶自動註冊
|
||||
auths.edit=編輯認證設置
|
||||
auths.activated=該授權認證已經啟用
|
||||
auths.default_auth=此認證方式為預設登入來源
|
||||
auths.new_success=新的認證源 "%s" 添加成功!
|
||||
auths.update_success=認證設置更新成功!
|
||||
auths.update=更新認證設置
|
||||
@@ -1166,7 +1174,7 @@ config.ssh_domain=域名
|
||||
config.ssh_port=埠
|
||||
config.ssh_listen_port=監聽埠
|
||||
config.ssh_root_path=根路徑
|
||||
config.ssh_rewrite_authorized_keys_at_start=Rewrite authorized_keys At Start
|
||||
config.ssh_rewrite_authorized_keys_at_start=在啟動時重寫 authorized_keys 檔案
|
||||
config.ssh_key_test_path=金鑰測試路徑
|
||||
config.ssh_keygen_path=金鑰產生 (' ssh-keygen ') 路徑
|
||||
config.ssh_minimum_key_size_check=金鑰最小大小檢查
|
||||
@@ -1214,7 +1222,7 @@ config.skip_tls_verify=忽略 TLS 驗證
|
||||
config.mailer_config=郵件配置
|
||||
config.mailer_enabled=啟用服務
|
||||
config.mailer_disable_helo=禁用 HELO 操作
|
||||
config.mailer_subject_prefix=Subject Prefix
|
||||
config.mailer_subject_prefix=主旨前置詞
|
||||
config.mailer_host=郵件主機地址
|
||||
config.mailer_user=發送者帳號
|
||||
config.send_test_mail=發送測試郵件
|
||||
@@ -1304,9 +1312,9 @@ delete_branch=已經刪除在 <a href="%[1]s">%[3]s</a> 上的分支 <code>%[2]s
|
||||
push_tag=推送了標籤 <a href="%s/src/%s">%[2]s</a> 到 <a href="%[1]s">%[3]s</a>
|
||||
delete_tag=已經刪除在 <a href="%[1]s">%[3]s</a> 上的標籤 <code>%[2]s</code>
|
||||
fork_repo=已經 fork 一個 repository 到 <a href="%s">%s</a>
|
||||
mirror_sync_push=synced commits to <a href="%[1]s/src/%[2]s">%[3]s</a> at <a href="%[1]s">%[4]s</a> from mirror
|
||||
mirror_sync_create=synced new reference <a href="%s/src/%s">%[2]s</a> to <a href="%[1]s">%[3]s</a> from mirror
|
||||
mirror_sync_delete=synced and deleted reference <code>%[2]s</code> at <a href="%[1]s">%[3]s</a> from mirror
|
||||
mirror_sync_push=已經從鏡像同步了提交 <a href="%[1]s/src/%[2]s">%[3]s</a> 於 <a href="%[1]s">%[4]s</a>
|
||||
mirror_sync_create=已經從鏡像同步了參考 <a href="%s/src/%s">%[2]s</a> 到 <a href="%[1]s">%[3]s</a>
|
||||
mirror_sync_delete=已經從鏡像同步並移除了參考 <code>%[2]s</code> 於 <a href="%[1]s">%[3]s</a>
|
||||
|
||||
[tool]
|
||||
ago=之前
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -23,7 +23,9 @@ rm -r $GOPATH
|
||||
# Remove build deps
|
||||
apk --no-progress del build-deps
|
||||
|
||||
# Create git user for Gogs
|
||||
addgroup -S git
|
||||
adduser -G git -H -D -g 'Gogs Git User' git -h /data/git -s /bin/bash && usermod -p '*' git && passwd -u git
|
||||
echo "export GOGS_CUSTOM=${GOGS_CUSTOM}" >> /etc/profile
|
||||
# Move to final place
|
||||
mv /app/gogs/build/gogs /app/gogs/
|
||||
|
||||
# Cleanup go
|
||||
rm -rf /tmp/go
|
||||
rm -rf /usr/local/go
|
||||
|
||||
@@ -4,8 +4,10 @@
|
||||
set -x
|
||||
set -e
|
||||
|
||||
# Move to final place
|
||||
mv /app/gogs/build/gogs /app/gogs/
|
||||
# Create git user for Gogs
|
||||
addgroup -S git
|
||||
adduser -G git -H -D -g 'Gogs Git User' git -h /data/git -s /bin/bash && usermod -p '*' git && passwd -u git
|
||||
echo "export GOGS_CUSTOM=${GOGS_CUSTOM}" >> /etc/profile
|
||||
|
||||
# Final cleaning
|
||||
rm -rf /app/gogs/build
|
||||
@@ -14,6 +16,3 @@ rm /app/gogs/docker/build-go.sh
|
||||
rm /app/gogs/docker/finalize.sh
|
||||
rm /app/gogs/docker/nsswitch.conf
|
||||
rm /app/gogs/docker/README.md
|
||||
|
||||
rm -rf /tmp/go
|
||||
rm -rf /usr/local/go
|
||||
|
||||
@@ -19,5 +19,8 @@ ln -sfn /data/gogs/data ./data
|
||||
# Backward Compatibility with Gogs Container v0.6.15
|
||||
ln -sfn /data/git /home/git
|
||||
|
||||
chown -R git:git /data /app/gogs ~git/
|
||||
# Only chown for the first time, '/data/gogs/conf/app.ini' must exist inside Docker after installation
|
||||
if ! test -d /data/gogs/conf/app.ini; then
|
||||
chown -R git:git /data /app/gogs ~git/
|
||||
fi
|
||||
chmod 0755 /data /data/gogs ~git/
|
||||
|
||||
5
gogs.go
5
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,7 +16,7 @@ import (
|
||||
"github.com/gogs/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
const APP_VER = "0.11.53.0603"
|
||||
const APP_VER = "0.11.86.0130"
|
||||
|
||||
func init() {
|
||||
setting.AppVer = APP_VER
|
||||
@@ -37,6 +37,5 @@ func main() {
|
||||
cmd.Backup,
|
||||
cmd.Restore,
|
||||
}
|
||||
app.Flags = append(app.Flags, []cli.Flag{}...)
|
||||
app.Run(os.Args)
|
||||
}
|
||||
|
||||
@@ -237,6 +237,6 @@ func (repo *Repository) recalculateAccesses(e Engine) error {
|
||||
}
|
||||
|
||||
// RecalculateAccesses recalculates all accesses for repository.
|
||||
func (r *Repository) RecalculateAccesses() error {
|
||||
return r.recalculateAccesses(x)
|
||||
func (repo *Repository) RecalculateAccesses() error {
|
||||
return repo.recalculateAccesses(x)
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"path"
|
||||
"regexp"
|
||||
@@ -15,6 +14,7 @@ import (
|
||||
|
||||
"github.com/Unknwon/com"
|
||||
"github.com/go-xorm/xorm"
|
||||
"github.com/json-iterator/go"
|
||||
log "gopkg.in/clog.v1"
|
||||
|
||||
"github.com/gogs/git-module"
|
||||
@@ -58,20 +58,15 @@ var (
|
||||
IssueCloseKeywords = []string{"close", "closes", "closed", "fix", "fixes", "fixed", "resolve", "resolves", "resolved"}
|
||||
IssueReopenKeywords = []string{"reopen", "reopens", "reopened"}
|
||||
|
||||
IssueCloseKeywordsPat, IssueReopenKeywordsPat *regexp.Regexp
|
||||
IssueReferenceKeywordsPat *regexp.Regexp
|
||||
IssueCloseKeywordsPat = regexp.MustCompile(assembleKeywordsPattern(IssueCloseKeywords))
|
||||
IssueReopenKeywordsPat = regexp.MustCompile(assembleKeywordsPattern(IssueReopenKeywords))
|
||||
IssueReferenceKeywordsPat = regexp.MustCompile(`(?i)(?:)(^| )\S+`)
|
||||
)
|
||||
|
||||
func assembleKeywordsPattern(words []string) string {
|
||||
return fmt.Sprintf(`(?i)(?:%s) \S+`, strings.Join(words, "|"))
|
||||
}
|
||||
|
||||
func init() {
|
||||
IssueCloseKeywordsPat = regexp.MustCompile(assembleKeywordsPattern(IssueCloseKeywords))
|
||||
IssueReopenKeywordsPat = regexp.MustCompile(assembleKeywordsPattern(IssueReopenKeywords))
|
||||
IssueReferenceKeywordsPat = regexp.MustCompile(`(?i)(?:)(^| )\S+`)
|
||||
}
|
||||
|
||||
// Action represents user operation type and other information to repository,
|
||||
// it implemented interface base.Actioner so that can be used in template render.
|
||||
type Action struct {
|
||||
@@ -80,14 +75,14 @@ type Action struct {
|
||||
OpType ActionType
|
||||
ActUserID int64 // Doer user ID
|
||||
ActUserName string // Doer user name
|
||||
ActAvatar string `xorm:"-"`
|
||||
ActAvatar string `xorm:"-" json:"-"`
|
||||
RepoID int64 `xorm:"INDEX"`
|
||||
RepoUserName string
|
||||
RepoName string
|
||||
RefName string
|
||||
IsPrivate bool `xorm:"NOT NULL DEFAULT false"`
|
||||
Content string `xorm:"TEXT"`
|
||||
Created time.Time `xorm:"-"`
|
||||
Created time.Time `xorm:"-" json:"-"`
|
||||
CreatedUnix int64
|
||||
}
|
||||
|
||||
@@ -492,8 +487,11 @@ func CommitRepoAction(opts CommitRepoActionOptions) error {
|
||||
opts.Commits.CompareURL = repo.ComposeCompareURL(opts.OldCommitID, opts.NewCommitID)
|
||||
}
|
||||
|
||||
if err = UpdateIssuesCommit(pusher, repo, opts.Commits.Commits); err != nil {
|
||||
log.Error(2, "UpdateIssuesCommit: %v", err)
|
||||
// Only update issues via commits when internal issue tracker is enabled
|
||||
if repo.EnableIssues && !repo.EnableExternalTracker {
|
||||
if err = UpdateIssuesCommit(pusher, repo, opts.Commits.Commits); err != nil {
|
||||
log.Error(2, "UpdateIssuesCommit: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -501,7 +499,7 @@ func CommitRepoAction(opts CommitRepoActionOptions) error {
|
||||
opts.Commits.Commits = opts.Commits.Commits[:setting.UI.FeedMaxCommitNum]
|
||||
}
|
||||
|
||||
data, err := json.Marshal(opts.Commits)
|
||||
data, err := jsoniter.Marshal(opts.Commits)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Marshal: %v", err)
|
||||
}
|
||||
@@ -717,7 +715,7 @@ func MirrorSyncPushAction(repo *Repository, opts MirrorSyncPushActionOptions) er
|
||||
return fmt.Errorf("PrepareWebhooks: %v", err)
|
||||
}
|
||||
|
||||
data, err := json.Marshal(opts.Commits)
|
||||
data, err := jsoniter.Marshal(opts.Commits)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@ package models
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
@@ -15,7 +14,6 @@ import (
|
||||
"github.com/go-xorm/xorm"
|
||||
log "gopkg.in/clog.v1"
|
||||
|
||||
"github.com/gogs/gogs/pkg/setting"
|
||||
"github.com/gogs/gogs/pkg/tool"
|
||||
)
|
||||
|
||||
@@ -30,7 +28,7 @@ type Notice struct {
|
||||
ID int64
|
||||
Type NoticeType
|
||||
Description string `xorm:"TEXT"`
|
||||
Created time.Time `xorm:"-"`
|
||||
Created time.Time `xorm:"-" json:"-"`
|
||||
CreatedUnix int64
|
||||
}
|
||||
|
||||
@@ -52,9 +50,9 @@ func (n *Notice) TrStr() string {
|
||||
|
||||
// CreateNotice creates new system notice.
|
||||
func CreateNotice(tp NoticeType, desc string) error {
|
||||
// prevent panic if database connection is not available at this point
|
||||
// Prevent panic if database connection is not available at this point
|
||||
if x == nil {
|
||||
return fmt.Errorf("Could not save notice due database connection not being available: %d %s", tp, desc)
|
||||
return fmt.Errorf("could not save notice due database connection not being available: %d %s", tp, desc)
|
||||
}
|
||||
|
||||
n := &Notice{
|
||||
@@ -73,24 +71,11 @@ func CreateRepositoryNotice(desc string) error {
|
||||
// RemoveAllWithNotice removes all directories in given path and
|
||||
// creates a system notice when error occurs.
|
||||
func RemoveAllWithNotice(title, path string) {
|
||||
var err error
|
||||
// LEGACY [Go 1.7, 0.12]: workaround for Go not being able to remove read-only files/folders: https://github.com/golang/go/issues/9606
|
||||
// this bug should be fixed on Go 1.7, so the workaround should be removed when Gogs don't support Go 1.6 anymore:
|
||||
// https://github.com/golang/go/commit/2ffb3e5d905b5622204d199128dec06cefd57790
|
||||
// Note: Windows complains when delete target does not exist, therefore we can skip deletion in such cases.
|
||||
if setting.IsWindows && com.IsExist(path) {
|
||||
// converting "/" to "\" in path on Windows
|
||||
path = strings.Replace(path, "/", "\\", -1)
|
||||
err = exec.Command("cmd", "/C", "rmdir", "/S", "/Q", path).Run()
|
||||
} else {
|
||||
err = os.RemoveAll(path)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
if err := os.RemoveAll(path); err != nil {
|
||||
desc := fmt.Sprintf("%s [%s]: %v", title, path, err)
|
||||
log.Warn(desc)
|
||||
if err = CreateRepositoryNotice(desc); err != nil {
|
||||
log.Error(4, "CreateRepositoryNotice: %v", err)
|
||||
log.Error(2, "CreateRepositoryNotice: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ type Attachment struct {
|
||||
ReleaseID int64 `xorm:"INDEX"`
|
||||
Name string
|
||||
|
||||
Created time.Time `xorm:"-"`
|
||||
Created time.Time `xorm:"-" json:"-"`
|
||||
CreatedUnix int64
|
||||
}
|
||||
|
||||
@@ -165,7 +165,6 @@ func DeleteAttachments(attachments []*Attachment, remove bool) (int, error) {
|
||||
// DeleteAttachmentsByIssue deletes all attachments associated with the given issue.
|
||||
func DeleteAttachmentsByIssue(issueId int64, remove bool) (int, error) {
|
||||
attachments, err := GetAttachmentsByIssueID(issueId)
|
||||
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
@@ -176,7 +175,6 @@ func DeleteAttachmentsByIssue(issueId int64, remove bool) (int, error) {
|
||||
// DeleteAttachmentsByComment deletes all attachments associated with the given comment.
|
||||
func DeleteAttachmentsByComment(commentId int64, remove bool) (int, error) {
|
||||
attachments, err := GetAttachmentsByCommentID(commentId)
|
||||
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
@@ -52,26 +52,26 @@ type Comment struct {
|
||||
ID int64
|
||||
Type CommentType
|
||||
PosterID int64
|
||||
Poster *User `xorm:"-"`
|
||||
Poster *User `xorm:"-" json:"-"`
|
||||
IssueID int64 `xorm:"INDEX"`
|
||||
Issue *Issue `xorm:"-"`
|
||||
Issue *Issue `xorm:"-" json:"-"`
|
||||
CommitID int64
|
||||
Line int64
|
||||
Content string `xorm:"TEXT"`
|
||||
RenderedContent string `xorm:"-"`
|
||||
RenderedContent string `xorm:"-" json:"-"`
|
||||
|
||||
Created time.Time `xorm:"-"`
|
||||
Created time.Time `xorm:"-" json:"-"`
|
||||
CreatedUnix int64
|
||||
Updated time.Time `xorm:"-"`
|
||||
Updated time.Time `xorm:"-" json:"-"`
|
||||
UpdatedUnix int64
|
||||
|
||||
// Reference issue in commit message
|
||||
CommitSHA string `xorm:"VARCHAR(40)"`
|
||||
|
||||
Attachments []*Attachment `xorm:"-"`
|
||||
Attachments []*Attachment `xorm:"-" json:"-"`
|
||||
|
||||
// For view issue page.
|
||||
ShowTag CommentTag `xorm:"-"`
|
||||
ShowTag CommentTag `xorm:"-" json:"-"`
|
||||
}
|
||||
|
||||
func (c *Comment) BeforeInsert() {
|
||||
@@ -132,14 +132,6 @@ func (c *Comment) LoadAttributes() error {
|
||||
return c.loadAttributes(x)
|
||||
}
|
||||
|
||||
func (c *Comment) AfterDelete() {
|
||||
_, err := DeleteAttachmentsByComment(c.ID, true)
|
||||
|
||||
if err != nil {
|
||||
log.Info("Could not delete files for comment %d on issue #%d: %s", c.ID, c.IssueID, err)
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Comment) HTMLURL() string {
|
||||
return fmt.Sprintf("%s#issuecomment-%d", c.Issue.HTMLURL(), c.ID)
|
||||
}
|
||||
@@ -508,7 +500,7 @@ func DeleteCommentByID(doer *User, id int64) error {
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err = sess.Id(comment.ID).Delete(new(Comment)); err != nil {
|
||||
if _, err = sess.ID(comment.ID).Delete(new(Comment)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -519,7 +511,12 @@ func DeleteCommentByID(doer *User, id int64) error {
|
||||
}
|
||||
|
||||
if err = sess.Commit(); err != nil {
|
||||
return fmt.Errorf("Commit: %v", err)
|
||||
return fmt.Errorf("commit: %v", err)
|
||||
}
|
||||
|
||||
_, err = DeleteAttachmentsByComment(comment.ID, true)
|
||||
if err != nil {
|
||||
log.Error(2, "Failed to delete attachments by comment[%d]: %v", comment.ID, err)
|
||||
}
|
||||
|
||||
if err = comment.Issue.LoadAttributes(); err != nil {
|
||||
|
||||
@@ -6,6 +6,8 @@ package errors
|
||||
|
||||
import "errors"
|
||||
|
||||
var InternalServerError = errors.New("internal server error")
|
||||
|
||||
// New is a wrapper of real errors.New function.
|
||||
func New(text string) error {
|
||||
return errors.New(text)
|
||||
|
||||
21
models/errors/org.go
Normal file
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)
|
||||
}
|
||||
107
models/issue.go
107
models/issue.go
@@ -28,34 +28,34 @@ var (
|
||||
type Issue struct {
|
||||
ID int64
|
||||
RepoID int64 `xorm:"INDEX UNIQUE(repo_index)"`
|
||||
Repo *Repository `xorm:"-"`
|
||||
Repo *Repository `xorm:"-" json:"-"`
|
||||
Index int64 `xorm:"UNIQUE(repo_index)"` // Index in one repository.
|
||||
PosterID int64
|
||||
Poster *User `xorm:"-"`
|
||||
Poster *User `xorm:"-" json:"-"`
|
||||
Title string `xorm:"name"`
|
||||
Content string `xorm:"TEXT"`
|
||||
RenderedContent string `xorm:"-"`
|
||||
Labels []*Label `xorm:"-"`
|
||||
RenderedContent string `xorm:"-" json:"-"`
|
||||
Labels []*Label `xorm:"-" json:"-"`
|
||||
MilestoneID int64
|
||||
Milestone *Milestone `xorm:"-"`
|
||||
Milestone *Milestone `xorm:"-" json:"-"`
|
||||
Priority int
|
||||
AssigneeID int64
|
||||
Assignee *User `xorm:"-"`
|
||||
Assignee *User `xorm:"-" json:"-"`
|
||||
IsClosed bool
|
||||
IsRead bool `xorm:"-"`
|
||||
IsRead bool `xorm:"-" json:"-"`
|
||||
IsPull bool // Indicates whether is a pull request or not.
|
||||
PullRequest *PullRequest `xorm:"-"`
|
||||
PullRequest *PullRequest `xorm:"-" json:"-"`
|
||||
NumComments int
|
||||
|
||||
Deadline time.Time `xorm:"-"`
|
||||
Deadline time.Time `xorm:"-" json:"-"`
|
||||
DeadlineUnix int64
|
||||
Created time.Time `xorm:"-"`
|
||||
Created time.Time `xorm:"-" json:"-"`
|
||||
CreatedUnix int64
|
||||
Updated time.Time `xorm:"-"`
|
||||
Updated time.Time `xorm:"-" json:"-"`
|
||||
UpdatedUnix int64
|
||||
|
||||
Attachments []*Attachment `xorm:"-"`
|
||||
Comments []*Comment `xorm:"-"`
|
||||
Attachments []*Attachment `xorm:"-" json:"-"`
|
||||
Comments []*Comment `xorm:"-" json:"-"`
|
||||
}
|
||||
|
||||
func (issue *Issue) BeforeInsert() {
|
||||
@@ -160,8 +160,8 @@ func (issue *Issue) HTMLURL() string {
|
||||
}
|
||||
|
||||
// State returns string representation of issue status.
|
||||
func (i *Issue) State() api.StateType {
|
||||
if i.IsClosed {
|
||||
func (issue *Issue) State() api.StateType {
|
||||
if issue.IsClosed {
|
||||
return api.STATE_CLOSED
|
||||
}
|
||||
return api.STATE_OPEN
|
||||
@@ -208,22 +208,22 @@ func (issue *Issue) APIFormat() *api.Issue {
|
||||
}
|
||||
|
||||
// HashTag returns unique hash tag for issue.
|
||||
func (i *Issue) HashTag() string {
|
||||
return "issue-" + com.ToStr(i.ID)
|
||||
func (issue *Issue) HashTag() string {
|
||||
return "issue-" + com.ToStr(issue.ID)
|
||||
}
|
||||
|
||||
// IsPoster returns true if given user by ID is the poster.
|
||||
func (i *Issue) IsPoster(uid int64) bool {
|
||||
return i.PosterID == uid
|
||||
func (issue *Issue) IsPoster(uid int64) bool {
|
||||
return issue.PosterID == uid
|
||||
}
|
||||
|
||||
func (i *Issue) hasLabel(e Engine, labelID int64) bool {
|
||||
return hasIssueLabel(e, i.ID, labelID)
|
||||
func (issue *Issue) hasLabel(e Engine, labelID int64) bool {
|
||||
return hasIssueLabel(e, issue.ID, labelID)
|
||||
}
|
||||
|
||||
// HasLabel returns true if issue has been labeled by given ID.
|
||||
func (i *Issue) HasLabel(labelID int64) bool {
|
||||
return i.hasLabel(x, labelID)
|
||||
func (issue *Issue) HasLabel(labelID int64) bool {
|
||||
return issue.hasLabel(x, labelID)
|
||||
}
|
||||
|
||||
func (issue *Issue) sendLabelUpdatedWebhook(doer *User) {
|
||||
@@ -255,8 +255,8 @@ func (issue *Issue) sendLabelUpdatedWebhook(doer *User) {
|
||||
}
|
||||
}
|
||||
|
||||
func (i *Issue) addLabel(e *xorm.Session, label *Label) error {
|
||||
return newIssueLabel(e, i, label)
|
||||
func (issue *Issue) addLabel(e *xorm.Session, label *Label) error {
|
||||
return newIssueLabel(e, issue, label)
|
||||
}
|
||||
|
||||
// AddLabel adds a new label to the issue.
|
||||
@@ -314,8 +314,13 @@ func (issue *Issue) clearLabels(e *xorm.Session) (err error) {
|
||||
return fmt.Errorf("getLabels: %v", err)
|
||||
}
|
||||
|
||||
// NOTE: issue.removeLabel slices issue.Labels, so we need to create another slice to be unaffected.
|
||||
labels := make([]*Label, len(issue.Labels))
|
||||
for i := range issue.Labels {
|
||||
if err = issue.removeLabel(e, issue.Labels[i]); err != nil {
|
||||
labels[i] = issue.Labels[i]
|
||||
}
|
||||
for i := range labels {
|
||||
if err = issue.removeLabel(e, labels[i]); err != nil {
|
||||
return fmt.Errorf("removeLabel: %v", err)
|
||||
}
|
||||
}
|
||||
@@ -384,12 +389,12 @@ func (issue *Issue) ReplaceLabels(labels []*Label) (err error) {
|
||||
return sess.Commit()
|
||||
}
|
||||
|
||||
func (i *Issue) GetAssignee() (err error) {
|
||||
if i.AssigneeID == 0 || i.Assignee != nil {
|
||||
func (issue *Issue) GetAssignee() (err error) {
|
||||
if issue.AssigneeID == 0 || issue.Assignee != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
i.Assignee, err = GetUserByID(i.AssigneeID)
|
||||
issue.Assignee, err = GetUserByID(issue.AssigneeID)
|
||||
if errors.IsUserNotExist(err) {
|
||||
return nil
|
||||
}
|
||||
@@ -397,12 +402,12 @@ func (i *Issue) GetAssignee() (err error) {
|
||||
}
|
||||
|
||||
// ReadBy sets issue to be read by given user.
|
||||
func (i *Issue) ReadBy(uid int64) error {
|
||||
return UpdateIssueUserByRead(uid, i.ID)
|
||||
func (issue *Issue) ReadBy(uid int64) error {
|
||||
return UpdateIssueUserByRead(uid, issue.ID)
|
||||
}
|
||||
|
||||
func updateIssueCols(e Engine, issue *Issue, cols ...string) error {
|
||||
_, err := e.Id(issue.ID).Cols(cols...).Update(issue)
|
||||
_, err := e.ID(issue.ID).Cols(cols...).Update(issue)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -411,41 +416,41 @@ func UpdateIssueCols(issue *Issue, cols ...string) error {
|
||||
return updateIssueCols(x, issue, cols...)
|
||||
}
|
||||
|
||||
func (i *Issue) changeStatus(e *xorm.Session, doer *User, repo *Repository, isClosed bool) (err error) {
|
||||
func (issue *Issue) changeStatus(e *xorm.Session, doer *User, repo *Repository, isClosed bool) (err error) {
|
||||
// Nothing should be performed if current status is same as target status
|
||||
if i.IsClosed == isClosed {
|
||||
if issue.IsClosed == isClosed {
|
||||
return nil
|
||||
}
|
||||
i.IsClosed = isClosed
|
||||
issue.IsClosed = isClosed
|
||||
|
||||
if err = updateIssueCols(e, i, "is_closed"); err != nil {
|
||||
if err = updateIssueCols(e, issue, "is_closed"); err != nil {
|
||||
return err
|
||||
} else if err = updateIssueUsersByStatus(e, i.ID, isClosed); err != nil {
|
||||
} else if err = updateIssueUsersByStatus(e, issue.ID, isClosed); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Update issue count of labels
|
||||
if err = i.getLabels(e); err != nil {
|
||||
if err = issue.getLabels(e); err != nil {
|
||||
return err
|
||||
}
|
||||
for idx := range i.Labels {
|
||||
if i.IsClosed {
|
||||
i.Labels[idx].NumClosedIssues++
|
||||
for idx := range issue.Labels {
|
||||
if issue.IsClosed {
|
||||
issue.Labels[idx].NumClosedIssues++
|
||||
} else {
|
||||
i.Labels[idx].NumClosedIssues--
|
||||
issue.Labels[idx].NumClosedIssues--
|
||||
}
|
||||
if err = updateLabel(e, i.Labels[idx]); err != nil {
|
||||
if err = updateLabel(e, issue.Labels[idx]); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// Update issue count of milestone
|
||||
if err = changeMilestoneIssueStats(e, i); err != nil {
|
||||
if err = changeMilestoneIssueStats(e, issue); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// New action comment
|
||||
if _, err = createStatusComment(e, doer, repo, i); err != nil {
|
||||
if _, err = createStatusComment(e, doer, repo, issue); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -799,9 +804,9 @@ func GetIssueByRef(ref string) (*Issue, error) {
|
||||
return nil, errors.InvalidIssueReference{ref}
|
||||
}
|
||||
|
||||
index, err := com.StrTo(ref[n+1:]).Int64()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
index := com.StrTo(ref[n+1:]).MustInt64()
|
||||
if index == 0 {
|
||||
return nil, errors.IssueNotExist{}
|
||||
}
|
||||
|
||||
repo, err := GetRepositoryByRef(ref[:n])
|
||||
@@ -843,7 +848,7 @@ func GetIssueByIndex(repoID, index int64) (*Issue, error) {
|
||||
|
||||
func getRawIssueByID(e Engine, id int64) (*Issue, error) {
|
||||
issue := new(Issue)
|
||||
has, err := e.Id(id).Get(issue)
|
||||
has, err := e.ID(id).Get(issue)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if !has {
|
||||
@@ -1354,7 +1359,7 @@ func GetRepoIssueStats(repoID, userID int64, filterMode FilterMode, isPull bool)
|
||||
}
|
||||
|
||||
func updateIssue(e Engine, issue *Issue) error {
|
||||
_, err := e.Id(issue.ID).AllCols().Update(issue)
|
||||
_, err := e.ID(issue.ID).AllCols().Update(issue)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -1423,7 +1428,7 @@ func updateIssueUsersByMentions(e Engine, issueID int64, uids []int64) error {
|
||||
|
||||
iu.IsMentioned = true
|
||||
if has {
|
||||
_, err = e.Id(iu.ID).AllCols().Update(iu)
|
||||
_, err = e.ID(iu.ID).AllCols().Update(iu)
|
||||
} else {
|
||||
_, err = e.Insert(iu)
|
||||
}
|
||||
|
||||
@@ -60,8 +60,8 @@ type Label struct {
|
||||
Color string `xorm:"VARCHAR(7)"`
|
||||
NumIssues int
|
||||
NumClosedIssues int
|
||||
NumOpenIssues int `xorm:"-"`
|
||||
IsChecked bool `xorm:"-"`
|
||||
NumOpenIssues int `xorm:"-" json:"-"`
|
||||
IsChecked bool `xorm:"-" json:"-"`
|
||||
}
|
||||
|
||||
func (label *Label) APIFormat() *api.Label {
|
||||
@@ -196,7 +196,7 @@ func GetLabelsByIssueID(issueID int64) ([]*Label, error) {
|
||||
}
|
||||
|
||||
func updateLabel(e Engine, l *Label) error {
|
||||
_, err := e.Id(l.ID).AllCols().Update(l)
|
||||
_, err := e.ID(l.ID).AllCols().Update(l)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -221,7 +221,7 @@ func DeleteLabel(repoID, labelID int64) error {
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err = sess.Id(labelID).Delete(new(Label)); err != nil {
|
||||
if _, err = sess.ID(labelID).Delete(new(Label)); err != nil {
|
||||
return err
|
||||
} else if _, err = sess.Where("label_id = ?", labelID).Delete(new(IssueLabel)); err != nil {
|
||||
return err
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
// Use of this source code is governed by a MIT-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// FIXME: Put this file into its own package and separate into different files based on login sources.
|
||||
package models
|
||||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/smtp"
|
||||
"net/textproto"
|
||||
@@ -20,10 +20,12 @@ import (
|
||||
"github.com/go-macaron/binding"
|
||||
"github.com/go-xorm/core"
|
||||
"github.com/go-xorm/xorm"
|
||||
"github.com/json-iterator/go"
|
||||
log "gopkg.in/clog.v1"
|
||||
"gopkg.in/ini.v1"
|
||||
|
||||
"github.com/gogs/gogs/models/errors"
|
||||
"github.com/gogs/gogs/pkg/auth/github"
|
||||
"github.com/gogs/gogs/pkg/auth/ldap"
|
||||
"github.com/gogs/gogs/pkg/auth/pam"
|
||||
"github.com/gogs/gogs/pkg/setting"
|
||||
@@ -39,13 +41,15 @@ const (
|
||||
LOGIN_SMTP // 3
|
||||
LOGIN_PAM // 4
|
||||
LOGIN_DLDAP // 5
|
||||
LOGIN_GITHUB // 6
|
||||
)
|
||||
|
||||
var LoginNames = map[LoginType]string{
|
||||
LOGIN_LDAP: "LDAP (via BindDN)",
|
||||
LOGIN_DLDAP: "LDAP (simple auth)", // Via direct bind
|
||||
LOGIN_SMTP: "SMTP",
|
||||
LOGIN_PAM: "PAM",
|
||||
LOGIN_LDAP: "LDAP (via BindDN)",
|
||||
LOGIN_DLDAP: "LDAP (simple auth)", // Via direct bind
|
||||
LOGIN_SMTP: "SMTP",
|
||||
LOGIN_PAM: "PAM",
|
||||
LOGIN_GITHUB: "GitHub",
|
||||
}
|
||||
|
||||
var SecurityProtocolNames = map[ldap.SecurityProtocol]string{
|
||||
@@ -59,6 +63,7 @@ var (
|
||||
_ core.Conversion = &LDAPConfig{}
|
||||
_ core.Conversion = &SMTPConfig{}
|
||||
_ core.Conversion = &PAMConfig{}
|
||||
_ core.Conversion = &GitHubConfig{}
|
||||
)
|
||||
|
||||
type LDAPConfig struct {
|
||||
@@ -66,11 +71,11 @@ type LDAPConfig struct {
|
||||
}
|
||||
|
||||
func (cfg *LDAPConfig) FromDB(bs []byte) error {
|
||||
return json.Unmarshal(bs, &cfg)
|
||||
return jsoniter.Unmarshal(bs, &cfg)
|
||||
}
|
||||
|
||||
func (cfg *LDAPConfig) ToDB() ([]byte, error) {
|
||||
return json.Marshal(cfg)
|
||||
return jsoniter.Marshal(cfg)
|
||||
}
|
||||
|
||||
func (cfg *LDAPConfig) SecurityProtocolName() string {
|
||||
@@ -87,11 +92,11 @@ type SMTPConfig struct {
|
||||
}
|
||||
|
||||
func (cfg *SMTPConfig) FromDB(bs []byte) error {
|
||||
return json.Unmarshal(bs, cfg)
|
||||
return jsoniter.Unmarshal(bs, cfg)
|
||||
}
|
||||
|
||||
func (cfg *SMTPConfig) ToDB() ([]byte, error) {
|
||||
return json.Marshal(cfg)
|
||||
return jsoniter.Marshal(cfg)
|
||||
}
|
||||
|
||||
type PAMConfig struct {
|
||||
@@ -99,11 +104,23 @@ type PAMConfig struct {
|
||||
}
|
||||
|
||||
func (cfg *PAMConfig) FromDB(bs []byte) error {
|
||||
return json.Unmarshal(bs, &cfg)
|
||||
return jsoniter.Unmarshal(bs, &cfg)
|
||||
}
|
||||
|
||||
func (cfg *PAMConfig) ToDB() ([]byte, error) {
|
||||
return json.Marshal(cfg)
|
||||
return jsoniter.Marshal(cfg)
|
||||
}
|
||||
|
||||
type GitHubConfig struct {
|
||||
APIEndpoint string // GitHub service (e.g. https://api.github.com/)
|
||||
}
|
||||
|
||||
func (cfg *GitHubConfig) FromDB(bs []byte) error {
|
||||
return jsoniter.Unmarshal(bs, &cfg)
|
||||
}
|
||||
|
||||
func (cfg *GitHubConfig) ToDB() ([]byte, error) {
|
||||
return jsoniter.Marshal(cfg)
|
||||
}
|
||||
|
||||
// AuthSourceFile contains information of an authentication source file.
|
||||
@@ -133,14 +150,15 @@ type LoginSource struct {
|
||||
Type LoginType
|
||||
Name string `xorm:"UNIQUE"`
|
||||
IsActived bool `xorm:"NOT NULL DEFAULT false"`
|
||||
IsDefault bool `xorm:"DEFAULT false"`
|
||||
Cfg core.Conversion `xorm:"TEXT"`
|
||||
|
||||
Created time.Time `xorm:"-"`
|
||||
Created time.Time `xorm:"-" json:"-"`
|
||||
CreatedUnix int64
|
||||
Updated time.Time `xorm:"-"`
|
||||
Updated time.Time `xorm:"-" json:"-"`
|
||||
UpdatedUnix int64
|
||||
|
||||
LocalFile *AuthSourceFile `xorm:"-"`
|
||||
LocalFile *AuthSourceFile `xorm:"-" json:"-"`
|
||||
}
|
||||
|
||||
func (s *LoginSource) BeforeInsert() {
|
||||
@@ -173,6 +191,8 @@ func (s *LoginSource) BeforeSet(colName string, val xorm.Cell) {
|
||||
s.Cfg = new(SMTPConfig)
|
||||
case LOGIN_PAM:
|
||||
s.Cfg = new(PAMConfig)
|
||||
case LOGIN_GITHUB:
|
||||
s.Cfg = new(GitHubConfig)
|
||||
default:
|
||||
panic("unrecognized login source type: " + com.ToStr(*val))
|
||||
}
|
||||
@@ -208,6 +228,10 @@ func (s *LoginSource) IsPAM() bool {
|
||||
return s.Type == LOGIN_PAM
|
||||
}
|
||||
|
||||
func (s *LoginSource) IsGitHub() bool {
|
||||
return s.Type == LOGIN_GITHUB
|
||||
}
|
||||
|
||||
func (s *LoginSource) HasTLS() bool {
|
||||
return ((s.IsLDAP() || s.IsDLDAP()) &&
|
||||
s.LDAP().SecurityProtocol > ldap.SECURITY_PROTOCOL_UNENCRYPTED) ||
|
||||
@@ -248,6 +272,10 @@ func (s *LoginSource) PAM() *PAMConfig {
|
||||
return s.Cfg.(*PAMConfig)
|
||||
}
|
||||
|
||||
func (s *LoginSource) GitHub() *GitHubConfig {
|
||||
return s.Cfg.(*GitHubConfig)
|
||||
}
|
||||
|
||||
func CreateLoginSource(source *LoginSource) error {
|
||||
has, err := x.Get(&LoginSource{Name: source.Name})
|
||||
if err != nil {
|
||||
@@ -257,7 +285,12 @@ func CreateLoginSource(source *LoginSource) error {
|
||||
}
|
||||
|
||||
_, err = x.Insert(source)
|
||||
return err
|
||||
if err != nil {
|
||||
return err
|
||||
} else if source.IsDefault {
|
||||
return ResetNonDefaultLoginSources(source)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// LoginSources returns all login sources defined.
|
||||
@@ -291,23 +324,48 @@ func GetLoginSourceByID(id int64) (*LoginSource, error) {
|
||||
return source, nil
|
||||
}
|
||||
|
||||
// ResetNonDefaultLoginSources clean other default source flag
|
||||
func ResetNonDefaultLoginSources(source *LoginSource) error {
|
||||
// update changes to DB
|
||||
if _, err := x.NotIn("id", []int64{source.ID}).Cols("is_default").Update(&LoginSource{IsDefault: false}); err != nil {
|
||||
return err
|
||||
}
|
||||
// write changes to local authentications
|
||||
for i := range localLoginSources.sources {
|
||||
if localLoginSources.sources[i].LocalFile != nil && localLoginSources.sources[i].ID != source.ID {
|
||||
localLoginSources.sources[i].LocalFile.SetGeneral("is_default", "false")
|
||||
if err := localLoginSources.sources[i].LocalFile.SetConfig(source.Cfg); err != nil {
|
||||
return fmt.Errorf("LocalFile.SetConfig: %v", err)
|
||||
} else if err = localLoginSources.sources[i].LocalFile.Save(); err != nil {
|
||||
return fmt.Errorf("LocalFile.Save: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
// flush memory so that web page can show the same behaviors
|
||||
localLoginSources.UpdateLoginSource(source)
|
||||
return nil
|
||||
}
|
||||
|
||||
// UpdateLoginSource updates information of login source to database or local file.
|
||||
func UpdateLoginSource(source *LoginSource) error {
|
||||
if source.LocalFile == nil {
|
||||
_, err := x.Id(source.ID).AllCols().Update(source)
|
||||
return err
|
||||
if _, err := x.Id(source.ID).AllCols().Update(source); err != nil {
|
||||
return err
|
||||
} else {
|
||||
return ResetNonDefaultLoginSources(source)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
source.LocalFile.SetGeneral("name", source.Name)
|
||||
source.LocalFile.SetGeneral("is_activated", com.ToStr(source.IsActived))
|
||||
source.LocalFile.SetGeneral("is_default", com.ToStr(source.IsDefault))
|
||||
if err := source.LocalFile.SetConfig(source.Cfg); err != nil {
|
||||
return fmt.Errorf("LocalFile.SetConfig: %v", err)
|
||||
} else if err = source.LocalFile.Save(); err != nil {
|
||||
return fmt.Errorf("LocalFile.Save: %v", err)
|
||||
}
|
||||
|
||||
localLoginSources.UpdateLoginSource(source)
|
||||
return nil
|
||||
return ResetNonDefaultLoginSources(source)
|
||||
}
|
||||
|
||||
func DeleteSource(source *LoginSource) error {
|
||||
@@ -361,7 +419,6 @@ func (s *LocalLoginSources) ActivatedList() []*LoginSource {
|
||||
if !s.sources[i].IsActived {
|
||||
continue
|
||||
}
|
||||
|
||||
source := &LoginSource{}
|
||||
*source = *s.sources[i]
|
||||
list = append(list, source)
|
||||
@@ -394,7 +451,8 @@ func (s *LocalLoginSources) UpdateLoginSource(source *LoginSource) {
|
||||
for i := range s.sources {
|
||||
if s.sources[i].ID == source.ID {
|
||||
*s.sources[i] = *source
|
||||
break
|
||||
} else if source.IsDefault {
|
||||
s.sources[i].IsDefault = false
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -429,6 +487,7 @@ func LoadAuthSources() {
|
||||
ID: s.Key("id").MustInt64(),
|
||||
Name: s.Key("name").String(),
|
||||
IsActived: s.Key("is_activated").MustBool(),
|
||||
IsDefault: s.Key("is_default").MustBool(),
|
||||
LocalFile: &AuthSourceFile{
|
||||
abspath: fpath,
|
||||
file: authSource,
|
||||
@@ -456,6 +515,9 @@ func LoadAuthSources() {
|
||||
case "pam":
|
||||
loginSource.Type = LOGIN_PAM
|
||||
loginSource.Cfg = &PAMConfig{}
|
||||
case "github":
|
||||
loginSource.Type = LOGIN_GITHUB
|
||||
loginSource.Cfg = &GitHubConfig{}
|
||||
default:
|
||||
log.Fatal(2, "Failed to load authentication source: unknown type '%s'", authType)
|
||||
}
|
||||
@@ -695,6 +757,41 @@ func LoginViaPAM(user *User, login, password string, sourceID int64, cfg *PAMCon
|
||||
return user, CreateUser(user)
|
||||
}
|
||||
|
||||
//________.__ __ ___ ___ ___.
|
||||
/// _____/|__|/ |_ / | \ __ _\_ |__
|
||||
/// \ ___| \ __\/ ~ \ | \ __ \
|
||||
//\ \_\ \ || | \ Y / | / \_\ \
|
||||
//\______ /__||__| \___|_ /|____/|___ /
|
||||
//\/ \/ \/
|
||||
|
||||
func LoginViaGitHub(user *User, login, password string, sourceID int64, cfg *GitHubConfig, autoRegister bool) (*User, error) {
|
||||
fullname, email, url, location, err := github.Authenticate(cfg.APIEndpoint, login, password)
|
||||
if err != nil {
|
||||
if strings.Contains(err.Error(), "401") {
|
||||
return nil, errors.UserNotExist{0, login}
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if !autoRegister {
|
||||
return user, nil
|
||||
}
|
||||
user = &User{
|
||||
LowerName: strings.ToLower(login),
|
||||
Name: login,
|
||||
FullName: fullname,
|
||||
Email: email,
|
||||
Website: url,
|
||||
Passwd: password,
|
||||
LoginType: LOGIN_GITHUB,
|
||||
LoginSource: sourceID,
|
||||
LoginName: login,
|
||||
IsActive: true,
|
||||
Location: location,
|
||||
}
|
||||
return user, CreateUser(user)
|
||||
}
|
||||
|
||||
func remoteUserLogin(user *User, login, password string, source *LoginSource, autoRegister bool) (*User, error) {
|
||||
if !source.IsActived {
|
||||
return nil, errors.LoginSourceNotActivated{source.ID}
|
||||
@@ -707,6 +804,8 @@ func remoteUserLogin(user *User, login, password string, source *LoginSource, au
|
||||
return LoginViaSMTP(user, login, password, source.ID, source.Cfg.(*SMTPConfig), autoRegister)
|
||||
case LOGIN_PAM:
|
||||
return LoginViaPAM(user, login, password, source.ID, source.Cfg.(*PAMConfig), autoRegister)
|
||||
case LOGIN_GITHUB:
|
||||
return LoginViaGitHub(user, login, password, source.ID, source.Cfg.(*GitHubConfig), autoRegister)
|
||||
}
|
||||
|
||||
return nil, errors.InvalidLoginSourceType{source.Type}
|
||||
|
||||
@@ -64,6 +64,10 @@ var migrations = []Migration{
|
||||
NewMigration("update repository sizes", updateRepositorySizes),
|
||||
// v16 -> v17:v0.10.31
|
||||
NewMigration("remove invalid protect branch whitelist", removeInvalidProtectBranchWhitelist),
|
||||
// v17 -> v18:v0.11.48
|
||||
NewMigration("store long text in repository description field", updateRepositoryDescriptionField),
|
||||
// v18 -> v19:v0.11.55
|
||||
NewMigration("clean unlinked webhook and hook_tasks", cleanUnlinkedWebhookAndHookTasks),
|
||||
}
|
||||
|
||||
// Migrate database to current version
|
||||
@@ -158,7 +162,7 @@ func generateOrgRandsAndSalt(x *xorm.Engine) (err error) {
|
||||
if org.Salt, err = tool.RandomString(10); err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err = sess.Id(org.ID).Update(org); err != nil {
|
||||
if _, err = sess.ID(org.ID).Update(org); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,12 +5,12 @@
|
||||
package migrations
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/Unknwon/com"
|
||||
"github.com/go-xorm/xorm"
|
||||
"github.com/json-iterator/go"
|
||||
)
|
||||
|
||||
func ldapUseSSLToSecurityProtocol(x *xorm.Engine) error {
|
||||
@@ -30,17 +30,17 @@ func ldapUseSSLToSecurityProtocol(x *xorm.Engine) error {
|
||||
|
||||
for _, result := range results {
|
||||
cfg := map[string]interface{}{}
|
||||
if err = json.Unmarshal(result["cfg"], &cfg); err != nil {
|
||||
return fmt.Errorf("decode JSON config: %v", err)
|
||||
if err = jsoniter.Unmarshal(result["cfg"], &cfg); err != nil {
|
||||
return fmt.Errorf("unmarshal JSON config: %v", err)
|
||||
}
|
||||
if com.ToStr(cfg["UseSSL"]) == "true" {
|
||||
cfg["SecurityProtocol"] = 1 // LDAPS
|
||||
}
|
||||
delete(cfg, "UseSSL")
|
||||
|
||||
data, err := json.Marshal(&cfg)
|
||||
data, err := jsoniter.Marshal(&cfg)
|
||||
if err != nil {
|
||||
return fmt.Errorf("encode JSON config: %v", err)
|
||||
return fmt.Errorf("marshal JSON config: %v", err)
|
||||
}
|
||||
|
||||
if _, err = sess.Exec("UPDATE `login_source` SET `cfg`=? WHERE `id`=?",
|
||||
|
||||
34
models/migrations/v18.go
Normal file
34
models/migrations/v18.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 migrations
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/go-xorm/xorm"
|
||||
|
||||
"github.com/gogs/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
func updateRepositoryDescriptionField(x *xorm.Engine) error {
|
||||
exist, err := x.IsTableExist("repository")
|
||||
if err != nil {
|
||||
return fmt.Errorf("IsTableExist: %v", err)
|
||||
} else if !exist {
|
||||
return nil
|
||||
}
|
||||
switch {
|
||||
case setting.UseMySQL:
|
||||
_, err = x.Exec("ALTER TABLE `repository` MODIFY `description` VARCHAR(512);")
|
||||
case setting.UseMSSQL:
|
||||
_, err = x.Exec("ALTER TABLE `repository` ALTER COLUMN `description` VARCHAR(512);")
|
||||
case setting.UsePostgreSQL:
|
||||
_, err = x.Exec("ALTER TABLE `repository` ALTER COLUMN `description` TYPE VARCHAR(512);")
|
||||
case setting.UseSQLite3:
|
||||
// Sqlite3 uses TEXT type by default for any string type field.
|
||||
// Keep this comment to mention that we don't missed any option.
|
||||
}
|
||||
return err
|
||||
}
|
||||
18
models/migrations/v19.go
Normal file
18
models/migrations/v19.go
Normal file
@@ -0,0 +1,18 @@
|
||||
// Copyright 2018 The Gogs Authors. All rights reserved.
|
||||
// Use of this source code is governed by a MIT-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package migrations
|
||||
|
||||
import (
|
||||
"github.com/go-xorm/xorm"
|
||||
)
|
||||
|
||||
func cleanUnlinkedWebhookAndHookTasks(x *xorm.Engine) error {
|
||||
_, err := x.Exec(`DELETE FROM webhook WHERE repo_id NOT IN (SELECT id FROM repository);`)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = x.Exec(`DELETE FROM hook_task WHERE repo_id NOT IN (SELECT id FROM repository);`)
|
||||
return err
|
||||
}
|
||||
@@ -22,18 +22,18 @@ type Milestone struct {
|
||||
RepoID int64 `xorm:"INDEX"`
|
||||
Name string
|
||||
Content string `xorm:"TEXT"`
|
||||
RenderedContent string `xorm:"-"`
|
||||
RenderedContent string `xorm:"-" json:"-"`
|
||||
IsClosed bool
|
||||
NumIssues int
|
||||
NumClosedIssues int
|
||||
NumOpenIssues int `xorm:"-"`
|
||||
NumOpenIssues int `xorm:"-" json:"-"`
|
||||
Completeness int // Percentage(1-100).
|
||||
IsOverDue bool `xorm:"-"`
|
||||
IsOverDue bool `xorm:"-" json:"-"`
|
||||
|
||||
DeadlineString string `xorm:"-"`
|
||||
Deadline time.Time `xorm:"-"`
|
||||
DeadlineString string `xorm:"-" json:"-"`
|
||||
Deadline time.Time `xorm:"-" json:"-"`
|
||||
DeadlineUnix int64
|
||||
ClosedDate time.Time `xorm:"-"`
|
||||
ClosedDate time.Time `xorm:"-" json:"-"`
|
||||
ClosedDateUnix int64
|
||||
}
|
||||
|
||||
@@ -166,7 +166,7 @@ func GetMilestones(repoID int64, page int, isClosed bool) ([]*Milestone, error)
|
||||
}
|
||||
|
||||
func updateMilestone(e Engine, m *Milestone) error {
|
||||
_, err := e.Id(m.ID).AllCols().Update(m)
|
||||
_, err := e.ID(m.ID).AllCols().Update(m)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -223,7 +223,7 @@ func ChangeMilestoneStatus(m *Milestone, isClosed bool) (err error) {
|
||||
|
||||
repo.NumMilestones = int(countRepoMilestones(sess, repo.ID))
|
||||
repo.NumClosedMilestones = int(countRepoClosedMilestones(sess, repo.ID))
|
||||
if _, err = sess.Id(repo.ID).AllCols().Update(repo); err != nil {
|
||||
if _, err = sess.ID(repo.ID).AllCols().Update(repo); err != nil {
|
||||
return err
|
||||
}
|
||||
return sess.Commit()
|
||||
@@ -383,13 +383,13 @@ func DeleteMilestoneOfRepoByID(repoID, id int64) error {
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err = sess.Id(m.ID).Delete(new(Milestone)); err != nil {
|
||||
if _, err = sess.ID(m.ID).Delete(new(Milestone)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
repo.NumMilestones = int(countRepoMilestones(sess, repo.ID))
|
||||
repo.NumClosedMilestones = int(countRepoClosedMilestones(sess, repo.ID))
|
||||
if _, err = sess.Id(repo.ID).AllCols().Update(repo); err != nil {
|
||||
if _, err = sess.ID(repo.ID).AllCols().Update(repo); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"container/list"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"strings"
|
||||
@@ -29,17 +30,17 @@ var MirrorQueue = sync.NewUniqueQueue(setting.Repository.MirrorQueueLength)
|
||||
type Mirror struct {
|
||||
ID int64
|
||||
RepoID int64
|
||||
Repo *Repository `xorm:"-"`
|
||||
Repo *Repository `xorm:"-" json:"-"`
|
||||
Interval int // Hour.
|
||||
EnablePrune bool `xorm:"NOT NULL DEFAULT true"`
|
||||
|
||||
// Last and next sync time of Git data from upstream
|
||||
LastSync time.Time `xorm:"-"`
|
||||
LastSync time.Time `xorm:"-" json:"-"`
|
||||
LastSyncUnix int64 `xorm:"updated_unix"`
|
||||
NextSync time.Time `xorm:"-"`
|
||||
NextSync time.Time `xorm:"-" json:"-"`
|
||||
NextSyncUnix int64 `xorm:"next_update_unix"`
|
||||
|
||||
address string `xorm:"-"`
|
||||
address string `xorm:"-" json:"-"`
|
||||
}
|
||||
|
||||
func (m *Mirror) BeforeInsert() {
|
||||
@@ -211,7 +212,6 @@ func parseRemoteUpdateOutput(output string) []*mirrorSyncResult {
|
||||
}
|
||||
|
||||
refName := lines[i][idx+3:]
|
||||
|
||||
switch {
|
||||
case strings.HasPrefix(lines[i], " * "): // New reference
|
||||
results = append(results, &mirrorSyncResult{
|
||||
@@ -320,7 +320,7 @@ func GetMirrorByRepoID(repoID int64) (*Mirror, error) {
|
||||
}
|
||||
|
||||
func updateMirror(e Engine, m *Mirror) error {
|
||||
_, err := e.Id(m.ID).AllCols().Update(m)
|
||||
_, err := e.ID(m.ID).AllCols().Update(m)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -362,7 +362,7 @@ func MirrorUpdate() {
|
||||
func SyncMirrors() {
|
||||
// Start listening on new sync requests.
|
||||
for repoID := range MirrorQueue.Queue() {
|
||||
log.Trace("SyncMirrors [repo_id: %d]", repoID)
|
||||
log.Trace("SyncMirrors [repo_id: %s]", repoID)
|
||||
MirrorQueue.Remove(repoID)
|
||||
|
||||
m, err := GetMirrorByRepoID(com.StrTo(repoID).MustInt64())
|
||||
@@ -403,14 +403,6 @@ func SyncMirrors() {
|
||||
continue
|
||||
}
|
||||
|
||||
// Create reference
|
||||
if result.oldCommitID == GIT_SHORT_EMPTY_SHA {
|
||||
if err = MirrorSyncCreateAction(m.Repo, result.refName); err != nil {
|
||||
log.Error(2, "MirrorSyncCreateAction [repo_id: %d]: %v", m.RepoID, err)
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
// Delete reference
|
||||
if result.newCommitID == GIT_SHORT_EMPTY_SHA {
|
||||
if err = MirrorSyncDeleteAction(m.Repo, result.refName); err != nil {
|
||||
@@ -419,21 +411,54 @@ func SyncMirrors() {
|
||||
continue
|
||||
}
|
||||
|
||||
// New reference
|
||||
isNewRef := false
|
||||
if result.oldCommitID == GIT_SHORT_EMPTY_SHA {
|
||||
if err = MirrorSyncCreateAction(m.Repo, result.refName); err != nil {
|
||||
log.Error(2, "MirrorSyncCreateAction [repo_id: %d]: %v", m.RepoID, err)
|
||||
continue
|
||||
}
|
||||
isNewRef = true
|
||||
}
|
||||
|
||||
// Push commits
|
||||
oldCommitID, err := git.GetFullCommitID(gitRepo.Path, result.oldCommitID)
|
||||
if err != nil {
|
||||
log.Error(2, "GetFullCommitID [%d]: %v", m.RepoID, err)
|
||||
continue
|
||||
}
|
||||
newCommitID, err := git.GetFullCommitID(gitRepo.Path, result.newCommitID)
|
||||
if err != nil {
|
||||
log.Error(2, "GetFullCommitID [%d]: %v", m.RepoID, err)
|
||||
continue
|
||||
}
|
||||
commits, err := gitRepo.CommitsBetweenIDs(newCommitID, oldCommitID)
|
||||
if err != nil {
|
||||
log.Error(2, "CommitsBetweenIDs [repo_id: %d, new_commit_id: %s, old_commit_id: %s]: %v", m.RepoID, newCommitID, oldCommitID, err)
|
||||
continue
|
||||
var commits *list.List
|
||||
var oldCommitID string
|
||||
var newCommitID string
|
||||
if !isNewRef {
|
||||
oldCommitID, err = git.GetFullCommitID(gitRepo.Path, result.oldCommitID)
|
||||
if err != nil {
|
||||
log.Error(2, "GetFullCommitID [%d]: %v", m.RepoID, err)
|
||||
continue
|
||||
}
|
||||
newCommitID, err = git.GetFullCommitID(gitRepo.Path, result.newCommitID)
|
||||
if err != nil {
|
||||
log.Error(2, "GetFullCommitID [%d]: %v", m.RepoID, err)
|
||||
continue
|
||||
}
|
||||
commits, err = gitRepo.CommitsBetweenIDs(newCommitID, oldCommitID)
|
||||
if err != nil {
|
||||
log.Error(2, "CommitsBetweenIDs [repo_id: %d, new_commit_id: %s, old_commit_id: %s]: %v", m.RepoID, newCommitID, oldCommitID, err)
|
||||
continue
|
||||
}
|
||||
} else {
|
||||
refNewCommitID, err := gitRepo.GetBranchCommitID(result.refName)
|
||||
if err != nil {
|
||||
log.Error(2, "GetFullCommitID [%d]: %v", m.RepoID, err)
|
||||
continue
|
||||
}
|
||||
if newCommit, err := gitRepo.GetCommit(refNewCommitID); err != nil {
|
||||
log.Error(2, "GetCommit [repo_id: %d, commit_id: %s]: %v", m.RepoID, refNewCommitID, err)
|
||||
continue
|
||||
} else {
|
||||
// TODO: Get the commits for the new ref until the closest ancestor branch like Github does
|
||||
commits, err = newCommit.CommitsBeforeLimit(10)
|
||||
if err != nil {
|
||||
log.Error(2, "CommitsBeforeLimit [repo_id: %d, commit_id: %s]: %v", m.RepoID, refNewCommitID, err)
|
||||
}
|
||||
oldCommitID = git.EMPTY_SHA
|
||||
newCommitID = refNewCommitID
|
||||
}
|
||||
}
|
||||
if err = MirrorSyncPushAction(m.Repo, MirrorSyncPushActionOptions{
|
||||
RefName: result.refName,
|
||||
|
||||
@@ -7,7 +7,6 @@ package models
|
||||
import (
|
||||
"bufio"
|
||||
"database/sql"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/url"
|
||||
@@ -20,6 +19,7 @@ import (
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
"github.com/go-xorm/core"
|
||||
"github.com/go-xorm/xorm"
|
||||
"github.com/json-iterator/go"
|
||||
_ "github.com/lib/pq"
|
||||
log "gopkg.in/clog.v1"
|
||||
|
||||
@@ -33,7 +33,7 @@ type Engine interface {
|
||||
Exec(string, ...interface{}) (sql.Result, error)
|
||||
Find(interface{}, ...interface{}) error
|
||||
Get(interface{}) (bool, error)
|
||||
Id(interface{}) *xorm.Session
|
||||
ID(interface{}) *xorm.Session
|
||||
In(string, ...interface{}) *xorm.Session
|
||||
Insert(...interface{}) (int64, error)
|
||||
InsertOne(interface{}) (int64, error)
|
||||
@@ -285,8 +285,7 @@ func DumpDatabase(dirPath string) (err error) {
|
||||
}
|
||||
|
||||
if err = x.Asc("id").Iterate(table, func(idx int, bean interface{}) (err error) {
|
||||
enc := json.NewEncoder(f)
|
||||
return enc.Encode(bean)
|
||||
return jsoniter.NewEncoder(f).Encode(bean)
|
||||
}); err != nil {
|
||||
f.Close()
|
||||
return fmt.Errorf("fail to dump table '%s': %v", tableName, err)
|
||||
@@ -300,6 +299,11 @@ func DumpDatabase(dirPath string) (err error) {
|
||||
func ImportDatabase(dirPath string, verbose bool) (err error) {
|
||||
snakeMapper := core.SnakeMapper{}
|
||||
|
||||
skipInsertProcessors := map[string]bool{
|
||||
"mirror": true,
|
||||
"milestone": true,
|
||||
}
|
||||
|
||||
// Purposely create a local variable to not modify global variable
|
||||
tables := append(tables, new(Version))
|
||||
for _, table := range tables {
|
||||
@@ -314,22 +318,24 @@ func ImportDatabase(dirPath string, verbose bool) (err error) {
|
||||
}
|
||||
|
||||
if err = x.DropTables(table); err != nil {
|
||||
return fmt.Errorf("fail to drop table '%s': %v", tableName, err)
|
||||
return fmt.Errorf("drop table '%s': %v", tableName, err)
|
||||
} else if err = x.Sync2(table); err != nil {
|
||||
return fmt.Errorf("fail to sync table '%s': %v", tableName, err)
|
||||
return fmt.Errorf("sync table '%s': %v", tableName, err)
|
||||
}
|
||||
|
||||
f, err := os.Open(tableFile)
|
||||
if err != nil {
|
||||
return fmt.Errorf("fail to open JSON file: %v", err)
|
||||
return fmt.Errorf("open JSON file: %v", err)
|
||||
}
|
||||
rawTableName := x.TableName(table)
|
||||
_, isInsertProcessor := table.(xorm.BeforeInsertProcessor)
|
||||
scanner := bufio.NewScanner(f)
|
||||
for scanner.Scan() {
|
||||
switch bean := table.(type) {
|
||||
case *LoginSource:
|
||||
meta := make(map[string]interface{})
|
||||
if err = json.Unmarshal(scanner.Bytes(), &meta); err != nil {
|
||||
return fmt.Errorf("fail to unmarshal to map: %v", err)
|
||||
if err = jsoniter.Unmarshal(scanner.Bytes(), &meta); err != nil {
|
||||
return fmt.Errorf("unmarshal to map: %v", err)
|
||||
}
|
||||
|
||||
tp := LoginType(com.StrTo(com.ToStr(meta["Type"])).MustInt64())
|
||||
@@ -340,18 +346,39 @@ func ImportDatabase(dirPath string, verbose bool) (err error) {
|
||||
bean.Cfg = new(SMTPConfig)
|
||||
case LOGIN_PAM:
|
||||
bean.Cfg = new(PAMConfig)
|
||||
case LOGIN_GITHUB:
|
||||
bean.Cfg = new(GitHubConfig)
|
||||
default:
|
||||
return fmt.Errorf("unrecognized login source type:: %v", tp)
|
||||
}
|
||||
table = bean
|
||||
}
|
||||
|
||||
if err = json.Unmarshal(scanner.Bytes(), table); err != nil {
|
||||
return fmt.Errorf("fail to unmarshal to struct: %v", err)
|
||||
if err = jsoniter.Unmarshal(scanner.Bytes(), table); err != nil {
|
||||
return fmt.Errorf("unmarshal to struct: %v", err)
|
||||
}
|
||||
|
||||
if _, err = x.Insert(table); err != nil {
|
||||
return fmt.Errorf("fail to insert strcut: %v", err)
|
||||
return fmt.Errorf("insert strcut: %v", err)
|
||||
}
|
||||
|
||||
meta := make(map[string]interface{})
|
||||
if err = jsoniter.Unmarshal(scanner.Bytes(), &meta); err != nil {
|
||||
log.Error(2, "Failed to unmarshal to map: %v", err)
|
||||
}
|
||||
|
||||
// Reset created_unix back to the date save in archive because Insert method updates its value
|
||||
if isInsertProcessor && !skipInsertProcessors[rawTableName] {
|
||||
if _, err = x.Exec("UPDATE "+rawTableName+" SET created_unix=? WHERE id=?", meta["CreatedUnix"], meta["ID"]); err != nil {
|
||||
log.Error(2, "Failed to reset 'created_unix': %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
switch rawTableName {
|
||||
case "milestone":
|
||||
if _, err = x.Exec("UPDATE "+rawTableName+" SET deadline_unix=?, closed_date_unix=? WHERE id=?", meta["DeadlineUnix"], meta["ClosedDateUnix"], meta["ID"]); err != nil {
|
||||
log.Error(2, "Failed to reset 'milestone.deadline_unix', 'milestone.closed_date_unix': %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -360,7 +387,7 @@ func ImportDatabase(dirPath string, verbose bool) (err error) {
|
||||
rawTableName := snakeMapper.Obj2Table(tableName)
|
||||
seqName := rawTableName + "_id_seq"
|
||||
if _, err = x.Exec(fmt.Sprintf(`SELECT setval('%s', COALESCE((SELECT MAX(id)+1 FROM "%s"), 1), false);`, seqName, rawTableName)); err != nil {
|
||||
return fmt.Errorf("fail to reset table '%s' sequence: %v", rawTableName, err)
|
||||
return fmt.Errorf("reset table '%s' sequence: %v", rawTableName, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,8 +15,7 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
ErrOrgNotExist = errors.New("Organization does not exist")
|
||||
ErrTeamNotExist = errors.New("Team does not exist")
|
||||
ErrOrgNotExist = errors.New("Organization does not exist")
|
||||
)
|
||||
|
||||
// IsOwnedBy returns true if given user is in the owner team.
|
||||
@@ -410,7 +409,7 @@ func RemoveOrgUser(orgID, userID int64) error {
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err := sess.Id(ou.ID).Delete(ou); err != nil {
|
||||
if _, err := sess.ID(ou.ID).Delete(ou); err != nil {
|
||||
return err
|
||||
} else if _, err = sess.Exec("UPDATE `user` SET num_members=num_members-1 WHERE id=?", orgID); err != nil {
|
||||
return err
|
||||
|
||||
@@ -5,11 +5,12 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/go-xorm/xorm"
|
||||
|
||||
"github.com/gogs/gogs/models/errors"
|
||||
)
|
||||
|
||||
const OWNER_TEAM = "Owners"
|
||||
@@ -22,8 +23,8 @@ type Team struct {
|
||||
Name string
|
||||
Description string
|
||||
Authorize AccessMode
|
||||
Repos []*Repository `xorm:"-"`
|
||||
Members []*User `xorm:"-"`
|
||||
Repos []*Repository `xorm:"-" json:"-"`
|
||||
Members []*User `xorm:"-" json:"-"`
|
||||
NumRepos int
|
||||
NumMembers int
|
||||
}
|
||||
@@ -111,7 +112,7 @@ func (t *Team) addRepository(e Engine, repo *Repository) (err error) {
|
||||
}
|
||||
|
||||
t.NumRepos++
|
||||
if _, err = e.Id(t.ID).AllCols().Update(t); err != nil {
|
||||
if _, err = e.ID(t.ID).AllCols().Update(t); err != nil {
|
||||
return fmt.Errorf("update team: %v", err)
|
||||
}
|
||||
|
||||
@@ -157,7 +158,7 @@ func (t *Team) removeRepository(e Engine, repo *Repository, recalculate bool) (e
|
||||
}
|
||||
|
||||
t.NumRepos--
|
||||
if _, err = e.Id(t.ID).AllCols().Update(t); err != nil {
|
||||
if _, err = e.ID(t.ID).AllCols().Update(t); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -274,7 +275,7 @@ func getTeamOfOrgByName(e Engine, orgID int64, name string) (*Team, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if !has {
|
||||
return nil, ErrTeamNotExist
|
||||
return nil, errors.TeamNotExist{0, name}
|
||||
}
|
||||
return t, nil
|
||||
}
|
||||
@@ -286,11 +287,11 @@ func GetTeamOfOrgByName(orgID int64, name string) (*Team, error) {
|
||||
|
||||
func getTeamByID(e Engine, teamID int64) (*Team, error) {
|
||||
t := new(Team)
|
||||
has, err := e.Id(teamID).Get(t)
|
||||
has, err := e.ID(teamID).Get(t)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if !has {
|
||||
return nil, ErrTeamNotExist
|
||||
return nil, errors.TeamNotExist{teamID, ""}
|
||||
}
|
||||
return t, nil
|
||||
}
|
||||
@@ -334,7 +335,7 @@ func UpdateTeam(t *Team, authChanged bool) (err error) {
|
||||
return ErrTeamAlreadyExist{t.OrgID, t.LowerName}
|
||||
}
|
||||
|
||||
if _, err = sess.Id(t.ID).AllCols().Update(t); err != nil {
|
||||
if _, err = sess.ID(t.ID).AllCols().Update(t); err != nil {
|
||||
return fmt.Errorf("update: %v", err)
|
||||
}
|
||||
|
||||
@@ -386,7 +387,7 @@ func DeleteTeam(t *Team) error {
|
||||
}
|
||||
|
||||
// Delete team.
|
||||
if _, err = sess.Id(t.ID).Delete(new(Team)); err != nil {
|
||||
if _, err = sess.ID(t.ID).Delete(new(Team)); err != nil {
|
||||
return err
|
||||
}
|
||||
// Update organization number of teams.
|
||||
@@ -431,7 +432,7 @@ func getTeamMembers(e Engine, teamID int64) (_ []*User, err error) {
|
||||
members := make([]*User, 0, len(teamUsers))
|
||||
for i := range teamUsers {
|
||||
member := new(User)
|
||||
if _, err = e.Id(teamUsers[i].UID).Get(member); err != nil {
|
||||
if _, err = e.ID(teamUsers[i].UID).Get(member); err != nil {
|
||||
return nil, fmt.Errorf("get user '%d': %v", teamUsers[i].UID, err)
|
||||
}
|
||||
members = append(members, member)
|
||||
@@ -500,7 +501,7 @@ func AddTeamMember(orgID, teamID, userID int64) error {
|
||||
}
|
||||
if _, err = sess.Insert(tu); err != nil {
|
||||
return err
|
||||
} else if _, err = sess.Id(t.ID).Update(t); err != nil {
|
||||
} else if _, err = sess.ID(t.ID).Update(t); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -520,7 +521,7 @@ func AddTeamMember(orgID, teamID, userID int64) error {
|
||||
if t.IsOwnerTeam() {
|
||||
ou.IsOwner = true
|
||||
}
|
||||
if _, err = sess.Id(ou.ID).AllCols().Update(ou); err != nil {
|
||||
if _, err = sess.ID(ou.ID).AllCols().Update(ou); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -562,7 +563,7 @@ func removeTeamMember(e Engine, orgID, teamID, uid int64) error {
|
||||
}
|
||||
if _, err := e.Delete(tu); err != nil {
|
||||
return err
|
||||
} else if _, err = e.Id(t.ID).AllCols().Update(t); err != nil {
|
||||
} else if _, err = e.ID(t.ID).AllCols().Update(t); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -583,7 +584,7 @@ func removeTeamMember(e Engine, orgID, teamID, uid int64) error {
|
||||
if t.IsOwnerTeam() {
|
||||
ou.IsOwner = false
|
||||
}
|
||||
if _, err = e.Id(ou.ID).AllCols().Update(ou); err != nil {
|
||||
if _, err = e.ID(ou.ID).AllCols().Update(ou); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -48,13 +48,13 @@ type PullRequest struct {
|
||||
Status PullRequestStatus
|
||||
|
||||
IssueID int64 `xorm:"INDEX"`
|
||||
Issue *Issue `xorm:"-"`
|
||||
Issue *Issue `xorm:"-" json:"-"`
|
||||
Index int64
|
||||
|
||||
HeadRepoID int64
|
||||
HeadRepo *Repository `xorm:"-"`
|
||||
HeadRepo *Repository `xorm:"-" json:"-"`
|
||||
BaseRepoID int64
|
||||
BaseRepo *Repository `xorm:"-"`
|
||||
BaseRepo *Repository `xorm:"-" json:"-"`
|
||||
HeadUserName string
|
||||
HeadBranch string
|
||||
BaseBranch string
|
||||
@@ -63,8 +63,8 @@ type PullRequest struct {
|
||||
HasMerged bool
|
||||
MergedCommitID string `xorm:"VARCHAR(40)"`
|
||||
MergerID int64
|
||||
Merger *User `xorm:"-"`
|
||||
Merged time.Time `xorm:"-"`
|
||||
Merger *User `xorm:"-" json:"-"`
|
||||
Merged time.Time `xorm:"-" json:"-"`
|
||||
MergedUnix int64
|
||||
}
|
||||
|
||||
@@ -193,7 +193,7 @@ const (
|
||||
|
||||
// Merge merges pull request to base repository.
|
||||
// FIXME: add repoWorkingPull make sure two merges does not happen at same time.
|
||||
func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle MergeStyle) (err error) {
|
||||
func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle MergeStyle, commitDescription string) (err error) {
|
||||
defer func() {
|
||||
go HookQueue.Add(pr.BaseRepo.ID)
|
||||
go AddTestPullRequestTask(doer, pr.BaseRepo.ID, pr.BaseBranch, false)
|
||||
@@ -266,7 +266,8 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle
|
||||
if _, stderr, err = process.ExecDir(-1, tmpBasePath,
|
||||
fmt.Sprintf("PullRequest.Merge (git merge): %s", tmpBasePath),
|
||||
"git", "commit", fmt.Sprintf("--author='%s <%s>'", sig.Name, sig.Email),
|
||||
"-m", fmt.Sprintf("Merge branch '%s' of %s/%s into %s", pr.HeadBranch, pr.HeadUserName, pr.HeadRepo.Name, pr.BaseBranch)); err != nil {
|
||||
"-m", fmt.Sprintf("Merge branch '%s' of %s/%s into %s", pr.HeadBranch, pr.HeadUserName, pr.HeadRepo.Name, pr.BaseBranch),
|
||||
"-m", commitDescription); err != nil {
|
||||
return fmt.Errorf("git commit [%s]: %v - %s", tmpBasePath, err, stderr)
|
||||
}
|
||||
|
||||
@@ -320,7 +321,7 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle
|
||||
pr.HasMerged = true
|
||||
pr.Merged = time.Now()
|
||||
pr.MergerID = doer.ID
|
||||
if _, err = sess.Id(pr.ID).AllCols().Update(pr); err != nil {
|
||||
if _, err = sess.ID(pr.ID).AllCols().Update(pr); err != nil {
|
||||
return fmt.Errorf("update pull request: %v", err)
|
||||
}
|
||||
|
||||
@@ -545,7 +546,7 @@ func GetUnmergedPullRequestsByBaseInfo(repoID int64, branch string) ([]*PullRequ
|
||||
|
||||
func getPullRequestByID(e Engine, id int64) (*PullRequest, error) {
|
||||
pr := new(PullRequest)
|
||||
has, err := e.Id(id).Get(pr)
|
||||
has, err := e.ID(id).Get(pr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if !has {
|
||||
|
||||
@@ -24,24 +24,24 @@ import (
|
||||
type Release struct {
|
||||
ID int64
|
||||
RepoID int64
|
||||
Repo *Repository `xorm:"-"`
|
||||
Repo *Repository `xorm:"-" json:"-"`
|
||||
PublisherID int64
|
||||
Publisher *User `xorm:"-"`
|
||||
Publisher *User `xorm:"-" json:"-"`
|
||||
TagName string
|
||||
LowerTagName string
|
||||
Target string
|
||||
Title string
|
||||
Sha1 string `xorm:"VARCHAR(40)"`
|
||||
NumCommits int64
|
||||
NumCommitsBehind int64 `xorm:"-"`
|
||||
NumCommitsBehind int64 `xorm:"-" json:"-"`
|
||||
Note string `xorm:"TEXT"`
|
||||
IsDraft bool `xorm:"NOT NULL DEFAULT false"`
|
||||
IsPrerelease bool
|
||||
|
||||
Created time.Time `xorm:"-"`
|
||||
Created time.Time `xorm:"-" json:"-"`
|
||||
CreatedUnix int64
|
||||
|
||||
Attachments []*Attachment `xorm:"-"`
|
||||
Attachments []*Attachment `xorm:"-" json:"-"`
|
||||
}
|
||||
|
||||
func (r *Release) BeforeInsert() {
|
||||
@@ -293,7 +293,7 @@ func UpdateRelease(doer *User, gitRepo *git.Repository, r *Release, isPublish bo
|
||||
if err = sess.Begin(); err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err = sess.Id(r.ID).AllCols().Update(r); err != nil {
|
||||
if _, err = sess.ID(r.ID).AllCols().Update(r); err != nil {
|
||||
return fmt.Errorf("Update: %v", err)
|
||||
}
|
||||
|
||||
|
||||
129
models/repo.go
129
models/repo.go
@@ -7,6 +7,9 @@ package models
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"image"
|
||||
_ "image/jpeg"
|
||||
"image/png"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"os/exec"
|
||||
@@ -20,6 +23,7 @@ import (
|
||||
"github.com/Unknwon/com"
|
||||
"github.com/go-xorm/xorm"
|
||||
"github.com/mcuadros/go-version"
|
||||
"github.com/nfnt/resize"
|
||||
log "gopkg.in/clog.v1"
|
||||
"gopkg.in/ini.v1"
|
||||
|
||||
@@ -27,6 +31,7 @@ import (
|
||||
api "github.com/gogs/go-gogs-client"
|
||||
|
||||
"github.com/gogs/gogs/models/errors"
|
||||
"github.com/gogs/gogs/pkg/avatar"
|
||||
"github.com/gogs/gogs/pkg/bindata"
|
||||
"github.com/gogs/gogs/pkg/markup"
|
||||
"github.com/gogs/gogs/pkg/process"
|
||||
@@ -34,6 +39,9 @@ import (
|
||||
"github.com/gogs/gogs/pkg/sync"
|
||||
)
|
||||
|
||||
// REPO_AVATAR_URL_PREFIX is used to identify a URL is to access repository avatar.
|
||||
const REPO_AVATAR_URL_PREFIX = "repo-avatars"
|
||||
|
||||
var repoWorkingPool = sync.NewExclusivePool()
|
||||
|
||||
var (
|
||||
@@ -141,35 +149,37 @@ func NewRepoContext() {
|
||||
|
||||
// Repository contains information of a repository.
|
||||
type Repository struct {
|
||||
ID int64
|
||||
OwnerID int64 `xorm:"UNIQUE(s)"`
|
||||
Owner *User `xorm:"-"`
|
||||
LowerName string `xorm:"UNIQUE(s) INDEX NOT NULL"`
|
||||
Name string `xorm:"INDEX NOT NULL"`
|
||||
Description string
|
||||
Website string
|
||||
DefaultBranch string
|
||||
Size int64 `xorm:"NOT NULL DEFAULT 0"`
|
||||
ID int64
|
||||
OwnerID int64 `xorm:"UNIQUE(s)"`
|
||||
Owner *User `xorm:"-" json:"-"`
|
||||
LowerName string `xorm:"UNIQUE(s) INDEX NOT NULL"`
|
||||
Name string `xorm:"INDEX NOT NULL"`
|
||||
Description string `xorm:"VARCHAR(512)"`
|
||||
Website string
|
||||
DefaultBranch string
|
||||
Size int64 `xorm:"NOT NULL DEFAULT 0"`
|
||||
UseCustomAvatar bool
|
||||
|
||||
// Counters
|
||||
NumWatches int
|
||||
NumStars int
|
||||
NumForks int
|
||||
NumIssues int
|
||||
NumClosedIssues int
|
||||
NumOpenIssues int `xorm:"-"`
|
||||
NumOpenIssues int `xorm:"-" json:"-"`
|
||||
NumPulls int
|
||||
NumClosedPulls int
|
||||
NumOpenPulls int `xorm:"-"`
|
||||
NumOpenPulls int `xorm:"-" json:"-"`
|
||||
NumMilestones int `xorm:"NOT NULL DEFAULT 0"`
|
||||
NumClosedMilestones int `xorm:"NOT NULL DEFAULT 0"`
|
||||
NumOpenMilestones int `xorm:"-"`
|
||||
NumTags int `xorm:"-"`
|
||||
NumOpenMilestones int `xorm:"-" json:"-"`
|
||||
NumTags int `xorm:"-" json:"-"`
|
||||
|
||||
IsPrivate bool
|
||||
IsBare bool
|
||||
|
||||
IsMirror bool
|
||||
*Mirror `xorm:"-"`
|
||||
*Mirror `xorm:"-" json:"-"`
|
||||
|
||||
// Advanced settings
|
||||
EnableWiki bool `xorm:"NOT NULL DEFAULT true"`
|
||||
@@ -182,18 +192,18 @@ type Repository struct {
|
||||
ExternalTrackerURL string
|
||||
ExternalTrackerFormat string
|
||||
ExternalTrackerStyle string
|
||||
ExternalMetas map[string]string `xorm:"-"`
|
||||
ExternalMetas map[string]string `xorm:"-" json:"-"`
|
||||
EnablePulls bool `xorm:"NOT NULL DEFAULT true"`
|
||||
PullsIgnoreWhitespace bool `xorm:"NOT NULL DEFAULT false"`
|
||||
PullsAllowRebase bool `xorm:"NOT NULL DEFAULT false"`
|
||||
|
||||
IsFork bool `xorm:"NOT NULL DEFAULT false"`
|
||||
ForkID int64
|
||||
BaseRepo *Repository `xorm:"-"`
|
||||
BaseRepo *Repository `xorm:"-" json:"-"`
|
||||
|
||||
Created time.Time `xorm:"-"`
|
||||
Created time.Time `xorm:"-" json:"-"`
|
||||
CreatedUnix int64
|
||||
Updated time.Time `xorm:"-"`
|
||||
Updated time.Time `xorm:"-" json:"-"`
|
||||
UpdatedUnix int64
|
||||
}
|
||||
|
||||
@@ -284,6 +294,65 @@ func (repo *Repository) HTMLURL() string {
|
||||
return setting.AppURL + repo.FullName()
|
||||
}
|
||||
|
||||
// CustomAvatarPath returns repository custom avatar file path.
|
||||
func (repo *Repository) CustomAvatarPath() string {
|
||||
return filepath.Join(setting.RepositoryAvatarUploadPath, com.ToStr(repo.ID))
|
||||
}
|
||||
|
||||
// RelAvatarLink returns relative avatar link to the site domain,
|
||||
// which includes app sub-url as prefix.
|
||||
// Since Gravatar support not needed here - just check for image path.
|
||||
func (repo *Repository) RelAvatarLink() string {
|
||||
defaultImgUrl := ""
|
||||
if !com.IsExist(repo.CustomAvatarPath()) {
|
||||
return defaultImgUrl
|
||||
}
|
||||
return fmt.Sprintf("%s/%s/%d", setting.AppSubURL, REPO_AVATAR_URL_PREFIX, repo.ID)
|
||||
}
|
||||
|
||||
// AvatarLink returns repository avatar absolute link.
|
||||
func (repo *Repository) AvatarLink() string {
|
||||
link := repo.RelAvatarLink()
|
||||
if link[0] == '/' && link[1] != '/' {
|
||||
return setting.AppURL + strings.TrimPrefix(link, setting.AppSubURL)[1:]
|
||||
}
|
||||
return link
|
||||
}
|
||||
|
||||
// UploadAvatar saves custom avatar for repository.
|
||||
// FIXME: split uploads to different subdirs in case we have massive number of repositories.
|
||||
func (repo *Repository) UploadAvatar(data []byte) error {
|
||||
img, _, err := image.Decode(bytes.NewReader(data))
|
||||
if err != nil {
|
||||
return fmt.Errorf("decode image: %v", err)
|
||||
}
|
||||
|
||||
os.MkdirAll(setting.RepositoryAvatarUploadPath, os.ModePerm)
|
||||
fw, err := os.Create(repo.CustomAvatarPath())
|
||||
if err != nil {
|
||||
return fmt.Errorf("create custom avatar directory: %v", err)
|
||||
}
|
||||
defer fw.Close()
|
||||
|
||||
m := resize.Resize(avatar.AVATAR_SIZE, avatar.AVATAR_SIZE, img, resize.NearestNeighbor)
|
||||
if err = png.Encode(fw, m); err != nil {
|
||||
return fmt.Errorf("encode image: %v", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeleteAvatar deletes the repository custom avatar.
|
||||
func (repo *Repository) DeleteAvatar() error {
|
||||
log.Trace("DeleteAvatar [%d]: %s", repo.ID, repo.CustomAvatarPath())
|
||||
if err := os.Remove(repo.CustomAvatarPath()); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
repo.UseCustomAvatar = false
|
||||
return UpdateRepository(repo, false)
|
||||
}
|
||||
|
||||
// This method assumes following fields have been assigned with valid values:
|
||||
// Required - BaseRepo (if fork)
|
||||
// Arguments that are allowed to be nil: permission
|
||||
@@ -312,6 +381,8 @@ func (repo *Repository) APIFormat(permission *api.Permission, user ...*User) *ap
|
||||
Created: repo.Created,
|
||||
Updated: repo.Updated,
|
||||
Permissions: permission,
|
||||
// Reserved for go-gogs-client change
|
||||
// AvatarUrl: repo.AvatarLink(),
|
||||
}
|
||||
if repo.IsFork {
|
||||
p := &api.Permission{Pull: true}
|
||||
@@ -1193,7 +1264,7 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
|
||||
repo.Owner = newOwner
|
||||
|
||||
// Update repository.
|
||||
if _, err := sess.Id(repo.ID).Update(repo); err != nil {
|
||||
if _, err := sess.ID(repo.ID).Update(repo); err != nil {
|
||||
return fmt.Errorf("update owner: %v", err)
|
||||
}
|
||||
|
||||
@@ -1225,7 +1296,7 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
|
||||
}
|
||||
|
||||
t.NumRepos--
|
||||
if _, err := sess.Id(t.ID).AllCols().Update(t); err != nil {
|
||||
if _, err := sess.ID(t.ID).AllCols().Update(t); err != nil {
|
||||
return fmt.Errorf("decrease team repository count '%d': %v", t.ID, err)
|
||||
}
|
||||
}
|
||||
@@ -1331,14 +1402,14 @@ func GetRepositoriesByForkID(forkID int64) ([]*Repository, error) {
|
||||
func updateRepository(e Engine, repo *Repository, visibilityChanged bool) (err error) {
|
||||
repo.LowerName = strings.ToLower(repo.Name)
|
||||
|
||||
if len(repo.Description) > 255 {
|
||||
repo.Description = repo.Description[:255]
|
||||
if len(repo.Description) > 512 {
|
||||
repo.Description = repo.Description[:512]
|
||||
}
|
||||
if len(repo.Website) > 255 {
|
||||
repo.Website = repo.Website[:255]
|
||||
}
|
||||
|
||||
if _, err = e.Id(repo.ID).AllCols().Update(repo); err != nil {
|
||||
if _, err = e.ID(repo.ID).AllCols().Update(repo); err != nil {
|
||||
return fmt.Errorf("update: %v", err)
|
||||
}
|
||||
|
||||
@@ -1452,6 +1523,8 @@ func DeleteRepository(uid, repoID int64) error {
|
||||
&PullRequest{BaseRepoID: repoID},
|
||||
&ProtectBranch{RepoID: repoID},
|
||||
&ProtectBranchWhitelist{RepoID: repoID},
|
||||
&Webhook{RepoID: repoID},
|
||||
&HookTask{RepoID: repoID},
|
||||
); err != nil {
|
||||
return fmt.Errorf("deleteBeans: %v", err)
|
||||
}
|
||||
@@ -1552,7 +1625,7 @@ func GetRepositoryByName(ownerID int64, name string) (*Repository, error) {
|
||||
|
||||
func getRepositoryByID(e Engine, id int64) (*Repository, error) {
|
||||
repo := new(Repository)
|
||||
has, err := e.Id(id).Get(repo)
|
||||
has, err := e.ID(id).Get(repo)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if !has {
|
||||
@@ -1651,11 +1724,11 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos []*Repository, count
|
||||
// this does not include other people's private repositories even if opts.UserID is an admin.
|
||||
if !opts.Private && opts.UserID > 0 {
|
||||
sess.Join("LEFT", "access", "access.repo_id = repo.id").
|
||||
Where("(repo.owner_id = ? OR access.user_id = ? OR repo.is_private = ?)", opts.UserID, opts.UserID, false)
|
||||
Where("repo.owner_id = ? OR access.user_id = ? OR repo.is_private = ? OR (repo.is_private = ? AND (repo.allow_public_wiki = ? OR repo.allow_public_issues = ?))", opts.UserID, opts.UserID, false, true, true, true)
|
||||
} else {
|
||||
// Only return public repositories if opts.Private is not set
|
||||
if !opts.Private {
|
||||
sess.And("repo.is_private = ?", false)
|
||||
sess.And("repo.is_private = ? OR (repo.is_private = ? AND (repo.allow_public_wiki = ? OR repo.allow_public_issues = ?))", false, true, true, true)
|
||||
}
|
||||
}
|
||||
if len(opts.Keyword) > 0 {
|
||||
@@ -2275,6 +2348,10 @@ func HasForkedRepo(ownerID, repoID int64) (*Repository, bool, error) {
|
||||
|
||||
// ForkRepository creates a fork of target repository under another user domain.
|
||||
func ForkRepository(doer, owner *User, baseRepo *Repository, name, desc string) (_ *Repository, err error) {
|
||||
if !owner.CanCreateRepo() {
|
||||
return nil, errors.ReachLimitOfRepo{owner.RepoCreationNum()}
|
||||
}
|
||||
|
||||
repo := &Repository{
|
||||
OwnerID: owner.ID,
|
||||
Owner: owner,
|
||||
|
||||
@@ -131,7 +131,7 @@ func UpdateProtectBranch(protectBranch *ProtectBranch) (err error) {
|
||||
}
|
||||
}
|
||||
|
||||
if _, err = sess.Id(protectBranch.ID).AllCols().Update(protectBranch); err != nil {
|
||||
if _, err = sess.ID(protectBranch.ID).AllCols().Update(protectBranch); err != nil {
|
||||
return fmt.Errorf("Update: %v", err)
|
||||
}
|
||||
|
||||
@@ -234,7 +234,7 @@ func UpdateOrgProtectBranch(repo *Repository, protectBranch *ProtectBranch, whit
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err = sess.Id(protectBranch.ID).AllCols().Update(protectBranch); err != nil {
|
||||
if _, err = sess.ID(protectBranch.ID).AllCols().Update(protectBranch); err != nil {
|
||||
return fmt.Errorf("Update: %v", err)
|
||||
}
|
||||
|
||||
|
||||
@@ -170,7 +170,7 @@ func (repo *Repository) ChangeCollaborationAccessMode(userID int64, mode AccessM
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err = sess.Id(collaboration.ID).AllCols().Update(collaboration); err != nil {
|
||||
if _, err = sess.ID(collaboration.ID).AllCols().Update(collaboration); err != nil {
|
||||
return fmt.Errorf("update collaboration: %v", err)
|
||||
}
|
||||
|
||||
|
||||
@@ -13,19 +13,55 @@ import (
|
||||
"os/exec"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/Unknwon/com"
|
||||
gouuid "github.com/satori/go.uuid"
|
||||
log "gopkg.in/clog.v1"
|
||||
|
||||
git "github.com/gogs/git-module"
|
||||
"github.com/gogs/git-module"
|
||||
|
||||
"github.com/gogs/gogs/models/errors"
|
||||
"github.com/gogs/gogs/pkg/process"
|
||||
"github.com/gogs/gogs/pkg/setting"
|
||||
"github.com/gogs/gogs/pkg/tool"
|
||||
)
|
||||
|
||||
const (
|
||||
ENV_AUTH_USER_ID = "GOGS_AUTH_USER_ID"
|
||||
ENV_AUTH_USER_NAME = "GOGS_AUTH_USER_NAME"
|
||||
ENV_AUTH_USER_EMAIL = "GOGS_AUTH_USER_EMAIL"
|
||||
ENV_REPO_OWNER_NAME = "GOGS_REPO_OWNER_NAME"
|
||||
ENV_REPO_OWNER_SALT_MD5 = "GOGS_REPO_OWNER_SALT_MD5"
|
||||
ENV_REPO_ID = "GOGS_REPO_ID"
|
||||
ENV_REPO_NAME = "GOGS_REPO_NAME"
|
||||
ENV_REPO_CUSTOM_HOOKS_PATH = "GOGS_REPO_CUSTOM_HOOKS_PATH"
|
||||
)
|
||||
|
||||
type ComposeHookEnvsOptions struct {
|
||||
AuthUser *User
|
||||
OwnerName string
|
||||
OwnerSalt string
|
||||
RepoID int64
|
||||
RepoName string
|
||||
RepoPath string
|
||||
}
|
||||
|
||||
func ComposeHookEnvs(opts ComposeHookEnvsOptions) []string {
|
||||
envs := []string{
|
||||
"SSH_ORIGINAL_COMMAND=1",
|
||||
ENV_AUTH_USER_ID + "=" + com.ToStr(opts.AuthUser.ID),
|
||||
ENV_AUTH_USER_NAME + "=" + opts.AuthUser.Name,
|
||||
ENV_AUTH_USER_EMAIL + "=" + opts.AuthUser.Email,
|
||||
ENV_REPO_OWNER_NAME + "=" + opts.OwnerName,
|
||||
ENV_REPO_OWNER_SALT_MD5 + "=" + tool.MD5(opts.OwnerSalt),
|
||||
ENV_REPO_ID + "=" + com.ToStr(opts.RepoID),
|
||||
ENV_REPO_NAME + "=" + opts.RepoName,
|
||||
ENV_REPO_CUSTOM_HOOKS_PATH + "=" + path.Join(opts.RepoPath, "custom_hooks"),
|
||||
}
|
||||
return envs
|
||||
}
|
||||
|
||||
// ___________ .___.__ __ ___________.__.__
|
||||
// \_ _____/ __| _/|__|/ |_ \_ _____/|__| | ____
|
||||
// | __)_ / __ | | \ __\ | __) | | | _/ __ \
|
||||
@@ -88,9 +124,9 @@ func (repo *Repository) UpdateRepoFile(doer *User, opts UpdateRepoFileOptions) (
|
||||
defer repoWorkingPool.CheckOut(com.ToStr(repo.ID))
|
||||
|
||||
if err = repo.DiscardLocalRepoBranchChanges(opts.OldBranch); err != nil {
|
||||
return fmt.Errorf("DiscardLocalRepoBranchChanges [branch: %s]: %v", opts.OldBranch, err)
|
||||
return fmt.Errorf("discard local repo branch[%s] changes: %v", opts.OldBranch, err)
|
||||
} else if err = repo.UpdateLocalCopyBranch(opts.OldBranch); err != nil {
|
||||
return fmt.Errorf("UpdateLocalCopyBranch [branch: %s]: %v", opts.OldBranch, err)
|
||||
return fmt.Errorf("update local copy branch[%s]: %v", opts.OldBranch, err)
|
||||
}
|
||||
|
||||
repoPath := repo.RepoPath()
|
||||
@@ -107,12 +143,12 @@ func (repo *Repository) UpdateRepoFile(doer *User, opts UpdateRepoFileOptions) (
|
||||
if err = git.DeleteBranch(localPath, opts.NewBranch, git.DeleteBranchOptions{
|
||||
Force: true,
|
||||
}); err != nil {
|
||||
return fmt.Errorf("DeleteBranch [name: %s]: %v", opts.NewBranch, err)
|
||||
return fmt.Errorf("delete branch[%s]: %v", opts.NewBranch, err)
|
||||
}
|
||||
}
|
||||
|
||||
if err := repo.CheckoutNewBranch(opts.OldBranch, opts.NewBranch); err != nil {
|
||||
return fmt.Errorf("CheckoutNewBranch [old_branch: %s, new_branch: %s]: %v", opts.OldBranch, opts.NewBranch, err)
|
||||
return fmt.Errorf("checkout new branch[%s] from old branch[%s]: %v", opts.NewBranch, opts.OldBranch, err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -131,12 +167,12 @@ func (repo *Repository) UpdateRepoFile(doer *User, opts UpdateRepoFileOptions) (
|
||||
// Otherwise, move the file when name changed.
|
||||
if com.IsFile(oldFilePath) && opts.OldTreeName != opts.NewTreeName {
|
||||
if err = git.MoveFile(localPath, opts.OldTreeName, opts.NewTreeName); err != nil {
|
||||
return fmt.Errorf("git mv %s %s: %v", opts.OldTreeName, opts.NewTreeName, err)
|
||||
return fmt.Errorf("git mv %q %q: %v", opts.OldTreeName, opts.NewTreeName, err)
|
||||
}
|
||||
}
|
||||
|
||||
if err = ioutil.WriteFile(filePath, []byte(opts.Content), 0666); err != nil {
|
||||
return fmt.Errorf("WriteFile: %v", err)
|
||||
return fmt.Errorf("write file: %v", err)
|
||||
}
|
||||
|
||||
if err = git.AddChanges(localPath, true); err != nil {
|
||||
@@ -145,45 +181,18 @@ func (repo *Repository) UpdateRepoFile(doer *User, opts UpdateRepoFileOptions) (
|
||||
Committer: doer.NewGitSig(),
|
||||
Message: opts.Message,
|
||||
}); err != nil {
|
||||
return fmt.Errorf("CommitChanges: %v", err)
|
||||
} else if err = git.Push(localPath, "origin", opts.NewBranch); err != nil {
|
||||
return fmt.Errorf("commit changes on %q: %v", localPath, err)
|
||||
} else if err = git.PushWithEnvs(localPath, "origin", opts.NewBranch,
|
||||
ComposeHookEnvs(ComposeHookEnvsOptions{
|
||||
AuthUser: doer,
|
||||
OwnerName: repo.MustOwner().Name,
|
||||
OwnerSalt: repo.MustOwner().Salt,
|
||||
RepoID: repo.ID,
|
||||
RepoName: repo.Name,
|
||||
RepoPath: repo.RepoPath(),
|
||||
})); err != nil {
|
||||
return fmt.Errorf("git push origin %s: %v", opts.NewBranch, err)
|
||||
}
|
||||
|
||||
gitRepo, err := git.OpenRepository(repo.RepoPath())
|
||||
if err != nil {
|
||||
log.Error(2, "OpenRepository: %v", err)
|
||||
return nil
|
||||
}
|
||||
commit, err := gitRepo.GetBranchCommit(opts.NewBranch)
|
||||
if err != nil {
|
||||
log.Error(2, "GetBranchCommit [branch: %s]: %v", opts.NewBranch, err)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Simulate push event.
|
||||
pushCommits := &PushCommits{
|
||||
Len: 1,
|
||||
Commits: []*PushCommit{CommitToPushCommit(commit)},
|
||||
}
|
||||
oldCommitID := opts.LastCommitID
|
||||
if opts.NewBranch != opts.OldBranch {
|
||||
oldCommitID = git.EMPTY_SHA
|
||||
}
|
||||
if err := CommitRepoAction(CommitRepoActionOptions{
|
||||
PusherName: doer.Name,
|
||||
RepoOwnerID: repo.MustOwner().ID,
|
||||
RepoName: repo.Name,
|
||||
RefFullName: git.BRANCH_PREFIX + opts.NewBranch,
|
||||
OldCommitID: oldCommitID,
|
||||
NewCommitID: commit.ID.String(),
|
||||
Commits: pushCommits,
|
||||
}); err != nil {
|
||||
log.Error(2, "CommitRepoAction: %v", err)
|
||||
return nil
|
||||
}
|
||||
|
||||
go AddTestPullRequestTask(doer, repo.ID, opts.NewBranch, true)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -193,16 +202,16 @@ func (repo *Repository) GetDiffPreview(branch, treePath, content string) (diff *
|
||||
defer repoWorkingPool.CheckOut(com.ToStr(repo.ID))
|
||||
|
||||
if err = repo.DiscardLocalRepoBranchChanges(branch); err != nil {
|
||||
return nil, fmt.Errorf("DiscardLocalRepoBranchChanges [branch: %s]: %v", branch, err)
|
||||
return nil, fmt.Errorf("discard local repo branch[%s] changes: %v", branch, err)
|
||||
} else if err = repo.UpdateLocalCopyBranch(branch); err != nil {
|
||||
return nil, fmt.Errorf("UpdateLocalCopyBranch [branch: %s]: %v", branch, err)
|
||||
return nil, fmt.Errorf("update local copy branch[%s]: %v", branch, err)
|
||||
}
|
||||
|
||||
localPath := repo.LocalCopyPath()
|
||||
filePath := path.Join(localPath, treePath)
|
||||
os.MkdirAll(filepath.Dir(filePath), os.ModePerm)
|
||||
if err = ioutil.WriteFile(filePath, []byte(content), 0666); err != nil {
|
||||
return nil, fmt.Errorf("WriteFile: %v", err)
|
||||
return nil, fmt.Errorf("write file: %v", err)
|
||||
}
|
||||
|
||||
cmd := exec.Command("git", "diff", treePath)
|
||||
@@ -211,11 +220,11 @@ func (repo *Repository) GetDiffPreview(branch, treePath, content string) (diff *
|
||||
|
||||
stdout, err := cmd.StdoutPipe()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("StdoutPipe: %v", err)
|
||||
return nil, fmt.Errorf("get stdout pipe: %v", err)
|
||||
}
|
||||
|
||||
if err = cmd.Start(); err != nil {
|
||||
return nil, fmt.Errorf("Start: %v", err)
|
||||
return nil, fmt.Errorf("start: %v", err)
|
||||
}
|
||||
|
||||
pid := process.Add(fmt.Sprintf("GetDiffPreview [repo_path: %s]", repo.RepoPath()), cmd)
|
||||
@@ -223,11 +232,11 @@ func (repo *Repository) GetDiffPreview(branch, treePath, content string) (diff *
|
||||
|
||||
diff, err = ParsePatch(setting.Git.MaxGitDiffLines, setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles, stdout)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("ParsePatch: %v", err)
|
||||
return nil, fmt.Errorf("parse path: %v", err)
|
||||
}
|
||||
|
||||
if err = cmd.Wait(); err != nil {
|
||||
return nil, fmt.Errorf("Wait: %v", err)
|
||||
return nil, fmt.Errorf("wait: %v", err)
|
||||
}
|
||||
|
||||
return diff, nil
|
||||
@@ -254,20 +263,20 @@ func (repo *Repository) DeleteRepoFile(doer *User, opts DeleteRepoFileOptions) (
|
||||
defer repoWorkingPool.CheckOut(com.ToStr(repo.ID))
|
||||
|
||||
if err = repo.DiscardLocalRepoBranchChanges(opts.OldBranch); err != nil {
|
||||
return fmt.Errorf("DiscardLocalRepoBranchChanges [branch: %s]: %v", opts.OldBranch, err)
|
||||
return fmt.Errorf("discard local repo branch[%s] changes: %v", opts.OldBranch, err)
|
||||
} else if err = repo.UpdateLocalCopyBranch(opts.OldBranch); err != nil {
|
||||
return fmt.Errorf("UpdateLocalCopyBranch [branch: %s]: %v", opts.OldBranch, err)
|
||||
return fmt.Errorf("update local copy branch[%s]: %v", opts.OldBranch, err)
|
||||
}
|
||||
|
||||
if opts.OldBranch != opts.NewBranch {
|
||||
if err := repo.CheckoutNewBranch(opts.OldBranch, opts.NewBranch); err != nil {
|
||||
return fmt.Errorf("CheckoutNewBranch [old_branch: %s, new_branch: %s]: %v", opts.OldBranch, opts.NewBranch, err)
|
||||
return fmt.Errorf("checkout new branch[%s] from old branch[%s]: %v", opts.NewBranch, opts.OldBranch, err)
|
||||
}
|
||||
}
|
||||
|
||||
localPath := repo.LocalCopyPath()
|
||||
if err = os.Remove(path.Join(localPath, opts.TreePath)); err != nil {
|
||||
return fmt.Errorf("Remove: %v", err)
|
||||
return fmt.Errorf("remove file %q: %v", opts.TreePath, err)
|
||||
}
|
||||
|
||||
if err = git.AddChanges(localPath, true); err != nil {
|
||||
@@ -276,41 +285,18 @@ func (repo *Repository) DeleteRepoFile(doer *User, opts DeleteRepoFileOptions) (
|
||||
Committer: doer.NewGitSig(),
|
||||
Message: opts.Message,
|
||||
}); err != nil {
|
||||
return fmt.Errorf("CommitChanges: %v", err)
|
||||
} else if err = git.Push(localPath, "origin", opts.NewBranch); err != nil {
|
||||
return fmt.Errorf("commit changes to %q: %v", localPath, err)
|
||||
} else if err = git.PushWithEnvs(localPath, "origin", opts.NewBranch,
|
||||
ComposeHookEnvs(ComposeHookEnvsOptions{
|
||||
AuthUser: doer,
|
||||
OwnerName: repo.MustOwner().Name,
|
||||
OwnerSalt: repo.MustOwner().Salt,
|
||||
RepoID: repo.ID,
|
||||
RepoName: repo.Name,
|
||||
RepoPath: repo.RepoPath(),
|
||||
})); err != nil {
|
||||
return fmt.Errorf("git push origin %s: %v", opts.NewBranch, err)
|
||||
}
|
||||
|
||||
gitRepo, err := git.OpenRepository(repo.RepoPath())
|
||||
if err != nil {
|
||||
log.Error(2, "OpenRepository: %v", err)
|
||||
return nil
|
||||
}
|
||||
commit, err := gitRepo.GetBranchCommit(opts.NewBranch)
|
||||
if err != nil {
|
||||
log.Error(2, "GetBranchCommit [branch: %s]: %v", opts.NewBranch, err)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Simulate push event.
|
||||
pushCommits := &PushCommits{
|
||||
Len: 1,
|
||||
Commits: []*PushCommit{CommitToPushCommit(commit)},
|
||||
}
|
||||
if err := CommitRepoAction(CommitRepoActionOptions{
|
||||
PusherName: doer.Name,
|
||||
RepoOwnerID: repo.MustOwner().ID,
|
||||
RepoName: repo.Name,
|
||||
RefFullName: git.BRANCH_PREFIX + opts.NewBranch,
|
||||
OldCommitID: opts.LastCommitID,
|
||||
NewCommitID: commit.ID.String(),
|
||||
Commits: pushCommits,
|
||||
}); err != nil {
|
||||
log.Error(2, "CommitRepoAction: %v", err)
|
||||
return nil
|
||||
}
|
||||
|
||||
go AddTestPullRequestTask(doer, repo.ID, opts.NewBranch, true)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -341,6 +327,10 @@ func (upload *Upload) LocalPath() string {
|
||||
|
||||
// NewUpload creates a new upload object.
|
||||
func NewUpload(name string, buf []byte, file multipart.File) (_ *Upload, err error) {
|
||||
if tool.IsMaliciousPath(name) {
|
||||
return nil, fmt.Errorf("malicious path detected: %s", name)
|
||||
}
|
||||
|
||||
upload := &Upload{
|
||||
UUID: gouuid.NewV4().String(),
|
||||
Name: name,
|
||||
@@ -348,19 +338,19 @@ func NewUpload(name string, buf []byte, file multipart.File) (_ *Upload, err err
|
||||
|
||||
localPath := upload.LocalPath()
|
||||
if err = os.MkdirAll(path.Dir(localPath), os.ModePerm); err != nil {
|
||||
return nil, fmt.Errorf("MkdirAll: %v", err)
|
||||
return nil, fmt.Errorf("mkdir all: %v", err)
|
||||
}
|
||||
|
||||
fw, err := os.Create(localPath)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Create: %v", err)
|
||||
return nil, fmt.Errorf("create: %v", err)
|
||||
}
|
||||
defer fw.Close()
|
||||
|
||||
if _, err = fw.Write(buf); err != nil {
|
||||
return nil, fmt.Errorf("Write: %v", err)
|
||||
return nil, fmt.Errorf("write: %v", err)
|
||||
} else if _, err = io.Copy(fw, file); err != nil {
|
||||
return nil, fmt.Errorf("Copy: %v", err)
|
||||
return nil, fmt.Errorf("copy: %v", err)
|
||||
}
|
||||
|
||||
if _, err := x.Insert(upload); err != nil {
|
||||
@@ -434,11 +424,11 @@ func DeleteUploadByUUID(uuid string) error {
|
||||
if IsErrUploadNotExist(err) {
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("GetUploadByUUID: %v", err)
|
||||
return fmt.Errorf("get upload by UUID[%s]: %v", uuid, err)
|
||||
}
|
||||
|
||||
if err := DeleteUpload(upload); err != nil {
|
||||
return fmt.Errorf("DeleteUpload: %v", err)
|
||||
return fmt.Errorf("delete upload: %v", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -450,7 +440,12 @@ type UploadRepoFileOptions struct {
|
||||
NewBranch string
|
||||
TreePath string
|
||||
Message string
|
||||
Files []string // In UUID format.
|
||||
Files []string // In UUID format
|
||||
}
|
||||
|
||||
// isRepositoryGitPath returns true if given path is or resides inside ".git" path of the repository.
|
||||
func isRepositoryGitPath(path string) bool {
|
||||
return strings.HasSuffix(path, ".git") || strings.Contains(path, ".git"+string(os.PathSeparator))
|
||||
}
|
||||
|
||||
func (repo *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions) (err error) {
|
||||
@@ -460,21 +455,21 @@ func (repo *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions)
|
||||
|
||||
uploads, err := GetUploadsByUUIDs(opts.Files)
|
||||
if err != nil {
|
||||
return fmt.Errorf("GetUploadsByUUIDs [uuids: %v]: %v", opts.Files, err)
|
||||
return fmt.Errorf("get uploads by UUIDs[%v]: %v", opts.Files, err)
|
||||
}
|
||||
|
||||
repoWorkingPool.CheckIn(com.ToStr(repo.ID))
|
||||
defer repoWorkingPool.CheckOut(com.ToStr(repo.ID))
|
||||
|
||||
if err = repo.DiscardLocalRepoBranchChanges(opts.OldBranch); err != nil {
|
||||
return fmt.Errorf("DiscardLocalRepoBranchChanges [branch: %s]: %v", opts.OldBranch, err)
|
||||
return fmt.Errorf("discard local repo branch[%s] changes: %v", opts.OldBranch, err)
|
||||
} else if err = repo.UpdateLocalCopyBranch(opts.OldBranch); err != nil {
|
||||
return fmt.Errorf("UpdateLocalCopyBranch [branch: %s]: %v", opts.OldBranch, err)
|
||||
return fmt.Errorf("update local copy branch[%s]: %v", opts.OldBranch, err)
|
||||
}
|
||||
|
||||
if opts.OldBranch != opts.NewBranch {
|
||||
if err = repo.CheckoutNewBranch(opts.OldBranch, opts.NewBranch); err != nil {
|
||||
return fmt.Errorf("CheckoutNewBranch [old_branch: %s, new_branch: %s]: %v", opts.OldBranch, opts.NewBranch, err)
|
||||
return fmt.Errorf("checkout new branch[%s] from old branch[%s]: %v", opts.NewBranch, opts.OldBranch, err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -482,16 +477,21 @@ func (repo *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions)
|
||||
dirPath := path.Join(localPath, opts.TreePath)
|
||||
os.MkdirAll(dirPath, os.ModePerm)
|
||||
|
||||
// Copy uploaded files into repository.
|
||||
// Copy uploaded files into repository
|
||||
for _, upload := range uploads {
|
||||
tmpPath := upload.LocalPath()
|
||||
targetPath := path.Join(dirPath, upload.Name)
|
||||
if !com.IsFile(tmpPath) {
|
||||
continue
|
||||
}
|
||||
|
||||
// Prevent copying files into .git directory, see https://github.com/gogs/gogs/issues/5558.
|
||||
if isRepositoryGitPath(upload.Name) {
|
||||
continue
|
||||
}
|
||||
|
||||
targetPath := path.Join(dirPath, upload.Name)
|
||||
if err = com.Copy(tmpPath, targetPath); err != nil {
|
||||
return fmt.Errorf("Copy: %v", err)
|
||||
return fmt.Errorf("copy: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -501,40 +501,18 @@ func (repo *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions)
|
||||
Committer: doer.NewGitSig(),
|
||||
Message: opts.Message,
|
||||
}); err != nil {
|
||||
return fmt.Errorf("CommitChanges: %v", err)
|
||||
} else if err = git.Push(localPath, "origin", opts.NewBranch); err != nil {
|
||||
return fmt.Errorf("commit changes on %q: %v", localPath, err)
|
||||
} else if err = git.PushWithEnvs(localPath, "origin", opts.NewBranch,
|
||||
ComposeHookEnvs(ComposeHookEnvsOptions{
|
||||
AuthUser: doer,
|
||||
OwnerName: repo.MustOwner().Name,
|
||||
OwnerSalt: repo.MustOwner().Salt,
|
||||
RepoID: repo.ID,
|
||||
RepoName: repo.Name,
|
||||
RepoPath: repo.RepoPath(),
|
||||
})); err != nil {
|
||||
return fmt.Errorf("git push origin %s: %v", opts.NewBranch, err)
|
||||
}
|
||||
|
||||
gitRepo, err := git.OpenRepository(repo.RepoPath())
|
||||
if err != nil {
|
||||
log.Error(2, "OpenRepository: %v", err)
|
||||
return nil
|
||||
}
|
||||
commit, err := gitRepo.GetBranchCommit(opts.NewBranch)
|
||||
if err != nil {
|
||||
log.Error(2, "GetBranchCommit [branch: %s]: %v", opts.NewBranch, err)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Simulate push event.
|
||||
pushCommits := &PushCommits{
|
||||
Len: 1,
|
||||
Commits: []*PushCommit{CommitToPushCommit(commit)},
|
||||
}
|
||||
if err := CommitRepoAction(CommitRepoActionOptions{
|
||||
PusherName: doer.Name,
|
||||
RepoOwnerID: repo.MustOwner().ID,
|
||||
RepoName: repo.Name,
|
||||
RefFullName: git.BRANCH_PREFIX + opts.NewBranch,
|
||||
OldCommitID: opts.LastCommitID,
|
||||
NewCommitID: commit.ID.String(),
|
||||
Commits: pushCommits,
|
||||
}); err != nil {
|
||||
log.Error(2, "CommitRepoAction: %v", err)
|
||||
return nil
|
||||
}
|
||||
|
||||
go AddTestPullRequestTask(doer, repo.ID, opts.NewBranch, true)
|
||||
return DeleteUploads(uploads...)
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -25,7 +25,6 @@ import (
|
||||
|
||||
"github.com/gogs/gogs/pkg/process"
|
||||
"github.com/gogs/gogs/pkg/setting"
|
||||
"github.com/gogs/gogs/pkg/tool"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -51,12 +50,12 @@ type PublicKey struct {
|
||||
Mode AccessMode `xorm:"NOT NULL DEFAULT 2"`
|
||||
Type KeyType `xorm:"NOT NULL DEFAULT 1"`
|
||||
|
||||
Created time.Time `xorm:"-"`
|
||||
Created time.Time `xorm:"-" json:"-"`
|
||||
CreatedUnix int64
|
||||
Updated time.Time `xorm:"-"` // Note: Updated must below Created for AfterSet.
|
||||
Updated time.Time `xorm:"-" json:"-"` // Note: Updated must below Created for AfterSet.
|
||||
UpdatedUnix int64
|
||||
HasRecentActivity bool `xorm:"-"`
|
||||
HasUsed bool `xorm:"-"`
|
||||
HasRecentActivity bool `xorm:"-" json:"-"`
|
||||
HasUsed bool `xorm:"-" json:"-"`
|
||||
}
|
||||
|
||||
func (k *PublicKey) BeforeInsert() {
|
||||
@@ -479,7 +478,7 @@ func deletePublicKeys(e *xorm.Session, keyIDs ...int64) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
_, err := e.In("id", strings.Join(tool.Int64sToStrings(keyIDs), ",")).Delete(new(PublicKey))
|
||||
_, err := e.In("id", keyIDs).Delete(new(PublicKey))
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -568,14 +567,14 @@ type DeployKey struct {
|
||||
RepoID int64 `xorm:"UNIQUE(s) INDEX"`
|
||||
Name string
|
||||
Fingerprint string
|
||||
Content string `xorm:"-"`
|
||||
Content string `xorm:"-" json:"-"`
|
||||
|
||||
Created time.Time `xorm:"-"`
|
||||
Created time.Time `xorm:"-" json:"-"`
|
||||
CreatedUnix int64
|
||||
Updated time.Time `xorm:"-"` // Note: Updated must below Created for AfterSet.
|
||||
Updated time.Time `xorm:"-" json:"-"` // Note: Updated must below Created for AfterSet.
|
||||
UpdatedUnix int64
|
||||
HasRecentActivity bool `xorm:"-"`
|
||||
HasUsed bool `xorm:"-"`
|
||||
HasRecentActivity bool `xorm:"-" json:"-"`
|
||||
HasUsed bool `xorm:"-" json:"-"`
|
||||
}
|
||||
|
||||
func (k *DeployKey) BeforeInsert() {
|
||||
@@ -748,7 +747,7 @@ func DeleteDeployKey(doer *User, id int64) error {
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err = sess.Id(key.ID).Delete(new(DeployKey)); err != nil {
|
||||
if _, err = sess.ID(key.ID).Delete(new(DeployKey)); err != nil {
|
||||
return fmt.Errorf("delete deploy key [%d]: %v", key.ID, err)
|
||||
}
|
||||
|
||||
|
||||
@@ -20,12 +20,12 @@ type AccessToken struct {
|
||||
Name string
|
||||
Sha1 string `xorm:"UNIQUE VARCHAR(40)"`
|
||||
|
||||
Created time.Time `xorm:"-"`
|
||||
Created time.Time `xorm:"-" json:"-"`
|
||||
CreatedUnix int64
|
||||
Updated time.Time `xorm:"-"` // Note: Updated must below Created for AfterSet.
|
||||
Updated time.Time `xorm:"-" json:"-"` // Note: Updated must below Created for AfterSet.
|
||||
UpdatedUnix int64
|
||||
HasRecentActivity bool `xorm:"-"`
|
||||
HasUsed bool `xorm:"-"`
|
||||
HasRecentActivity bool `xorm:"-" json:"-"`
|
||||
HasUsed bool `xorm:"-" json:"-"`
|
||||
}
|
||||
|
||||
func (t *AccessToken) BeforeInsert() {
|
||||
|
||||
@@ -25,7 +25,7 @@ type TwoFactor struct {
|
||||
ID int64
|
||||
UserID int64 `xorm:"UNIQUE"`
|
||||
Secret string
|
||||
Created time.Time `xorm:"-"`
|
||||
Created time.Time `xorm:"-" json:"-"`
|
||||
CreatedUnix int64
|
||||
}
|
||||
|
||||
|
||||
@@ -35,6 +35,9 @@ import (
|
||||
"github.com/gogs/gogs/pkg/tool"
|
||||
)
|
||||
|
||||
// USER_AVATAR_URL_PREFIX is used to identify a URL is to access user avatar.
|
||||
const USER_AVATAR_URL_PREFIX = "avatars"
|
||||
|
||||
type UserType int
|
||||
|
||||
const (
|
||||
@@ -55,17 +58,17 @@ type User struct {
|
||||
LoginSource int64 `xorm:"NOT NULL DEFAULT 0"`
|
||||
LoginName string
|
||||
Type UserType
|
||||
OwnedOrgs []*User `xorm:"-"`
|
||||
Orgs []*User `xorm:"-"`
|
||||
Repos []*Repository `xorm:"-"`
|
||||
OwnedOrgs []*User `xorm:"-" json:"-"`
|
||||
Orgs []*User `xorm:"-" json:"-"`
|
||||
Repos []*Repository `xorm:"-" json:"-"`
|
||||
Location string
|
||||
Website string
|
||||
Rands string `xorm:"VARCHAR(10)"`
|
||||
Salt string `xorm:"VARCHAR(10)"`
|
||||
|
||||
Created time.Time `xorm:"-"`
|
||||
Created time.Time `xorm:"-" json:"-"`
|
||||
CreatedUnix int64
|
||||
Updated time.Time `xorm:"-"`
|
||||
Updated time.Time `xorm:"-" json:"-"`
|
||||
UpdatedUnix int64
|
||||
|
||||
// Remember visibility choice for convenience, true for private
|
||||
@@ -95,8 +98,8 @@ type User struct {
|
||||
Description string
|
||||
NumTeams int
|
||||
NumMembers int
|
||||
Teams []*Team `xorm:"-"`
|
||||
Members []*User `xorm:"-"`
|
||||
Teams []*Team `xorm:"-" json:"-"`
|
||||
Members []*User `xorm:"-" json:"-"`
|
||||
}
|
||||
|
||||
func (u *User) BeforeInsert() {
|
||||
@@ -129,6 +132,7 @@ func (u *User) APIFormat() *api.User {
|
||||
return &api.User{
|
||||
ID: u.ID,
|
||||
UserName: u.Name,
|
||||
Login: u.Name,
|
||||
FullName: u.FullName,
|
||||
Email: u.Email,
|
||||
AvatarUrl: u.AvatarLink(),
|
||||
@@ -257,7 +261,7 @@ func (u *User) RelAvatarLink() string {
|
||||
if !com.IsExist(u.CustomAvatarPath()) {
|
||||
return defaultImgUrl
|
||||
}
|
||||
return setting.AppSubURL + "/avatars/" + com.ToStr(u.ID)
|
||||
return fmt.Sprintf("%s/%s/%d", setting.AppSubURL, USER_AVATAR_URL_PREFIX, u.ID)
|
||||
case setting.DisableGravatar, setting.OfflineMode:
|
||||
if !com.IsExist(u.CustomAvatarPath()) {
|
||||
if err := u.GenerateRandomAvatar(); err != nil {
|
||||
@@ -265,7 +269,7 @@ func (u *User) RelAvatarLink() string {
|
||||
}
|
||||
}
|
||||
|
||||
return setting.AppSubURL + "/avatars/" + com.ToStr(u.ID)
|
||||
return fmt.Sprintf("%s/%s/%d", setting.AppSubURL, USER_AVATAR_URL_PREFIX, u.ID)
|
||||
}
|
||||
return tool.AvatarLink(u.AvatarEmail)
|
||||
}
|
||||
@@ -330,50 +334,37 @@ func (u *User) ValidatePassword(passwd string) bool {
|
||||
}
|
||||
|
||||
// UploadAvatar saves custom avatar for user.
|
||||
// FIXME: split uploads to different subdirs in case we have massive users.
|
||||
// FIXME: split uploads to different subdirs in case we have massive number of users.
|
||||
func (u *User) UploadAvatar(data []byte) error {
|
||||
img, _, err := image.Decode(bytes.NewReader(data))
|
||||
if err != nil {
|
||||
return fmt.Errorf("Decode: %v", err)
|
||||
}
|
||||
|
||||
m := resize.Resize(avatar.AVATAR_SIZE, avatar.AVATAR_SIZE, img, resize.NearestNeighbor)
|
||||
|
||||
sess := x.NewSession()
|
||||
defer sess.Close()
|
||||
if err = sess.Begin(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
u.UseCustomAvatar = true
|
||||
if err = updateUser(sess, u); err != nil {
|
||||
return fmt.Errorf("updateUser: %v", err)
|
||||
return fmt.Errorf("decode image: %v", err)
|
||||
}
|
||||
|
||||
os.MkdirAll(setting.AvatarUploadPath, os.ModePerm)
|
||||
fw, err := os.Create(u.CustomAvatarPath())
|
||||
if err != nil {
|
||||
return fmt.Errorf("Create: %v", err)
|
||||
return fmt.Errorf("create custom avatar directory: %v", err)
|
||||
}
|
||||
defer fw.Close()
|
||||
|
||||
m := resize.Resize(avatar.AVATAR_SIZE, avatar.AVATAR_SIZE, img, resize.NearestNeighbor)
|
||||
if err = png.Encode(fw, m); err != nil {
|
||||
return fmt.Errorf("Encode: %v", err)
|
||||
return fmt.Errorf("encode image: %v", err)
|
||||
}
|
||||
|
||||
return sess.Commit()
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeleteAvatar deletes the user's custom avatar.
|
||||
func (u *User) DeleteAvatar() error {
|
||||
log.Trace("DeleteAvatar [%d]: %s", u.ID, u.CustomAvatarPath())
|
||||
os.Remove(u.CustomAvatarPath())
|
||||
if err := os.Remove(u.CustomAvatarPath()); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
u.UseCustomAvatar = false
|
||||
if err := UpdateUser(u); err != nil {
|
||||
return fmt.Errorf("UpdateUser: %v", err)
|
||||
}
|
||||
return nil
|
||||
return UpdateUser(u)
|
||||
}
|
||||
|
||||
// IsAdminOfRepo returns true if user has admin or higher access of repository.
|
||||
@@ -716,7 +707,7 @@ func updateUser(e Engine, u *User) error {
|
||||
u.Website = tool.TruncateString(u.Website, 255)
|
||||
u.Description = tool.TruncateString(u.Description, 255)
|
||||
|
||||
_, err := e.Id(u.ID).AllCols().Update(u)
|
||||
_, err := e.ID(u.ID).AllCols().Update(u)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -900,7 +891,7 @@ func GetUserByKeyID(keyID int64) (*User, error) {
|
||||
|
||||
func getUserByID(e Engine, id int64) (*User, error) {
|
||||
u := new(User)
|
||||
has, err := e.Id(id).Get(u)
|
||||
has, err := e.ID(id).Get(u)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if !has {
|
||||
|
||||
@@ -18,7 +18,7 @@ type EmailAddress struct {
|
||||
UID int64 `xorm:"INDEX NOT NULL"`
|
||||
Email string `xorm:"UNIQUE NOT NULL"`
|
||||
IsActivated bool
|
||||
IsPrimary bool `xorm:"-"`
|
||||
IsPrimary bool `xorm:"-" json:"-"`
|
||||
}
|
||||
|
||||
// GetEmailAddresses returns all email addresses belongs to given user.
|
||||
@@ -132,7 +132,7 @@ func (email *EmailAddress) Activate() error {
|
||||
}
|
||||
|
||||
email.IsActivated = true
|
||||
if _, err := sess.Id(email.ID).AllCols().Update(email); err != nil {
|
||||
if _, err := sess.ID(email.ID).AllCols().Update(email); err != nil {
|
||||
return err
|
||||
} else if err = updateUser(sess, user); err != nil {
|
||||
return err
|
||||
@@ -202,7 +202,7 @@ func MakeEmailPrimary(email *EmailAddress) error {
|
||||
}
|
||||
|
||||
user.Email = email.Email
|
||||
if _, err = sess.Id(user.ID).AllCols().Update(user); err != nil {
|
||||
if _, err = sess.ID(user.ID).AllCols().Update(user); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
@@ -9,13 +9,13 @@ import (
|
||||
"crypto/sha256"
|
||||
"crypto/tls"
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/go-xorm/xorm"
|
||||
"github.com/json-iterator/go"
|
||||
gouuid "github.com/satori/go.uuid"
|
||||
log "gopkg.in/clog.v1"
|
||||
|
||||
@@ -97,18 +97,18 @@ type Webhook struct {
|
||||
OrgID int64
|
||||
URL string `xorm:"url TEXT"`
|
||||
ContentType HookContentType
|
||||
Secret string `xorm:"TEXT"`
|
||||
Events string `xorm:"TEXT"`
|
||||
*HookEvent `xorm:"-"`
|
||||
IsSSL bool `xorm:"is_ssl"`
|
||||
Secret string `xorm:"TEXT"`
|
||||
Events string `xorm:"TEXT"`
|
||||
*HookEvent `xorm:"-"` // LEGACY [1.0]: Cannot ignore JSON here, it breaks old backup archive
|
||||
IsSSL bool `xorm:"is_ssl"`
|
||||
IsActive bool
|
||||
HookTaskType HookTaskType
|
||||
Meta string `xorm:"TEXT"` // store hook-specific attributes
|
||||
LastStatus HookStatus // Last delivery status
|
||||
|
||||
Created time.Time `xorm:"-"`
|
||||
Created time.Time `xorm:"-" json:"-"`
|
||||
CreatedUnix int64
|
||||
Updated time.Time `xorm:"-"`
|
||||
Updated time.Time `xorm:"-" json:"-"`
|
||||
UpdatedUnix int64
|
||||
}
|
||||
|
||||
@@ -126,7 +126,7 @@ func (w *Webhook) AfterSet(colName string, _ xorm.Cell) {
|
||||
switch colName {
|
||||
case "events":
|
||||
w.HookEvent = &HookEvent{}
|
||||
if err = json.Unmarshal([]byte(w.Events), w.HookEvent); err != nil {
|
||||
if err = jsoniter.Unmarshal([]byte(w.Events), w.HookEvent); err != nil {
|
||||
log.Error(3, "Unmarshal [%d]: %v", w.ID, err)
|
||||
}
|
||||
case "created_unix":
|
||||
@@ -138,7 +138,7 @@ func (w *Webhook) AfterSet(colName string, _ xorm.Cell) {
|
||||
|
||||
func (w *Webhook) GetSlackHook() *SlackMeta {
|
||||
s := &SlackMeta{}
|
||||
if err := json.Unmarshal([]byte(w.Meta), s); err != nil {
|
||||
if err := jsoniter.Unmarshal([]byte(w.Meta), s); err != nil {
|
||||
log.Error(2, "GetSlackHook [%d]: %v", w.ID, err)
|
||||
}
|
||||
return s
|
||||
@@ -151,7 +151,7 @@ func (w *Webhook) History(page int) ([]*HookTask, error) {
|
||||
|
||||
// UpdateEvent handles conversion from HookEvent to Events.
|
||||
func (w *Webhook) UpdateEvent() error {
|
||||
data, err := json.Marshal(w.HookEvent)
|
||||
data, err := jsoniter.Marshal(w.HookEvent)
|
||||
w.Events = string(data)
|
||||
return err
|
||||
}
|
||||
@@ -418,21 +418,21 @@ type HookTask struct {
|
||||
Type HookTaskType
|
||||
URL string `xorm:"TEXT"`
|
||||
Signature string `xorm:"TEXT"`
|
||||
api.Payloader `xorm:"-"`
|
||||
api.Payloader `xorm:"-" json:"-"`
|
||||
PayloadContent string `xorm:"TEXT"`
|
||||
ContentType HookContentType
|
||||
EventType HookEventType
|
||||
IsSSL bool
|
||||
IsDelivered bool
|
||||
Delivered int64
|
||||
DeliveredString string `xorm:"-"`
|
||||
DeliveredString string `xorm:"-" json:"-"`
|
||||
|
||||
// History info.
|
||||
IsSucceed bool
|
||||
RequestContent string `xorm:"TEXT"`
|
||||
RequestInfo *HookRequest `xorm:"-"`
|
||||
RequestInfo *HookRequest `xorm:"-" json:"-"`
|
||||
ResponseContent string `xorm:"TEXT"`
|
||||
ResponseInfo *HookResponse `xorm:"-"`
|
||||
ResponseInfo *HookResponse `xorm:"-" json:"-"`
|
||||
}
|
||||
|
||||
func (t *HookTask) BeforeUpdate() {
|
||||
@@ -456,7 +456,7 @@ func (t *HookTask) AfterSet(colName string, _ xorm.Cell) {
|
||||
}
|
||||
|
||||
t.RequestInfo = &HookRequest{}
|
||||
if err = json.Unmarshal([]byte(t.RequestContent), t.RequestInfo); err != nil {
|
||||
if err = jsoniter.Unmarshal([]byte(t.RequestContent), t.RequestInfo); err != nil {
|
||||
log.Error(3, "Unmarshal[%d]: %v", t.ID, err)
|
||||
}
|
||||
|
||||
@@ -466,14 +466,14 @@ func (t *HookTask) AfterSet(colName string, _ xorm.Cell) {
|
||||
}
|
||||
|
||||
t.ResponseInfo = &HookResponse{}
|
||||
if err = json.Unmarshal([]byte(t.ResponseContent), t.ResponseInfo); err != nil {
|
||||
if err = jsoniter.Unmarshal([]byte(t.ResponseContent), t.ResponseInfo); err != nil {
|
||||
log.Error(3, "Unmarshal [%d]: %v", t.ID, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (t *HookTask) MarshalJSON(v interface{}) string {
|
||||
p, err := json.Marshal(v)
|
||||
p, err := jsoniter.Marshal(v)
|
||||
if err != nil {
|
||||
log.Error(3, "Marshal [%d]: %v", t.ID, err)
|
||||
}
|
||||
@@ -654,6 +654,8 @@ func (t *HookTask) deliver() {
|
||||
|
||||
timeout := time.Duration(setting.Webhook.DeliverTimeout) * time.Second
|
||||
req := httplib.Post(t.URL).SetTimeout(timeout, timeout).
|
||||
Header("X-Github-Delivery", t.UUID).
|
||||
Header("X-Github-Event", string(t.EventType)).
|
||||
Header("X-Gogs-Delivery", t.UUID).
|
||||
Header("X-Gogs-Signature", t.Signature).
|
||||
Header("X-Gogs-Event", string(t.EventType)).
|
||||
|
||||
@@ -5,10 +5,11 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/json-iterator/go"
|
||||
|
||||
"github.com/gogs/git-module"
|
||||
api "github.com/gogs/go-gogs-client"
|
||||
)
|
||||
@@ -41,7 +42,7 @@ type DingtalkPayload struct {
|
||||
}
|
||||
|
||||
func (p *DingtalkPayload) JSONPayload() ([]byte, error) {
|
||||
data, err := json.MarshalIndent(p, "", " ")
|
||||
data, err := jsoniter.MarshalIndent(p, "", " ")
|
||||
if err != nil {
|
||||
return []byte{}, err
|
||||
}
|
||||
|
||||
@@ -5,11 +5,12 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/json-iterator/go"
|
||||
|
||||
"github.com/gogs/git-module"
|
||||
api "github.com/gogs/go-gogs-client"
|
||||
|
||||
@@ -49,7 +50,7 @@ type DiscordPayload struct {
|
||||
}
|
||||
|
||||
func (p *DiscordPayload) JSONPayload() ([]byte, error) {
|
||||
data, err := json.MarshalIndent(p, "", " ")
|
||||
data, err := jsoniter.MarshalIndent(p, "", " ")
|
||||
if err != nil {
|
||||
return []byte{}, err
|
||||
}
|
||||
@@ -371,8 +372,8 @@ func getDiscordReleasePayload(p *api.ReleasePayload) (*DiscordPayload, error) {
|
||||
|
||||
func GetDiscordPayload(p api.Payloader, event HookEventType, meta string) (payload *DiscordPayload, err error) {
|
||||
slack := &SlackMeta{}
|
||||
if err := json.Unmarshal([]byte(meta), &slack); err != nil {
|
||||
return nil, fmt.Errorf("json.Unmarshal: %v", err)
|
||||
if err := jsoniter.Unmarshal([]byte(meta), &slack); err != nil {
|
||||
return nil, fmt.Errorf("jsoniter.Unmarshal: %v", err)
|
||||
}
|
||||
|
||||
switch event {
|
||||
|
||||
@@ -5,10 +5,11 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/json-iterator/go"
|
||||
|
||||
"github.com/gogs/git-module"
|
||||
api "github.com/gogs/go-gogs-client"
|
||||
|
||||
@@ -40,7 +41,7 @@ type SlackPayload struct {
|
||||
}
|
||||
|
||||
func (p *SlackPayload) JSONPayload() ([]byte, error) {
|
||||
data, err := json.MarshalIndent(p, "", " ")
|
||||
data, err := jsoniter.MarshalIndent(p, "", " ")
|
||||
if err != nil {
|
||||
return []byte{}, err
|
||||
}
|
||||
@@ -288,8 +289,8 @@ func getSlackReleasePayload(p *api.ReleasePayload) (*SlackPayload, error) {
|
||||
|
||||
func GetSlackPayload(p api.Payloader, event HookEventType, meta string) (payload *SlackPayload, err error) {
|
||||
slack := &SlackMeta{}
|
||||
if err := json.Unmarshal([]byte(meta), &slack); err != nil {
|
||||
return nil, fmt.Errorf("json.Unmarshal: %v", err)
|
||||
if err := jsoniter.Unmarshal([]byte(meta), &slack); err != nil {
|
||||
return nil, fmt.Errorf("Unmarshal: %v", err)
|
||||
}
|
||||
|
||||
switch event {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -178,7 +178,7 @@ func bindUser(l *ldap.Conn, userDN, passwd string) error {
|
||||
func (ls *Source) SearchEntry(name, passwd string, directBind bool) (string, string, string, string, bool, bool) {
|
||||
// See https://tools.ietf.org/search/rfc4513#section-5.1.2
|
||||
if len(passwd) == 0 {
|
||||
log.Trace("authentication failed for '%s' with empty password")
|
||||
log.Trace("authentication failed for '%s' with empty password", name)
|
||||
return "", "", "", "", false, false
|
||||
}
|
||||
l, err := dial(ls)
|
||||
@@ -268,16 +268,26 @@ func (ls *Source) SearchEntry(name, passwd string, directBind bool) (string, str
|
||||
if err != nil {
|
||||
log.Error(2, "LDAP: Group search failed: %v", err)
|
||||
return "", "", "", "", false, false
|
||||
} else if len(sr.Entries) < 1 {
|
||||
} else if len(srg.Entries) < 1 {
|
||||
log.Error(2, "LDAP: Group search failed: 0 entries")
|
||||
return "", "", "", "", false, false
|
||||
}
|
||||
|
||||
isMember := false
|
||||
for _, group := range srg.Entries {
|
||||
for _, member := range group.GetAttributeValues(ls.GroupMemberUID) {
|
||||
if member == uid {
|
||||
isMember = true
|
||||
if ls.UserUID == "dn" {
|
||||
for _, group := range srg.Entries {
|
||||
for _, member := range group.GetAttributeValues(ls.GroupMemberUID) {
|
||||
if member == sr.Entries[0].DN {
|
||||
isMember = true
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for _, group := range srg.Entries {
|
||||
for _, member := range group.GetAttributeValues(ls.GroupMemberUID) {
|
||||
if member == uid {
|
||||
isMember = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -6,6 +6,7 @@ package context
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/Unknwon/paginater"
|
||||
@@ -16,12 +17,16 @@ import (
|
||||
)
|
||||
|
||||
type APIContext struct {
|
||||
*Context
|
||||
*Context // TODO: Reduce to only needed fields instead of full shadow
|
||||
|
||||
// Base URL for the version of API endpoints, e.g. https://try.gogs.io/api/v1
|
||||
BaseURL string
|
||||
|
||||
Org *APIOrganization
|
||||
}
|
||||
|
||||
// FIXME: move to github.com/gogs/go-gogs-client
|
||||
const DOC_URL = "https://github.com/gogs/go-gogs-client/wiki"
|
||||
const DOC_URL = "https://github.com/gogs/docs-api"
|
||||
|
||||
// Error responses error message to client with given message.
|
||||
// If status is 500, also it prints error to log.
|
||||
@@ -33,7 +38,7 @@ func (c *APIContext) Error(status int, title string, obj interface{}) {
|
||||
message = obj.(string)
|
||||
}
|
||||
|
||||
if status == 500 {
|
||||
if status == http.StatusInternalServerError {
|
||||
log.Error(3, "%s: %s", title, message)
|
||||
}
|
||||
|
||||
@@ -43,7 +48,33 @@ func (c *APIContext) Error(status int, title string, obj interface{}) {
|
||||
})
|
||||
}
|
||||
|
||||
// SetLinkHeader sets pagination link header by given totol number and page size.
|
||||
// NoContent renders the 204 response.
|
||||
func (c *APIContext) NoContent() {
|
||||
c.Status(http.StatusNoContent)
|
||||
}
|
||||
|
||||
// NotFound renders the 404 response.
|
||||
func (c *APIContext) NotFound() {
|
||||
c.Status(http.StatusNotFound)
|
||||
}
|
||||
|
||||
// ServerError renders the 500 response.
|
||||
func (c *APIContext) ServerError(title string, err error) {
|
||||
c.Error(http.StatusInternalServerError, title, err)
|
||||
}
|
||||
|
||||
// NotFoundOrServerError use error check function to determine if the error
|
||||
// is about not found. It responses with 404 status code for not found error,
|
||||
// or error context description for logging purpose of 500 server error.
|
||||
func (c *APIContext) NotFoundOrServerError(title string, errck func(error) bool, err error) {
|
||||
if errck(err) {
|
||||
c.NotFound()
|
||||
return
|
||||
}
|
||||
c.ServerError(title, err)
|
||||
}
|
||||
|
||||
// SetLinkHeader sets pagination link header by given total number and page size.
|
||||
func (c *APIContext) SetLinkHeader(total, pageSize int) {
|
||||
page := paginater.New(total, pageSize, c.QueryInt("page"), 0)
|
||||
links := make([]string, 0, 4)
|
||||
@@ -69,6 +100,7 @@ func APIContexter() macaron.Handler {
|
||||
return func(ctx *Context) {
|
||||
c := &APIContext{
|
||||
Context: ctx,
|
||||
BaseURL: setting.AppURL + "api/v1",
|
||||
}
|
||||
ctx.Map(c)
|
||||
}
|
||||
|
||||
@@ -5,13 +5,16 @@
|
||||
package context
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
|
||||
"github.com/go-macaron/csrf"
|
||||
"gopkg.in/macaron.v1"
|
||||
|
||||
"github.com/gogs/gogs/pkg/auth"
|
||||
"github.com/gogs/gogs/pkg/setting"
|
||||
"github.com/gogs/gogs/pkg/tool"
|
||||
)
|
||||
|
||||
type ToggleOptions struct {
|
||||
@@ -92,3 +95,18 @@ func Toggle(options *ToggleOptions) macaron.Handler {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// RequireBasicAuth verifies HTTP Basic Authentication header with given credentials
|
||||
func (c *Context) RequireBasicAuth(username, password string) {
|
||||
fields := strings.Fields(c.Req.Header.Get("Authorization"))
|
||||
if len(fields) != 2 || fields[0] != "Basic" {
|
||||
c.Status(http.StatusUnauthorized)
|
||||
return
|
||||
}
|
||||
|
||||
uname, passwd, _ := tool.BasicAuthDecode(fields[1])
|
||||
if uname != username || passwd != password {
|
||||
c.Status(http.StatusForbidden)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,6 @@ package context
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"html/template"
|
||||
"io"
|
||||
"net/http"
|
||||
"path"
|
||||
@@ -26,6 +25,7 @@ import (
|
||||
"github.com/gogs/gogs/pkg/auth"
|
||||
"github.com/gogs/gogs/pkg/form"
|
||||
"github.com/gogs/gogs/pkg/setting"
|
||||
"github.com/gogs/gogs/pkg/template"
|
||||
)
|
||||
|
||||
// Context represents context of a request.
|
||||
@@ -40,6 +40,7 @@ type Context struct {
|
||||
User *models.User
|
||||
IsLogged bool
|
||||
IsBasicAuth bool
|
||||
IsTokenAuth bool
|
||||
|
||||
Repo *Repository
|
||||
Org *Organization
|
||||
@@ -68,6 +69,14 @@ func (c *Context) RequireSimpleMDE() {
|
||||
c.Require("SimpleMDE")
|
||||
}
|
||||
|
||||
func (c *Context) RequireAutosize() {
|
||||
c.Require("Autosize")
|
||||
}
|
||||
|
||||
func (c *Context) RequireDropzone() {
|
||||
c.Require("Dropzone")
|
||||
}
|
||||
|
||||
// FormErr sets "Err_xxx" field in template data.
|
||||
func (c *Context) FormErr(names ...string) {
|
||||
for i := range names {
|
||||
@@ -130,10 +139,21 @@ func (c *Context) JSONSuccess(data interface{}) {
|
||||
c.JSON(http.StatusOK, data)
|
||||
}
|
||||
|
||||
// RawRedirect simply calls underlying Redirect method with no escape.
|
||||
func (c *Context) RawRedirect(location string, status ...int) {
|
||||
c.Context.Redirect(location, status...)
|
||||
}
|
||||
|
||||
// Redirect responses redirection wtih given location and status.
|
||||
// It escapes special characters in the location string.
|
||||
func (c *Context) Redirect(location string, status ...int) {
|
||||
c.Context.Redirect(template.EscapePound(location), status...)
|
||||
}
|
||||
|
||||
// SubURLRedirect responses redirection wtih given location and status.
|
||||
// It prepends setting.AppSubURL to the location string.
|
||||
func (c *Context) SubURLRedirect(location string, status ...int) {
|
||||
c.Redirect(setting.AppSubURL + location)
|
||||
c.Redirect(setting.AppSubURL+location, status...)
|
||||
}
|
||||
|
||||
// RenderWithErr used for page has form validation but need to prompt error to users.
|
||||
@@ -219,7 +239,7 @@ func Contexter() macaron.Handler {
|
||||
},
|
||||
Org: &Organization{},
|
||||
}
|
||||
c.Data["Link"] = c.Link
|
||||
c.Data["Link"] = template.EscapePound(c.Link)
|
||||
c.Data["PageStartTime"] = time.Now()
|
||||
|
||||
// Quick responses appropriate go-get meta with status 200
|
||||
@@ -244,6 +264,10 @@ func Contexter() macaron.Handler {
|
||||
}
|
||||
|
||||
prefix := setting.AppURL + path.Join(ownerName, repoName, "src", branchName)
|
||||
insecureFlag := ""
|
||||
if !strings.HasPrefix(setting.AppURL, "https://") {
|
||||
insecureFlag = "--insecure "
|
||||
}
|
||||
c.PlainText(http.StatusOK, []byte(com.Expand(`<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
@@ -251,14 +275,15 @@ func Contexter() macaron.Handler {
|
||||
<meta name="go-source" content="{GoGetImport} _ {GoDocDirectory} {GoDocFile}">
|
||||
</head>
|
||||
<body>
|
||||
go get {GoGetImport}
|
||||
go get {InsecureFlag}{GoGetImport}
|
||||
</body>
|
||||
</html>
|
||||
`, map[string]string{
|
||||
"GoGetImport": path.Join(setting.Domain, setting.AppSubURL, repo.FullName()),
|
||||
"GoGetImport": path.Join(setting.HostAddress, setting.AppSubURL, repo.FullName()),
|
||||
"CloneLink": models.ComposeHTTPSCloneURL(ownerName, repoName),
|
||||
"GoDocDirectory": prefix + "{/dir}",
|
||||
"GoDocFile": prefix + "{/dir}/{file}#L{line}",
|
||||
"InsecureFlag": insecureFlag,
|
||||
})))
|
||||
return
|
||||
}
|
||||
@@ -270,8 +295,8 @@ func Contexter() macaron.Handler {
|
||||
c.Header().Set("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With")
|
||||
}
|
||||
|
||||
// Get user from session if logined.
|
||||
c.User, c.IsBasicAuth = auth.SignedInUser(c.Context, c.Session)
|
||||
// Get user from session or header when possible
|
||||
c.User, c.IsBasicAuth, c.IsTokenAuth = auth.SignedInUser(c.Context, c.Session)
|
||||
|
||||
if c.User != nil {
|
||||
c.IsLogged = true
|
||||
@@ -288,13 +313,13 @@ func Contexter() macaron.Handler {
|
||||
// If request sends files, parse them here otherwise the Query() can't be parsed and the CsrfToken will be invalid.
|
||||
if c.Req.Method == "POST" && strings.Contains(c.Req.Header.Get("Content-Type"), "multipart/form-data") {
|
||||
if err := c.Req.ParseMultipartForm(setting.AttachmentMaxSize << 20); err != nil && !strings.Contains(err.Error(), "EOF") { // 32MB max size
|
||||
c.Handle(500, "ParseMultipartForm", err)
|
||||
c.ServerError("ParseMultipartForm", err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
c.Data["CSRFToken"] = x.GetToken()
|
||||
c.Data["CSRFTokenHTML"] = template.HTML(`<input type="hidden" name="_csrf" value="` + x.GetToken() + `">`)
|
||||
c.Data["CSRFTokenHTML"] = template.Safe(`<input type="hidden" name="_csrf" value="` + x.GetToken() + `">`)
|
||||
log.Trace("Session ID: %s", sess.ID())
|
||||
log.Trace("CSRF Token: %v", c.Data["CSRFToken"])
|
||||
|
||||
|
||||
30
pkg/context/user.go
Normal file
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
|
||||
@@ -32,6 +32,7 @@ type Authentication struct {
|
||||
GroupMemberUID string
|
||||
UserUID string
|
||||
IsActive bool
|
||||
IsDefault bool
|
||||
SMTPAuth string
|
||||
SMTPHost string
|
||||
SMTPPort int
|
||||
@@ -40,6 +41,7 @@ type Authentication struct {
|
||||
TLS bool
|
||||
SkipVerify bool
|
||||
PAMServiceName string
|
||||
GitHubAPIEndpoint string `form:"github_api_endpoint" binding:"Url"`
|
||||
}
|
||||
|
||||
func (f *Authentication) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
|
||||
|
||||
@@ -26,7 +26,7 @@ type CreateRepo struct {
|
||||
UserID int64 `binding:"Required"`
|
||||
RepoName string `binding:"Required;AlphaDashDot;MaxSize(100)"`
|
||||
Private bool
|
||||
Description string `binding:"MaxSize(255)"`
|
||||
Description string `binding:"MaxSize(512)"`
|
||||
AutoInit bool
|
||||
Gitignores string
|
||||
License string
|
||||
@@ -45,7 +45,7 @@ type MigrateRepo struct {
|
||||
RepoName string `json:"repo_name" binding:"Required;AlphaDashDot;MaxSize(100)"`
|
||||
Mirror bool `json:"mirror"`
|
||||
Private bool `json:"private"`
|
||||
Description string `json:"description" binding:"MaxSize(255)"`
|
||||
Description string `json:"description" binding:"MaxSize(512)"`
|
||||
}
|
||||
|
||||
func (f *MigrateRepo) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
|
||||
@@ -82,7 +82,7 @@ func (f MigrateRepo) ParseRemoteAddr(user *models.User) (string, error) {
|
||||
|
||||
type RepoSetting struct {
|
||||
RepoName string `binding:"Required;AlphaDashDot;MaxSize(100)"`
|
||||
Description string `binding:"MaxSize(255)"`
|
||||
Description string `binding:"MaxSize(512)"`
|
||||
Website string `binding:"Url;MaxSize(100)"`
|
||||
Branch string
|
||||
Interval int
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user