Compare commits

...

66 Commits

Author SHA1 Message Date
Unknwon
3a4c981e31 locale: sync from Crowdin 2018-09-16 11:53:32 -04:00
Unknwon
0d48344f93 docker: chown only for the frist time (#5422) 2018-09-15 13:57:41 -04:00
Unknwon
21ceba6cfd Revert "docker: remove chown the git repos on startup (refs #4996). (#5390)"
This reverts commit 068e6ce2c9.
2018-09-15 13:46:14 -04:00
Unknwon
f8302c5470 ci: fix go vet and add Go 1.11.x 2018-09-14 22:48:35 -04:00
Unknwon
7a7e07a57c vendor: add dependencies of Prometheus client 2018-09-14 22:38:06 -04:00
Unknwon
520530dfcf metrics: add initial Prometheus support (#4141) 2018-09-14 22:29:43 -04:00
Unknwon
31c18b4bc7 repo: adjust pull request setting description (#5359) 2018-09-14 20:10:54 -04:00
Unknwon
1ec365de25 repo: trigger webhook when delete branch after merged pull request (#5331) 2018-09-14 20:04:31 -04:00
Unknwon
99f3eabb1b README: update vision
[ci skip]
2018-09-14 15:25:15 -04:00
Unknwon
32479744f6 templates/admin/monitor: fix field error
[ci skip]
2018-09-13 23:30:59 -04:00
Unknwon
b68de2330d auth: support set default login source (#5274) 2018-09-13 14:06:04 -04:00
haixunlu
68a6579852 login_source: add default authentication switch (#5338)
* Add default Authentication Switch.

* adjust the code accroding to reviews

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

* Remove unused logic

* Fix local authentication files are not flushed.

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

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

* allow i18n on commit_message label

* place label above textarea for commit message

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

* Last code for repository avatars

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

* Update locale messages

* Add repo avatars to home page

* Add repo avatars to organization right panel

* Show repo avatars in repo list

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

* Fix migration

* Fix seed and not used tool

* Revert public css changes, add them to less files

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

So redirect output to file

* Simplify things:

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

* Fix repo image seed - name not unique

* Get rid of not needed model fields

* Class value is enough, remove height attribute

* Don't generate random avatar for repository

- use html and semantic ui icons if no avatar found

* Update styles and templates for repo

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

* Remvoe redundant empty line

* Fix nl2br filter - must return string

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

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

* Update after review 2:

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

* Update after review 2:

- no random avatar for repo

* Update after review 2:

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

* Update after review 2:

- update templates

* Fix trace call

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

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

* Update for description field, new features

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

* Fix migration - typo in var

* Update repo description behaviour

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

* Fix function definition - it a var

* Revert ru-RU locale

* Update by review

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

* Fix migration - new project paths

* Fixes after review 2

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

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

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

* Fix after feedback

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -62,7 +62,7 @@ pkg/bindata/bindata.go: $(DATA_FILES)
less: public/css/gogs.css
public/css/gogs.css: $(LESS_FILES)
lessc $< $@
@type lessc >/dev/null 2>&1 && lessc $< >$@ || echo "lessc command not found, skipped."
clean:
go clean -i ./...

View File

@@ -22,9 +22,9 @@ Gogs [![Build Status](https://travis-ci.org/gogs/gogs.svg?branch=master)](https:
[简体中文](README_ZH.md)
## Purpose
## Vision
The goal of this project is to make the easiest, fastest, and most painless way of setting up a self-hosted Git service. With Go, this can be done with an independent binary distribution across **ALL platforms** that Go supports, including Linux, macOS, Windows and ARM.
This project aims to build a simple, stable and extensible self-hosted Git service that can be setup in the most painless way. With Go, this can be done with an independent binary distribution across **ALL platforms** that Go supports, including Linux, macOS, Windows and ARM.
## Overview

View File

@@ -3,9 +3,9 @@ Gogs [![Build Status](https://travis-ci.org/gogs/gogs.svg?branch=master)](https:
Gogs 是一款极易搭建的自助 Git 服务。
## 开发目的
## 项目愿景
Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务。使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发,并且支持 Go 语言支持的 **所有平台**,包括 Linux、macOS、Windows 以及 ARM 平台。
本项目旨在打造一个最简便的方式搭建简单、稳定和可扩展的自助 Git 服务。使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发,并且支持 Go 语言支持的 **所有平台**,包括 Linux、macOS、Windows 以及 ARM 平台。
## 项目概览

View File

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

View File

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

View File

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

View File

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

View File

@@ -25,6 +25,7 @@ import (
"github.com/go-macaron/session"
"github.com/go-macaron/toolbox"
"github.com/mcuadros/go-version"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/urfave/cli"
log "gopkg.in/clog.v1"
"gopkg.in/macaron.v1"
@@ -64,7 +65,7 @@ func checkVersion() {
if err != nil {
log.Fatal(2, "Fail to read 'templates/.VERSION': %v", err)
}
tplVer := string(data)
tplVer := strings.TrimSpace(string(data))
if tplVer != setting.AppVer {
if version.Compare(tplVer, setting.AppVer, ">") {
log.Fatal(2, "Binary version is lower than template file version, did you forget to recompile Gogs?")
@@ -96,7 +97,14 @@ func newMacaron() *macaron.Macaron {
m.Use(macaron.Static(
setting.AvatarUploadPath,
macaron.StaticOptions{
Prefix: "avatars",
Prefix: models.USER_AVATAR_URL_PREFIX,
SkipLogging: setting.DisableRouterLog,
},
))
m.Use(macaron.Static(
setting.RepositoryAvatarUploadPath,
macaron.StaticOptions{
Prefix: models.REPO_AVATAR_URL_PREFIX,
SkipLogging: setting.DisableRouterLog,
},
))
@@ -253,11 +261,11 @@ func runWeb(c *cli.Context) error {
})
// ***** 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() {
@@ -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)
@@ -649,6 +660,18 @@ func runWeb(c *cli.Context) error {
apiv1.RegisterRoutes(m)
}, ignSignIn)
m.Group("/-", func() {
if setting.Prometheus.Enabled {
m.Get("/metrics", func(c *context.Context) {
if !setting.Prometheus.EnableBasicAuth {
return
}
c.RequireBasicAuth(setting.Prometheus.BasicAuthUsername, setting.Prometheus.BasicAuthPassword)
}, promhttp.Handler())
}
})
// robots.txt
m.Get("/robots.txt", func(c *context.Context) {
if setting.HasRobotsTxt {

View File

@@ -286,6 +286,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
@@ -462,6 +464,12 @@ 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

View File

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

View File

@@ -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é.
@@ -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=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
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=Commit Description
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=Available characters
diff.browse_source=Procházet zdrojové kódy
diff.parent=rodič
@@ -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=Default
auths.updated=Změněné
auths.auth_type=Typ ověření
auths.auth_name=Název ověření
@@ -1104,7 +1111,7 @@ auths.domain=Doména
auths.host=Server
auths.port=Port
auths.bind_dn=Připojení DN
auths.bind_dn_helper=You can use '%s' as placeholder for username, e.g. DOM\%s
auths.bind_dn_helper=Můžete použít '%s' jako zástupný znak pro uživatelské jméno, například DOM\%s
auths.bind_password=Heslo připojení
auths.bind_password_helper=Upozornění: Toto heslo je ukládáno nešifrované. Nepoužívejte pro správcovské účty.
auths.user_base=Výchozí místo hledání uživatelů
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Název služby PAM
auths.enable_auto_register=Povolit zaregistrování se
auths.edit=Upravit nastavení ověřování
auths.activated=Tento způsob ověřování je aktivní
auths.default_auth=This authentication is default login source
auths.new_success=Nový způsob ověřování '%s' byl přidán.
auths.update_success=Nastavení ověřování bylo změněno.
auths.update=Změnit nastavení ověřování
@@ -1144,7 +1152,7 @@ auths.still_in_used=Tento způsob ověřování je stále používán některým
auths.deletion_success=Způsob ověřování byl smazán!
auths.login_source_exist=Zdroj přihlášení '%s' již existuje.
config.not_set=(not set)
config.not_set=(není nastaveno)
config.server_config=Nastavení serveru
config.app_name=Název aplikace
config.app_ver=Verze aplikace
@@ -1166,7 +1174,7 @@ config.ssh_domain=Doména
config.ssh_port=Port
config.ssh_listen_port=Port pro naslouchání
config.ssh_root_path=Kořenová cesta
config.ssh_rewrite_authorized_keys_at_start=Rewrite authorized_keys At Start
config.ssh_rewrite_authorized_keys_at_start=Přepsat authorized_keys při startu
config.ssh_key_test_path=Cesta testu klíčů
config.ssh_keygen_path=Cesta ke generátoru klíčů ('ssh-keygen')
config.ssh_minimum_key_size_check=Kontrola minimální velikosti klíčů
@@ -1182,7 +1190,7 @@ config.disable_http_git=Vypnout HTTP Git
config.enable_local_path_migration=Povolit migraci z místní cesty
config.commits_fetch_concurrency=Souběžnost vyzvednutí revizí
config.http_config=HTTP Configuration
config.http_config=Nastavení HTTP
config.http_access_control_allow_origin=Access Control Allow Origin
config.db_config=Nastavení databáze

View File

@@ -151,8 +151,8 @@ register_hepler_msg=Haben Sie bereits ein Konto? Jetzt anmelden!
social_register_hepler_msg=Haben Sie bereits ein Konto? Jetzt verknüpfen!
disable_register_prompt=Es tut uns leid, die Registrierung wurde deaktiviert. Bitte wenden Sie sich an den Administrator.
disable_register_mail=Es tut uns leid, die Bestätigung der Registrierungs-E-Mail wurde deaktiviert.
auth_source=Authentication Source
local=Local
auth_source=Authentifizierungsquelle
local=Lokalisierung
remember_me=Angemeldet bleiben
forgot_password=Passwort vergessen
forget_password=Passwort vergessen?
@@ -231,7 +231,7 @@ org_name_been_taken=Organisationsname ist bereits vergeben.
team_name_been_taken=Teamname ist bereits vergeben.
email_been_used=E-Mail-Adresse wird bereits verwendet.
username_password_incorrect=Benutzername oder Passwort ist nicht korrekt.
auth_source_mismatch=The authentication source selected is not associated with the user.
auth_source_mismatch=Die ausgewählte Authentifizierungsquelle ist dem Benutzer nicht zugeordnet.
enterred_invalid_repo_name=Bitte achten Sie darauf, dass der von Ihnen eingegebene Repository-Name korrekt ist.
enterred_invalid_owner_name=Bitte achten Sie darauf, dass der eingegebene Name des Besitzers korrekt ist.
enterred_invalid_password=Bitte achten Sie darauf, dass das eingegebene Passwort richtig ist.
@@ -351,7 +351,7 @@ two_factor_or_enter_secret=Oder geben Sie Ihren Geheim-Code ein:
two_factor_then_enter_passcode=Geben Sie die PIN ein:
two_factor_verify=Bestätigen
two_factor_invalid_passcode=Die eingegebene PIN ist ungültig. Bitte versuchen Sie es erneut!
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
two_factor_reused_passcode=Der von dir eingegebene Passcode wurde bereits verwendet, bitte probiere einen anderen!
two_factor_enable_error=Einschalten der Zwei-Faktor-Authentifizierung ist fehlgeschlagen: %v
two_factor_enable_success=Die Zwei-Faktor-Authentifizierung wurde für Ihr Konto erfolgreich aktiviert!
two_factor_recovery_codes_title=Zwei-Faktor-Authentifizierung-Wiederherstellungscodes
@@ -421,6 +421,8 @@ mirror_last_synced=Zuletzt synchronisiert
watchers=Beobachter
stargazers=In Favoriten von
forks=Forks
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
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=Failed to delete file '%s' with error: %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 Description
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=Enable pull requests to accept contributions between repositories and 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=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
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=Default
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=This authentication is default login source
auths.new_success=Neue Authentifizierung '%s' wurde erfolgreich hinzugefügt.
auths.update_success=Die Authentifizierungseinstellungen wurden erfolgreich aktualisiert.
auths.update=Authentifizierungseinstellungen aktualisieren
@@ -1166,7 +1174,7 @@ config.ssh_domain=Domain
config.ssh_port=Port
config.ssh_listen_port=Listen Port
config.ssh_root_path=Verzeichnis
config.ssh_rewrite_authorized_keys_at_start=Rewrite authorized_keys At Start
config.ssh_rewrite_authorized_keys_at_start=Beim Start authorized_keys umschreiben
config.ssh_key_test_path=Schlüssel-Test-Pfad
config.ssh_keygen_path=Keygen ('ssh-keygen') Pfad
config.ssh_minimum_key_size_check=Prüfung der Mindestschlüssellänge
@@ -1298,13 +1306,13 @@ comment_issue=`hat Issue <a href="%s/issues/%s">%s#%[2]s</a> kommentiert`
create_pull_request=`hat Pull-Request <a href="%s/pulls/%s">%s#%[2]s</a> erstellt`
close_pull_request=`hat Pull-Request <a href="%s/pulls/%s">%s#%[2]s</a> geschlossen`
reopen_pull_request=`hat den Pull-Request <a href="%s/pulls/%s">%s#%[2]s</a> wieder geöffnet`
merge_pull_request=`hat Pull-Request <a href="%s/pulls/%s">%s#%[2]s</a> zuammengeführt`
merge_pull_request=`hat Pull-Request <a href="%s/pulls/%s">%s#%[2]s</a> zusammengeführt`
create_branch=hat neuen Branch <a href="%[1]s/src/%[2]s">%[3]s</a> in <a href="%[1]s">%[4]s</a> angelegt
delete_branch=hat Branch <code>%[2]s</code> in <a href="%[1]s">%[3]s</a> gelöscht
push_tag=hat Tag <a href="%s/src/%s">%[2]s</a> auf <a href="%[1]s">%[3]s</a> gepusht
delete_tag=hat Tag <code>%[2]s</code> in <a href="%[1]s">%[3]s</a> gelöscht
fork_repo=hat das Repository nach <a href="%s">%s</a> geforkt
mirror_sync_push=synced commits to <a href="%[1]s/src/%[2]s">%[3]s</a> at <a href="%[1]s">%[4]s</a> from mirror
mirror_sync_push=hat auf <a href="%[1]s/src/%[2]s">%[3]s</a> in <a href="%[1]s">%[4]s</a> gepusht
mirror_sync_create=synced new reference <a href="%s/src/%s">%[2]s</a> to <a href="%[1]s">%[3]s</a> from mirror
mirror_sync_delete=synced and deleted reference <code>%[2]s</code> at <a href="%[1]s">%[3]s</a> from mirror

View File

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

View File

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

View File

@@ -152,7 +152,7 @@ social_register_hepler_msg=¿Ya tienes una cuenta? ¡Enlázala!
disable_register_prompt=Lo sentimos, el registro está deshabilitado. Por favor, contacta con el administrador del sitio.
disable_register_mail=Lo sentimos. Los correos de Confirmación de Registro están deshabilitados.
auth_source=Authentication Source
local=Local
local=Idioma
remember_me=Recuérdame
forgot_password=He olvidado mi contraseña
forget_password=¿Has olvidado tu contraseña?
@@ -421,6 +421,8 @@ mirror_last_synced=Última sincronización
watchers=Seguidores
stargazers=Fans
forks=Forks
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
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=Failed to delete file '%s' with 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'
@@ -638,6 +641,7 @@ pulls.cannot_auto_merge_desc=Este Pull Request no puede ser fusionado automátic
pulls.cannot_auto_merge_helper=Por favor, fusiona manualmente para resolver los conflictos.
pulls.create_merge_commit=Create a merge commit
pulls.rebase_before_merging=Rebase before merging
pulls.commit_description=Commit Description
pulls.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
@@ -742,7 +746,7 @@ 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_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 Peligro
@@ -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=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
diff.browse_source=Explorar el Código
diff.parent=padre
@@ -1096,6 +1102,7 @@ auths.new=Añadir nuevo origen
auths.name=Nombre
auths.type=Tipo
auths.enabled=Activo
auths.default=Default
auths.updated=Actualizado
auths.auth_type=Tipo de autenticación
auths.auth_name=Nombre de autenticación
@@ -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=This authentication is default login source
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
@@ -1298,7 +1306,7 @@ 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>

View File

@@ -423,6 +423,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' از قبل وجود دارد.
@@ -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=Failed to delete file '%s' with error: %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=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=والد
@@ -1098,6 +1104,7 @@ auths.new=اضافه کردن منبع جدید
auths.name=نام
auths.type=نوع
auths.enabled=فعال شده
auths.default=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=This authentication is default login source
auths.new_success=متد احرازهویت %s با موفقیت افزوده شد.
auths.update_success=تنظیمات سیستم احرازهویت با موفقیت به روز شد.
auths.update=به روزرسانی تنظیمات سیستم احراز هویت

View File

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

View File

@@ -151,8 +151,8 @@ register_hepler_msg=Déjà enregistré ? Connectez-vous !
social_register_hepler_msg=Déjà enregistré ? Associez-le !
disable_register_prompt=Désolé, les enregistrements ont été désactivés. Veuillez contacter l'administrateur du site.
disable_register_mail=Désolé, la confirmation par courriel des enregistrements a été désactivée.
auth_source=Authentication Source
local=Local
auth_source=Sources d'authentification
local=Locale
remember_me=Se souvenir de moi
forgot_password=Mot de passe oublié
forget_password=Mot de passe oublié ?
@@ -231,7 +231,7 @@ org_name_been_taken=Nom d'organisation déjà pris.
team_name_been_taken=Nom d'équipe déjà pris.
email_been_used=Adresse e-mail déjà utilisée.
username_password_incorrect=Nom d'utilisateur ou mot de passe incorrect.
auth_source_mismatch=The authentication source selected is not associated with the user.
auth_source_mismatch=La source dauthentification sélectionnée nest pas associée à lutilisateur.
enterred_invalid_repo_name=Veuillez vérifier que le nom saisi du dépôt soit correct.
enterred_invalid_owner_name=Veuillez vérifier que le nom du propriétaire saisi soit correct.
enterred_invalid_password=Veuillez vérifier que le mot de passe saisi soit correct.
@@ -351,7 +351,7 @@ two_factor_or_enter_secret=Ou entrez la phrase secrète :
two_factor_then_enter_passcode=Puis entrez le mot de passe :
two_factor_verify=Vérifier
two_factor_invalid_passcode=Le mot de passe que vous avez entré n'est pas valide, veuillez réessayer.
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
two_factor_reused_passcode=Le mot de passe que vous avez entré a déjà été utilisé, veuillez en essayez un autre !
two_factor_enable_error=L'activation de l'authentification en deux étapes a échoué : %v
two_factor_enable_success=L'authentification en deux étapes a été bien été activée pour votre compte.
two_factor_recovery_codes_title=Codes de secours pour l'authentification en deux étapes
@@ -421,6 +421,8 @@ mirror_last_synced=Dernière synchronisation
watchers=Observateurs
stargazers=Stargazers
forks=Forks
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
form.reach_limit_of_creation=Le propriétaire a atteint le nombre maximal de %d dépôts créés.
form.name_reserved=Le nom de dépôt '%s' est réservé.
@@ -518,6 +520,7 @@ editor.file_changed_while_editing=Le contenu du fichier à changé depuis que vo
editor.file_already_exists=La branche '%s' existe déjà dans ce dépôt.
editor.no_changes_to_show=Il ny a aucun changement à afficher.
editor.fail_to_update_file=Échec lors de la mise à jour/création du fichier '%s' avec l'erreur : %v
editor.fail_to_delete_file=Failed to delete file '%s' with error: %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=Commit Description
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=Enable pull requests to accept contributions between repositories and 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 of repository. Maximum 512 characters length.
settings.description_length=Available characters
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=Default
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=This authentication is default login source
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
@@ -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_push=a commité dans <a href="%[1]s/src/%[2]s">%[3]s</a> sur <a href="%[1]s">%[4]s</a>
mirror_sync_create=synced new reference <a href="%s/src/%s">%[2]s</a> to <a href="%[1]s">%[3]s</a> from mirror
mirror_sync_delete=synced and deleted reference <code>%[2]s</code> at <a href="%[1]s">%[3]s</a> from mirror
mirror_sync_delete=Référence synchronisés et supprimé <code>%[2]s</code> sur <a href="%[1]s">%[3]s</a>
[tool]
ago=il y a

View File

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

View File

@@ -421,6 +421,8 @@ mirror_last_synced=Utoljára szinkr.
watchers=Figyelők
stargazers=Csillagvizsgálók
forks=Másolások
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
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=Failed to delete file '%s' with error: %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 Description
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=Enable pull requests to accept contributions between repositories and branches
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=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
diff.browse_source=Forráskód Böngészése
diff.parent=szülő
@@ -1096,6 +1102,7 @@ auths.new=Új forrás hozzáadása
auths.name=Név
auths.type=Típus
auths.enabled=Engedélyezett
auths.default=Default
auths.updated=Frissítve
auths.auth_type=Hitelesítés típusa
auths.auth_name=Hitelesítési név
@@ -1134,6 +1141,7 @@ auths.pam_service_name=PAM szolgáltatás neve
auths.enable_auto_register=Automatikus regisztráció engedélyezése
auths.edit=Hitelesítési beállítások szerkesztése
auths.activated=Ez a hitelesítés mód aktiválva van
auths.default_auth=This authentication is default login source
auths.new_success=Az új hitelesítési mód '%s' sikeresen hozzáadva.
auths.update_success=A hitelesítési beállítások sikeresen firssítve lettek.
auths.update=Hitelesítési forrás frissítése
@@ -1314,14 +1322,14 @@ from_now=mostantól
now=most
1s=1 másodperce %s
1m=1 perce %s
1h=1 órája
1h=1 órája %s
1d=1 napja %s
1w=1 hete %s
1mon=1 hónapja %s
1y=1 éve %s
seconds=%d másodperce %s
minutes=%d perce %s
hours=%d órája
hours=%d órája %s
days=%d napja %s
weeks=%d hete %s
months=%d hónapja %s

View File

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

View File

@@ -151,7 +151,7 @@ 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
auth_source=Fonte di autenticazione
local=Local
remember_me=Ricordami
forgot_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
@@ -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=Available characters
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,7 +640,8 @@ 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=Commit Description
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
@@ -718,32 +722,32 @@ settings.update_protect_branch_success=Protect options for this branch has been
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
@@ -898,7 +904,7 @@ release.deletion=Eliminazione Release
release.deletion_desc=Eliminando questa release cancellarai anche i tag Git corrispondenti. Vuoi continuare?
release.deletion_success=La release è stata eliminata con successo!
release.tag_name_already_exist=Un rilascio con questo tag esiste già.
release.tag_name_invalid=Tag name is not valid.
release.tag_name_invalid=Il nome del Tag non è valido.
release.downloads=Download
[org]
@@ -922,7 +928,7 @@ team_permission_desc=Quale livello di autorizzazione dovrebbe avere questa squad
form.name_reserved=Il nome organizzazione '%s' è riservato.
form.name_pattern_not_allowed=La struttura del nome dell'organizzazione '%s' non è consentita.
form.team_name_reserved=Team name '%s' is reserved.
form.team_name_reserved=Non puoi utilizzare '%s' come nome del Team.
settings=Impostazioni
settings.options=Opzioni
@@ -1089,13 +1095,14 @@ repos.private=Privati
repos.watches=Segue
repos.stars=Voti
repos.issues=Problemi
repos.size=Size
repos.size=Dimensione
auths.auth_sources=Authentication Sources
auths.new=Aggiungi Nuova Origine
auths.name=Nome
auths.type=Tipo
auths.enabled=Attivo
auths.default=Default
auths.updated=Aggiornato
auths.auth_type=Tipo di autenticazione
auths.auth_name=Nome di autenticazione
@@ -1114,7 +1121,7 @@ auths.attribute_username_placeholder=Se vuoto, verrà usato il nome di login del
auths.attribute_name=First Name Attribute
auths.attribute_surname=Attributo Cognome
auths.attribute_mail=Attributo Email
auths.verify_group_membership=Verify group membership
auths.verify_group_membership=Verifica gruppo di appartenenza
auths.group_search_base_dn=Group Search Base DN
auths.group_filter=Group Filter
auths.group_attribute_contain_user_list=Group Attribute Containing List of Users
@@ -1134,6 +1141,7 @@ auths.pam_service_name=Nome del Servizio PAM
auths.enable_auto_register=Abilitare Registrazione Automatica
auths.edit=Modifica impostazioni di autenticazione
auths.activated=Questa Autenticazione è stata attivata
auths.default_auth=This authentication is default login source
auths.new_success=Nuovo meccanismo di autenticazione '%s' aggiunto.
auths.update_success=Parametro di autenticazione aggiornato.
auths.update=Aggiornare le impostazioni di autenticazione
@@ -1144,7 +1152,7 @@ auths.still_in_used=Questo meccanismo di autenticazione è ancora attivo per alc
auths.deletion_success=Il meccanismo di autenticazione è stato eliminato!
auths.login_source_exist=La fonte di autenticazione '%s' esiste già.
config.not_set=(not set)
config.not_set=(non impostata)
config.server_config=Configurazione Server
config.app_name=Nome Applicazione
config.app_ver=Versione Applicazione
@@ -1172,17 +1180,17 @@ config.ssh_keygen_path=Percorso Keygen ('ssh-keygen')
config.ssh_minimum_key_size_check=Verifica delle dimensioni minime della chiave
config.ssh_minimum_key_sizes=Dimensioni minime della chiave
config.repo_config=Repository Configuration
config.repo_config=Configurazione Repository
config.repo_root_path=Percorso Root del Repository
config.script_type=Tipo di Script
config.repo_force_private=Force Private
config.max_creation_limit=Max Creation Limit
config.preferred_licenses=Preferred Licenses
config.disable_http_git=Disable HTTP Git
config.enable_local_path_migration=Enable Local Path Migration
config.disable_http_git=Disabilita Git in HTTP
config.enable_local_path_migration=Abilita migrazioni con path locale
config.commits_fetch_concurrency=Commits Fetch Concurrency
config.http_config=HTTP Configuration
config.http_config=Configurazione HTTP
config.http_access_control_allow_origin=Access Control Allow Origin
config.db_config=Configurazione Database
@@ -1258,7 +1266,7 @@ config.git_gc_timeout=Timeout per le operazioni di GC
config.log_config=Configurazione Log
config.log_mode=Modalità
config.log_options=Options
config.log_options=Opzioni
monitor.cron=Incarici di cron
monitor.name=Nome

View File

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

View File

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

View File

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

View File

@@ -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.
@@ -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'
@@ -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
@@ -742,7 +746,7 @@ settings.tracker_issue_style=Naamgevingstijl externe kwestietracker:
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
@@ -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

View File

@@ -151,8 +151,8 @@ register_hepler_msg=Masz już konto? Zaloguj się teraz!
social_register_hepler_msg=Masz już konto? Powiąż je teraz!
disable_register_prompt=Przepraszamy rejestracja została wyłączona. Prosimy o kontakt z administratorem serwisu.
disable_register_mail=Przepraszamy, potwierdzenia rejestracji zostały wyłączone przez administratora.
auth_source=Authentication Source
local=Local
auth_source=Źródło uwierzytelniania
local=Lokalne
remember_me=Zapamiętaj mnie
forgot_password=Zapomniałem hasła
forget_password=Zapomniałeś hasła?
@@ -231,7 +231,7 @@ org_name_been_taken=Nazwa organizacji jest już zajęta.
team_name_been_taken=Nazwa zespołu jest już zajęta.
email_been_used=Adres e-mail jest już zarejestrowany.
username_password_incorrect=Nazwa użytkownika lub hasło nie jest prawidłowe.
auth_source_mismatch=The authentication source selected is not associated with the user.
auth_source_mismatch=Wybrane źródło uwierzytelniania nie jest związane z użytkownikiem.
enterred_invalid_repo_name=Upewnij się, że wprowadzona nazwa repozytorium jest poprawna.
enterred_invalid_owner_name=Upewnij się, że nazwa właściciela repozytorium jest poprawna.
enterred_invalid_password=Proszę upewnij się, że wprowadzono hasło jest poprawne.
@@ -351,7 +351,7 @@ two_factor_or_enter_secret=Lub wprowadź sekret:
two_factor_then_enter_passcode=Następnie wprowadź kod dostępu:
two_factor_verify=Weryfikuj
two_factor_invalid_passcode=Wprowadzony kod nie jest prawidłowy, spróbuj ponownie!
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
two_factor_reused_passcode=Ten kod jest już używany, spróbuj ponownie!
two_factor_enable_error=Włączenie dwuetapowego uwierzytelniania nie powiodło się: %v
two_factor_enable_success=Uwierzytelnianie dwuetapowe Twojego konta zostało włączone pomyślnie!
two_factor_recovery_codes_title=Kody odzyskiwania uwierzytelniania dwuetapowego
@@ -421,6 +421,8 @@ mirror_last_synced=Ostatnia synchronizacja
watchers=Obserwujący
stargazers=Polubienia
forks=Forki
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
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=Failed to delete file '%s' with error: %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=Commit Description
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=Enable pull requests to accept contributions between repositories and branches
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=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
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=Default
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=This authentication is default login source
auths.new_success=Pomyślnie dodano nowe uwierzytelnianie '%s'.
auths.update_success=Ustawienia uwierzytelnienia zostały zaktualizowane pomyślnie.
auths.update=Aktualizuj ustawienia uwierzytelniania

View File

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

View File

@@ -151,8 +151,8 @@ register_hepler_msg=Уже есть аккаунт? Авторизуйтесь!
social_register_hepler_msg=Уже есть учетная запись? Свяжите ее с соцсетью!
disable_register_prompt=Извините, возможность регистрации отключена. Пожалуйста, свяжитесь с администратором сайта.
disable_register_mail=К сожалению подтверждение регистрации по почте отключено.
auth_source=Authentication Source
local=Local
auth_source=Тип аутентификации
local=Локальный
remember_me=Запомнить меня
forgot_password=Забыли пароль
forget_password=Забыли пароль?
@@ -231,7 +231,7 @@ org_name_been_taken=Название организации занято.
team_name_been_taken=Название команды занято.
email_been_used=Адрес электронной почты уже используется.
username_password_incorrect=Имя пользователя или пароль не правильный.
auth_source_mismatch=The authentication source selected is not associated with the user.
auth_source_mismatch=Выбранный источник проверки подлинности не связан с пользователем.
enterred_invalid_repo_name=Пожалуйста, убедитесь, что введено правильное имя репозитория.
enterred_invalid_owner_name=Убедитесь, что введенное имя владельца верное.
enterred_invalid_password=Убедитесь, что введенный пароль верен.
@@ -351,7 +351,7 @@ two_factor_or_enter_secret=Или введите кодовое слово:
two_factor_then_enter_passcode=Затем введите пароль:
two_factor_verify=Проверить
two_factor_invalid_passcode=Введенные пароли не совпадают; пожалуйста, повторите попытку!
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
two_factor_reused_passcode=Введенный вами пароль уже используется, пожалуйста, попробуйте другой!
two_factor_enable_error=Ошибка активация двухфакторной аутентификации: %v
two_factor_enable_success=Двухфакторная аутентификация активирована для вашей учетной записи!
two_factor_recovery_codes_title=Коды восстановления для двухфакторная аутентификации
@@ -421,6 +421,8 @@ mirror_last_synced=Последняя синхронизация
watchers=Наблюдатели
stargazers=Звездочеты
forks=Ответвления
repo_description_helper=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=Выполнить rebase перед слиянием
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=Разрешить rebase-слияние
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=Родитель
@@ -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=удалил ветку <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=назад

View File

@@ -421,6 +421,8 @@ mirror_last_synced=Naposledy synchronizované
watchers=Pozorovatelia
stargazers=Sledujúci
forks=Forky
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
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=Failed to delete file '%s' with error: %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=Commit Description
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
@@ -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=Description of repository. Maximum 512 characters length.
settings.description_length=Available characters
diff.browse_source=Prechádzať zdrojové kódy
diff.parent=rodič
@@ -1096,6 +1102,7 @@ auths.new=Pridať nový zdroj
auths.name=Názov
auths.type=Typ
auths.enabled=Povolené
auths.default=Default
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

View File

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

View File

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

View File

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

View File

@@ -151,8 +151,8 @@ register_hepler_msg=Вже зареєстровані? Увійдіть зара
social_register_hepler_msg=Вже зареєстровані? Прив'яжіть зараз!
disable_register_prompt=Вибачте, реєстрація відключена. Будь ласка, зв'яжіться з адміністратором сайту.
disable_register_mail=На жаль, підтвердження реєстрації на електрону пошту було відключено.
auth_source=Authentication Source
local=Local
auth_source=Джерело автентифікації
local=Локальний
remember_me=Запам'ятати мене
forgot_password=Забув пароль
forget_password=Забули пароль?
@@ -231,7 +231,7 @@ org_name_been_taken=Назва організаціі вже використо
team_name_been_taken=Назва команди вже використовується.
email_been_used=Адреса електронної пошти вже використовується.
username_password_incorrect=Ім'я користувача або пароль помилкові.
auth_source_mismatch=The authentication source selected is not associated with the user.
auth_source_mismatch=Обране джерело автентифікації не асоційовано з користувачем.
enterred_invalid_repo_name=Переконайтеся, що ви ввели назву сховища правильно.
enterred_invalid_owner_name=Переконайтеся, що ви ввели ім'я власника правильно.
enterred_invalid_password=Переконайтеся, що ви ввели пароль правильно.
@@ -351,7 +351,7 @@ two_factor_or_enter_secret=Або введіть секрет:
two_factor_then_enter_passcode=Потім введіть пароль:
two_factor_verify=Перевірити
two_factor_invalid_passcode=Введений пароль не валідний, будь ласка, спробуйте ще раз!
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
two_factor_reused_passcode=Введений пасскод вже було використано. Будь ласка, спробуйте інший!
two_factor_enable_error=Увімкнення двофакторної автентифікації не вдалося: %v
two_factor_enable_success=Двофакторну автентифікацію успішно активовано для вашого акаунту!
two_factor_recovery_codes_title=Пароль відновлення для двофакторної автентифікації
@@ -421,6 +421,8 @@ mirror_last_synced=Востаннє синхронізовано
watchers=Спостерігачі
stargazers=Шанувальники
forks=Відгалуження
repo_description_helper=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=Дозволити перебазування для 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=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=видалено гілку <code>%[2]s</code> у <a href="%[1]s">
push_tag=заштовхнуто тег <a href="%s/src/%s">%[2]s</a> до <a href="%[1]s">%[3]s</a>
delete_tag=видалено мітку <code>%[2]s</code> у <a href="%[1]s">%[3]s</a>
fork_repo=відгалуджено репозиторій у <a href="%s">%s</a>
mirror_sync_push=synced commits to <a href="%[1]s/src/%[2]s">%[3]s</a> at <a href="%[1]s">%[4]s</a> from mirror
mirror_sync_create=synced new reference <a href="%s/src/%s">%[2]s</a> to <a href="%[1]s">%[3]s</a> from mirror
mirror_sync_delete=synced and deleted reference <code>%[2]s</code> at <a href="%[1]s">%[3]s</a> from mirror
mirror_sync_push=синхронізовано коміт <a href="%[1]s/src/%[2]s">%[3]s</a> в <a href="%[1]s">%[4]s</a> із дзеркала
mirror_sync_create=синхронізовано нове посилання <a href="%s/src/%s">%[2]s</a> до <a href="%[1]s">%[3]s</a> із дзеркала
mirror_sync_delete=синхронізовано й видалено посилання <code>%[2]s</code> в <a href="%[1]s">%[3]s</a> із дзеркала
[tool]
ago=тому

View File

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

View File

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

View File

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

View File

@@ -1,7 +1,7 @@
app_desc=基於 Go 語言的自助 Git 服務
app_desc=一款極易搭建的自助 Git 服務
home=首頁
dashboard=控制面
dashboard=控制面
explore=探索
help=說明
sign_in=登入
@@ -35,7 +35,7 @@ manage_org=管理組織
admin_panel=管理面板
account_settings=帳號設定
settings=設定
your_profile=個人資
your_profile=個人資
your_settings=用戶設定
activities=活動
@@ -83,7 +83,7 @@ app_url_helper=該設置影響 HTTP/HTTPS 複製地址和一些郵箱中的連
log_root_path=日誌路徑
log_root_path_helper=寫入日誌檔目錄
enable_console_mode=開啟主控台模式
enable_console_mode_popup=In addition to file mode, also print logs to console.
enable_console_mode_popup=除了使用檔案模式之外, 還要將日誌列印到控制台。
optional_title=可選設置
email_title=電子郵件服務設定
@@ -151,8 +151,8 @@ register_hepler_msg=已經註冊?立即登錄!
social_register_hepler_msg=已經註冊?立即綁定!
disable_register_prompt=對不起,註冊功能已被關閉。請聯系網站管理員。
disable_register_mail=對不起,註冊郵箱確認功能已被關閉。
auth_source=Authentication Source
local=Local
auth_source=認證來源
local=本地
remember_me=記住登錄
forgot_password=忘記密碼
forget_password=忘記密碼?
@@ -197,7 +197,7 @@ RepoName=儲存庫名稱
Email=郵箱地址
Password=密碼
Retype=確認密碼
SSHTitle=SSH 鑰名稱
SSHTitle=SSH 鑰名稱
HttpsUrl=HTTPS URL 地址
PayloadUrl=推送地址
TeamName=團隊名稱
@@ -231,7 +231,7 @@ org_name_been_taken=組織名稱已經被佔用。
team_name_been_taken=團隊名稱已經被佔用。
email_been_used=郵箱地址已經被使用。
username_password_incorrect=用戶名或密碼不正確。
auth_source_mismatch=The authentication source selected is not associated with the user.
auth_source_mismatch=此用戶未與所用的認證來源相關聯
enterred_invalid_repo_name=請檢查您輸入的倉庫名稱是正確。
enterred_invalid_owner_name=請檢查您輸入的新所有者用戶名是否正確。
enterred_invalid_password=請檢查您輸入的密碼是否正確。
@@ -263,7 +263,7 @@ form.name_reserved=用戶名 '%s' 是被保留的。
form.name_pattern_not_allowed=用戶名不允許 '%s' 的格式。
[settings]
profile=個人信息
profile=個人資訊
password=修改密碼
avatar=頭像
ssh_keys=管理 SSH 密鑰
@@ -280,7 +280,7 @@ full_name=自定義名稱
website=個人網站
location=所在地區
update_profile=更新信息
update_profile_success=您的個人信息更新成功!
update_profile_success=您的個人資訊更新成功!
change_username=用戶名將被修改
change_username_prompt=該操作將會影響到所有與您帳戶有關的鏈接
continue=繼續操作
@@ -344,24 +344,24 @@ two_factor_off=關閉
two_factor_enable=啟用
two_factor_disable=禁用
two_factor_view_recovery_codes=在安全的地方查看並保存 <a href="%s%s"> 您的恢復代碼 </a>。如果您失去對身份驗證應用程式的存取權限, 則可以將它們用作密碼。
two_factor_http=For HTTP/HTTPS operations, you are no longer able to use plain username and password. Please create and use <a href="%[1]s%[2]s">Personal Access Token</a> as your credential, e.g. <code>%[3]s</code>.
two_factor_enable_title=Enable Two-factor Authentication
two_factor_http=對於HTTP/HTTPS操作,您不能使用用戶名稱和密碼作為憑據。請創建和使用<a href=%[1]s%[2]s”>個人操作令牌</a>作為您的憑據,如<code>%[3]s</code>
two_factor_enable_title=啟用兩步驗證
two_factor_scan_qr=請使用您的身份驗證應用程式掃描圖像:
two_factor_or_enter_secret=或輸入密碼: %s
two_factor_then_enter_passcode=然後輸入驗證碼:
two_factor_verify=驗證
two_factor_invalid_passcode=您輸入的密碼無效,請再試一次。
two_factor_reused_passcode=The passcode you entered has already been used, please try another one!
two_factor_reused_passcode=您输入的验证码已经被使用过了,请换一个重试!
two_factor_enable_error=啟用兩步驗證失敗: %v
two_factor_enable_success=您帳戶的兩步驗證已成功啟用!
two_factor_recovery_codes_title=兩步驗證恢復代碼
two_factor_recovery_codes_desc=Recovery codes are used when you temporarily lose access to your authentication application. Each recovery code can only be used once, <b>please keep these codes in a safe place</b>.
two_factor_recovery_codes_desc=當您無法存取您的認證應用程式時,可以使用救援代碼。每個救援代碼只能使用一次,因此 <b>請在安全的地方妥善保存您的救援代碼</b>
two_factor_regenerate_recovery_codes=重新生成恢復代碼
two_factor_regenerate_recovery_codes_error=重新生成恢復代碼失敗: %v
two_factor_regenerate_recovery_codes_success=已成功生成新的恢復代碼!
two_factor_disable_title=Disable Two-factor Authentication
two_factor_disable_desc=Your account security level will decrease after disabled two-factor authentication. Do you want to continue?
two_factor_disable_success=Two-factor authentication has disabled successfully!
two_factor_disable_title=停用兩步驗證
two_factor_disable_desc=停用兩步驗證後,您的帳戶安全級別將降低。是否繼續?
two_factor_disable_success=您帳戶的兩步驗證已成功停用!
manage_access_token=管理個人操作令牌
generate_new_token=生成新的令牌
@@ -382,7 +382,7 @@ orgs.leave_desc=離開組織後,所有與組織相關的倉庫和團隊權限
repos.leave=離開
repos.leave_title=離開存儲庫
repos.leave_desc=在你離開後,您將無法進入到存儲庫。你想要繼續嗎?
repos.leave_success=You have left repository '%s' successfully!
repos.leave_success=您已經成功退出「%s」版本庫
delete_account=刪除當前帳戶
delete_prompt=刪除操作會永久清除您的帳戶信息,並且 <strong>不可恢復</strong>
@@ -421,6 +421,8 @@ mirror_last_synced=上次同步
watchers=關注者
stargazers=稱讚者
forks=派生倉庫
repo_description_helper=Description of repository. Maximum 512 characters length.
repo_description_length=Available characters
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=Failed to delete file '%s' with error: %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=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=Enable pull requests to accept contributions between repositories and branches
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=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=認證名稱
@@ -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=This authentication is default login source
auths.new_success=新的認證源 "%s" 添加成功!
auths.update_success=認證設置更新成功!
auths.update=更新認證設置
@@ -1166,7 +1174,7 @@ config.ssh_domain=域名
config.ssh_port=
config.ssh_listen_port=監聽埠
config.ssh_root_path=根路徑
config.ssh_rewrite_authorized_keys_at_start=Rewrite authorized_keys At Start
config.ssh_rewrite_authorized_keys_at_start=在啟動時重寫 authorized_keys 檔案
config.ssh_key_test_path=金鑰測試路徑
config.ssh_keygen_path=金鑰產生 (' ssh-keygen ') 路徑
config.ssh_minimum_key_size_check=金鑰最小大小檢查
@@ -1214,7 +1222,7 @@ config.skip_tls_verify=忽略 TLS 驗證
config.mailer_config=郵件配置
config.mailer_enabled=啟用服務
config.mailer_disable_helo=禁用 HELO 操作
config.mailer_subject_prefix=Subject Prefix
config.mailer_subject_prefix=主旨前置詞
config.mailer_host=郵件主機地址
config.mailer_user=發送者帳號
config.send_test_mail=發送測試郵件
@@ -1304,9 +1312,9 @@ delete_branch=已經刪除在 <a href="%[1]s">%[3]s</a> 上的分支 <code>%[2]s
push_tag=推送了標籤 <a href="%s/src/%s">%[2]s</a> 到 <a href="%[1]s">%[3]s</a>
delete_tag=已經刪除在 <a href="%[1]s">%[3]s</a> 上的標籤 <code>%[2]s</code>
fork_repo=已經 fork 一個 repository 到 <a href="%s">%s</a>
mirror_sync_push=synced commits to <a href="%[1]s/src/%[2]s">%[3]s</a> at <a href="%[1]s">%[4]s</a> from mirror
mirror_sync_create=synced new reference <a href="%s/src/%s">%[2]s</a> to <a href="%[1]s">%[3]s</a> from mirror
mirror_sync_delete=synced and deleted reference <code>%[2]s</code> at <a href="%[1]s">%[3]s</a> from mirror
mirror_sync_push=已經從鏡像同步了提交 <a href="%[1]s/src/%[2]s">%[3]s</a> <a href="%[1]s">%[4]s</a>
mirror_sync_create=已經從鏡像同步了參考 <a href="%s/src/%s">%[2]s</a> <a href="%[1]s">%[3]s</a>
mirror_sync_delete=已經從鏡像同步並移除了參考 <code>%[2]s</code> <a href="%[1]s">%[3]s</a>
[tool]
ago=之前

View File

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

View File

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

View File

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

View File

@@ -16,7 +16,7 @@ import (
"github.com/gogs/gogs/pkg/setting"
)
const APP_VER = "0.11.53.0603"
const APP_VER = "0.11.66.0916"
func init() {
setting.AppVer = APP_VER
@@ -37,6 +37,5 @@ func main() {
cmd.Backup,
cmd.Restore,
}
app.Flags = append(app.Flags, []cli.Flag{}...)
app.Run(os.Args)
}

View File

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

View File

@@ -5,7 +5,6 @@
package models
import (
"encoding/json"
"fmt"
"path"
"regexp"
@@ -15,6 +14,7 @@ import (
"github.com/Unknwon/com"
"github.com/go-xorm/xorm"
"github.com/json-iterator/go"
log "gopkg.in/clog.v1"
"github.com/gogs/git-module"
@@ -80,14 +80,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
}
@@ -501,7 +501,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 +717,7 @@ func MirrorSyncPushAction(repo *Repository, opts MirrorSyncPushActionOptions) er
return fmt.Errorf("PrepareWebhooks: %v", err)
}
data, err := json.Marshal(opts.Commits)
data, err := jsoniter.Marshal(opts.Commits)
if err != nil {
return err
}

View File

@@ -30,7 +30,7 @@ type Notice struct {
ID int64
Type NoticeType
Description string `xorm:"TEXT"`
Created time.Time `xorm:"-"`
Created time.Time `xorm:"-" json:"-"`
CreatedUnix int64
}

View File

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

View File

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

View File

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

View File

@@ -28,34 +28,34 @@ var (
type Issue struct {
ID int64
RepoID int64 `xorm:"INDEX UNIQUE(repo_index)"`
Repo *Repository `xorm:"-"`
Repo *Repository `xorm:"-" json:"-"`
Index int64 `xorm:"UNIQUE(repo_index)"` // Index in one repository.
PosterID int64
Poster *User `xorm:"-"`
Poster *User `xorm:"-" json:"-"`
Title string `xorm:"name"`
Content string `xorm:"TEXT"`
RenderedContent string `xorm:"-"`
Labels []*Label `xorm:"-"`
RenderedContent string `xorm:"-" json:"-"`
Labels []*Label `xorm:"-" json:"-"`
MilestoneID int64
Milestone *Milestone `xorm:"-"`
Milestone *Milestone `xorm:"-" json:"-"`
Priority int
AssigneeID int64
Assignee *User `xorm:"-"`
Assignee *User `xorm:"-" json:"-"`
IsClosed bool
IsRead bool `xorm:"-"`
IsRead bool `xorm:"-" json:"-"`
IsPull bool // Indicates whether is a pull request or not.
PullRequest *PullRequest `xorm:"-"`
PullRequest *PullRequest `xorm:"-" json:"-"`
NumComments int
Deadline time.Time `xorm:"-"`
Deadline time.Time `xorm:"-" json:"-"`
DeadlineUnix int64
Created time.Time `xorm:"-"`
Created time.Time `xorm:"-" json:"-"`
CreatedUnix int64
Updated time.Time `xorm:"-"`
Updated time.Time `xorm:"-" json:"-"`
UpdatedUnix int64
Attachments []*Attachment `xorm:"-"`
Comments []*Comment `xorm:"-"`
Attachments []*Attachment `xorm:"-" json:"-"`
Comments []*Comment `xorm:"-" json:"-"`
}
func (issue *Issue) BeforeInsert() {
@@ -402,7 +402,7 @@ func (i *Issue) ReadBy(uid int64) error {
}
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
}
@@ -843,7 +843,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 +1354,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 +1423,7 @@ func updateIssueUsersByMentions(e Engine, issueID int64, uids []int64) error {
iu.IsMentioned = true
if has {
_, err = e.Id(iu.ID).AllCols().Update(iu)
_, err = e.ID(iu.ID).AllCols().Update(iu)
} else {
_, err = e.Insert(iu)
}

View File

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

View File

@@ -6,7 +6,6 @@ package models
import (
"crypto/tls"
"encoding/json"
"fmt"
"net/smtp"
"net/textproto"
@@ -20,6 +19,7 @@ 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"
@@ -66,11 +66,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 +87,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 +99,11 @@ 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)
}
// AuthSourceFile contains information of an authentication source file.
@@ -133,14 +133,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() {
@@ -257,7 +258,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 +297,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 +392,6 @@ func (s *LocalLoginSources) ActivatedList() []*LoginSource {
if !s.sources[i].IsActived {
continue
}
source := &LoginSource{}
*source = *s.sources[i]
list = append(list, source)
@@ -394,7 +424,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 +460,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,

View File

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

View File

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

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

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

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

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

View File

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

View File

@@ -29,17 +29,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() {
@@ -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())

View File

@@ -7,7 +7,6 @@ package models
import (
"bufio"
"database/sql"
"encoding/json"
"errors"
"fmt"
"net/url"
@@ -20,6 +19,7 @@ import (
_ "github.com/go-sql-driver/mysql"
"github.com/go-xorm/core"
"github.com/go-xorm/xorm"
"github.com/json-iterator/go"
_ "github.com/lib/pq"
log "gopkg.in/clog.v1"
@@ -33,7 +33,7 @@ type Engine interface {
Exec(string, ...interface{}) (sql.Result, error)
Find(interface{}, ...interface{}) error
Get(interface{}) (bool, error)
Id(interface{}) *xorm.Session
ID(interface{}) *xorm.Session
In(string, ...interface{}) *xorm.Session
Insert(...interface{}) (int64, error)
InsertOne(interface{}) (int64, error)
@@ -285,8 +285,7 @@ func DumpDatabase(dirPath string) (err error) {
}
if err = x.Asc("id").Iterate(table, func(idx int, bean interface{}) (err error) {
enc := json.NewEncoder(f)
return enc.Encode(bean)
return jsoniter.NewEncoder(f).Encode(bean)
}); err != nil {
f.Close()
return fmt.Errorf("fail to dump table '%s': %v", tableName, err)
@@ -300,6 +299,11 @@ func DumpDatabase(dirPath string) (err error) {
func ImportDatabase(dirPath string, verbose bool) (err error) {
snakeMapper := core.SnakeMapper{}
skipInsertProcessors := map[string]bool{
"mirror": true,
"milestone": true,
}
// Purposely create a local variable to not modify global variable
tables := append(tables, new(Version))
for _, table := range tables {
@@ -314,22 +318,24 @@ func ImportDatabase(dirPath string, verbose bool) (err error) {
}
if err = x.DropTables(table); err != nil {
return fmt.Errorf("fail to drop table '%s': %v", tableName, err)
return fmt.Errorf("drop table '%s': %v", tableName, err)
} else if err = x.Sync2(table); err != nil {
return fmt.Errorf("fail to sync table '%s': %v", tableName, err)
return fmt.Errorf("sync table '%s': %v", tableName, err)
}
f, err := os.Open(tableFile)
if err != nil {
return fmt.Errorf("fail to open JSON file: %v", err)
return fmt.Errorf("open JSON file: %v", err)
}
rawTableName := x.TableName(table)
_, isInsertProcessor := table.(xorm.BeforeInsertProcessor)
scanner := bufio.NewScanner(f)
for scanner.Scan() {
switch bean := table.(type) {
case *LoginSource:
meta := make(map[string]interface{})
if err = json.Unmarshal(scanner.Bytes(), &meta); err != nil {
return fmt.Errorf("fail to unmarshal to map: %v", err)
if err = jsoniter.Unmarshal(scanner.Bytes(), &meta); err != nil {
return fmt.Errorf("unmarshal to map: %v", err)
}
tp := LoginType(com.StrTo(com.ToStr(meta["Type"])).MustInt64())
@@ -346,12 +352,31 @@ func ImportDatabase(dirPath string, verbose bool) (err error) {
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 +385,7 @@ func ImportDatabase(dirPath string, verbose bool) (err error) {
rawTableName := snakeMapper.Obj2Table(tableName)
seqName := rawTableName + "_id_seq"
if _, err = x.Exec(fmt.Sprintf(`SELECT setval('%s', COALESCE((SELECT MAX(id)+1 FROM "%s"), 1), false);`, seqName, rawTableName)); err != nil {
return fmt.Errorf("fail to reset table '%s' sequence: %v", rawTableName, err)
return fmt.Errorf("reset table '%s' sequence: %v", rawTableName, err)
}
}
}

View File

@@ -410,7 +410,7 @@ func RemoveOrgUser(orgID, userID int64) error {
return err
}
if _, err := sess.Id(ou.ID).Delete(ou); err != nil {
if _, err := sess.ID(ou.ID).Delete(ou); err != nil {
return err
} else if _, err = sess.Exec("UPDATE `user` SET num_members=num_members-1 WHERE id=?", orgID); err != nil {
return err

View File

@@ -22,8 +22,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 +111,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 +157,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
}
@@ -286,7 +286,7 @@ 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 {
@@ -334,7 +334,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 +386,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 +431,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 +500,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 +520,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 +562,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 +583,7 @@ func removeTeamMember(e Engine, orgID, teamID, uid int64) error {
if t.IsOwnerTeam() {
ou.IsOwner = false
}
if _, err = e.Id(ou.ID).AllCols().Update(ou); err != nil {
if _, err = e.ID(ou.ID).AllCols().Update(ou); err != nil {
return err
}
return nil

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -17,15 +17,50 @@ import (
"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 +123,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 +142,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 +166,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 +180,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 +201,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 +219,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 +231,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 +262,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 +284,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
}
@@ -348,19 +333,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 +419,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 +435,7 @@ type UploadRepoFileOptions struct {
NewBranch string
TreePath string
Message string
Files []string // In UUID format.
Files []string // In UUID format
}
func (repo *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions) (err error) {
@@ -460,21 +445,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)
}
}
@@ -491,7 +476,7 @@ func (repo *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions)
}
if err = com.Copy(tmpPath, targetPath); err != nil {
return fmt.Errorf("Copy: %v", err)
return fmt.Errorf("copy: %v", err)
}
}
@@ -501,40 +486,18 @@ func (repo *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions)
Committer: doer.NewGitSig(),
Message: opts.Message,
}); err != nil {
return fmt.Errorf("CommitChanges: %v", err)
} else if err = git.Push(localPath, "origin", opts.NewBranch); err != nil {
return fmt.Errorf("commit changes on %q: %v", localPath, err)
} else if err = git.PushWithEnvs(localPath, "origin", opts.NewBranch,
ComposeHookEnvs(ComposeHookEnvsOptions{
AuthUser: doer,
OwnerName: repo.MustOwner().Name,
OwnerSalt: repo.MustOwner().Salt,
RepoID: repo.ID,
RepoName: repo.Name,
RepoPath: repo.RepoPath(),
})); err != nil {
return fmt.Errorf("git push origin %s: %v", opts.NewBranch, err)
}
gitRepo, err := git.OpenRepository(repo.RepoPath())
if err != nil {
log.Error(2, "OpenRepository: %v", err)
return nil
}
commit, err := gitRepo.GetBranchCommit(opts.NewBranch)
if err != nil {
log.Error(2, "GetBranchCommit [branch: %s]: %v", opts.NewBranch, err)
return nil
}
// Simulate push event.
pushCommits := &PushCommits{
Len: 1,
Commits: []*PushCommit{CommitToPushCommit(commit)},
}
if err := CommitRepoAction(CommitRepoActionOptions{
PusherName: doer.Name,
RepoOwnerID: repo.MustOwner().ID,
RepoName: repo.Name,
RefFullName: git.BRANCH_PREFIX + opts.NewBranch,
OldCommitID: opts.LastCommitID,
NewCommitID: commit.ID.String(),
Commits: pushCommits,
}); err != nil {
log.Error(2, "CommitRepoAction: %v", err)
return nil
}
go AddTestPullRequestTask(doer, repo.ID, opts.NewBranch, true)
return DeleteUploads(uploads...)
}

View File

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

View File

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

View File

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

View File

@@ -35,6 +35,9 @@ import (
"github.com/gogs/gogs/pkg/tool"
)
// USER_AVATAR_URL_PREFIX is used to identify a URL is to access user avatar.
const USER_AVATAR_URL_PREFIX = "avatars"
type UserType int
const (
@@ -55,17 +58,17 @@ type User struct {
LoginSource int64 `xorm:"NOT NULL DEFAULT 0"`
LoginName string
Type UserType
OwnedOrgs []*User `xorm:"-"`
Orgs []*User `xorm:"-"`
Repos []*Repository `xorm:"-"`
OwnedOrgs []*User `xorm:"-" json:"-"`
Orgs []*User `xorm:"-" json:"-"`
Repos []*Repository `xorm:"-" json:"-"`
Location string
Website string
Rands string `xorm:"VARCHAR(10)"`
Salt string `xorm:"VARCHAR(10)"`
Created time.Time `xorm:"-"`
Created time.Time `xorm:"-" json:"-"`
CreatedUnix int64
Updated time.Time `xorm:"-"`
Updated time.Time `xorm:"-" json:"-"`
UpdatedUnix int64
// Remember visibility choice for convenience, true for private
@@ -95,8 +98,8 @@ type User struct {
Description string
NumTeams int
NumMembers int
Teams []*Team `xorm:"-"`
Members []*User `xorm:"-"`
Teams []*Team `xorm:"-" json:"-"`
Members []*User `xorm:"-" json:"-"`
}
func (u *User) BeforeInsert() {
@@ -257,7 +260,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 +268,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 +333,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 +706,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 +890,7 @@ func GetUserByKeyID(keyID int64) (*User, error) {
func getUserByID(e Engine, id int64) (*User, error) {
u := new(User)
has, err := e.Id(id).Get(u)
has, err := e.ID(id).Get(u)
if err != nil {
return nil, err
} else if !has {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

File diff suppressed because one or more lines are too long

View File

@@ -43,7 +43,7 @@ func (c *APIContext) Error(status int, title string, obj interface{}) {
})
}
// SetLinkHeader sets pagination link header by given totol number and page size.
// 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)

View File

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

View File

@@ -68,6 +68,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 {

View File

@@ -32,6 +32,7 @@ type Authentication struct {
GroupMemberUID string
UserUID string
IsActive bool
IsDefault bool
SMTPAuth string
SMTPHost string
SMTPPort int

View File

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

View File

@@ -8,7 +8,6 @@ package httplib
import (
"bytes"
"crypto/tls"
"encoding/json"
"encoding/xml"
"io"
"io/ioutil"
@@ -23,6 +22,8 @@ import (
"strings"
"sync"
"time"
"github.com/json-iterator/go"
)
var defaultSetting = Settings{false, "GogsServer", 60 * time.Second, 60 * time.Second, nil, nil, nil, false}
@@ -416,8 +417,7 @@ func (r *Request) ToJson(v interface{}) error {
if err != nil {
return err
}
err = json.Unmarshal(data, v)
return err
return jsoniter.Unmarshal(data, v)
}
// ToXml returns the map that marshals from the body bytes as xml in response .
@@ -427,8 +427,7 @@ func (r *Request) ToXml(v interface{}) error {
if err != nil {
return err
}
err = xml.Unmarshal(data, v)
return err
return xml.Unmarshal(data, v)
}
// Response executes request client gets response mannually.

View File

@@ -53,9 +53,8 @@ var (
CrossReferenceIssueNumericPattern = regexp.MustCompile(`( |^)[0-9a-zA-Z-_\.]+/[0-9a-zA-Z-_\.]+#[0-9]+\b`)
// Sha1CurrentPattern matches string that represents a commit SHA, e.g. d8a994ef243349f321568f9e36d5c3f444b99cae
// FIXME: this pattern matches pure numbers as well, right now we do a hack to check in RenderSha1CurrentPattern
// by converting string to a number.
Sha1CurrentPattern = regexp.MustCompile(`\b[0-9a-f]{40}\b`)
// FIXME: this pattern matches pure numbers as well, right now we do a hack to check in RenderSha1CurrentPattern by converting string to a number.
Sha1CurrentPattern = regexp.MustCompile(`\b[0-9a-f]{7,40}\b`)
)
// FindAllMentions matches mention patterns in given content

View File

@@ -70,7 +70,8 @@ var (
LocalURL string
OfflineMode bool
DisableRouterLog bool
CertFile, KeyFile string
CertFile string
KeyFile string
TLSMinVersion string
StaticRootPath string
EnableGzip bool
@@ -187,11 +188,12 @@ var (
}
// Picture settings
AvatarUploadPath string
GravatarSource string
DisableGravatar bool
EnableFederatedAvatar bool
LibravatarService *libravatar.Libravatar
AvatarUploadPath string
RepositoryAvatarUploadPath string
GravatarSource string
DisableGravatar bool
EnableFederatedAvatar bool
LibravatarService *libravatar.Libravatar
// Log settings
LogRootPath string
@@ -292,6 +294,14 @@ var (
} `ini:"ui.user"`
}
// Prometheus settings
Prometheus struct {
Enabled bool
EnableBasicAuth bool
BasicAuthUsername string
BasicAuthPassword string
}
// I18n settings
Langs []string
Names []string
@@ -403,7 +413,9 @@ func NewContext() {
log.Fatal(2, "Fail to get work directory: %v", err)
}
Cfg, err = ini.Load(bindata.MustAsset("conf/app.ini"))
Cfg, err = ini.LoadSources(ini.LoadOptions{
IgnoreInlineComment: true,
}, bindata.MustAsset("conf/app.ini"))
if err != nil {
log.Fatal(2, "Fail to parse 'conf/app.ini': %v", err)
}
@@ -608,6 +620,11 @@ func NewContext() {
if !filepath.IsAbs(AvatarUploadPath) {
AvatarUploadPath = path.Join(workDir, AvatarUploadPath)
}
RepositoryAvatarUploadPath = sec.Key("REPOSITORY_AVATAR_UPLOAD_PATH").MustString(path.Join(AppDataPath, "repo-avatars"))
forcePathSeparator(RepositoryAvatarUploadPath)
if !filepath.IsAbs(RepositoryAvatarUploadPath) {
RepositoryAvatarUploadPath = path.Join(workDir, RepositoryAvatarUploadPath)
}
switch source := sec.Key("GRAVATAR_SOURCE").MustString("gravatar"); source {
case "duoshuo":
GravatarSource = "http://gravatar.duoshuo.com/avatar/"
@@ -643,27 +660,29 @@ func NewContext() {
}
if err = Cfg.Section("http").MapTo(&HTTP); err != nil {
log.Fatal(2, "Fail to map HTTP settings: %v", err)
log.Fatal(2, "Failed to map HTTP settings: %v", err)
} else if err = Cfg.Section("webhook").MapTo(&Webhook); err != nil {
log.Fatal(2, "Fail to map Webhook settings: %v", err)
log.Fatal(2, "Failed to map Webhook settings: %v", err)
} else if err = Cfg.Section("release.attachment").MapTo(&Release.Attachment); err != nil {
log.Fatal(2, "Fail to map Release.Attachment settings: %v", err)
log.Fatal(2, "Failed to map Release.Attachment settings: %v", err)
} else if err = Cfg.Section("markdown").MapTo(&Markdown); err != nil {
log.Fatal(2, "Fail to map Markdown settings: %v", err)
log.Fatal(2, "Failed to map Markdown settings: %v", err)
} else if err = Cfg.Section("smartypants").MapTo(&Smartypants); err != nil {
log.Fatal(2, "Fail to map Smartypants settings: %v", err)
log.Fatal(2, "Failed to map Smartypants settings: %v", err)
} else if err = Cfg.Section("admin").MapTo(&Admin); err != nil {
log.Fatal(2, "Fail to map Admin settings: %v", err)
log.Fatal(2, "Failed to map Admin settings: %v", err)
} else if err = Cfg.Section("cron").MapTo(&Cron); err != nil {
log.Fatal(2, "Fail to map Cron settings: %v", err)
log.Fatal(2, "Failed to map Cron settings: %v", err)
} else if err = Cfg.Section("git").MapTo(&Git); err != nil {
log.Fatal(2, "Fail to map Git settings: %v", err)
log.Fatal(2, "Failed to map Git settings: %v", err)
} else if err = Cfg.Section("mirror").MapTo(&Mirror); err != nil {
log.Fatal(2, "Fail to map Mirror settings: %v", err)
log.Fatal(2, "Failed to map Mirror settings: %v", err)
} else if err = Cfg.Section("api").MapTo(&API); err != nil {
log.Fatal(2, "Fail to map API settings: %v", err)
log.Fatal(2, "Failed to map API settings: %v", err)
} else if err = Cfg.Section("ui").MapTo(&UI); err != nil {
log.Fatal(2, "Fail to map UI settings: %v", err)
log.Fatal(2, "Failed to map UI settings: %v", err)
} else if err = Cfg.Section("prometheus").MapTo(&Prometheus); err != nil {
log.Fatal(2, "Failed to map Prometheus settings: %v", err)
}
if Mirror.DefaultInterval <= 0 {

View File

@@ -6,7 +6,6 @@ package template
import (
"container/list"
"encoding/json"
"fmt"
"html/template"
"mime"
@@ -15,6 +14,7 @@ import (
"strings"
"time"
"github.com/json-iterator/go"
"github.com/microcosm-cc/bluemonday"
"golang.org/x/net/html/charset"
"golang.org/x/text/transform"
@@ -281,8 +281,8 @@ func ActionIcon(opType int) string {
func ActionContent2Commits(act Actioner) *models.PushCommits {
push := models.NewPushCommits()
if err := json.Unmarshal([]byte(act.GetContent()), push); err != nil {
log.Error(4, "json.Unmarshal:\n%s\nERROR: %v", act.GetContent(), err)
if err := jsoniter.Unmarshal([]byte(act.GetContent()), push); err != nil {
log.Error(4, "Unmarshal:\n%s\nERROR: %v", act.GetContent(), err)
}
return push
}

View File

@@ -16,9 +16,9 @@
<td><a href="/js/libs/jquery.are-you-sure.js">jquery.are-you-sure.js</a></td>
</tr>
<tr>
<td><a href="/js/semantic-2.2.7.min.js">semantic-2.2.1.min.js</a></td>
<td><a href="/js/semantic-2.3.1.min.js">semantic-2.3.1.min.js</a></td>
<td><a href="http://www.freebsd.org/copyright/freebsd-license.html">Expat</a></td>
<td><a href="https://github.com/Semantic-Org/Semantic-UI/archive/2.2.1.tar.gz">semantic-UI-2.2.1.tar.gz</a></td>
<td><a href="https://github.com/Semantic-Org/Semantic-UI/archive/2.3.1.tar.gz">semantic-UI-2.3.1.tar.gz</a></td>
</tr>
<tr>
<td><a href="/js/gogs.js">gogs.js</a></td>

View File

@@ -350,6 +350,9 @@ footer .ui.language .menu {
.center {
text-align: center;
}
.no-padding-left {
padding-left: 0 !important;
}
.img-1 {
width: 2px !important;
height: 2px !important;
@@ -1728,6 +1731,9 @@ footer .ui.language .menu {
margin-left: 10px;
margin-top: 10px;
}
.repository.view.issue .pull .merge.box #commit_description {
height: auto;
}
.repository.view.issue .comment-list:before {
display: block;
content: "";

View File

@@ -111,7 +111,7 @@ function initCommentForm() {
// This should be added directly to HTML but somehow just get empty <span> on this page.
$labelMenu.find('.item:not(.no-select) .octicon:not(.octicon-check)').each(function () {
$(this).html('&nbsp;');
})
});
$labelMenu.find('.item:not(.no-select)').click(function () {
if ($(this).hasClass('checked')) {
$(this).removeClass('checked');
@@ -499,6 +499,15 @@ function initRepository() {
if ($('.repository.compare.pull').length > 0) {
initFilterSearchDropdown('.choose.branch .dropdown');
}
if ($('.repository.view.pull').length > 0) {
$('.comment.merge.box input[name=merge_style]').change(function () {
if ($(this).val() === 'create_merge_commit') {
$('.commit.description.field').show();
} else {
$('.commit.description.field').hide();
}
})
}
}
function initWikiForm() {
@@ -1143,7 +1152,7 @@ function initWebhookSettings() {
$(document).ready(function () {
csrf = $('meta[name=_csrf]').attr("content");
suburl = $('meta[name=_suburl]').attr("content");
// Set cursor to the end of autofocus input string
$('input[autofocus]').each(function () {
$(this).val($(this).val());
@@ -1262,6 +1271,12 @@ $(document).ready(function () {
e.trigger.setAttribute('data-content', e.trigger.getAttribute('data-original'))
});
// Autosize
if ($('#description.autosize').length > 0) {
autosize($('#description'));
showMessageMaxLength(512, 'description', 'descLength');
}
// AJAX load buttons
$('.ajax-load-button').click(function () {
var $this = $(this);
@@ -1443,3 +1458,42 @@ $(function () {
if ($('.user.signin').length > 0) return;
$('form').areYouSure();
});
// getByteLen counts bytes in a string's UTF-8 representation.
function getByteLen(normalVal) {
// Force string type
normalVal = String(normalVal);
var byteLen = 0;
for (var i = 0; i < normalVal.length; i++) {
var c = normalVal.charCodeAt(i);
byteLen += c < (1 << 7) ? 1 :
c < (1 << 11) ? 2 :
c < (1 << 16) ? 3 :
c < (1 << 21) ? 4 :
c < (1 << 26) ? 5 :
c < (1 << 31) ? 6 : Number.NaN;
}
return byteLen;
}
function showMessageMaxLength(maxLen, textElemId, counterId) {
var $msg = $('#'+textElemId);
$('#'+counterId).html(maxLen - getByteLen($msg.val()));
var onMessageKey = function (e) {
var $msg = $(this);
var text = $msg.val();
var len = getByteLen(text);
var remainder = maxLen - len;
if (len >= maxLen) {
$msg.val($msg.val().substr(0, maxLen));
remainder = 0;
}
$('#'+counterId).html(remainder);
};
$msg.keyup(onMessageKey).keydown(onMessageKey);
}

View File

@@ -388,6 +388,10 @@ footer {
text-align: center;
}
.no-padding-left {
padding-left: 0 !important;
}
.generate-img(16);
.generate-img(@n, @i: 1) when (@i =< @n) {
.img-@{i} {

View File

@@ -141,18 +141,18 @@
.repo-owner-name-list {
.item-name {
max-width: 70%;
margin-bottom: -4px;
margin-bottom: -4px;
}
}
#collaborative-repo-list {
.owner-and-repo {
max-width: 80%;
margin-bottom: -5px;
margin-bottom: -5px;
}
.owner-name {
max-width: 120px;
margin-bottom: -5px;
margin-bottom: -5px;
}
}
}

View File

@@ -639,6 +639,9 @@
margin-left: 10px;
margin-top: 10px;
}
#commit_description {
height: auto;
}
}
}
.comment-list {

View File

@@ -0,0 +1,6 @@
/*!
autosize 4.0.2
license: MIT
http://www.jacklmoore.com/autosize
*/
!function(e,t){if("function"==typeof define&&define.amd)define(["module","exports"],t);else if("undefined"!=typeof exports)t(module,exports);else{var n={exports:{}};t(n,n.exports),e.autosize=n.exports}}(this,function(e,t){"use strict";var n,o,p="function"==typeof Map?new Map:(n=[],o=[],{has:function(e){return-1<n.indexOf(e)},get:function(e){return o[n.indexOf(e)]},set:function(e,t){-1===n.indexOf(e)&&(n.push(e),o.push(t))},delete:function(e){var t=n.indexOf(e);-1<t&&(n.splice(t,1),o.splice(t,1))}}),c=function(e){return new Event(e,{bubbles:!0})};try{new Event("test")}catch(e){c=function(e){var t=document.createEvent("Event");return t.initEvent(e,!0,!1),t}}function r(r){if(r&&r.nodeName&&"TEXTAREA"===r.nodeName&&!p.has(r)){var e,n=null,o=null,i=null,d=function(){r.clientWidth!==o&&a()},l=function(t){window.removeEventListener("resize",d,!1),r.removeEventListener("input",a,!1),r.removeEventListener("keyup",a,!1),r.removeEventListener("autosize:destroy",l,!1),r.removeEventListener("autosize:update",a,!1),Object.keys(t).forEach(function(e){r.style[e]=t[e]}),p.delete(r)}.bind(r,{height:r.style.height,resize:r.style.resize,overflowY:r.style.overflowY,overflowX:r.style.overflowX,wordWrap:r.style.wordWrap});r.addEventListener("autosize:destroy",l,!1),"onpropertychange"in r&&"oninput"in r&&r.addEventListener("keyup",a,!1),window.addEventListener("resize",d,!1),r.addEventListener("input",a,!1),r.addEventListener("autosize:update",a,!1),r.style.overflowX="hidden",r.style.wordWrap="break-word",p.set(r,{destroy:l,update:a}),"vertical"===(e=window.getComputedStyle(r,null)).resize?r.style.resize="none":"both"===e.resize&&(r.style.resize="horizontal"),n="content-box"===e.boxSizing?-(parseFloat(e.paddingTop)+parseFloat(e.paddingBottom)):parseFloat(e.borderTopWidth)+parseFloat(e.borderBottomWidth),isNaN(n)&&(n=0),a()}function s(e){var t=r.style.width;r.style.width="0px",r.offsetWidth,r.style.width=t,r.style.overflowY=e}function u(){if(0!==r.scrollHeight){var e=function(e){for(var t=[];e&&e.parentNode&&e.parentNode instanceof Element;)e.parentNode.scrollTop&&t.push({node:e.parentNode,scrollTop:e.parentNode.scrollTop}),e=e.parentNode;return t}(r),t=document.documentElement&&document.documentElement.scrollTop;r.style.height="",r.style.height=r.scrollHeight+n+"px",o=r.clientWidth,e.forEach(function(e){e.node.scrollTop=e.scrollTop}),t&&(document.documentElement.scrollTop=t)}}function a(){u();var e=Math.round(parseFloat(r.style.height)),t=window.getComputedStyle(r,null),n="content-box"===t.boxSizing?Math.round(parseFloat(t.height)):r.offsetHeight;if(n<e?"hidden"===t.overflowY&&(s("scroll"),u(),n="content-box"===t.boxSizing?Math.round(parseFloat(window.getComputedStyle(r,null).height)):r.offsetHeight):"hidden"!==t.overflowY&&(s("hidden"),u(),n="content-box"===t.boxSizing?Math.round(parseFloat(window.getComputedStyle(r,null).height)):r.offsetHeight),i!==n){i=n;var o=c("autosize:resized");try{r.dispatchEvent(o)}catch(e){}}}}function i(e){var t=p.get(e);t&&t.destroy()}function d(e){var t=p.get(e);t&&t.update()}var l=null;"undefined"==typeof window||"function"!=typeof window.getComputedStyle?((l=function(e){return e}).destroy=function(e){return e},l.update=function(e){return e}):((l=function(e,t){return e&&Array.prototype.forEach.call(e.length?e:[e],function(e){return r(e)}),e}).destroy=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],i),e},l.update=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],d),e}),t.default=l,e.exports=t.default});

View File

@@ -5,13 +5,13 @@
package admin
import (
"encoding/json"
"fmt"
"runtime"
"strings"
"time"
"github.com/Unknwon/com"
"github.com/json-iterator/go"
"gopkg.in/macaron.v1"
"github.com/gogs/gogs/models"
@@ -241,7 +241,7 @@ func Config(c *context.Context) {
Mode: strings.Title(setting.LogModes[i]),
}
result, _ := json.MarshalIndent(setting.LogConfigs[i], "", " ")
result, _ := jsoniter.MarshalIndent(setting.LogConfigs[i], "", " ")
loggers[i].Config = string(result)
}
c.Data["Loggers"] = loggers

View File

@@ -69,6 +69,7 @@ func NewAuthSource(c *context.Context) {
c.Data["CurrentSecurityProtocol"] = models.SecurityProtocolNames[ldap.SECURITY_PROTOCOL_UNENCRYPTED]
c.Data["smtp_auth"] = "PLAIN"
c.Data["is_active"] = true
c.Data["is_default"] = true
c.Data["AuthSources"] = authSources
c.Data["SecurityProtocols"] = securityProtocols
c.Data["SMTPAuths"] = models.SMTPAuths
@@ -152,6 +153,7 @@ func NewAuthSourcePost(c *context.Context, f form.Authentication) {
Type: models.LoginType(f.Type),
Name: f.Name,
IsActived: f.IsActive,
IsDefault: f.IsDefault,
Cfg: config,
}); err != nil {
if models.IsErrLoginSourceAlreadyExist(err) {
@@ -225,11 +227,13 @@ func EditAuthSourcePost(c *context.Context, f form.Authentication) {
source.Name = f.Name
source.IsActived = f.IsActive
source.IsDefault = f.IsDefault
source.Cfg = config
if err := models.UpdateLoginSource(source); err != nil {
c.ServerError("UpdateLoginSource", err)
return
}
log.Trace("Authentication changed by admin '%s': %d", c.User.Name, source.ID)
c.Flash.Success(c.Tr("admin.auths.update_success"))

View File

@@ -5,9 +5,8 @@
package repo
import (
"encoding/json"
"github.com/Unknwon/com"
"github.com/json-iterator/go"
api "github.com/gogs/go-gogs-client"
@@ -79,7 +78,7 @@ func CreateHook(c *context.APIContext, form api.CreateHookOption) {
c.Error(422, "", "Missing config option: channel")
return
}
meta, err := json.Marshal(&models.SlackMeta{
meta, err := jsoniter.Marshal(&models.SlackMeta{
Channel: channel,
Username: form.Config["username"],
IconURL: form.Config["icon_url"],
@@ -129,7 +128,7 @@ func EditHook(c *context.APIContext, form api.EditHookOption) {
if w.HookTaskType == models.SLACK {
if channel, ok := form.Config["channel"]; ok {
meta, err := json.Marshal(&models.SlackMeta{
meta, err := jsoniter.Marshal(&models.SlackMeta{
Channel: channel,
Username: form.Config["username"],
IconURL: form.Config["icon_url"],

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