mirror of
https://github.com/gogs/gogs.git
synced 2026-03-02 02:00:57 +01:00
Compare commits
96 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e0a787b5ee | ||
|
|
63598688e4 | ||
|
|
497cdc9250 | ||
|
|
edaf14f2b6 | ||
|
|
6fbb984ebf | ||
|
|
ba151eda0a | ||
|
|
c05717a5f0 | ||
|
|
5a488b6517 | ||
|
|
ae1d50d19a | ||
|
|
fe25effe7c | ||
|
|
d05395fe90 | ||
|
|
37b10666de | ||
|
|
41c8e87be8 | ||
|
|
55afc1ad21 | ||
|
|
16c6ca72cd | ||
|
|
b873ec2bce | ||
|
|
1bc805bb4b | ||
|
|
348c75c91b | ||
|
|
76ebdb265b | ||
|
|
88ae3510ff | ||
|
|
c07899701a | ||
|
|
ab42671c63 | ||
|
|
b3ac33cbcf | ||
|
|
3b94162803 | ||
|
|
52aade232d | ||
|
|
3a9276307c | ||
|
|
ca6326c937 | ||
|
|
8da16ac302 | ||
|
|
761bb3cf53 | ||
|
|
c1c269d9ef | ||
|
|
9edac05e05 | ||
|
|
9c1620d49c | ||
|
|
65bb6eb284 | ||
|
|
aff55ff105 | ||
|
|
4a67bb5806 | ||
|
|
1afafde3b3 | ||
|
|
ab634ce61a | ||
|
|
9d06ebd01a | ||
|
|
09723ec0e5 | ||
|
|
864761c2d0 | ||
|
|
abe7f7bc36 | ||
|
|
717bcc4ad8 | ||
|
|
11ffdac3f8 | ||
|
|
cf7d5d0c56 | ||
|
|
375f1b1fde | ||
|
|
ad3c6ef205 | ||
|
|
30d9e2ee3c | ||
|
|
1038916460 | ||
|
|
73de9f9d6a | ||
|
|
f40eb9774e | ||
|
|
496e07c1c9 | ||
|
|
c238647020 | ||
|
|
78f94986e3 | ||
|
|
8f52ab8201 | ||
|
|
260ebcc1ca | ||
|
|
09cb48e41c | ||
|
|
674106c7b6 | ||
|
|
8196430f47 | ||
|
|
7a99e56893 | ||
|
|
79ba0314e9 | ||
|
|
c441f8080e | ||
|
|
bd1e757350 | ||
|
|
3144be5c81 | ||
|
|
fdc7cb565d | ||
|
|
a6dbde4c46 | ||
|
|
8ce23e2c71 | ||
|
|
8a3f4fc616 | ||
|
|
66c1e6b0e8 | ||
|
|
beee6e03b1 | ||
|
|
902372067c | ||
|
|
7adaf8f812 | ||
|
|
71753cdd46 | ||
|
|
d3363430dc | ||
|
|
945e65eedf | ||
|
|
85a050fca7 | ||
|
|
bb86d66496 | ||
|
|
aba8789542 | ||
|
|
5f1bbbde49 | ||
|
|
0203eaab00 | ||
|
|
2807274e2d | ||
|
|
55a5ad5cdc | ||
|
|
b3c4a39208 | ||
|
|
cac7af2c78 | ||
|
|
2d4dc544be | ||
|
|
171f97868d | ||
|
|
becaec19a7 | ||
|
|
bc630cc52b | ||
|
|
d591cb0dfb | ||
|
|
07a9cbe0a9 | ||
|
|
7c802f6d83 | ||
|
|
431e930367 | ||
|
|
9e8ffa14cb | ||
|
|
0ccd7c97ab | ||
|
|
4e64e71e28 | ||
|
|
86c7f45383 | ||
|
|
50b36a732c |
@@ -7,7 +7,7 @@ watch_all = true
|
||||
watch_dirs = [
|
||||
"$WORKDIR/cmd",
|
||||
"$WORKDIR/models",
|
||||
"$WORKDIR/modules",
|
||||
"$WORKDIR/pkg",
|
||||
"$WORKDIR/routers"
|
||||
]
|
||||
watch_exts = [".go"]
|
||||
|
||||
@@ -14,6 +14,4 @@ config.codekit
|
||||
.editorconfig
|
||||
.gitignore
|
||||
Dockerfile*
|
||||
vendor
|
||||
vendor/**
|
||||
gogs
|
||||
|
||||
@@ -21,5 +21,5 @@ indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.js]
|
||||
indent_style = space
|
||||
indent_style = tab
|
||||
indent_size = 4
|
||||
|
||||
9
.gitattributes
vendored
9
.gitattributes
vendored
@@ -1,11 +1,10 @@
|
||||
public/conf/gitignore/* linguist-vendored
|
||||
public/conf/license/* linguist-vendored
|
||||
conf/gitignore/* linguist-vendored
|
||||
conf/license/* linguist-vendored
|
||||
public/assets/* linguist-vendored
|
||||
public/plugins/* linguist-vendored
|
||||
public/plugins/* linguist-vendored
|
||||
public/css/themes/* linguist-vendored
|
||||
public/css/github.min.css linguist-vendored
|
||||
public/css/semantic-2.2.7.min.css linguist-vendored
|
||||
public/css/semantic-2.2.10.min.css linguist-vendored
|
||||
public/js/libs/* linguist-vendored
|
||||
public/js/jquery-1.11.3.min.js linguist-vendored
|
||||
public/js/semantic-2.2.7.min.js linguist-vendored
|
||||
public/js/semantic-2.2.10.min.js linguist-vendored
|
||||
@@ -3,6 +3,7 @@ go:
|
||||
- 1.5.x
|
||||
- 1.6.x
|
||||
- 1.7.x
|
||||
- 1.8.x
|
||||
- master
|
||||
|
||||
before_install:
|
||||
|
||||
18
Makefile
18
Makefile
@@ -1,9 +1,9 @@
|
||||
LDFLAGS += -X "github.com/gogits/gogs/modules/setting.BuildTime=$(shell date -u '+%Y-%m-%d %I:%M:%S %Z')"
|
||||
LDFLAGS += -X "github.com/gogits/gogs/modules/setting.BuildGitHash=$(shell git rev-parse HEAD)"
|
||||
LDFLAGS += -X "github.com/gogits/gogs/pkg/setting.BuildTime=$(shell date -u '+%Y-%m-%d %I:%M:%S %Z')"
|
||||
LDFLAGS += -X "github.com/gogits/gogs/pkg/setting.BuildGitHash=$(shell git rev-parse HEAD)"
|
||||
|
||||
DATA_FILES := $(shell find conf | sed 's/ /\\ /g')
|
||||
LESS_FILES := $(wildcard public/less/gogs.less public/less/_*.less)
|
||||
GENERATED := modules/bindata/bindata.go public/css/gogs.css
|
||||
GENERATED := pkg/bindata/bindata.go public/css/gogs.css
|
||||
|
||||
OS := $(shell uname)
|
||||
|
||||
@@ -27,7 +27,7 @@ dist: release
|
||||
|
||||
govet:
|
||||
$(GOVET) gogs.go
|
||||
$(GOVET) models modules routers
|
||||
$(GOVET) models pkg routers
|
||||
|
||||
build: $(GENERATED)
|
||||
go install $(BUILD_FLAGS) -ldflags '$(LDFLAGS)' -tags '$(TAGS)'
|
||||
@@ -50,9 +50,9 @@ pack:
|
||||
|
||||
release: build pack
|
||||
|
||||
bindata: modules/bindata/bindata.go
|
||||
bindata: pkg/bindata/bindata.go
|
||||
|
||||
modules/bindata/bindata.go: $(DATA_FILES)
|
||||
pkg/bindata/bindata.go: $(DATA_FILES)
|
||||
go-bindata -o=$@ -ignore="\\.DS_Store|README.md|TRANSLATORS" -pkg=bindata conf/...
|
||||
|
||||
less: public/css/gogs.css
|
||||
@@ -70,11 +70,11 @@ test:
|
||||
go test -cover -race ./...
|
||||
|
||||
fixme:
|
||||
grep -rnw "FIXME" cmd routers models modules
|
||||
grep -rnw "FIXME" cmd routers models pkg
|
||||
|
||||
todo:
|
||||
grep -rnw "TODO" cmd routers models modules
|
||||
grep -rnw "TODO" cmd routers models pkg
|
||||
|
||||
# Legacy code should be remove by the time of release
|
||||
legacy:
|
||||
grep -rnw "LEGACY" cmd routers models modules
|
||||
grep -rnw "LEGACY" cmd routers models pkg
|
||||
|
||||
@@ -7,9 +7,9 @@ Gogs [](http
|
||||
|
||||
| Web | UI | Preview |
|
||||
|:-------------:|:-------:|:-------:|
|
||||
||||
|
||||
||||
|
||||
||||
|
||||
||||
|
||||
||||
|
||||
||||
|
||||
|
||||
### Important Notes
|
||||
|
||||
@@ -50,7 +50,7 @@ The goal of this project is to make the easiest, fastest, and most painless way
|
||||
- Gravatar and Federated avatar with custom source
|
||||
- Mail service
|
||||
- Administration panel
|
||||
- Supports MySQL, PostgreSQL, SQLite3, MSSQL and [TiDB](https://github.com/pingcap/tidb) (experimental)
|
||||
- Supports MySQL, PostgreSQL, SQLite3, MSSQL and [TiDB](https://github.com/pingcap/tidb) (via MySQL protocol)
|
||||
- Multi-language support ([23 languages](https://crowdin.com/project/gogs))
|
||||
|
||||
## Hardware Requirements
|
||||
|
||||
@@ -9,7 +9,7 @@ Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自
|
||||
|
||||
## 项目概览
|
||||
|
||||
- 有关基本用法和变更日志,请通过 [使用手册](https://gogs.io/docs/intro/) 查看。
|
||||
- 有关基本用法和变更日志,请通过 [使用手册](https://gogs.io/docs/intro) 查看。
|
||||
- 想要先睹为快?直接去 [在线体验](https://try.gogs.io/gogs/gogs) 。
|
||||
- 使用过程中遇到问题?尝试从 [故障排查](https://gogs.io/docs/intro/troubleshooting.html) 页面或 [用户论坛](https://discuss.gogs.io/) 获取帮助。
|
||||
- 希望帮助多国语言界面的翻译吗?请立即访问 [详情页面](https://gogs.io/docs/features/i18n.html)!
|
||||
@@ -31,7 +31,7 @@ Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自
|
||||
- 支持 Jupyter Notebook
|
||||
- 支持邮件服务
|
||||
- 支持后台管理面板
|
||||
- 支持 MySQL、PostgreSQL、SQLite3、MSSQL 和 [TiDB](https://github.com/pingcap/tidb)(实验性支持) 数据库
|
||||
- 支持 MySQL、PostgreSQL、SQLite3、MSSQL 和 [TiDB](https://github.com/pingcap/tidb)(通过 MySQL 协议)数据库
|
||||
- 支持多语言本地化([23 种语言]([more](https://crowdin.com/project/gogs)))
|
||||
|
||||
## 硬件要求
|
||||
|
||||
@@ -10,7 +10,7 @@ import (
|
||||
"github.com/urfave/cli"
|
||||
|
||||
"github.com/gogits/gogs/models"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
var (
|
||||
|
||||
@@ -18,7 +18,7 @@ import (
|
||||
"gopkg.in/ini.v1"
|
||||
|
||||
"github.com/gogits/gogs/models"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
var Backup = cli.Command{
|
||||
@@ -33,6 +33,7 @@ portable among all supported database engines.`,
|
||||
boolFlag("verbose, v", "Show process details"),
|
||||
stringFlag("tempdir, t", os.TempDir(), "Temporary directory path"),
|
||||
stringFlag("target", "./", "Target directory path to save backup archive"),
|
||||
stringFlag("archive-name", fmt.Sprintf("gogs-backup-%d.zip", time.Now().Unix()), "Name of backup archive"),
|
||||
boolFlag("database-only", "Only dump database"),
|
||||
boolFlag("exclude-repos", "Exclude repositories"),
|
||||
},
|
||||
@@ -69,7 +70,7 @@ func runBackup(c *cli.Context) error {
|
||||
log.Fatal(0, "Fail to save metadata '%s': %v", metaFile, err)
|
||||
}
|
||||
|
||||
archiveName := path.Join(c.String("target"), fmt.Sprintf("gogs-backup-%d.zip", time.Now().Unix()))
|
||||
archiveName := path.Join(c.String("target"), c.String("archive-name"))
|
||||
log.Info("Packing backup files to: %s", archiveName)
|
||||
|
||||
z, err := zip.Create(archiveName)
|
||||
|
||||
@@ -21,8 +21,8 @@ import (
|
||||
"github.com/gogits/git-module"
|
||||
|
||||
"github.com/gogits/gogs/models"
|
||||
"github.com/gogits/gogs/modules/httplib"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/pkg/httplib"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
http "github.com/gogits/gogs/routers/repo"
|
||||
)
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ import (
|
||||
"github.com/Unknwon/com"
|
||||
"github.com/urfave/cli"
|
||||
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
var (
|
||||
|
||||
@@ -16,7 +16,7 @@ import (
|
||||
"gopkg.in/ini.v1"
|
||||
|
||||
"github.com/gogits/gogs/models"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
var Restore = cli.Command{
|
||||
@@ -24,9 +24,9 @@ var Restore = cli.Command{
|
||||
Usage: "Restore files and database from backup",
|
||||
Description: `Restore imports all related files and database from a backup archive.
|
||||
The backup version must lower or equal to current Gogs version. You can also import
|
||||
backup from other database engines, which is useful for database migrating.
|
||||
backup from other database engines, which is useful for database migrating.
|
||||
|
||||
If corresponding files or database tables are not presented in the archive, they will
|
||||
If corresponding files or database tables are not presented in the archive, they will
|
||||
be skipped and remian unchanged.`,
|
||||
Action: runRestore,
|
||||
Flags: []cli.Flag{
|
||||
|
||||
@@ -17,7 +17,8 @@ import (
|
||||
log "gopkg.in/clog.v1"
|
||||
|
||||
"github.com/gogits/gogs/models"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/models/errors"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
http "github.com/gogits/gogs/routers/repo"
|
||||
)
|
||||
|
||||
@@ -153,7 +154,7 @@ func runServ(c *cli.Context) error {
|
||||
|
||||
owner, err := models.GetUserByName(ownerName)
|
||||
if err != nil {
|
||||
if models.IsErrUserNotExist(err) {
|
||||
if errors.IsUserNotExist(err) {
|
||||
fail("Repository owner does not exist", "Unregistered owner: %s", ownerName)
|
||||
}
|
||||
fail("Internal error", "Fail to get repository owner '%s': %v", ownerName, err)
|
||||
@@ -161,7 +162,7 @@ func runServ(c *cli.Context) error {
|
||||
|
||||
repo, err := models.GetRepositoryByName(owner.ID, repoName)
|
||||
if err != nil {
|
||||
if models.IsErrRepoNotExist(err) {
|
||||
if errors.IsRepoNotExist(err) {
|
||||
fail(_ACCESS_DENIED_MESSAGE, "Repository does not exist: %s/%s", owner.Name, repoName)
|
||||
}
|
||||
fail("Internal error", "Fail to get repository: %v", err)
|
||||
|
||||
143
cmd/web.go
143
cmd/web.go
@@ -24,23 +24,18 @@ import (
|
||||
"github.com/go-macaron/i18n"
|
||||
"github.com/go-macaron/session"
|
||||
"github.com/go-macaron/toolbox"
|
||||
"github.com/go-xorm/xorm"
|
||||
"github.com/mcuadros/go-version"
|
||||
"github.com/urfave/cli"
|
||||
log "gopkg.in/clog.v1"
|
||||
"gopkg.in/ini.v1"
|
||||
"gopkg.in/macaron.v1"
|
||||
|
||||
"github.com/gogits/git-module"
|
||||
"github.com/gogits/go-gogs-client"
|
||||
|
||||
"github.com/gogits/gogs/models"
|
||||
"github.com/gogits/gogs/modules/bindata"
|
||||
"github.com/gogits/gogs/modules/context"
|
||||
"github.com/gogits/gogs/modules/form"
|
||||
"github.com/gogits/gogs/modules/mailer"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/modules/template"
|
||||
"github.com/gogits/gogs/pkg/bindata"
|
||||
"github.com/gogits/gogs/pkg/context"
|
||||
"github.com/gogits/gogs/pkg/form"
|
||||
"github.com/gogits/gogs/pkg/mailer"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
"github.com/gogits/gogs/pkg/template"
|
||||
"github.com/gogits/gogs/routers"
|
||||
"github.com/gogits/gogs/routers/admin"
|
||||
apiv1 "github.com/gogits/gogs/routers/api/v1"
|
||||
@@ -62,49 +57,19 @@ and it takes care of all the other things for you`,
|
||||
},
|
||||
}
|
||||
|
||||
type VerChecker struct {
|
||||
ImportPath string
|
||||
Version func() string
|
||||
Expected string
|
||||
}
|
||||
|
||||
// checkVersion checks if binary matches the version of templates files.
|
||||
func checkVersion() {
|
||||
// Templates.
|
||||
data, err := ioutil.ReadFile(setting.StaticRootPath + "/templates/.VERSION")
|
||||
if err != nil {
|
||||
log.Fatal(4, "Fail to read 'templates/.VERSION': %v", err)
|
||||
log.Fatal(2, "Fail to read 'templates/.VERSION': %v", err)
|
||||
}
|
||||
tplVer := string(data)
|
||||
if tplVer != setting.AppVer {
|
||||
if version.Compare(tplVer, setting.AppVer, ">") {
|
||||
log.Fatal(4, "Binary version is lower than template file version, did you forget to recompile Gogs?")
|
||||
log.Fatal(2, "Binary version is lower than template file version, did you forget to recompile Gogs?")
|
||||
} else {
|
||||
log.Fatal(4, "Binary version is higher than template file version, did you forget to update template files?")
|
||||
}
|
||||
}
|
||||
|
||||
// Check dependency version.
|
||||
// LEGACY [0.11]: no need to check version as we check in vendor into version control
|
||||
checkers := []VerChecker{
|
||||
{"github.com/go-xorm/xorm", func() string { return xorm.Version }, "0.6.0"},
|
||||
{"github.com/go-macaron/binding", binding.Version, "0.3.2"},
|
||||
{"github.com/go-macaron/cache", cache.Version, "0.1.2"},
|
||||
{"github.com/go-macaron/csrf", csrf.Version, "0.1.0"},
|
||||
{"github.com/go-macaron/i18n", i18n.Version, "0.3.0"},
|
||||
{"github.com/go-macaron/session", session.Version, "0.1.6"},
|
||||
{"github.com/go-macaron/toolbox", toolbox.Version, "0.1.3"},
|
||||
{"gopkg.in/ini.v1", ini.Version, "1.8.4"},
|
||||
{"gopkg.in/macaron.v1", macaron.Version, "1.1.7"},
|
||||
{"github.com/gogits/git-module", git.Version, "0.4.12"},
|
||||
{"github.com/gogits/go-gogs-client", gogs.Version, "0.12.1"},
|
||||
}
|
||||
for _, c := range checkers {
|
||||
if !version.Compare(c.Version(), c.Expected, ">=") {
|
||||
log.Fatal(4, `Dependency outdated!
|
||||
Package '%s' current version (%s) is below requirement (%s),
|
||||
please use following command to update this package and recompile Gogs:
|
||||
go get -u %[1]s`, c.ImportPath, c.Version(), c.Expected)
|
||||
log.Fatal(2, "Binary version is higher than template file version, did you forget to update template files?")
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -247,22 +212,23 @@ func runWeb(ctx *cli.Context) error {
|
||||
m.Combo("/ssh").Get(user.SettingsSSHKeys).
|
||||
Post(bindIgnErr(form.AddSSHKey{}), user.SettingsSSHKeysPost)
|
||||
m.Post("/ssh/delete", user.DeleteSSHKey)
|
||||
m.Combo("/applications").Get(user.SettingsApplications).
|
||||
Post(bindIgnErr(form.NewAccessToken{}), user.SettingsApplicationsPost)
|
||||
m.Post("/applications/delete", user.SettingsDeleteApplication)
|
||||
|
||||
m.Group("/repositories", func() {
|
||||
m.Get("", user.SettingsRepos)
|
||||
m.Post("/leave", user.SettingsLeaveRepo)
|
||||
})
|
||||
m.Group("/organizations", func() {
|
||||
m.Get("", user.SettingsOrganizations)
|
||||
m.Post("/leave", user.SettingsLeaveOrganization)
|
||||
})
|
||||
|
||||
m.Combo("/applications").Get(user.SettingsApplications).
|
||||
Post(bindIgnErr(form.NewAccessToken{}), user.SettingsApplicationsPost)
|
||||
m.Post("/applications/delete", user.SettingsDeleteApplication)
|
||||
m.Route("/delete", "GET,POST", user.SettingsDelete)
|
||||
}, reqSignIn, func(ctx *context.Context) {
|
||||
ctx.Data["PageIsUserSettings"] = true
|
||||
})
|
||||
|
||||
m.Group("/user", func() {
|
||||
// r.Get("/feeds", binding.Bind(form.Feeds{}), user.Feeds)
|
||||
m.Any("/activate", user.Activate)
|
||||
m.Any("/activate_email", user.ActivateEmail)
|
||||
m.Get("/email2user", user.Email2User)
|
||||
@@ -460,12 +426,16 @@ func runWeb(ctx *cli.Context) error {
|
||||
m.Post("/gogs/new", bindIgnErr(form.NewWebhook{}), repo.WebHooksNewPost)
|
||||
m.Post("/slack/new", bindIgnErr(form.NewSlackHook{}), repo.SlackHooksNewPost)
|
||||
m.Post("/discord/new", bindIgnErr(form.NewDiscordHook{}), repo.DiscordHooksNewPost)
|
||||
m.Get("/:id", repo.WebHooksEdit)
|
||||
m.Post("/:id/test", repo.TestWebhook)
|
||||
m.Post("/gogs/:id", bindIgnErr(form.NewWebhook{}), repo.WebHooksEditPost)
|
||||
m.Post("/slack/:id", bindIgnErr(form.NewSlackHook{}), repo.SlackHooksEditPost)
|
||||
m.Post("/discord/:id", bindIgnErr(form.NewDiscordHook{}), repo.DiscordHooksEditPost)
|
||||
|
||||
m.Group("/:id", func() {
|
||||
m.Get("", repo.WebHooksEdit)
|
||||
m.Post("/test", repo.TestWebhook)
|
||||
m.Post("/redelivery", repo.RedeliveryWebhook)
|
||||
})
|
||||
|
||||
m.Group("/git", func() {
|
||||
m.Get("", repo.SettingsGitHooks)
|
||||
m.Combo("/:name").Get(repo.SettingsGitHooksEdit).
|
||||
@@ -485,6 +455,12 @@ func runWeb(ctx *cli.Context) error {
|
||||
}, reqSignIn, context.RepoAssignment(), reqRepoAdmin, context.RepoRef())
|
||||
|
||||
m.Get("/:username/:reponame/action/:action", reqSignIn, context.RepoAssignment(), repo.Action)
|
||||
m.Group("/:username/:reponame", func() {
|
||||
m.Get("/issues", repo.RetrieveLabels, repo.Issues)
|
||||
m.Get("/issues/:index", repo.ViewIssue)
|
||||
m.Get("/labels/", repo.RetrieveLabels, repo.Labels)
|
||||
m.Get("/milestones", repo.Milestones)
|
||||
}, ignSignIn, context.RepoAssignment(true))
|
||||
m.Group("/:username/:reponame", func() {
|
||||
// FIXME: should use different URLs but mostly same logic for comments of issue and pull reuqest.
|
||||
// So they can apply their own enable/disable logic on routers.
|
||||
@@ -492,12 +468,6 @@ func runWeb(ctx *cli.Context) error {
|
||||
m.Combo("/new", repo.MustEnableIssues).Get(context.RepoRef(), repo.NewIssue).
|
||||
Post(bindIgnErr(form.NewIssue{}), repo.NewIssuePost)
|
||||
|
||||
m.Group("/:index", func() {
|
||||
m.Post("/label", repo.UpdateIssueLabel)
|
||||
m.Post("/milestone", repo.UpdateIssueMilestone)
|
||||
m.Post("/assignee", repo.UpdateIssueAssignee)
|
||||
}, reqRepoWriter)
|
||||
|
||||
m.Group("/:index", func() {
|
||||
m.Post("/title", repo.UpdateIssueTitle)
|
||||
m.Post("/content", repo.UpdateIssueContent)
|
||||
@@ -508,6 +478,24 @@ func runWeb(ctx *cli.Context) error {
|
||||
m.Post("", repo.UpdateCommentContent)
|
||||
m.Post("/delete", repo.DeleteComment)
|
||||
})
|
||||
}, reqSignIn, context.RepoAssignment(true))
|
||||
m.Group("/:username/:reponame", func() {
|
||||
m.Group("/wiki", func() {
|
||||
m.Get("/?:page", repo.Wiki)
|
||||
m.Get("/_pages", repo.WikiPages)
|
||||
}, repo.MustEnableWiki, context.RepoRef())
|
||||
}, ignSignIn, context.RepoAssignment(false, true))
|
||||
|
||||
m.Group("/:username/:reponame", func() {
|
||||
// FIXME: should use different URLs but mostly same logic for comments of issue and pull reuqest.
|
||||
// So they can apply their own enable/disable logic on routers.
|
||||
m.Group("/issues", func() {
|
||||
m.Group("/:index", func() {
|
||||
m.Post("/label", repo.UpdateIssueLabel)
|
||||
m.Post("/milestone", repo.UpdateIssueMilestone)
|
||||
m.Post("/assignee", repo.UpdateIssueAssignee)
|
||||
}, reqRepoWriter)
|
||||
})
|
||||
m.Group("/labels", func() {
|
||||
m.Post("/new", bindIgnErr(form.CreateLabel{}), repo.NewLabel)
|
||||
m.Post("/edit", bindIgnErr(form.CreateLabel{}), repo.UpdateLabel)
|
||||
@@ -529,8 +517,8 @@ func runWeb(ctx *cli.Context) error {
|
||||
m.Post("/delete", repo.DeleteRelease)
|
||||
m.Get("/edit/*", repo.EditRelease)
|
||||
m.Post("/edit/*", bindIgnErr(form.EditRelease{}), repo.EditReleasePost)
|
||||
}, reqRepoWriter, func(ctx *context.Context) {
|
||||
ctx.Data["PageIsViewCode"] = true
|
||||
}, repo.MustBeNotBare, reqRepoWriter, func(ctx *context.Context) {
|
||||
ctx.Data["PageIsViewFiles"] = true
|
||||
})
|
||||
|
||||
// FIXME: Should use ctx.Repo.PullRequest to unify template, currently we have inconsistent URL
|
||||
@@ -560,35 +548,32 @@ func runWeb(ctx *cli.Context) error {
|
||||
return
|
||||
}
|
||||
})
|
||||
}, reqRepoWriter, context.RepoRef(), func(ctx *context.Context) {
|
||||
}, repo.MustBeNotBare, reqRepoWriter, context.RepoRef(), func(ctx *context.Context) {
|
||||
if !ctx.Repo.CanEnableEditor() {
|
||||
ctx.NotFound()
|
||||
return
|
||||
}
|
||||
|
||||
ctx.Data["PageIsViewFiles"] = true
|
||||
})
|
||||
}, reqSignIn, context.RepoAssignment(), repo.MustBeNotBare)
|
||||
}, reqSignIn, context.RepoAssignment())
|
||||
|
||||
m.Group("/:username/:reponame", func() {
|
||||
m.Group("", func() {
|
||||
m.Get("/releases", repo.Releases)
|
||||
m.Get("/^:type(issues|pulls)$", repo.RetrieveLabels, repo.Issues)
|
||||
m.Get("/^:type(issues|pulls)$/:index", repo.ViewIssue)
|
||||
m.Get("/labels/", repo.RetrieveLabels, repo.Labels)
|
||||
m.Get("/milestones", repo.Milestones)
|
||||
m.Get("/releases", repo.MustBeNotBare, repo.Releases)
|
||||
m.Get("/pulls", repo.RetrieveLabels, repo.Pulls)
|
||||
m.Get("/pulls/:index", repo.ViewPull)
|
||||
}, context.RepoRef())
|
||||
|
||||
m.Group("/branches", func() {
|
||||
m.Get("", repo.Branches)
|
||||
m.Get("/all", repo.AllBranches)
|
||||
m.Post("/delete/*", reqSignIn, reqRepoWriter, repo.DeleteBranchPost)
|
||||
}, func(ctx *context.Context) {
|
||||
ctx.Data["PageIsViewCode"] = true
|
||||
}, repo.MustBeNotBare, func(ctx *context.Context) {
|
||||
ctx.Data["PageIsViewFiles"] = true
|
||||
})
|
||||
|
||||
m.Group("/wiki", func() {
|
||||
m.Get("/?:page", repo.Wiki)
|
||||
m.Get("/_pages", repo.WikiPages)
|
||||
|
||||
m.Group("", func() {
|
||||
m.Combo("/_new").Get(repo.NewWiki).
|
||||
Post(bindIgnErr(form.NewWiki{}), repo.NewWikiPost)
|
||||
@@ -598,7 +583,7 @@ func runWeb(ctx *cli.Context) error {
|
||||
}, reqSignIn, reqRepoWriter)
|
||||
}, repo.MustEnableWiki, context.RepoRef())
|
||||
|
||||
m.Get("/archive/*", repo.Download)
|
||||
m.Get("/archive/*", repo.MustBeNotBare, repo.Download)
|
||||
|
||||
m.Group("/pulls/:index", func() {
|
||||
m.Get("/commits", context.RepoRef(), repo.ViewPullCommits)
|
||||
@@ -612,18 +597,18 @@ func runWeb(ctx *cli.Context) error {
|
||||
m.Get("/commits/*", repo.RefCommits)
|
||||
m.Get("/commit/:sha([a-f0-9]{7,40})$", repo.Diff)
|
||||
m.Get("/forks", repo.Forks)
|
||||
}, context.RepoRef())
|
||||
m.Get("/commit/:sha([a-f0-9]{7,40})\\.:ext(patch|diff)", repo.RawDiff)
|
||||
}, repo.MustBeNotBare, context.RepoRef())
|
||||
m.Get("/commit/:sha([a-f0-9]{7,40})\\.:ext(patch|diff)", repo.MustBeNotBare, repo.RawDiff)
|
||||
|
||||
m.Get("/compare/:before([a-z0-9]{40})\\.\\.\\.:after([a-z0-9]{40})", context.RepoRef(), repo.CompareDiff)
|
||||
}, ignSignIn, context.RepoAssignment(), repo.MustBeNotBare)
|
||||
m.Get("/compare/:before([a-z0-9]{40})\\.\\.\\.:after([a-z0-9]{40})", repo.MustBeNotBare, context.RepoRef(), repo.CompareDiff)
|
||||
}, ignSignIn, context.RepoAssignment())
|
||||
m.Group("/:username/:reponame", func() {
|
||||
m.Get("/stars", repo.Stars)
|
||||
m.Get("/watchers", repo.Watchers)
|
||||
}, ignSignIn, context.RepoAssignment(), context.RepoRef())
|
||||
|
||||
m.Group("/:username", func() {
|
||||
m.Get("/:reponame", ignSignIn, context.RepoAssignment(true), context.RepoRef(), repo.Home)
|
||||
m.Get("/:reponame", ignSignIn, context.RepoAssignment(), context.RepoRef(), repo.Home)
|
||||
|
||||
m.Group("/:reponame", func() {
|
||||
m.Head("/tasks/trigger", repo.TriggerTask)
|
||||
@@ -632,7 +617,7 @@ func runWeb(ctx *cli.Context) error {
|
||||
// Duplicated routes to enable different ways of accessing same set of URLs,
|
||||
// e.g. with or without ".git" suffix.
|
||||
m.Group("/:reponame([\\d\\w-_\\.]+\\.git$)", func() {
|
||||
m.Get("", ignSignIn, context.RepoAssignment(true), context.RepoRef(), repo.Home)
|
||||
m.Get("", ignSignIn, context.RepoAssignment(), context.RepoRef(), repo.Home)
|
||||
m.Route("/*", "GET,POST", ignSignInAndCsrf, repo.HTTPContexter(), repo.HTTP)
|
||||
})
|
||||
m.Route("/:reponame/*", "GET,POST", ignSignInAndCsrf, repo.HTTPContexter(), repo.HTTP)
|
||||
|
||||
25
conf/app.ini
25
conf/app.ini
@@ -93,6 +93,8 @@ ENABLE_LOCAL_PATH_MIGRATION = false
|
||||
; value depend of how many CPUs (cores) you have. If the value is set to zero
|
||||
; or under, GOGS will automatically detect the number of CPUs your system have
|
||||
COMMITS_FETCH_CONCURRENCY = 0
|
||||
; Enable render mode for raw file
|
||||
ENABLE_RAW_FILE_RENDER_MODE = false
|
||||
|
||||
[repository.editor]
|
||||
; List of file extensions that should have line wraps in the CodeMirror editor.
|
||||
@@ -182,6 +184,9 @@ COOKIE_REMEMBER_NAME = gogs_incredible
|
||||
COOKIE_SECURE = false
|
||||
; Reverse proxy authentication header name of user name
|
||||
REVERSE_PROXY_AUTHENTICATION_USER = X-WEBAUTH-USER
|
||||
; Enable to set cookie to indicate user login status
|
||||
ENABLE_LOGIN_STATUS_COOKIE = false
|
||||
LOGIN_STATUS_COOKIE_NAME = login_status
|
||||
|
||||
[service]
|
||||
ACTIVE_CODE_LIVE_MINUTES = 180
|
||||
@@ -266,8 +271,8 @@ COOKIE_NAME = i_like_gogits
|
||||
COOKIE_SECURE = false
|
||||
; Enable set cookie, default is true
|
||||
ENABLE_SET_COOKIE = true
|
||||
; Session GC time interval, default is 86400
|
||||
GC_INTERVAL_TIME = 86400
|
||||
; Session GC time interval, default is 3600
|
||||
GC_INTERVAL_TIME = 3600
|
||||
; Session life time, default is 86400
|
||||
SESSION_LIFE_TIME = 86400
|
||||
; Cookie name for CSRF
|
||||
@@ -343,6 +348,16 @@ LEVEL =
|
||||
; Webhook URL
|
||||
URL =
|
||||
|
||||
[log.xorm]
|
||||
; Enable file rotation
|
||||
ROTATE = true
|
||||
; Rotate every day
|
||||
ROTATE_DAILY = true
|
||||
; Rotate once file size excesses x MB
|
||||
MAX_SIZE = 100
|
||||
; Maximum days to keep logger files
|
||||
MAX_DAYS = 3
|
||||
|
||||
[cron]
|
||||
; Enable running cron tasks periodically.
|
||||
ENABLED = true
|
||||
@@ -429,10 +444,14 @@ ORG_PAGING_NUM = 50
|
||||
[ui.user]
|
||||
; Number of repos that are showed in one page
|
||||
REPO_PAGING_NUM = 15
|
||||
; Number of news feeds that are showed in one page
|
||||
NEWS_FEED_PAGING_NUM = 20
|
||||
; Number of commits that are showed in one page
|
||||
COMMITS_PAGING_NUM = 30
|
||||
|
||||
[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
|
||||
NAMES = English,简体中文,繁體中文(香港),繁體中文(台湾),Deutsch,Français,Nederlands,Latviešu,Русский,日本語,Español,Português do Brasil,Polski,български,Italiano,Suomalainen,Türkçe,čeština,Српски,Svenska,한국어,Galego,Українська
|
||||
NAMES = English,简体中文,繁體中文(香港),繁體中文(台湾),Deutsch,français,Nederlands,latviešu,русский,日本語,español,português do Brasil,polski,български,italiano,suomi,Türkçe,čeština,српски,svenska,한국어,galego,українська
|
||||
|
||||
; Used for datetimepicker
|
||||
[i18n.datelang]
|
||||
|
||||
@@ -42,6 +42,7 @@ Ilya Makarov
|
||||
Jamie Mansfield <dev AT jamierocks DOT uk>
|
||||
Javier Ortiz Bultron <javier DOT ortiz DOT 78 AT gmail DOT com>
|
||||
Jean THOMAS <contact AT tibounise DOT com>
|
||||
John Behm <jxsl13 AT googlemail DOT com>
|
||||
Jonas De Kegel <jonasgithub [AT] gmail [DOT] com>
|
||||
Joubert RedRat <me+github AT redrat DOT com DOT br>
|
||||
Juraj Bubniak <contact AT jbub DOT eu>
|
||||
|
||||
@@ -82,6 +82,8 @@ app_url=URL адрес на приложението
|
||||
app_url_helper=Този настройка променя HTTP/HTTPS адреса за клониране, а понякога и адреса на ел. поща.
|
||||
log_root_path=Път към журналите
|
||||
log_root_path_helper=Директория в която се записват журналите.
|
||||
enable_console_mode=Enable Console Mode
|
||||
enable_console_mode_popup=In addition to file mode, also print logs to console.
|
||||
|
||||
optional_title=Опционални настройки
|
||||
email_title=Настройки на пощенска услуга
|
||||
@@ -253,11 +255,10 @@ profile=Профил
|
||||
password=Парола
|
||||
avatar=Аватар
|
||||
ssh_keys=SSH ключове
|
||||
social=Социални профили
|
||||
applications=Приложения
|
||||
repos=Repositories
|
||||
orgs=Организации
|
||||
applications=Приложения
|
||||
delete=Изтрий профил
|
||||
uid=UID
|
||||
|
||||
public_profile=Публичен профил
|
||||
profile_desc=Вашият адрес на ел. поща е публичен и ще бъде използван за всички свързани с профила Ви уведомления и всички уеб базирани операции, направени чрез сайта.
|
||||
@@ -344,6 +345,11 @@ orgs.none=Не сте член на никоя организация.
|
||||
orgs.leave_title=Напусни организация
|
||||
orgs.leave_desc=Ще загубите достъп до всички хранилища и екипи, след като напуснете организацията. Желаете ли да продължите?
|
||||
|
||||
repos.leave=Leave
|
||||
repos.leave_title=Leave repository
|
||||
repos.leave_desc=You will lose access to the repository after you left. Do you want to continue?
|
||||
repos.leave_success=You have left repository '%s' successfully!
|
||||
|
||||
delete_account=Изтриване на собствения профил
|
||||
delete_prompt=Тази операция ще изтрие Вашия профил завинаги и тя <strong>НЕ МОЖЕ</strong> да бъде отменена в последствие!
|
||||
confirm_delete_account=Потвърди изтриването
|
||||
@@ -414,7 +420,7 @@ quick_guide=Бърз справочник
|
||||
clone_this_repo=Клонирай хранилището
|
||||
create_new_repo_command=Създай ново хранилище чрез командния ред
|
||||
push_exist_repo=Предай съществуващо хранилище през командния ред
|
||||
repo_is_empty=Това хранилище е празно. Моля проверете по-късно пак!
|
||||
bare_message=This repository does not have any content yet.
|
||||
|
||||
files=Файлове
|
||||
branch=Клон
|
||||
@@ -650,9 +656,11 @@ settings.collaboration.write=За писане
|
||||
settings.collaboration.read=За четене
|
||||
settings.collaboration.undefined=Недефинирано
|
||||
settings.branches=Branches
|
||||
settings.branches_bare=You cannot manage branches for bare repository. Please push some content first.
|
||||
settings.default_branch=Default Branch
|
||||
settings.default_branch_desc=The default branch is considered the "base" branch for code commits, pull requests and online editing.
|
||||
settings.update=Update
|
||||
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
|
||||
settings.update_default_branch_success=Default branch of this repository has been updated successfully!
|
||||
settings.protected_branches=Protected Branches
|
||||
settings.protected_branches_desc=Protect branches from force pushing, accidental deletion and whitelist code committers.
|
||||
@@ -682,11 +690,13 @@ settings.change_reponame_prompt=Тази промяна ще засегне вр
|
||||
settings.advanced_settings=Разширени настройки
|
||||
settings.wiki_desc=Включи система за уики
|
||||
settings.use_internal_wiki=Използвай вградено уики
|
||||
settings.allow_public_wiki_desc=Allow public access to wiki when repository is private
|
||||
settings.use_external_wiki=Използвай външно уики
|
||||
settings.external_wiki_url=URL адрес на външно уики
|
||||
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.use_external_issue_tracker=Използвай външна система за проследяване на задачи
|
||||
settings.external_tracker_url=URL адрес на външна система за проследяване на задачи
|
||||
settings.external_tracker_url_desc=Посетителите ще бъдат пренасочени към този URL адрес от връзката на раздела.
|
||||
@@ -740,6 +750,8 @@ settings.webhook_deletion_success=Уеб-куката е изтрита успе
|
||||
settings.webhook.test_delivery=Тестово изпращане
|
||||
settings.webhook.test_delivery_desc=Симулира тестово изпращане за тест на настройките на уеб-куката
|
||||
settings.webhook.test_delivery_success=Тестовата уеб-кука е добавена в опашката за изпращане. Може да отнеме няколко секунди преди да се появи в историята с доставени.
|
||||
settings.webhook.redelivery=Redelivery
|
||||
settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history.
|
||||
settings.webhook.request=Заявка
|
||||
settings.webhook.response=Отговор
|
||||
settings.webhook.headers=Заглавки
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -82,6 +82,8 @@ app_url=Anwendungs-URL
|
||||
app_url_helper=Dies hat Auswirkung auf die HTTP/HTTPS Klon-URLs und den Inhalt der E-Mails.
|
||||
log_root_path=Logdateipfad
|
||||
log_root_path_helper=Verzeichnis in das Logdateien geschrieben werden.
|
||||
enable_console_mode=Konsolen-Modus einschalten
|
||||
enable_console_mode_popup=Zusätzlich zum Datei-Modus, zeige Logs auch in der Konsole.
|
||||
|
||||
optional_title=Optionale Einstellungen
|
||||
email_title=E-Mail-Service Einstellungen
|
||||
@@ -201,7 +203,7 @@ Content=Inhalt
|
||||
require_error=` darf nicht leer sein.`
|
||||
alpha_dash_error=` kann ausschließlich alphanumerische Zeichen und "-_" enthalten.`
|
||||
alpha_dash_dot_error=` kann ausschließlich alphanumerische Zeichen und ".-_" enthalten.`
|
||||
alpha_dash_dot_slash_error=` must be valid alpha or numeric or dash(-_) or dot characters or slashes.`
|
||||
alpha_dash_dot_slash_error=` kann ausschließlich alphanumerische Zeichen und ".-_/" enthalten.`
|
||||
size_error=` muss die Größe %s haben.`
|
||||
min_size_error=` muss mindestens %s Zeichen enthalten.`
|
||||
max_size_error=` darf höchstens %s Zeichen enthalten.`
|
||||
@@ -253,11 +255,10 @@ profile=Profil
|
||||
password=Passwort
|
||||
avatar=Profilbild
|
||||
ssh_keys=SSH-Schlüssel
|
||||
social=Soziale Konten
|
||||
applications=Anwendungen
|
||||
repos=Repositories
|
||||
orgs=Organisationen
|
||||
applications=Anwendungen
|
||||
delete=Konto löschen
|
||||
uid=Uid
|
||||
|
||||
public_profile=Öffentliches Profil
|
||||
profile_desc=Ihre E-Mail-Adresse ist öffentlich einsehbar und dient dazu, Ihnen Benachrichtigungen bezüglich Ihres Kontos und Aktivitäten auf der Webseite zu schicken.
|
||||
@@ -344,6 +345,11 @@ orgs.none=Sie sind kein Mitglied einer Organisation.
|
||||
orgs.leave_title=Organisation verlassen
|
||||
orgs.leave_desc=Sie verlieren den Zugriff auf alle Repositories und Teams nach dem Verlassen der Organisation. Möchten Sie fortfahren?
|
||||
|
||||
repos.leave=Verlassen
|
||||
repos.leave_title=Repository verlassen
|
||||
repos.leave_desc=Der Zugriff zum Repository wird verloren gehen, nachdem diese verlassen wird. Möchten Sie fortfahren?
|
||||
repos.leave_success=Sie haben die Repository '%s' erfolgreich verlassen!
|
||||
|
||||
delete_account=Konto löschen
|
||||
delete_prompt=Diese Aktion wird Ihr Konto dauerhaft löschen und kann <strong>NICHT</strong> rückgängig gemacht werden!
|
||||
confirm_delete_account=Löschvorgang bestätigen
|
||||
@@ -392,7 +398,7 @@ migrate_type_helper=Dieses Repository wird ein <span class="text blue">Mirror</s
|
||||
migrate_repo=Repository migrieren
|
||||
migrate.clone_address=Adresse kopieren
|
||||
migrate.clone_address_desc=Dies kann eine HTTP/HTTPS/GIT-URL sein.
|
||||
migrate.clone_address_desc_import_local=Sie dürfen auch eine Repository vom lokalen Serverpfad migrieren.
|
||||
migrate.clone_address_desc_import_local=Sie dürfen auch ein Repository vom lokalen Serverpfad migrieren.
|
||||
migrate.permission_denied=Ihnen fehlen die Rechte zum Importieren lokaler Repositories.
|
||||
migrate.invalid_local_path=Der lokale Pfad ist ungültig, existiert nicht oder ist kein Ordner.
|
||||
migrate.failed=Fehler bei Migration: %v
|
||||
@@ -414,7 +420,7 @@ quick_guide=Kurzanleitung
|
||||
clone_this_repo=Dieses Repository klonen
|
||||
create_new_repo_command=Erstellen Sie ein neues Repository mittels der Kommandozeile
|
||||
push_exist_repo=Bestehendes Repository von der Kommandozeile pushen
|
||||
repo_is_empty=Dieses Repository ist leer. Bitte kommen Sie später wieder!
|
||||
bare_message=Diese Repository hat noch keinen Inhalt.
|
||||
|
||||
files=Dateien
|
||||
branch=Branch
|
||||
@@ -436,12 +442,12 @@ file_permalink=Permalink
|
||||
file_too_large=Diese Datei ist zu groß zum Anzeigen
|
||||
video_not_supported_in_browser=Ihr Browser unterstützt HTML5 Video-Tags nicht.
|
||||
|
||||
branches.overview=Overview
|
||||
branches.active_branches=Active Branches
|
||||
branches.stale_branches=Stale Branches
|
||||
branches.all=All Branches
|
||||
branches.updated_by=Updated %[1]s by %[2]s
|
||||
branches.change_default_branch=Change Default Branch
|
||||
branches.overview=Übersicht
|
||||
branches.active_branches=Aktive Branches
|
||||
branches.stale_branches=Alte Branches
|
||||
branches.all=Alle Branches
|
||||
branches.updated_by=Aktualisiert %[1]s von %[2]s
|
||||
branches.change_default_branch=Ändere Standard-Branch
|
||||
|
||||
editor.new_file=Neue Datei
|
||||
editor.upload_file=Datei hochladen
|
||||
@@ -650,9 +656,11 @@ settings.collaboration.write=Schreibrechte
|
||||
settings.collaboration.read=Leserechte
|
||||
settings.collaboration.undefined=Nicht definiert
|
||||
settings.branches=Branches
|
||||
settings.branches_bare=Branches leerer Repositories können nicht verwaltet werden. Bitte erst Datei(en) pushen.
|
||||
settings.default_branch=Standard-Branch
|
||||
settings.default_branch_desc=Der Standard-Branch gilt als Basis für Commits, Pull-Requests und Online-Bearbeitung.
|
||||
settings.update=Aktualisieren
|
||||
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
|
||||
settings.update_default_branch_success=Standard-Branch dieses Repositories wurde erfolgreich aktualisiert!
|
||||
settings.protected_branches=Protected Branches
|
||||
settings.protected_branches_desc=Schützt Branches vor forcierten Pushes und versehentlichem Löschen. Comitter können freigeschaltet werden.
|
||||
@@ -664,7 +672,7 @@ settings.protect_this_branch_desc=Verhindere forcierte Pushes sowie Löschungen.
|
||||
settings.protect_require_pull_request=Verlange Pull-Request an Stelle von direkten Pushes
|
||||
settings.protect_require_pull_request_desc=Aktivieren Sie diese Option, um direktes Pushen in diesen Branch zu verhindern. Commits müssen in einen anderen, ungeschützten Branch gepusht werden und dann per Pull-Request in diesen Branch überführt werden.
|
||||
settings.protect_whitelist_committers=Hinzufügen von Benutzern oder Teams zur Whitelist, die in diesen Branch pushen dürfen
|
||||
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_committers_desc=Fügt Benutzer oder Teams zur Push-Whitelist dieses Branches hinzu. Auf der Whitelist geführte Benutze können können ohne Prüfung von Pull-Requests pushen.
|
||||
settings.protect_whitelist_users=Benutzer, die in diesen Branch pushen können
|
||||
settings.protect_whitelist_search_users=Benutzer suchen
|
||||
settings.protect_whitelist_teams=Teams, deren Mitglieder in diesen Branch pushen können
|
||||
@@ -682,11 +690,13 @@ settings.change_reponame_prompt=Diese Änderung wirkt sich darauf aus, wie sich
|
||||
settings.advanced_settings=Erweiterte Einstellungen
|
||||
settings.wiki_desc=Wiki einschalten
|
||||
settings.use_internal_wiki=Eingebautes Wiki verwenden
|
||||
settings.allow_public_wiki_desc=Erlaube öffentlichen Zugang zum Wiki, auch wenn die Repository privat ist.
|
||||
settings.use_external_wiki=Externes Wiki verwenden
|
||||
settings.external_wiki_url=Externe Wiki URL
|
||||
settings.external_wiki_url_desc=Besucher werden auf diese URL umgeleitet, wenn sie auf den Tab klicken.
|
||||
settings.issues_desc=Issue-Tracker einschalten
|
||||
settings.use_internal_issue_tracker=Eingebauten Issue-Tracker verwenden
|
||||
settings.allow_public_issues_desc=Erlaube öffentlichen Zugriff auf Issues, auch wenn die Repository privat ist.
|
||||
settings.use_external_issue_tracker=Externes Issue-System verwenden
|
||||
settings.external_tracker_url=URL eines externen Issue Trackers
|
||||
settings.external_tracker_url_desc=Besucher werden auf diese URL umgeleitet, wenn sie auf den Tab klicken.
|
||||
@@ -740,6 +750,8 @@ settings.webhook_deletion_success=Webhook wurde erfolgreich entfernt!
|
||||
settings.webhook.test_delivery=Senden testen
|
||||
settings.webhook.test_delivery_desc=Sendet ein simuliertes Push-Ereignis, um die Webhook-Einstellungen zu testen
|
||||
settings.webhook.test_delivery_success=Test-Webhook wurde zur Auslieferungswarteschlange hinzugefügt. Es kann einige Sekunden dauern, bevor es in der Auslieferungshistorie erscheint.
|
||||
settings.webhook.redelivery=Erneuter Versand
|
||||
settings.webhook.redelivery_success=Hook-Task '%s' wurde wieder zur Auslieferungswarteschlange hinzugefügt. Es kann einige Sekunden, bis sich der Auslieferungsstatus in der History aktualisiert hat.
|
||||
settings.webhook.request=Anfrage
|
||||
settings.webhook.response=Antwort
|
||||
settings.webhook.headers=Kopfzeilen
|
||||
@@ -764,20 +776,20 @@ settings.event_send_everything=Ich brauche <strong>alles</strong>.
|
||||
settings.event_choose=Lass mich auswählen, was ich brauche.
|
||||
settings.event_create=Erstellen
|
||||
settings.event_create_desc=Branch/Tag erstellt
|
||||
settings.event_delete=Delete
|
||||
settings.event_delete_desc=Branch or tag deleted
|
||||
settings.event_delete=Löschen
|
||||
settings.event_delete_desc=Branch/Tag gelöscht
|
||||
settings.event_fork=Fork
|
||||
settings.event_fork_desc=Repository forked
|
||||
settings.event_fork_desc=Repository geforkt
|
||||
settings.event_push=Push
|
||||
settings.event_push_desc=Git push auf ein Repository
|
||||
settings.event_issues=Issues
|
||||
settings.event_issues_desc=Issue opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, or demilestoned.
|
||||
settings.event_issue_comment=Issue Comment
|
||||
settings.event_issue_comment_desc=Issue comment created, edited, or deleted.
|
||||
settings.event_issues_desc=Issue geöffnet, geschlossen, wieder geöffnet, bearbeitet, zugewiesen, nicht zugewiesen, Label aktualisiert, Label gelöscht, einem Meilenstein zugewiesen oder davon entfernt.
|
||||
settings.event_issue_comment=Issue-Kommentar
|
||||
settings.event_issue_comment_desc=Issue-Kommentar angelegt, geändert oder gelöscht.
|
||||
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_pull_request_desc=Pull-Request geöffnet, geschlossen, wieder geöffnet, bearbeitet, zugewiesen, nicht zugewiesen, Label aktualisiert, Label gelöscht, einem Meilenstein zugewiesen, davon entfernt oder synchronisiert.
|
||||
settings.event_release=Release
|
||||
settings.event_release_desc=Release published in a repository.
|
||||
settings.event_release_desc=Release in Repository veröffentlicht.
|
||||
settings.active=Aktiv
|
||||
settings.active_helper=Details über das auslösende Ereignis des Webhooks werden ebenfalls mit gesendet
|
||||
settings.add_hook_success=Webhook hinzugefügt
|
||||
@@ -1037,7 +1049,7 @@ repos.private=Privat
|
||||
repos.watches=Beobachtungen
|
||||
repos.stars=Favoriten
|
||||
repos.issues=Issues
|
||||
repos.size=Size
|
||||
repos.size=Größe
|
||||
|
||||
auths.auth_manage_panel=Authentifizierung
|
||||
auths.new=Neue Quelle hinzufügen
|
||||
@@ -1195,8 +1207,8 @@ config.git_pull_timeout=Zeitlimit für Pull
|
||||
config.git_gc_timeout=Zeitlimit für GC
|
||||
|
||||
config.log_config=Konfiguration des Loggings
|
||||
config.log_mode=Mode
|
||||
config.log_options=Options
|
||||
config.log_mode=Modus
|
||||
config.log_options=Optionen
|
||||
|
||||
monitor.cron=Cron-Tasks
|
||||
monitor.name=Name
|
||||
@@ -1225,7 +1237,7 @@ notices.delete_success=Systemmitteilungen wurden erfolgreich gelöscht.
|
||||
|
||||
[action]
|
||||
create_repo=hat das Repository <a href="%s">%s</a> erstellt
|
||||
fork_repo=forked a repository to <a href="%s">%s</a>
|
||||
fork_repo=hat das Repository nach <a href="%s">%s</a> geforkt
|
||||
rename_repo=hat das Repository von <code>%[1]s</code> zu <a href="%[2]s">%[3]s</a> umbenannt
|
||||
commit_repo=hat auf <a href="%[1]s/src/%[2]s">%[3]s</a> in <a href="%[1]s">%[4]s</a> gepusht
|
||||
compare_commits=Zeige Vergleich für diese %d Commits
|
||||
@@ -1238,10 +1250,10 @@ create_pull_request=`hat Pull-Request <a href="%s/pulls/%s">%s#%[2]s</a> erstell
|
||||
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`
|
||||
create_branch=created new branch <a href="%[1]s/src/%[2]s">%[3]s</a> at <a href="%[1]s">%[4]s</a>
|
||||
delete_branch=deleted branch <code>%[2]s</code> at <a href="%[1]s">%[3]s</a>
|
||||
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=deleted tag <code>%[2]s</code> at <a href="%[1]s">%[3]s</a>
|
||||
delete_tag=hat Tag <code>%[2]s</code> in <a href="%[1]s">%[3]s</a> gelöscht
|
||||
|
||||
[tool]
|
||||
ago=vor
|
||||
|
||||
@@ -82,6 +82,8 @@ app_url = Application URL
|
||||
app_url_helper = This affects HTTP/HTTPS clone URL and somewhere in email.
|
||||
log_root_path = Log Path
|
||||
log_root_path_helper = Directory to write log files to.
|
||||
enable_console_mode = Enable Console Mode
|
||||
enable_console_mode_popup = In addition to file mode, also print logs to console.
|
||||
|
||||
optional_title = Optional Settings
|
||||
email_title = Email Service Settings
|
||||
@@ -253,11 +255,10 @@ profile = Profile
|
||||
password = Password
|
||||
avatar = Avatar
|
||||
ssh_keys = SSH Keys
|
||||
social = Social Accounts
|
||||
applications = Applications
|
||||
repos = Repositories
|
||||
orgs = Organizations
|
||||
applications = Applications
|
||||
delete = Delete Account
|
||||
uid = Uid
|
||||
|
||||
public_profile = Public Profile
|
||||
profile_desc = Your email address is public and will be used for any account related notifications, and any web based operations made via the site.
|
||||
@@ -341,9 +342,14 @@ access_token_deletion_desc = Delete this personal access token will remove all r
|
||||
delete_token_success = Personal access token has been removed successfully! Don't forget to update your application as well.
|
||||
|
||||
orgs.none = You are not a member of any organizations.
|
||||
orgs.leave_title = Leave an organization
|
||||
orgs.leave_title = Leave organization
|
||||
orgs.leave_desc = You will lose access to all repositories and teams after you left the organization. Do you want to continue?
|
||||
|
||||
repos.leave = Leave
|
||||
repos.leave_title = Leave repository
|
||||
repos.leave_desc = You will lose access to the repository after you left. Do you want to continue?
|
||||
repos.leave_success = You have left repository '%s' successfully!
|
||||
|
||||
delete_account = Delete Your Account
|
||||
delete_prompt = The operation will delete your account permanently, and <strong>CANNOT</strong> be undone!
|
||||
confirm_delete_account = Confirm Deletion
|
||||
@@ -414,7 +420,7 @@ quick_guide = Quick Guide
|
||||
clone_this_repo = Clone this repository
|
||||
create_new_repo_command = Create a new repository on the command line
|
||||
push_exist_repo = Push an existing repository from the command line
|
||||
repo_is_empty = This repository is empty, please come back later!
|
||||
bare_message = This repository does not have any content yet.
|
||||
|
||||
files = Files
|
||||
branch = Branch
|
||||
@@ -650,9 +656,11 @@ settings.collaboration.write = Write
|
||||
settings.collaboration.read = Read
|
||||
settings.collaboration.undefined = Undefined
|
||||
settings.branches = Branches
|
||||
settings.branches_bare = You cannot manage branches for bare repository. Please push some content first.
|
||||
settings.default_branch = Default Branch
|
||||
settings.default_branch_desc = The default branch is considered the "base" branch for code commits, pull requests and online editing.
|
||||
settings.update = Update
|
||||
settings.update_default_branch_unsupported = Change default branch is not supported by the Git version on server.
|
||||
settings.update_default_branch_success = Default branch of this repository has been updated successfully!
|
||||
settings.protected_branches = Protected Branches
|
||||
settings.protected_branches_desc = Protect branches from force pushing, accidental deletion and whitelist code committers.
|
||||
@@ -682,11 +690,13 @@ settings.change_reponame_prompt = This change will affect how links relate to th
|
||||
settings.advanced_settings = Advanced Settings
|
||||
settings.wiki_desc = Enable wiki system
|
||||
settings.use_internal_wiki = Use builtin wiki
|
||||
settings.allow_public_wiki_desc = Allow public access to wiki when repository is private
|
||||
settings.use_external_wiki = Use external wiki
|
||||
settings.external_wiki_url = External Wiki URL
|
||||
settings.external_wiki_url_desc = Visitors will be redirected to URL when they click on the tab.
|
||||
settings.issues_desc = Enable issue tracker
|
||||
settings.use_internal_issue_tracker = Use builtin lightweight issue tracker
|
||||
settings.allow_public_issues_desc = Allow public access to issues when repository is private
|
||||
settings.use_external_issue_tracker = Use external issue tracker
|
||||
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.
|
||||
@@ -740,6 +750,8 @@ settings.webhook_deletion_success = Webhook has been deleted successfully!
|
||||
settings.webhook.test_delivery = Test Delivery
|
||||
settings.webhook.test_delivery_desc = Send a fake push event delivery to test your webhook settings
|
||||
settings.webhook.test_delivery_success = Test webhook has been added to delivery queue. It may take few seconds before it shows up in the delivery history.
|
||||
settings.webhook.redelivery = Redelivery
|
||||
settings.webhook.redelivery_success = Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history.
|
||||
settings.webhook.request = Request
|
||||
settings.webhook.response = Response
|
||||
settings.webhook.headers = Headers
|
||||
|
||||
@@ -75,13 +75,15 @@ domain_helper=Esto afecta a las URLs para clonar por SSH.
|
||||
ssh_port=Puerto SSH
|
||||
ssh_port_helper=Número de puerto de su servidor SSH, déjelo en blanco para desactivar SSH.
|
||||
use_builtin_ssh_server=Usar Builtin SSH Server
|
||||
use_builtin_ssh_server_popup=Start builtin SSH server for Git operations to distinguish from system SSH daemon.
|
||||
use_builtin_ssh_server_popup=Iniciar servidor SSH integrado para operaciones con Git para distinguirlo del demonio SSH del sistema.
|
||||
http_port=Puerto HTTP
|
||||
http_port_helper=Puerto en el que escuchará la aplicación.
|
||||
app_url=URL de la aplicación
|
||||
app_url_helper=Esto afecta a las URLs para clonar por HTTP/HTTPS y a algunos correos electrónicos.
|
||||
log_root_path=Ruta del registro
|
||||
log_root_path_helper=Directorio donde almacenar los registros.
|
||||
enable_console_mode=Activar Modo Consola
|
||||
enable_console_mode_popup=Además del modo archivo, también imprime los registros en consola.
|
||||
|
||||
optional_title=Configuración opcional
|
||||
email_title=Configuración del servicio de correo
|
||||
@@ -201,7 +203,7 @@ Content=Contenido
|
||||
require_error=` no puede estar vacío.`
|
||||
alpha_dash_error=` los caracteres deben ser Alfanumericos o dash(-_).`
|
||||
alpha_dash_dot_error=` debe ser un caracter alfanumérivo válido, un guión alto o bajo (-_) o un signo de puntuación.`
|
||||
alpha_dash_dot_slash_error=` must be valid alpha or numeric or dash(-_) or dot characters or slashes.`
|
||||
alpha_dash_dot_slash_error=` deben ser caracteres alfanuméricos, guiones(-_), puntos o barras.`
|
||||
size_error=` debe ser de tamaño %s.`
|
||||
min_size_error=` debe contener al menos %s caracteres.`
|
||||
max_size_error=` debe contener como máximo %s caracteres.`
|
||||
@@ -253,11 +255,10 @@ profile=Perfil
|
||||
password=Contraseña
|
||||
avatar=Avatar
|
||||
ssh_keys=Claves SSH
|
||||
social=Redes Sociales
|
||||
applications=Aplicaciones
|
||||
repos=Repositorios
|
||||
orgs=Organizaciones
|
||||
applications=Aplicaciones
|
||||
delete=Eliminar cuenta
|
||||
uid=UUID
|
||||
|
||||
public_profile=Perfil público
|
||||
profile_desc=Tu correo electrónico es público y será usado para todas las notificaciones relacionadas con cualquier cuenta y cualquier operación hecha a través de la web.
|
||||
@@ -344,6 +345,11 @@ orgs.none=No eres un miembro de ninguna organización.
|
||||
orgs.leave_title=Salir de una organización
|
||||
orgs.leave_desc=Perderá el acceso a todos los repositorios y equipos después dejar la organización. ¿Desea continuar?
|
||||
|
||||
repos.leave=Salir
|
||||
repos.leave_title=Dejar repositorio
|
||||
repos.leave_desc=Perderás acceso al repositorio cuando salgas. ¿Quieres continuar?
|
||||
repos.leave_success=¡Has dejado el repositorio '%s' con éxito!
|
||||
|
||||
delete_account=Elimina tu cuenta
|
||||
delete_prompt=La operación eliminará tu cuenta de forma permanente y ¡<strong>NO</strong> se puede deshacer!
|
||||
confirm_delete_account=Confirmar Eliminación
|
||||
@@ -414,7 +420,7 @@ quick_guide=Guía Rápida
|
||||
clone_this_repo=Clonar este repositorio
|
||||
create_new_repo_command=Crear un nuevo repositorio desde línea de comandos
|
||||
push_exist_repo=Hacer Push de un repositorio existente desde línea de comandos
|
||||
repo_is_empty=Este repositorio está vacío, por favor, ¡vuelva más tarde!
|
||||
bare_message=Este repositorio aun no tiene contenido alguno.
|
||||
|
||||
files=Archivos
|
||||
branch=Rama
|
||||
@@ -427,7 +433,7 @@ pulls=Pull Requests
|
||||
labels=Etiquetas
|
||||
milestones=Milestones
|
||||
commits=Commits
|
||||
git_branches=Branches
|
||||
git_branches=Ramas
|
||||
releases=Releases
|
||||
file_raw=Raw
|
||||
file_history=Histórico
|
||||
@@ -436,12 +442,12 @@ file_permalink=Permalink
|
||||
file_too_large=Este archivo es demasiado grande para ser mostrado
|
||||
video_not_supported_in_browser=Su navegador no soporta el tag video de HTML5.
|
||||
|
||||
branches.overview=Overview
|
||||
branches.active_branches=Active Branches
|
||||
branches.stale_branches=Stale Branches
|
||||
branches.all=All Branches
|
||||
branches.updated_by=Updated %[1]s by %[2]s
|
||||
branches.change_default_branch=Change Default Branch
|
||||
branches.overview=Resumen
|
||||
branches.active_branches=Ramas activas
|
||||
branches.stale_branches=Ramas Viejas
|
||||
branches.all=Todas las Ramas
|
||||
branches.updated_by=%[1]s actualizado por %[2]s
|
||||
branches.change_default_branch=Cambiar la Rama por Defecto
|
||||
|
||||
editor.new_file=Nuevo archivo
|
||||
editor.upload_file=Subir archivo
|
||||
@@ -482,7 +488,7 @@ 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'
|
||||
|
||||
commits.commit_history=Commit History
|
||||
commits.commit_history=Historial de Commits
|
||||
commits.commits=Commits
|
||||
commits.search=Buscar commits
|
||||
commits.find=Buscar
|
||||
@@ -650,9 +656,11 @@ settings.collaboration.write=Escritura
|
||||
settings.collaboration.read=Lectura
|
||||
settings.collaboration.undefined=Indefinido
|
||||
settings.branches=Ramas
|
||||
settings.branches_bare=No puedes gestionar ramas en un repositorio vacío. Por favor sube algún contenido primero.
|
||||
settings.default_branch=Rama predeterminada
|
||||
settings.default_branch_desc=Se considera la rama «base» como la rama por defecto para commits de código, las solicitudes pull y edición en línea.
|
||||
settings.update=Actualizar
|
||||
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
|
||||
settings.update_default_branch_success=¡La Rama por defecto de este repositorio ha sido actualizado con éxito!
|
||||
settings.protected_branches=Ramas protegidas
|
||||
settings.protected_branches_desc=Proteger ramas force pushing, de eliminación accidental y lista blanca de committers de código.
|
||||
@@ -664,11 +672,11 @@ settings.protect_this_branch_desc=Desactivar force pushes y evite la eliminació
|
||||
settings.protect_require_pull_request=Requiere una solicitud pull, en lugar de un push directo
|
||||
settings.protect_require_pull_request_desc=Active esta opción para deshabilitar un push directo a esta rama. Los commits tienen que ser empujados a otra rama no protegida y fusionados a esta rama a través de la solicitud pull.
|
||||
settings.protect_whitelist_committers=Lista blanca de quienes pueden empujar a esta rama
|
||||
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_teams=Teams for which members of them can push to this branch
|
||||
settings.protect_whitelist_search_teams=Search teams
|
||||
settings.protect_whitelist_committers_desc=Añadir personas o equipos a la lista blanca de push directo a esta rama. Los usuarios en esta lista se saltan la comprobación de pull request.
|
||||
settings.protect_whitelist_users=Usuarios que pueden hacer push a esta rama
|
||||
settings.protect_whitelist_search_users=Buscar usuarios
|
||||
settings.protect_whitelist_teams=Equipos cuyos miembros pueden hacer push a esta rama
|
||||
settings.protect_whitelist_search_teams=Buscar equipos
|
||||
settings.update_protect_branch_success=Protect options for this branch has been updated successfully!
|
||||
settings.hooks=Webhooks
|
||||
settings.githooks=Git Hooks
|
||||
@@ -682,11 +690,13 @@ settings.change_reponame_prompt=Este cambio afectará a los enlaces al repositor
|
||||
settings.advanced_settings=Ajustes avanzados
|
||||
settings.wiki_desc=Activar sistema de wiki
|
||||
settings.use_internal_wiki=Usar wiki integrada
|
||||
settings.allow_public_wiki_desc=Allow public access to wiki when repository is private
|
||||
settings.use_external_wiki=Usar Wiki externa
|
||||
settings.external_wiki_url=URL externa de la Wiki
|
||||
settings.external_wiki_url_desc=Los visitantes serán redireccionados a la URL cuando hagan click en la barra.
|
||||
settings.issues_desc=Habilitar rastreo de incidencias
|
||||
settings.use_internal_issue_tracker=Usar rastreo de incidencias ligero incluido
|
||||
settings.allow_public_issues_desc=Permitir acceso público a las incidencias cuando el repositorio es privado
|
||||
settings.use_external_issue_tracker=Usar tracker externo de incidencias
|
||||
settings.external_tracker_url=URL de seguimiento de problemas externos
|
||||
settings.external_tracker_url_desc=Los visitantes serán redirigidos a la URL cuando hagan click en la barra.
|
||||
@@ -740,6 +750,8 @@ settings.webhook_deletion_success=¡Webhook eliminado con éxito!
|
||||
settings.webhook.test_delivery=Test de entrega
|
||||
settings.webhook.test_delivery_desc=Enviar un falso evento Push de entrega para probar tus ajustes de webhook
|
||||
settings.webhook.test_delivery_success=Probar que los webhook han sido añadidos a la cola de entrega. Esto puede tomar algunos segundos antes de aparecer en el historial de entregas.
|
||||
settings.webhook.redelivery=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.request=Petición
|
||||
settings.webhook.response=Respuesta
|
||||
settings.webhook.headers=Encabezado
|
||||
@@ -764,20 +776,20 @@ settings.event_send_everything=Necesito <strong>todo</strong>.
|
||||
settings.event_choose=Déjeme elegir lo que necesito.
|
||||
settings.event_create=Crear
|
||||
settings.event_create_desc=Rama o etiqueta creada
|
||||
settings.event_delete=Delete
|
||||
settings.event_delete_desc=Branch or tag deleted
|
||||
settings.event_delete=Borrar
|
||||
settings.event_delete_desc=Rama o etiqueta borrada
|
||||
settings.event_fork=Fork
|
||||
settings.event_fork_desc=Repository forked
|
||||
settings.event_push=Push
|
||||
settings.event_push_desc=Git push a un repositorio
|
||||
settings.event_issues=Issues
|
||||
settings.event_issues_desc=Issue opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, or demilestoned.
|
||||
settings.event_issue_comment=Issue Comment
|
||||
settings.event_issue_comment_desc=Issue comment created, edited, or deleted.
|
||||
settings.event_issues=Incidencias
|
||||
settings.event_issues_desc=Incidencia abierta, cerrada, reabierta, editada, asignada, desasignada, etiqueta actualizada, etiqueta limpiada, hito marcado, o desmarcado,.
|
||||
settings.event_issue_comment=Comentario de incidencia
|
||||
settings.event_issue_comment_desc=Comentario de incidencias creado, editado o borrado.
|
||||
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_release=Release
|
||||
settings.event_release_desc=Release published in a repository.
|
||||
settings.event_pull_request_desc=Pull request abierto, cerrado, reabierto, editado, asignado, desasignado, etiqueta actualizada, etiqueta limpiada, hito marcado, hito desmarcado, o sincronizado.
|
||||
settings.event_release=Lanzamiento
|
||||
settings.event_release_desc=Lanzamiento publicado en un repositorio.
|
||||
settings.active=Activo
|
||||
settings.active_helper=Enviaremos detalles del evento cuando este hook se dispare.
|
||||
settings.add_hook_success=Se ha añadido un nuevo webhook.
|
||||
@@ -1037,7 +1049,7 @@ repos.private=Privado
|
||||
repos.watches=Vigilantes
|
||||
repos.stars=Estrellas
|
||||
repos.issues=Incidencias
|
||||
repos.size=Size
|
||||
repos.size=Tamaño
|
||||
|
||||
auths.auth_manage_panel=Panel de administración de autenticación
|
||||
auths.new=Añadir nuevo origen
|
||||
@@ -1116,9 +1128,9 @@ config.ssh_minimum_key_sizes=Tamaños de clave mínimos
|
||||
config.repo_config=Configuración del repositorio
|
||||
config.repo_root_path=Ruta del Repositorio
|
||||
config.script_type=Tipo de Script
|
||||
config.repo_force_private=Force Private
|
||||
config.repo_force_private=Forzar Privado
|
||||
config.max_creation_limit=Limite máximo de creación
|
||||
config.preferred_licenses=Preferred Licenses
|
||||
config.preferred_licenses=Licencias Preferidas
|
||||
config.disable_http_git=Desactivar HTTP Git
|
||||
config.enable_local_path_migration=Activar la migración de la ruta de acceso Local
|
||||
config.commits_fetch_concurrency=Commits Fetch Concurrency
|
||||
@@ -1195,8 +1207,8 @@ config.git_pull_timeout=Tiempo de espera de operación de pull
|
||||
config.git_gc_timeout=Tiempo de espera de operación de GC
|
||||
|
||||
config.log_config=Configuración del Log
|
||||
config.log_mode=Mode
|
||||
config.log_options=Options
|
||||
config.log_mode=Modo
|
||||
config.log_options=Opciones
|
||||
|
||||
monitor.cron=Tareas de Cron
|
||||
monitor.name=Nombre
|
||||
@@ -1238,10 +1250,10 @@ 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>`
|
||||
create_branch=created new branch <a href="%[1]s/src/%[2]s">%[3]s</a> at <a href="%[1]s">%[4]s</a>
|
||||
delete_branch=deleted branch <code>%[2]s</code> at <a href="%[1]s">%[3]s</a>
|
||||
create_branch=nueva rama <a href="%[1]s/src/%[2]s">%[3]s</a> creada en <a href="%[1]s">%[4]s</a>
|
||||
delete_branch=borrada rama <code>%[2]s</code> at <a href="%[1]s">%[3]s</a>
|
||||
push_tag=hizo push del tag <a href="%s/src/%s">%[2]s</a> a <a href="%[1]s">%[3]s</a>
|
||||
delete_tag=deleted tag <code>%[2]s</code> at <a href="%[1]s">%[3]s</a>
|
||||
delete_tag=borrada etiqueta <code>%[2]s</code> en <a href="%[1]s">%[3]s</a>
|
||||
|
||||
[tool]
|
||||
ago=hace
|
||||
|
||||
@@ -64,7 +64,7 @@ no_admin_and_disable_registration=Et voi poistaa käytöstä rekisteröintiä lu
|
||||
err_empty_admin_password=Ylläpito salasana ei voi olla tyhjä.
|
||||
|
||||
general_title=Sovellus yleiset asetukset
|
||||
app_name=Sovellus nimi
|
||||
app_name=Sovelluksen nimi
|
||||
app_name_helper=Laita organisaatiosi nimi tähän isolla ja kovaäänisesti!
|
||||
repo_path=Repon juuren polku
|
||||
repo_path_helper=Kaikki Git etä repot tullaan tallentamaan tähän hakemistoon.
|
||||
@@ -82,6 +82,8 @@ app_url=Sovellus URL
|
||||
app_url_helper=Tämä vaikuttaa HTTP/HTTPS klooni URLeihin ja joihinkin sähköposteihin.
|
||||
log_root_path=Lokin polku
|
||||
log_root_path_helper=Lokien tallennushakemisto.
|
||||
enable_console_mode=Enable Console Mode
|
||||
enable_console_mode_popup=In addition to file mode, also print logs to console.
|
||||
|
||||
optional_title=Valinnaiset asetukset
|
||||
email_title=Sähköposti palvelu asetukset
|
||||
@@ -253,11 +255,10 @@ profile=Profiili
|
||||
password=Salasana
|
||||
avatar=Profiilikuva
|
||||
ssh_keys=SSH avaimet
|
||||
social=Sosiaaliset tilit
|
||||
applications=Sovellukset
|
||||
repos=Repositories
|
||||
orgs=Organisaatiot
|
||||
applications=Sovellukset
|
||||
delete=Poista tili
|
||||
uid=Käyttäjä ID
|
||||
|
||||
public_profile=Julkinen profiili
|
||||
profile_desc=Sähköposti osoitteesi on julkinen ja käytetään tiliin liittyviin ilmoituksiin, ja nettipohjaisiin toimintoihin joita on tehty sivujen kautta.
|
||||
@@ -344,6 +345,11 @@ orgs.none=Et ole yhdenkään organisaation jäsen.
|
||||
orgs.leave_title=Poistu organisaatiosta
|
||||
orgs.leave_desc=Menetät oikeudet kaikkiin niihin repoihin ja tiimeihin joihin organisaatio on sinulle oikeudet antanut. Haluatko varmasti jatkaa?
|
||||
|
||||
repos.leave=Leave
|
||||
repos.leave_title=Leave repository
|
||||
repos.leave_desc=You will lose access to the repository after you left. Do you want to continue?
|
||||
repos.leave_success=You have left repository '%s' successfully!
|
||||
|
||||
delete_account=Poista tilisi
|
||||
delete_prompt=Toiminto poistaa tilisi pysyvästi ja tätä <strong>EI VOI</strong> peruuttaa myöhemmin!
|
||||
confirm_delete_account=Varmista poisto
|
||||
@@ -414,7 +420,7 @@ quick_guide=Pikaopas
|
||||
clone_this_repo=Kloonaa tämä repo
|
||||
create_new_repo_command=Luo uusi repo komentoriviltä
|
||||
push_exist_repo=Työnnä olemassaoleva repo komentoriviltä
|
||||
repo_is_empty=Tämä repo on tyhjä, ole hyvä ja tule takaisin myöhemmin!
|
||||
bare_message=This repository does not have any content yet.
|
||||
|
||||
files=Tiedostot
|
||||
branch=Branch
|
||||
@@ -650,9 +656,11 @@ settings.collaboration.write=Kirjoita
|
||||
settings.collaboration.read=Lue
|
||||
settings.collaboration.undefined=Määrittelemätön
|
||||
settings.branches=Haarat
|
||||
settings.branches_bare=You cannot manage branches for bare repository. Please push some content first.
|
||||
settings.default_branch=Oletushaara
|
||||
settings.default_branch_desc=Oletushaaraa käytetään "pohjahaarana" commiteille, pull-pyynnöille ja sivustolla toteutetuille muokkauksille.
|
||||
settings.update=Päivitä
|
||||
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
|
||||
settings.update_default_branch_success=Repositoryn oletushaara päivitetty!
|
||||
settings.protected_branches=Suojatut haarat
|
||||
settings.protected_branches_desc=Suojaa haaroja pakotetulta push-operaatiolta, vahinkopoistamisilta ja sallitun listan committereilta.
|
||||
@@ -682,11 +690,13 @@ settings.change_reponame_prompt=Tämä muutos vaikuttaa siihen miten linkit liit
|
||||
settings.advanced_settings=Lisäasetukset
|
||||
settings.wiki_desc=Ota wiki käyttöön
|
||||
settings.use_internal_wiki=Käytä sisäänrakennettua wikiä
|
||||
settings.allow_public_wiki_desc=Allow public access to wiki when repository is private
|
||||
settings.use_external_wiki=Käytä ulkoista wikiä
|
||||
settings.external_wiki_url=Ulkoinen Wiki URL
|
||||
settings.external_wiki_url_desc=Vierailijat uudelleenohjataan URL-osoitteeseen kun he klikkaavat välilehteä.
|
||||
settings.issues_desc=Ota virheenseuranta käyttöön
|
||||
settings.use_internal_issue_tracker=Käytä sisäänrakennettua kevyttä virheenseurantaa
|
||||
settings.allow_public_issues_desc=Allow public access to issues when repository is private
|
||||
settings.use_external_issue_tracker=Käytä ulkoista vikaseurantaa
|
||||
settings.external_tracker_url=Ulkoisen virheenseurannan URL
|
||||
settings.external_tracker_url_desc=Vierailijat ohjataan URL-osoitteeseen kun he klikkaavat välilehteä.
|
||||
@@ -740,6 +750,8 @@ settings.webhook_deletion_success=Webkoukku on poistettu onnistuneesti!
|
||||
settings.webhook.test_delivery=Testitoimitus
|
||||
settings.webhook.test_delivery_desc=Lähetä väärennetty push toimitusjakelu testataksesi webkoukku asetuksia
|
||||
settings.webhook.test_delivery_success=Testi webkoukku on lisätty toimitusjonoon. Muutama sekunti voi mennä ennenkuin se näkyy toimitushistoriassa.
|
||||
settings.webhook.redelivery=Redelivery
|
||||
settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history.
|
||||
settings.webhook.request=Pyyntö
|
||||
settings.webhook.response=Vastaus
|
||||
settings.webhook.headers=Otsikot
|
||||
|
||||
@@ -82,6 +82,8 @@ app_url=URL de l'application
|
||||
app_url_helper=Cela affecte les doublons d'URL HTTP/HTTPS et le contenu d'e-mail.
|
||||
log_root_path=Chemin des fichiers log
|
||||
log_root_path_helper=Répertoire d'écriture des fichiers de log.
|
||||
enable_console_mode=Enable Console Mode
|
||||
enable_console_mode_popup=In addition to file mode, also print logs to console.
|
||||
|
||||
optional_title=Paramètres facultatifs
|
||||
email_title=Paramètres du service de messagerie
|
||||
@@ -253,11 +255,10 @@ profile=Profil
|
||||
password=Mot de Passe
|
||||
avatar=Avatar
|
||||
ssh_keys=Clés SSH
|
||||
social=Réseaux Sociaux
|
||||
applications=Applications
|
||||
repos=Repositories
|
||||
orgs=Organisations
|
||||
applications=Applications
|
||||
delete=Supprimer le compte
|
||||
uid=ID d'Utilisateur
|
||||
|
||||
public_profile=Profil public
|
||||
profile_desc=Votre adresse e-mail est publique et sera utilisée pour les notifications relatives au compte, ainsi que pour toute opération Web effectuée via le site.
|
||||
@@ -344,6 +345,11 @@ orgs.none=Vous n'êtes membre d'aucune organisation.
|
||||
orgs.leave_title=Quitter une organisation
|
||||
orgs.leave_desc=Vous perdrez accès à tous les dépôts et équipes après que vous ayez quitté l'organisation. Voulez-vous continuer ?
|
||||
|
||||
repos.leave=Leave
|
||||
repos.leave_title=Leave repository
|
||||
repos.leave_desc=You will lose access to the repository after you left. Do you want to continue?
|
||||
repos.leave_success=You have left repository '%s' successfully!
|
||||
|
||||
delete_account=Supprimer votre compte
|
||||
delete_prompt=Votre compte sera définitivement supprimé et cette opération est <strong>irréversible</strong> !
|
||||
confirm_delete_account=Confirmer la suppression
|
||||
@@ -414,7 +420,7 @@ quick_guide=Introduction rapide
|
||||
clone_this_repo=Cloner ce dépôt
|
||||
create_new_repo_command=Créer un nouveau dépôt en ligne de commande
|
||||
push_exist_repo=Soumettre un dépôt existant par ligne de commande
|
||||
repo_is_empty=Ce dépôt est vide, veuillez revenir plus tard !
|
||||
bare_message=This repository does not have any content yet.
|
||||
|
||||
files=Fichiers
|
||||
branch=Branche
|
||||
@@ -437,11 +443,11 @@ file_too_large=Ce fichier est trop gros pour être afficher
|
||||
video_not_supported_in_browser=Votre navigateur ne supporte pas la balise video HTML5.
|
||||
|
||||
branches.overview=Overview
|
||||
branches.active_branches=Active Branches
|
||||
branches.active_branches=Branches Actives
|
||||
branches.stale_branches=Stale Branches
|
||||
branches.all=All Branches
|
||||
branches.all=Toutes les Branches
|
||||
branches.updated_by=Updated %[1]s by %[2]s
|
||||
branches.change_default_branch=Change Default Branch
|
||||
branches.change_default_branch=Changer la Branche par Défaut
|
||||
|
||||
editor.new_file=Nouveau fichier
|
||||
editor.upload_file=Téléverser un fichier
|
||||
@@ -650,9 +656,11 @@ settings.collaboration.write=Écrire
|
||||
settings.collaboration.read=Lire
|
||||
settings.collaboration.undefined=Indéfini
|
||||
settings.branches=Branches
|
||||
settings.branches_bare=You cannot manage branches for bare repository. Please push some content first.
|
||||
settings.default_branch=Branche par défaut
|
||||
settings.default_branch_desc=La branche par défaut est considérée comme la branche « originale » pour les commits de code, les requêtes de fusion et l'édition en ligne.
|
||||
settings.update=Actualiser
|
||||
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
|
||||
settings.update_default_branch_success=La branche par défaut de ce dépôt a bien été mise à jour.
|
||||
settings.protected_branches=Branches protégées
|
||||
settings.protected_branches_desc=Protéger les branches du push forcé, de la suppression accidentelle et des publicateurs de code en liste blanche.
|
||||
@@ -682,11 +690,13 @@ settings.change_reponame_prompt=Ce changement affectera comment les liens sont r
|
||||
settings.advanced_settings=Paramètres avancés
|
||||
settings.wiki_desc=Activer le wiki
|
||||
settings.use_internal_wiki=Utiliser le wiki interne
|
||||
settings.allow_public_wiki_desc=Allow public access to wiki when repository is private
|
||||
settings.use_external_wiki=Utiliser un wiki externe
|
||||
settings.external_wiki_url=URL Wiki externe
|
||||
settings.external_wiki_url_desc=Les visiteurs seront redirigés vers cette URL lorsqu'ils cliqueront sur l'onglet.
|
||||
settings.issues_desc=Activer le système de tickets
|
||||
settings.use_internal_issue_tracker=Utiliser le système simplifié de tickets interne
|
||||
settings.allow_public_issues_desc=Allow public access to issues when repository is private
|
||||
settings.use_external_issue_tracker=Utiliser un bug-tracker externe
|
||||
settings.external_tracker_url=Adresse de l'issue tracker externe
|
||||
settings.external_tracker_url_desc=Les visiteurs seront redirigés vers cette URL lorsqu'ils cliqueront sur l'onglet.
|
||||
@@ -740,6 +750,8 @@ settings.webhook_deletion_success=Le webhook a été supprimé avec succès !
|
||||
settings.webhook.test_delivery=Tester la version
|
||||
settings.webhook.test_delivery_desc=Envoyer un faux push pour tester la configuration des webhooks
|
||||
settings.webhook.test_delivery_success=Le webhook de test a été ajouté à la file d'attente de livraison. L'affichage dans l'historique de livraison peut prendre quelques secondes.
|
||||
settings.webhook.redelivery=Redelivery
|
||||
settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history.
|
||||
settings.webhook.request=Requête
|
||||
settings.webhook.response=Réponse
|
||||
settings.webhook.headers=Entêtes
|
||||
@@ -758,19 +770,19 @@ settings.secret_desc=Le secret sera envoyé comme digest de payload SHA256 HMAC
|
||||
settings.slack_username=Nom d'utilisateur
|
||||
settings.slack_icon_url=URL de l'icône
|
||||
settings.slack_color=Couleur
|
||||
settings.event_desc=Quel évènement ce Webhook doit-il déclencher ?
|
||||
settings.event_desc=Quand ce webhook doit-il être déclenché ?
|
||||
settings.event_push_only=Uniquement les <code>push</code> (soumissions).
|
||||
settings.event_send_everything=J'ai besoin de <strong>tout</strong>.
|
||||
settings.event_choose=Permettez-moi de choisir ce dont j'ai besoin.
|
||||
settings.event_create=Créer
|
||||
settings.event_create_desc=Branche, ou Tag créé
|
||||
settings.event_delete=Delete
|
||||
settings.event_delete_desc=Branch or tag deleted
|
||||
settings.event_delete=Supprimer
|
||||
settings.event_delete_desc=Branche ou tag supprimé
|
||||
settings.event_fork=Fork
|
||||
settings.event_fork_desc=Repository forked
|
||||
settings.event_push=Push
|
||||
settings.event_push_desc=Git push vers un dépôt
|
||||
settings.event_issues=Issues
|
||||
settings.event_issues=Tickets
|
||||
settings.event_issues_desc=Issue opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, or demilestoned.
|
||||
settings.event_issue_comment=Issue Comment
|
||||
settings.event_issue_comment_desc=Issue comment created, edited, or deleted.
|
||||
|
||||
@@ -82,6 +82,8 @@ app_url=URL da aplicación
|
||||
app_url_helper=Isto afecta ás URLs para clonar por HTTP/HTTPS e a algúns correos electrónicos.
|
||||
log_root_path=Ruta do rexistro
|
||||
log_root_path_helper=Directorio onde almacenar os rexistros.
|
||||
enable_console_mode=Enable Console Mode
|
||||
enable_console_mode_popup=In addition to file mode, also print logs to console.
|
||||
|
||||
optional_title=Configuración opcional
|
||||
email_title=Configuración do servizo de correo
|
||||
@@ -253,11 +255,10 @@ profile=Perfil
|
||||
password=Contrasinal
|
||||
avatar=Avatar
|
||||
ssh_keys=Claves SSH
|
||||
social=Redes sociais
|
||||
applications=Aplicacións
|
||||
repos=Repositories
|
||||
orgs=Organizacións
|
||||
applications=Aplicacións
|
||||
delete=Eliminar conta
|
||||
uid=UUID
|
||||
|
||||
public_profile=Perfil público
|
||||
profile_desc=O teu correo electrónico é público e será usado para todas as notificacións relacionadas con calquera conta e calquera operación feita a través da web.
|
||||
@@ -344,6 +345,11 @@ orgs.none=Non es membro de nengunha organización.
|
||||
orgs.leave_title=Deixar unha organización
|
||||
orgs.leave_desc=Deixarás de ter aceso ao tódolos repositorios e equipos despois de deixar a organización. Desexas abandonala?
|
||||
|
||||
repos.leave=Leave
|
||||
repos.leave_title=Leave repository
|
||||
repos.leave_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!
|
||||
|
||||
delete_account=Elimina a túa conta
|
||||
delete_prompt=A operación eliminará a túa conta de forma permanente e <strong>NON</strong> se pode desfacer!
|
||||
confirm_delete_account=Confirmar eliminación
|
||||
@@ -414,7 +420,7 @@ quick_guide=Guía rápida
|
||||
clone_this_repo=Clonar este repositorio
|
||||
create_new_repo_command=Crear un novo repositorio desde liña de comandos
|
||||
push_exist_repo=Facer Push dun repositorio existente desde liña de comandos
|
||||
repo_is_empty=Este repositorio está baleiro, por favor, volva máis tarde!
|
||||
bare_message=This repository does not have any content yet.
|
||||
|
||||
files=Ficheiros
|
||||
branch=Rama
|
||||
@@ -650,9 +656,11 @@ settings.collaboration.write=Escritura
|
||||
settings.collaboration.read=Lectura
|
||||
settings.collaboration.undefined=Indefinido
|
||||
settings.branches=Branches
|
||||
settings.branches_bare=You cannot manage branches for bare repository. Please push some content first.
|
||||
settings.default_branch=Default Branch
|
||||
settings.default_branch_desc=The default branch is considered the "base" branch for code commits, pull requests and online editing.
|
||||
settings.update=Update
|
||||
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
|
||||
settings.update_default_branch_success=Default branch of this repository has been updated successfully!
|
||||
settings.protected_branches=Protected Branches
|
||||
settings.protected_branches_desc=Protect branches from force pushing, accidental deletion and whitelist code committers.
|
||||
@@ -682,11 +690,13 @@ settings.change_reponame_prompt=Este cambio afectaralles ás ligazóns ao reposi
|
||||
settings.advanced_settings=Axustes avanzados
|
||||
settings.wiki_desc=Activar sistema de wiki
|
||||
settings.use_internal_wiki=Usar wiki integrada
|
||||
settings.allow_public_wiki_desc=Allow public access to wiki when repository is private
|
||||
settings.use_external_wiki=Usar Wiki externa
|
||||
settings.external_wiki_url=URL externa da Wiki
|
||||
settings.external_wiki_url_desc=Os visitantes serán redireccionados á URL cando preman na barra.
|
||||
settings.issues_desc=Habilitar rastrexo de incidencias
|
||||
settings.use_internal_issue_tracker=Usar rastrexo de incidencias lixeiro incluído
|
||||
settings.allow_public_issues_desc=Allow public access to issues when repository is private
|
||||
settings.use_external_issue_tracker=Usar tracker externo de incidencias
|
||||
settings.external_tracker_url=URL de seguimento de problemas externos
|
||||
settings.external_tracker_url_desc=Os visitantes serán redireccionados á URL cando preman na barra.
|
||||
@@ -740,6 +750,8 @@ settings.webhook_deletion_success=Webhook eliminado con éxito!
|
||||
settings.webhook.test_delivery=Test de entrega
|
||||
settings.webhook.test_delivery_desc=Enviar un falso evento Push de entrega para probar os teus axustes de webhook
|
||||
settings.webhook.test_delivery_success=Probar que os webhook foron engadidos á cola de entrega. Isto pode levar algúns segundos antes de aparecer no historial de entregas.
|
||||
settings.webhook.redelivery=Redelivery
|
||||
settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history.
|
||||
settings.webhook.request=Petición
|
||||
settings.webhook.response=Resposta
|
||||
settings.webhook.headers=Encabezado
|
||||
|
||||
@@ -75,13 +75,15 @@ domain_helper=Questo influisce sugli URL per il clonaggio via SSH.
|
||||
ssh_port=Porta SSH
|
||||
ssh_port_helper=Numero di porta utilizzato dal server SSH, lasciare vuoto per disabilitare l'integrazione SSH.
|
||||
use_builtin_ssh_server=Usa il server SSH integrato
|
||||
use_builtin_ssh_server_popup=Start builtin SSH server for Git operations to distinguish from system SSH daemon.
|
||||
use_builtin_ssh_server_popup=Avvia il server SSH integrato per le operazioni Git per distinguerle dal demone SSH di sistema.
|
||||
http_port=Porta HTTP
|
||||
http_port_helper=Porta di ascolto dell'applicazione.
|
||||
app_url=URL Applicazione
|
||||
app_url_helper=Questo influisce sugli URL per il clonaggio via HTTP/HTTPS e da qualche parte nella posta elettronica.
|
||||
log_root_path=Percorso dei log
|
||||
log_root_path_helper=Directory in cui scrivere i file di log.
|
||||
enable_console_mode=Abilita modalità Terminale
|
||||
enable_console_mode_popup=In aggiunta alla modalità file, invia i log anche al terminale.
|
||||
|
||||
optional_title=Impostazioni Facoltative
|
||||
email_title=Impostazioni E-mail
|
||||
@@ -253,11 +255,10 @@ profile=Profilo
|
||||
password=Password
|
||||
avatar=Avatar
|
||||
ssh_keys=Chiavi SSH
|
||||
social=Account Sociali
|
||||
applications=Applicazioni
|
||||
repos=Repositories
|
||||
orgs=Organizzazioni
|
||||
applications=Applicazioni
|
||||
delete=Elimina account
|
||||
uid=Uid
|
||||
|
||||
public_profile=Profilo pubblico
|
||||
profile_desc=Il tuo indirizzo e-mail è pubblico e sarà usato per ogni notifica inerente al tuo account, e per qualsiasi operazione web effettuata attraverso il sito.
|
||||
@@ -344,6 +345,11 @@ orgs.none=Non sei membro di alcuna organizzazione.
|
||||
orgs.leave_title=Abbandona una organizzazione
|
||||
orgs.leave_desc=Abbandonando l'organizzazione perderai l'accesso a tutti i repository e i gruppi. Confermi?
|
||||
|
||||
repos.leave=Leave
|
||||
repos.leave_title=Leave repository
|
||||
repos.leave_desc=You will lose access to the repository after you left. Do you want to continue?
|
||||
repos.leave_success=You have left repository '%s' successfully!
|
||||
|
||||
delete_account=Elimina Account
|
||||
delete_prompt=L'operazione eliminerà permanentemente l'account e <strong>NON POTRÀ</strong> essere annullata!
|
||||
confirm_delete_account=Conferma Eliminazione
|
||||
@@ -414,7 +420,7 @@ quick_guide=Guida rapida
|
||||
clone_this_repo=Clona questo repository
|
||||
create_new_repo_command=Crea nuovo repository da riga di comando
|
||||
push_exist_repo=Push un repo esistente dalla riga di comando
|
||||
repo_is_empty=Questo repository è vuoto, si prega di tornare più tardi!
|
||||
bare_message=This repository does not have any content yet.
|
||||
|
||||
files=File
|
||||
branch=Ramo (Branch)
|
||||
@@ -650,9 +656,11 @@ settings.collaboration.write=Write
|
||||
settings.collaboration.read=Read
|
||||
settings.collaboration.undefined=Undefined
|
||||
settings.branches=Branches
|
||||
settings.branches_bare=You cannot manage branches for bare repository. Please push some content first.
|
||||
settings.default_branch=Default Branch
|
||||
settings.default_branch_desc=The default branch is considered the "base" branch for code commits, pull requests and online editing.
|
||||
settings.update=Update
|
||||
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
|
||||
settings.update_default_branch_success=Default branch of this repository has been updated successfully!
|
||||
settings.protected_branches=Protected Branches
|
||||
settings.protected_branches_desc=Protect branches from force pushing, accidental deletion and whitelist code committers.
|
||||
@@ -682,11 +690,13 @@ 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.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.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.
|
||||
@@ -740,6 +750,8 @@ settings.webhook_deletion_success=Il Webhook è stato eliminato con successo!
|
||||
settings.webhook.test_delivery=Test di consegna
|
||||
settings.webhook.test_delivery_desc=Send a fake push event delivery to test your webhook settings
|
||||
settings.webhook.test_delivery_success=Test webhook has been added to delivery queue. It may take few seconds before it shows up in the delivery history.
|
||||
settings.webhook.redelivery=Redelivery
|
||||
settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history.
|
||||
settings.webhook.request=Richiesta
|
||||
settings.webhook.response=Risposta
|
||||
settings.webhook.headers=Headers
|
||||
|
||||
@@ -82,6 +82,8 @@ app_url=アプリケーションの URL
|
||||
app_url_helper=この設定は、HTTP / HTTPSのクローンURLおよび、一部のメールボックスへのリンクに影響を与えます。
|
||||
log_root_path=ログのパス
|
||||
log_root_path_helper=ログファイルを書き込むディレクトリ。
|
||||
enable_console_mode=Enable Console Mode
|
||||
enable_console_mode_popup=In addition to file mode, also print logs to console.
|
||||
|
||||
optional_title=オプション設定
|
||||
email_title=メールサービス設定
|
||||
@@ -253,11 +255,10 @@ profile=プロフィール
|
||||
password=パスワード
|
||||
avatar=アバター
|
||||
ssh_keys=SSH キー
|
||||
social=SNSアカウント
|
||||
applications=アプリケーション
|
||||
repos=Repositories
|
||||
orgs=組織
|
||||
applications=アプリケーション
|
||||
delete=アカウントを削除
|
||||
uid=Uid
|
||||
|
||||
public_profile=パブリック プロフィール
|
||||
profile_desc=あなたのメールアドレスは公開され、任意のアカウント関連の通知に使用されます。また、Webベースの操作はサイトを介して行います。
|
||||
@@ -341,9 +342,14 @@ access_token_deletion_desc=パーソナルアクセストークンを削除す
|
||||
delete_token_success=パーソナルアクセストークンは正常に削除されました!同時にあなたのアプリケーションを更新することを忘れないでください。
|
||||
|
||||
orgs.none=You are not a member of any organizations.
|
||||
orgs.leave_title=Leave an organization
|
||||
orgs.leave_title=Leave organization
|
||||
orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue?
|
||||
|
||||
repos.leave=Leave
|
||||
repos.leave_title=Leave repository
|
||||
repos.leave_desc=You will lose access to the repository after you left. Do you want to continue?
|
||||
repos.leave_success=You have left repository '%s' successfully!
|
||||
|
||||
delete_account=アカウントを削除
|
||||
delete_prompt=この操作をするとアカウントが完全に削除され、<strong>二度と元に戻すことができなくなります</strong> !
|
||||
confirm_delete_account=削除の確認
|
||||
@@ -414,7 +420,7 @@ quick_guide=クイック ガイド
|
||||
clone_this_repo=このリポジトリのクローンを作成
|
||||
create_new_repo_command=コマンドラインで新しいリポジトリを作成します。
|
||||
push_exist_repo=コマンド ・ ラインから既存のリポジトリをプッシュ
|
||||
repo_is_empty=このリポジトリは空です、後で戻って来て下さい!
|
||||
bare_message=This repository does not have any content yet.
|
||||
|
||||
files=Files
|
||||
branch=ブランチ
|
||||
@@ -650,9 +656,11 @@ settings.collaboration.write=書込
|
||||
settings.collaboration.read=読込
|
||||
settings.collaboration.undefined=Undefined
|
||||
settings.branches=Branches
|
||||
settings.branches_bare=You cannot manage branches for bare repository. Please push some content first.
|
||||
settings.default_branch=Default Branch
|
||||
settings.default_branch_desc=The default branch is considered the "base" branch for code commits, pull requests and online editing.
|
||||
settings.update=Update
|
||||
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
|
||||
settings.update_default_branch_success=Default branch of this repository has been updated successfully!
|
||||
settings.protected_branches=Protected Branches
|
||||
settings.protected_branches_desc=Protect branches from force pushing, accidental deletion and whitelist code committers.
|
||||
@@ -682,11 +690,13 @@ settings.change_reponame_prompt=この変更はリンクがリポジトリに関
|
||||
settings.advanced_settings=拡張設定
|
||||
settings.wiki_desc=Enable wiki system
|
||||
settings.use_internal_wiki=Use builtin wiki
|
||||
settings.allow_public_wiki_desc=Allow public access to wiki when repository is private
|
||||
settings.use_external_wiki=外部 wiki を使用します。
|
||||
settings.external_wiki_url=外部 Wiki の URL
|
||||
settings.external_wiki_url_desc=Visitors will be redirected to URL when they click on the tab.
|
||||
settings.issues_desc=Enable issue tracker
|
||||
settings.use_internal_issue_tracker=Use builtin lightweight issue tracker
|
||||
settings.allow_public_issues_desc=Allow public access to issues when repository is private
|
||||
settings.use_external_issue_tracker=外部課題トラッキングシステムを使用
|
||||
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.
|
||||
@@ -740,6 +750,8 @@ settings.webhook_deletion_success=Webhook が正常に削除されました。
|
||||
settings.webhook.test_delivery=テスト配信
|
||||
settings.webhook.test_delivery_desc=Send a fake push event delivery to test your webhook settings
|
||||
settings.webhook.test_delivery_success=Test webhook has been added to delivery queue. It may take few seconds before it shows up in the delivery history.
|
||||
settings.webhook.redelivery=Redelivery
|
||||
settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history.
|
||||
settings.webhook.request=リクエスト
|
||||
settings.webhook.response=レスポンス
|
||||
settings.webhook.headers=ヘッダ
|
||||
@@ -795,7 +807,7 @@ settings.deploy_keys=デプロイキー
|
||||
settings.deploy_keys_helper=<b>Common Gotcha!</b> If you're looking for adding personal public keys, please add them in your <a href="%s%s">account settings</a>.
|
||||
settings.add_deploy_key=デプロイキーを追加
|
||||
settings.deploy_key_desc=個人アカウントのSSHキーとは異なり、デプロイキーは読み取り専用アクセスとなります。
|
||||
settings.no_deploy_keys=でプロキーは1つも追加されていません。
|
||||
settings.no_deploy_keys=デプロイキーは1つも追加されていません。
|
||||
settings.title=タイトル
|
||||
settings.deploy_key_content=コンテント
|
||||
settings.key_been_used=デプロイキーが使用されています。
|
||||
|
||||
@@ -82,6 +82,8 @@ app_url=애플리케이션 URL
|
||||
app_url_helper=이 작업은 HTTP/HTTPS 클론 URL과 이메일의 어딘가에 영향을 미칩니다.
|
||||
log_root_path=로그 경로
|
||||
log_root_path_helper=로그 파일을 쓸 디렉터리.
|
||||
enable_console_mode=Enable Console Mode
|
||||
enable_console_mode_popup=In addition to file mode, also print logs to console.
|
||||
|
||||
optional_title=추가설정
|
||||
email_title=이메일 서비스 설정
|
||||
@@ -253,11 +255,10 @@ profile=프로필
|
||||
password=비밀번호
|
||||
avatar=아바타
|
||||
ssh_keys=SSH 키
|
||||
social=소셜 계정
|
||||
applications=애플리케이션
|
||||
repos=Repositories
|
||||
orgs=조직
|
||||
applications=애플리케이션
|
||||
delete=계정 삭제
|
||||
uid=Uid
|
||||
|
||||
public_profile=공개 프로필
|
||||
profile_desc=이메일 주소가 공개되며, 사이트를 통해 작업하거나 계정과 관련된 모든 알림에 사용됩니다.
|
||||
@@ -344,6 +345,11 @@ orgs.none=당신은 어떤 조직의 구성원도 아닙니다.
|
||||
orgs.leave_title=조직 떠나기
|
||||
orgs.leave_desc=조직을 떠난 후에는 모든 리포지토리와 팀에 액세스 할 수 없게 됩니다. 계속 하시겠습니까?
|
||||
|
||||
repos.leave=Leave
|
||||
repos.leave_title=Leave repository
|
||||
repos.leave_desc=You will lose access to the repository after you left. Do you want to continue?
|
||||
repos.leave_success=You have left repository '%s' successfully!
|
||||
|
||||
delete_account=계정 삭제
|
||||
delete_prompt=당신의 계정을 삭제합니다. 완료된 후에는 <strong>취소할 수 없습니다</strong>.
|
||||
confirm_delete_account=삭제 승인
|
||||
@@ -414,7 +420,7 @@ quick_guide=퀵 가이드
|
||||
clone_this_repo=이 저장소 복제
|
||||
create_new_repo_command=커맨드 라인에서 새 저장소 만들기
|
||||
push_exist_repo=커맨드 라인에서 기존 저장소 푸시하기
|
||||
repo_is_empty=이 저장소는 비어 있습니다. 나중에 다시 와주세요!
|
||||
bare_message=This repository does not have any content yet.
|
||||
|
||||
files=파일
|
||||
branch=브렌치
|
||||
@@ -651,9 +657,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.default_branch=기본 브랜치
|
||||
settings.default_branch_desc=The default branch is considered the "base" branch for code commits, pull requests and online editing.
|
||||
settings.update=업데이트
|
||||
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
|
||||
settings.update_default_branch_success=이 레포지토리의 기본 브랜치가 성공적으로 설정되었습니다!
|
||||
settings.protected_branches=보호된 브랜치
|
||||
settings.protected_branches_desc=보호된 브랜치는 force 푸시, 실수로 인한 코드 삭제를 방지하며 코드 커미터를 화이트리스트 합니다.
|
||||
@@ -683,11 +691,13 @@ settings.change_reponame_prompt=이 변경은 이 저장소와 연관된 링크
|
||||
settings.advanced_settings=고급 설정
|
||||
settings.wiki_desc=위키 시스템 활성화
|
||||
settings.use_internal_wiki=내장 위키 사용
|
||||
settings.allow_public_wiki_desc=Allow public access to wiki when repository is private
|
||||
settings.use_external_wiki=외부 위키 사용하기
|
||||
settings.external_wiki_url=외부 위키 URL
|
||||
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.use_external_issue_tracker=외부 이슈 트래커 사용하기
|
||||
settings.external_tracker_url=외부 이슈 트래커 URL
|
||||
settings.external_tracker_url_desc=방문자는 탭을 클릭하면 URL로 리다이렉트 됩니다.
|
||||
@@ -741,6 +751,8 @@ settings.webhook_deletion_success=Webhook을 성공적으로 삭제했습니다!
|
||||
settings.webhook.test_delivery=전달 시험
|
||||
settings.webhook.test_delivery_desc=가짜 푸시 이벤트 전달하여 웹훅 설정을 테스트합니다.
|
||||
settings.webhook.test_delivery_success=Webhook 테스트가 delivery 큐에 추가되었습니다. delivery 기록에서 나오기까지 몇 초의 시간이 걸릴 것입니다.
|
||||
settings.webhook.redelivery=Redelivery
|
||||
settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history.
|
||||
settings.webhook.request=요청
|
||||
settings.webhook.response=응답
|
||||
settings.webhook.headers=제목
|
||||
|
||||
@@ -82,6 +82,8 @@ app_url=Lietotnes URL
|
||||
app_url_helper=Tas ietekmē HTTP/HTTPS klonēšanas URL un e-pasta saturā izsūtītās saites.
|
||||
log_root_path=Žurnalizēšanas direktorija
|
||||
log_root_path_helper=Direktorija, kurā tiks glabāti žurnāla faili.
|
||||
enable_console_mode=Enable Console Mode
|
||||
enable_console_mode_popup=In addition to file mode, also print logs to console.
|
||||
|
||||
optional_title=Neobligātie iestatījumi
|
||||
email_title=E-pasta pakalpojuma iestatījumi
|
||||
@@ -253,11 +255,10 @@ profile=Profils
|
||||
password=Parole
|
||||
avatar=Profila attēls
|
||||
ssh_keys=SSH atslēgas
|
||||
social=Sociālie konti
|
||||
applications=Lietotnes
|
||||
repos=Repositories
|
||||
orgs=Organizācijas
|
||||
applications=Lietotnes
|
||||
delete=Dzēst kontu
|
||||
uid=Lietotāja ID
|
||||
|
||||
public_profile=Publiskais profils
|
||||
profile_desc=Jūsu e-pasta adrese ir publiska un tiks izmantota, lai nosūtītju Jums paziņojumus, kas saistīti ar Jūsu kontu vai darbībām veiktām caur šo mājas lapu.
|
||||
@@ -341,9 +342,14 @@ access_token_deletion_desc=Dzēšot personīgo piekļuves talonu, tiks liegta pi
|
||||
delete_token_success=Personīgās piekļuves talons veiksmīgi izdzēsts! Neaizmirstiet nomainīt uz citu aplikācijās, kas to izmantoja.
|
||||
|
||||
orgs.none=You are not a member of any organizations.
|
||||
orgs.leave_title=Leave an organization
|
||||
orgs.leave_title=Leave organization
|
||||
orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue?
|
||||
|
||||
repos.leave=Leave
|
||||
repos.leave_title=Leave repository
|
||||
repos.leave_desc=You will lose access to the repository after you left. Do you want to continue?
|
||||
repos.leave_success=You have left repository '%s' successfully!
|
||||
|
||||
delete_account=Dzēst savu kontu
|
||||
delete_prompt=Šī darbība pilnībā izdzēsīs Jūsu kontu, kā arī tā ir <strong>NEATGRIEZENISKA</strong>!
|
||||
confirm_delete_account=Apstiprināt dzēšanu
|
||||
@@ -414,7 +420,7 @@ quick_guide=Īsa pamācība
|
||||
clone_this_repo=Klonēt šo repozitoriju
|
||||
create_new_repo_command=Izveidot jaunu repozitoriju komandrindā
|
||||
push_exist_repo=Nosūtīt izmaiņas no komandrindas eksistējošam repozitorijam
|
||||
repo_is_empty=Šis repozitorijs ir tukšs, apskatiet atkal vēlāk!
|
||||
bare_message=This repository does not have any content yet.
|
||||
|
||||
files=Files
|
||||
branch=Atzars
|
||||
@@ -650,9 +656,11 @@ settings.collaboration.write=Rakstīšanas
|
||||
settings.collaboration.read=Skatīšanās
|
||||
settings.collaboration.undefined=Nedefinētas
|
||||
settings.branches=Branches
|
||||
settings.branches_bare=You cannot manage branches for bare repository. Please push some content first.
|
||||
settings.default_branch=Default Branch
|
||||
settings.default_branch_desc=The default branch is considered the "base" branch for code commits, pull requests and online editing.
|
||||
settings.update=Update
|
||||
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
|
||||
settings.update_default_branch_success=Default branch of this repository has been updated successfully!
|
||||
settings.protected_branches=Protected Branches
|
||||
settings.protected_branches_desc=Protect branches from force pushing, accidental deletion and whitelist code committers.
|
||||
@@ -682,11 +690,13 @@ settings.change_reponame_prompt=Šī izmaiņa ietekmēs saites, kas ir saistīta
|
||||
settings.advanced_settings=Papildu iestatījumi
|
||||
settings.wiki_desc=Iespējot vikivietnes
|
||||
settings.use_internal_wiki=Izmantot iebūvēto vikivietni
|
||||
settings.allow_public_wiki_desc=Allow public access to wiki when repository is private
|
||||
settings.use_external_wiki=Izmantot ārējo vikivietni
|
||||
settings.external_wiki_url=Ārējās Vikivietnes adrese
|
||||
settings.external_wiki_url_desc=Apmeklētāji tiks novirzīti uz adresi, kad viņi uzklikšķinās uz cilnes.
|
||||
settings.issues_desc=Iespējot problēmu sekotāju
|
||||
settings.use_internal_issue_tracker=Izmantot iebūvētu vieglu problēmu sekotāju
|
||||
settings.allow_public_issues_desc=Allow public access to issues when repository is private
|
||||
settings.use_external_issue_tracker=Izmantot ārējo problēmu sekotāju
|
||||
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.
|
||||
@@ -740,6 +750,8 @@ settings.webhook_deletion_success=Tīmekļa āķis tika veiksmīgi izdzēsts!
|
||||
settings.webhook.test_delivery=Testa piegāde
|
||||
settings.webhook.test_delivery_desc=Veikt viltus push-notikuma piegādi lai notestētu Jūsu tīmekļa āķa iestatījumus
|
||||
settings.webhook.test_delivery_success=Testa web-āķis ir pievienots piegādes rindai. Var paiet dažas sekundes, kamēr tas parādīsies piegāžu vēsturē.
|
||||
settings.webhook.redelivery=Redelivery
|
||||
settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history.
|
||||
settings.webhook.request=Pieprasījums
|
||||
settings.webhook.response=Atbilde
|
||||
settings.webhook.headers=Galvenes
|
||||
|
||||
@@ -82,6 +82,8 @@ app_url=Applicatie URL
|
||||
app_url_helper=Dit heeft invloed op de HTTP/HTTPS kloon urls en de urls die in de email worden gebruikt
|
||||
log_root_path=Log-pad
|
||||
log_root_path_helper=Directory waar logbestanden opgeslagen worden.
|
||||
enable_console_mode=Enable Console Mode
|
||||
enable_console_mode_popup=In addition to file mode, also print logs to console.
|
||||
|
||||
optional_title=Optionele instellingen
|
||||
email_title=E-mail service instellingen
|
||||
@@ -253,11 +255,10 @@ profile=Profiel
|
||||
password=Wachtwoord
|
||||
avatar=Profielfoto
|
||||
ssh_keys=SSH-sleutels
|
||||
social=Sociale netwerk-accounts
|
||||
applications=Toepassingen
|
||||
repos=Repositories
|
||||
orgs=Organisaties
|
||||
applications=Toepassingen
|
||||
delete=Verwijder account
|
||||
uid=uid
|
||||
|
||||
public_profile=Openbaar profiel
|
||||
profile_desc=Uw e-mailadres is openbaar en zal gebruikt worden voor alle account gerelateerde berichtgevingen en bewerkingingen die via de website worden gedaan.
|
||||
@@ -344,6 +345,11 @@ orgs.none=U bent geen lid van een organisatie.
|
||||
orgs.leave_title=Een organisatie verlaten
|
||||
orgs.leave_desc=U verliest toegang tot alle repositories en teams nadat u de organisatie verlaten hebt. Wilt u doorgaan?
|
||||
|
||||
repos.leave=Leave
|
||||
repos.leave_title=Leave repository
|
||||
repos.leave_desc=You will lose access to the repository after you left. Do you want to continue?
|
||||
repos.leave_success=You have left repository '%s' successfully!
|
||||
|
||||
delete_account=Verwijder uw account
|
||||
delete_prompt=Deze handeling zal uw account definitief verwijderen, u kunt dit <strong> NIET </strong> terug draaien!
|
||||
confirm_delete_account=Bevestig verwijdering
|
||||
@@ -414,7 +420,7 @@ quick_guide=Snelstart gids
|
||||
clone_this_repo=Kloon deze repositorie
|
||||
create_new_repo_command=Maak een nieuwe repositorie aan vanaf de console
|
||||
push_exist_repo=Push een bestaande repositorie vanaf de console
|
||||
repo_is_empty=Deze repositories is leeg is, probeer het later opnieuw!
|
||||
bare_message=This repository does not have any content yet.
|
||||
|
||||
files=Bestanden
|
||||
branch=Aftakking
|
||||
@@ -650,9 +656,11 @@ settings.collaboration.write=Schrijven
|
||||
settings.collaboration.read=Lezen
|
||||
settings.collaboration.undefined=Niet gedefinieerd
|
||||
settings.branches=Branches
|
||||
settings.branches_bare=You cannot manage branches for bare repository. Please push some content first.
|
||||
settings.default_branch=Default Branch
|
||||
settings.default_branch_desc=The default branch is considered the "base" branch for code commits, pull requests and online editing.
|
||||
settings.update=Update
|
||||
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
|
||||
settings.update_default_branch_success=Default branch of this repository has been updated successfully!
|
||||
settings.protected_branches=Protected Branches
|
||||
settings.protected_branches_desc=Protect branches from force pushing, accidental deletion and whitelist code committers.
|
||||
@@ -682,11 +690,13 @@ settings.change_reponame_prompt=Deze verandering zal gevolgen hebben voor hoe li
|
||||
settings.advanced_settings=Geavanceerde opties
|
||||
settings.wiki_desc=Wiki-systeem inschakelen
|
||||
settings.use_internal_wiki=Ingebouwde wiki gebruiken
|
||||
settings.allow_public_wiki_desc=Allow public access to wiki when repository is private
|
||||
settings.use_external_wiki=Externe wiki gebruiken
|
||||
settings.external_wiki_url=Externe wiki-URL
|
||||
settings.external_wiki_url_desc=Bezoekers worden doorgestuurd naar de URL als ze op het tabblad klikken.
|
||||
settings.issues_desc=Kwestietracker inschakelen
|
||||
settings.use_internal_issue_tracker=Gebruik ingebouwde eenvoudige kwestietracker
|
||||
settings.allow_public_issues_desc=Allow public access to issues when repository is private
|
||||
settings.use_external_issue_tracker=Externe issuetracker gebruiken
|
||||
settings.external_tracker_url=URL externe kwestietracker
|
||||
settings.external_tracker_url_desc=Bezoekers worden doorgestuurd naar de URL als ze op het tabblad klikken.
|
||||
@@ -740,6 +750,8 @@ settings.webhook_deletion_success=Webhook is succesvol verwijderd!
|
||||
settings.webhook.test_delivery=Test-bezorging
|
||||
settings.webhook.test_delivery_desc=Stuur een nep push bericht om de webhook te testen
|
||||
settings.webhook.test_delivery_success=De test webhook is toegevoegd aan de wachtrij. Het kan enkele seconden duren voor deze in de geschiedenis wordt weergegeven.
|
||||
settings.webhook.redelivery=Redelivery
|
||||
settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history.
|
||||
settings.webhook.request=Verzoek
|
||||
settings.webhook.response=Antwoord
|
||||
settings.webhook.headers=Headers
|
||||
|
||||
@@ -82,6 +82,8 @@ app_url=Adres URL aplikacji
|
||||
app_url_helper=To wpłynie na adresy klonowania HTTP/HTTPS i w wiadomościach e-mail.
|
||||
log_root_path=Ścieżka dla logów
|
||||
log_root_path_helper=Katalog do zapisu logów.
|
||||
enable_console_mode=Enable Console Mode
|
||||
enable_console_mode_popup=In addition to file mode, also print logs to console.
|
||||
|
||||
optional_title=Ustawienia opcjonalne
|
||||
email_title=Ustawienia serwera e-mail
|
||||
@@ -253,11 +255,10 @@ profile=Profil
|
||||
password=Hasło
|
||||
avatar=Awatar
|
||||
ssh_keys=Klucze SSH
|
||||
social=Konta społecznościowe
|
||||
applications=Aplikacje
|
||||
repos=Repositories
|
||||
orgs=Organizacje
|
||||
applications=Aplikacje
|
||||
delete=Usuń konto
|
||||
uid=UID
|
||||
|
||||
public_profile=Profil publiczny
|
||||
profile_desc=Twój adres e-mail jest publiczny i będzie używany dla wszystkich powiadomień związanych z kontem i dla każdej operacji wykonanej przez tę stronę.
|
||||
@@ -341,9 +342,14 @@ access_token_deletion_desc=Usunięcie tego tokena osobistego dostęp spowoduje u
|
||||
delete_token_success=Osobisty token dostępu został usunięty pomyślnie! Nie zapomnij również zaktualizować swoich aplikacji.
|
||||
|
||||
orgs.none=You are not a member of any organizations.
|
||||
orgs.leave_title=Leave an organization
|
||||
orgs.leave_title=Leave organization
|
||||
orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue?
|
||||
|
||||
repos.leave=Leave
|
||||
repos.leave_title=Leave repository
|
||||
repos.leave_desc=You will lose access to the repository after you left. Do you want to continue?
|
||||
repos.leave_success=You have left repository '%s' successfully!
|
||||
|
||||
delete_account=Usuń swoje konto
|
||||
delete_prompt=Ta operacja trwale usunie Twoje konto i <strong>NIE MOŻE</strong> zostać cofnięta!
|
||||
confirm_delete_account=Potwierdź usunięcie
|
||||
@@ -414,7 +420,7 @@ quick_guide=Skrócona instrukcja
|
||||
clone_this_repo=Klonuj repozytorium
|
||||
create_new_repo_command=Utwórz nowe repozytorium z wiersza poleceń
|
||||
push_exist_repo=Prześlij istniejące repozytorium z wiersza poleceń
|
||||
repo_is_empty=To repozytorium jest puste, proszę wrócić później!
|
||||
bare_message=This repository does not have any content yet.
|
||||
|
||||
files=Files
|
||||
branch=Gałąź
|
||||
@@ -650,9 +656,11 @@ settings.collaboration.write=Zapis
|
||||
settings.collaboration.read=Odczyt
|
||||
settings.collaboration.undefined=Niezdefiniowany
|
||||
settings.branches=Branches
|
||||
settings.branches_bare=You cannot manage branches for bare repository. Please push some content first.
|
||||
settings.default_branch=Default Branch
|
||||
settings.default_branch_desc=The default branch is considered the "base" branch for code commits, pull requests and online editing.
|
||||
settings.update=Update
|
||||
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
|
||||
settings.update_default_branch_success=Default branch of this repository has been updated successfully!
|
||||
settings.protected_branches=Protected Branches
|
||||
settings.protected_branches_desc=Protect branches from force pushing, accidental deletion and whitelist code committers.
|
||||
@@ -682,11 +690,13 @@ settings.change_reponame_prompt=Zmiana nazwy repozytorium wpłynie na linki do n
|
||||
settings.advanced_settings=Ustawienia zaawansowane
|
||||
settings.wiki_desc=Włącz system wiki
|
||||
settings.use_internal_wiki=Użyj wbudowanego wiki
|
||||
settings.allow_public_wiki_desc=Allow public access to wiki when repository is private
|
||||
settings.use_external_wiki=Użyj zewnętrznego Wiki
|
||||
settings.external_wiki_url=Adres URL zewnętrznego Wiki
|
||||
settings.external_wiki_url_desc=Odwiedzający zostaną przekierowani do adresu URL po kliknięciu zakładki.
|
||||
settings.issues_desc=Włącz system zgłaszania problemów
|
||||
settings.use_internal_issue_tracker=Użyj wbudowany lekki system zgłaszania problemów
|
||||
settings.allow_public_issues_desc=Allow public access to issues when repository is private
|
||||
settings.use_external_issue_tracker=Użyj zewnętrznego systemu zgłaszania problemów
|
||||
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.
|
||||
@@ -740,6 +750,8 @@ settings.webhook_deletion_success=Webhook został pomyślnie usunięty!
|
||||
settings.webhook.test_delivery=Testuj dostawę
|
||||
settings.webhook.test_delivery_desc=Wyślij fałszywe zdarzenie push aby przetestować ustawienie webhooka
|
||||
settings.webhook.test_delivery_success=Testowy webhook został dodany do kolejki dostawy. To może zająć kilka sekund, zanim to pojawia się w historii dostawy.
|
||||
settings.webhook.redelivery=Redelivery
|
||||
settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history.
|
||||
settings.webhook.request=Żądanie
|
||||
settings.webhook.response=Odpowiedź
|
||||
settings.webhook.headers=Nagłówki
|
||||
|
||||
@@ -82,6 +82,8 @@ app_url=URL do aplicativo
|
||||
app_url_helper=Isto afeta a URL de clone via HTTP/HTTPs e também o e-mail.
|
||||
log_root_path=Caminho do log
|
||||
log_root_path_helper=Pasta dos arquivos de log.
|
||||
enable_console_mode=Enable Console Mode
|
||||
enable_console_mode_popup=In addition to file mode, also print logs to console.
|
||||
|
||||
optional_title=Configurações opcionais
|
||||
email_title=Configurações do serviço de e-mail
|
||||
@@ -253,11 +255,10 @@ profile=Perfil
|
||||
password=Senha
|
||||
avatar=Avatar
|
||||
ssh_keys=Chaves SSH
|
||||
social=Contas sociais
|
||||
applications=Aplicativos
|
||||
repos=Repositories
|
||||
orgs=Organizações
|
||||
applications=Aplicativos
|
||||
delete=Deletar conta
|
||||
uid=Uid
|
||||
|
||||
public_profile=Perfil público
|
||||
profile_desc=Seu endereço de E-mail é publico e será usado para qualquer notificação relacionada à conta, e qualquer operação na web feita através do site.
|
||||
@@ -344,6 +345,11 @@ orgs.none=Você não é participante de nenhuma organização.
|
||||
orgs.leave_title=Deixar uma organização
|
||||
orgs.leave_desc=Você perderá acesso a todos os repositórios e equipes após deixar a organização. Deseja continuar?
|
||||
|
||||
repos.leave=Leave
|
||||
repos.leave_title=Leave repository
|
||||
repos.leave_desc=You will lose access to the repository after you left. Do you want to continue?
|
||||
repos.leave_success=You have left repository '%s' successfully!
|
||||
|
||||
delete_account=Deletar sua conta
|
||||
delete_prompt=A operação deletará sua conta permanentemente, e <strong>NÃO PODERÁ</strong> ser desfeita!
|
||||
confirm_delete_account=Confirmar exclusão
|
||||
@@ -414,7 +420,7 @@ quick_guide=Guia rápido
|
||||
clone_this_repo=Clonar este repositório
|
||||
create_new_repo_command=Criar um novo repositório na linha de comando
|
||||
push_exist_repo=Push um repositório existente na linha de comando
|
||||
repo_is_empty=Este repositório está vazio, por favor volte mais tarde!
|
||||
bare_message=This repository does not have any content yet.
|
||||
|
||||
files=Arquivos
|
||||
branch=Branch
|
||||
@@ -650,9 +656,11 @@ settings.collaboration.write=Escrita
|
||||
settings.collaboration.read=Leitura
|
||||
settings.collaboration.undefined=Indefinido
|
||||
settings.branches=Branches
|
||||
settings.branches_bare=You cannot manage branches for bare repository. Please push some content first.
|
||||
settings.default_branch=Default Branch
|
||||
settings.default_branch_desc=The default branch is considered the "base" branch for code commits, pull requests and online editing.
|
||||
settings.update=Update
|
||||
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
|
||||
settings.update_default_branch_success=Default branch of this repository has been updated successfully!
|
||||
settings.protected_branches=Protected Branches
|
||||
settings.protected_branches_desc=Protect branches from force pushing, accidental deletion and whitelist code committers.
|
||||
@@ -682,11 +690,13 @@ settings.change_reponame_prompt=Esta mudança irá afetar os links para este rep
|
||||
settings.advanced_settings=Configurações avançadas
|
||||
settings.wiki_desc=Habilitar sistema de wiki
|
||||
settings.use_internal_wiki=Usar wiki nativa
|
||||
settings.allow_public_wiki_desc=Allow public access to wiki when repository is private
|
||||
settings.use_external_wiki=Usar wiki externa
|
||||
settings.external_wiki_url=URL externa da wiki
|
||||
settings.external_wiki_url_desc=Os visitantes serão redirecionados para a URL ao clicar na aba.
|
||||
settings.issues_desc=Habilitar issue tracker
|
||||
settings.use_internal_issue_tracker=Usar o issue tracker nativo
|
||||
settings.allow_public_issues_desc=Allow public access to issues when repository is private
|
||||
settings.use_external_issue_tracker=Usar issue tracker externo
|
||||
settings.external_tracker_url=URL do Issue Tracker Externo
|
||||
settings.external_tracker_url_desc=Visitantes serão redirecionados ao URL quando clicarem na aba.
|
||||
@@ -740,6 +750,8 @@ settings.webhook_deletion_success=Webhook deletado com sucesso!
|
||||
settings.webhook.test_delivery=Entrega de teste
|
||||
settings.webhook.test_delivery_desc=Enviar uma entrega de evento de Push falso para testar suas configurações de webhook
|
||||
settings.webhook.test_delivery_success=O Webhook de teste foi adicionado para a fila de entrega. Pode demorar alguns segundos antes de ser exibido no histórico de entrega.
|
||||
settings.webhook.redelivery=Redelivery
|
||||
settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history.
|
||||
settings.webhook.request=Solicitação
|
||||
settings.webhook.response=Resposta
|
||||
settings.webhook.headers=Cabeçalhos
|
||||
|
||||
@@ -82,6 +82,8 @@ app_url=URL приложения
|
||||
app_url_helper=Этот параметр влияет на URL для клонирования по HTTP/HTTPS и на адреса в электронной почте.
|
||||
log_root_path=Путь к журналу
|
||||
log_root_path_helper=Каталог для записи файлов журнала.
|
||||
enable_console_mode=Enable Console Mode
|
||||
enable_console_mode_popup=In addition to file mode, also print logs to console.
|
||||
|
||||
optional_title=Расширенные настройки
|
||||
email_title=Настройки службы электронной почты
|
||||
@@ -253,11 +255,10 @@ profile=Профиль
|
||||
password=Пароль
|
||||
avatar=Аватар
|
||||
ssh_keys=SSH ключи
|
||||
social=Учетные записи в соцсетях
|
||||
applications=Приложения
|
||||
repos=Repositories
|
||||
orgs=Организации
|
||||
applications=Приложения
|
||||
delete=Удалить аккаунт
|
||||
uid=UID
|
||||
|
||||
public_profile=Открытый профиль
|
||||
profile_desc=Адрес вашей электронной почты является публичным и будет использован для любых уведомлений, связанных с аккаунтом, а также для любых действий, совершенных через сайт.
|
||||
@@ -344,6 +345,11 @@ orgs.none=Вы не состоите ни в одной организации.
|
||||
orgs.leave_title=Покинуть организацию
|
||||
orgs.leave_desc=Вы потеряете доступ ко всем репозиториям и командам, как только покинете организацию. Вы хотите продолжить?
|
||||
|
||||
repos.leave=Leave
|
||||
repos.leave_title=Leave repository
|
||||
repos.leave_desc=You will lose access to the repository after you left. Do you want to continue?
|
||||
repos.leave_success=You have left repository '%s' successfully!
|
||||
|
||||
delete_account=Удалить свой аккаунт
|
||||
delete_prompt=Этим действием вы удалите свою учетную запись навсегда и <strong>НЕ СМОЖЕТЕ</strong> ее вернуть!
|
||||
confirm_delete_account=Подтвердите удаление
|
||||
@@ -414,7 +420,7 @@ quick_guide=Краткое руководство
|
||||
clone_this_repo=Клонировать репозиторий
|
||||
create_new_repo_command=Создать новый репозиторий из командной строки
|
||||
push_exist_repo=Отправить существующий репозиторий из командной строки
|
||||
repo_is_empty=Этот репозиторий пуст, пожалуйста, возвращайтесь позже!
|
||||
bare_message=This repository does not have any content yet.
|
||||
|
||||
files=Файлы
|
||||
branch=Ветка
|
||||
@@ -427,7 +433,7 @@ pulls=Запросы на слияние
|
||||
labels=Метки
|
||||
milestones=Этапы
|
||||
commits=Коммиты
|
||||
git_branches=Branches
|
||||
git_branches=Ветки
|
||||
releases=Релизы
|
||||
file_raw=Исходник
|
||||
file_history=История
|
||||
@@ -436,10 +442,10 @@ file_permalink=Постоянная ссылка
|
||||
file_too_large=Этот файл слишком большой, поэтому он не может быть отображен
|
||||
video_not_supported_in_browser=Ваш браузер не поддерживает HTML5 видео тэг.
|
||||
|
||||
branches.overview=Overview
|
||||
branches.active_branches=Active Branches
|
||||
branches.stale_branches=Stale Branches
|
||||
branches.all=All Branches
|
||||
branches.overview=Обзор
|
||||
branches.active_branches=Активные ветки
|
||||
branches.stale_branches=Устаревшие ветки
|
||||
branches.all=Все ветки
|
||||
branches.updated_by=Updated %[1]s by %[2]s
|
||||
branches.change_default_branch=Change Default Branch
|
||||
|
||||
@@ -650,9 +656,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.default_branch=Ветка по умолчанию
|
||||
settings.default_branch_desc=Ветка по-умолчанию считается основной для коммитов, запросов на слияние и онлайн-редактирования.
|
||||
settings.update=Обновить
|
||||
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
|
||||
settings.update_default_branch_success=Ветка по умолчанию для этого репозитория была успешно изменена!
|
||||
settings.protected_branches=Защищенные ветки
|
||||
settings.protected_branches_desc=Защитить ветки от принудительного push, случайного удаления и разрешить изменения только коммитерам из белого списка.
|
||||
@@ -664,7 +672,7 @@ settings.protect_this_branch_desc=Выключить принудительны
|
||||
settings.protect_require_pull_request=Требовать запрос на слияние вместо прямого push
|
||||
settings.protect_require_pull_request_desc=Включите этот параметр для запрета прямого push в это ветку. Коммит должен быть запушен в незащищенную ветку и слит в эту ветку через запрос на слияние.
|
||||
settings.protect_whitelist_committers=Белый список тех, кто может делать push в эту ветку
|
||||
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_committers_desc=Добавьте людей или команды в белый список для прямого доступа к этой ветке. Пользователи из белого списка будут обходить проверку pull request.
|
||||
settings.protect_whitelist_users=Пользователи которые могут делать push в эту ветку
|
||||
settings.protect_whitelist_search_users=Поиск пользователей
|
||||
settings.protect_whitelist_teams=Команды, члены которых могут делать push в эту ветку
|
||||
@@ -682,11 +690,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.use_external_wiki=Использовать внешнюю Wiki
|
||||
settings.external_wiki_url=URL-адрес внешней Вики
|
||||
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.use_external_issue_tracker=Использовать внешнюю систему отслеживания ошибок
|
||||
settings.external_tracker_url=URL внешней системы отслеживания ошибок
|
||||
settings.external_tracker_url_desc=Посетители будут перенаправлены на URL когда они нажмут на вкладку.
|
||||
@@ -740,6 +750,8 @@ settings.webhook_deletion_success=Веб-хук успешно удален!
|
||||
settings.webhook.test_delivery=Проверить доставку
|
||||
settings.webhook.test_delivery_desc=Отправить push для тестирования настройки веб-хуков
|
||||
settings.webhook.test_delivery_success=Тест веб-хука была добавлен в очередь доставки. Это может занять несколько секунд, прежде чем он отобразится в истории доставки.
|
||||
settings.webhook.redelivery=Redelivery
|
||||
settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history.
|
||||
settings.webhook.request=Запрос
|
||||
settings.webhook.response=Ответ
|
||||
settings.webhook.headers=Заголовки
|
||||
@@ -764,20 +776,20 @@ settings.event_send_everything=Мне нужно <strong>все</strong>.
|
||||
settings.event_choose=Позвольте мне выбрать то, что нужно.
|
||||
settings.event_create=Создать
|
||||
settings.event_create_desc=Ветка или тэг созданы
|
||||
settings.event_delete=Delete
|
||||
settings.event_delete_desc=Branch or tag deleted
|
||||
settings.event_fork=Fork
|
||||
settings.event_delete=Удалить
|
||||
settings.event_delete_desc=Ветка или метка удалена
|
||||
settings.event_fork=Ответвить
|
||||
settings.event_fork_desc=Repository forked
|
||||
settings.event_push=Push
|
||||
settings.event_push_desc=Push в репозиторий
|
||||
settings.event_issues=Issues
|
||||
settings.event_issues=Вопросы
|
||||
settings.event_issues_desc=Issue opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, milestoned, or demilestoned.
|
||||
settings.event_issue_comment=Issue Comment
|
||||
settings.event_issue_comment_desc=Issue comment created, edited, or deleted.
|
||||
settings.event_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_release=Release
|
||||
settings.event_release_desc=Release published in a repository.
|
||||
settings.event_release=Релиз
|
||||
settings.event_release_desc=Релиз опубликован в репозитории.
|
||||
settings.active=Активен
|
||||
settings.active_helper=Подробности о событии, вызвавшем срабатывание хука, также будут предоставлены.
|
||||
settings.add_hook_success=Был добавлен новый webhook.
|
||||
@@ -1037,7 +1049,7 @@ repos.private=Приватный
|
||||
repos.watches=Следят
|
||||
repos.stars=В избранном
|
||||
repos.issues=Задачи
|
||||
repos.size=Size
|
||||
repos.size=Размер
|
||||
|
||||
auths.auth_manage_panel=Панель управления аутнентификациями
|
||||
auths.new=Добавить новый источник
|
||||
@@ -1195,8 +1207,8 @@ config.git_pull_timeout=Время Ожидания Операции Извле
|
||||
config.git_gc_timeout=Время Ожидания Операции Сборки Мусора
|
||||
|
||||
config.log_config=Конфигурация журнала
|
||||
config.log_mode=Mode
|
||||
config.log_options=Options
|
||||
config.log_mode=Режим
|
||||
config.log_options=Опции
|
||||
|
||||
monitor.cron=Задачи cron
|
||||
monitor.name=Имя
|
||||
|
||||
@@ -82,6 +82,8 @@ app_url=URL адреса апликације
|
||||
app_url_helper=Ова поставка утиче на URL за клонирање преко HTTP/HTTPS протокола и на адресама е-поште.
|
||||
log_root_path=Пут до журнала
|
||||
log_root_path_helper=Директоријум где ће бити снимане датотеке журнала.
|
||||
enable_console_mode=Enable Console Mode
|
||||
enable_console_mode_popup=In addition to file mode, also print logs to console.
|
||||
|
||||
optional_title=Напредна подешавања
|
||||
email_title=Подешавања сервиса е-поште
|
||||
@@ -253,11 +255,10 @@ profile=Профил
|
||||
password=Лозинка
|
||||
avatar=Аватар
|
||||
ssh_keys=SSH Кључеви
|
||||
social=Налози на друштвеним мрежама
|
||||
applications=Апликације
|
||||
repos=Repositories
|
||||
orgs=Организације
|
||||
applications=Апликације
|
||||
delete=Уклоните налог
|
||||
uid=Uid
|
||||
|
||||
public_profile=Јавни профил
|
||||
profile_desc=Ваша адреса е-поште је јавна и коришће се за све обавести везане са налогом, као и друге операције почињене кроз Gogs.
|
||||
@@ -341,9 +342,14 @@ access_token_deletion_desc=Уклоњење овог токена ће онем
|
||||
delete_token_success=Лични токен је успешно избришен! Не заборавите да ажурирате апликацију.
|
||||
|
||||
orgs.none=You are not a member of any organizations.
|
||||
orgs.leave_title=Leave an organization
|
||||
orgs.leave_title=Leave organization
|
||||
orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue?
|
||||
|
||||
repos.leave=Leave
|
||||
repos.leave_title=Leave repository
|
||||
repos.leave_desc=You will lose access to the repository after you left. Do you want to continue?
|
||||
repos.leave_success=You have left repository '%s' successfully!
|
||||
|
||||
delete_account=Уклоните ваш налог
|
||||
delete_prompt=Операција ће трајно избрисати ваш налог, што се <strong>НЕ може</strong> поввратити!
|
||||
confirm_delete_account=Потврдите брисање
|
||||
@@ -414,7 +420,7 @@ quick_guide=Кратак водич
|
||||
clone_this_repo=Клонирај спремиште
|
||||
create_new_repo_command=Направите ново спремиште са командне линије
|
||||
push_exist_repo=Push постојећe спремиште са командне линије
|
||||
repo_is_empty=Овo спремиште je празнo, молимо вас, вратите се касније!
|
||||
bare_message=This repository does not have any content yet.
|
||||
|
||||
files=Files
|
||||
branch=Грана
|
||||
@@ -650,9 +656,11 @@ settings.collaboration.write=За писање
|
||||
settings.collaboration.read=Читање
|
||||
settings.collaboration.undefined=Није дефинисано
|
||||
settings.branches=Branches
|
||||
settings.branches_bare=You cannot manage branches for bare repository. Please push some content first.
|
||||
settings.default_branch=Default Branch
|
||||
settings.default_branch_desc=The default branch is considered the "base" branch for code commits, pull requests and online editing.
|
||||
settings.update=Update
|
||||
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
|
||||
settings.update_default_branch_success=Default branch of this repository has been updated successfully!
|
||||
settings.protected_branches=Protected Branches
|
||||
settings.protected_branches_desc=Protect branches from force pushing, accidental deletion and whitelist code committers.
|
||||
@@ -682,11 +690,13 @@ settings.change_reponame_prompt=Ова промена ће утицати на
|
||||
settings.advanced_settings=Напредна подешавања
|
||||
settings.wiki_desc=Омогући систем вики
|
||||
settings.use_internal_wiki=Користи уграђен вики
|
||||
settings.allow_public_wiki_desc=Allow public access to wiki when repository is private
|
||||
settings.use_external_wiki=Користи спољни Вики
|
||||
settings.external_wiki_url=URL адреса спољног Вики
|
||||
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.use_external_issue_tracker=Користи спољни систем праћења грешака
|
||||
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.
|
||||
@@ -740,6 +750,8 @@ settings.webhook_deletion_success=Webhook успешно избрисан!
|
||||
settings.webhook.test_delivery=Провери испоруку
|
||||
settings.webhook.test_delivery_desc=Пошаљи push за тестирање подешавања webhook
|
||||
settings.webhook.test_delivery_success=Тест webhook је додат у месту испоруке. Процес може да потраје неколико секунди пре него што ће показати у историји испоруке.
|
||||
settings.webhook.redelivery=Redelivery
|
||||
settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history.
|
||||
settings.webhook.request=Захтев
|
||||
settings.webhook.response=Одговор
|
||||
settings.webhook.headers=Наслови
|
||||
|
||||
@@ -82,6 +82,8 @@ app_url=Applikationsadressen
|
||||
app_url_helper=Detta påverkar HTTP/HTTPS kloningsadressen och på platser i e-post.
|
||||
log_root_path=Loggsökväg
|
||||
log_root_path_helper=Katalog till vilken loggfiler skrivs.
|
||||
enable_console_mode=Enable Console Mode
|
||||
enable_console_mode_popup=In addition to file mode, also print logs to console.
|
||||
|
||||
optional_title=Övriga inställningar
|
||||
email_title=E-post tjänstens inställningar
|
||||
@@ -253,11 +255,10 @@ profile=Profil
|
||||
password=Lösenord
|
||||
avatar=Avatar
|
||||
ssh_keys=SSH-nycklar
|
||||
social=Sociala konton
|
||||
applications=Applikationer
|
||||
repos=Repositories
|
||||
orgs=Organisationer
|
||||
applications=Applikationer
|
||||
delete=Radera konto
|
||||
uid=Uid
|
||||
|
||||
public_profile=Offentlig profil
|
||||
profile_desc=Din epostaddress är offentlig och kommer att användas för alla kontorelaterade notifieringar och alla webbaserade åtgärder gjorda på sidan.
|
||||
@@ -344,6 +345,11 @@ orgs.none=Du är inte en medlem i någon organisation.
|
||||
orgs.leave_title=Lämna en organisation
|
||||
orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue?
|
||||
|
||||
repos.leave=Leave
|
||||
repos.leave_title=Leave repository
|
||||
repos.leave_desc=You will lose access to the repository after you left. Do you want to continue?
|
||||
repos.leave_success=You have left repository '%s' successfully!
|
||||
|
||||
delete_account=Radera ditt konto
|
||||
delete_prompt=Åtgärden kommer at ta bort ditt konto permanent, och kan <strong>INTE</strong> ångras!
|
||||
confirm_delete_account=Bekräfta Borttagelsen
|
||||
@@ -414,7 +420,7 @@ quick_guide=Snabbguide
|
||||
clone_this_repo=Klona detta repo
|
||||
create_new_repo_command=Skapa ett nytt repo på kommandoraden
|
||||
push_exist_repo=Knuffa ett existerande repo från kommandoraden
|
||||
repo_is_empty=Detta repo är tomt, vänligen kom tillbaka senare!
|
||||
bare_message=This repository does not have any content yet.
|
||||
|
||||
files=Filer
|
||||
branch=Gren
|
||||
@@ -650,9 +656,11 @@ settings.collaboration.write=Skriva
|
||||
settings.collaboration.read=Läsa
|
||||
settings.collaboration.undefined=Odefinierad
|
||||
settings.branches=Branches
|
||||
settings.branches_bare=You cannot manage branches for bare repository. Please push some content first.
|
||||
settings.default_branch=Default Branch
|
||||
settings.default_branch_desc=The default branch is considered the "base" branch for code commits, pull requests and online editing.
|
||||
settings.update=Update
|
||||
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
|
||||
settings.update_default_branch_success=Default branch of this repository has been updated successfully!
|
||||
settings.protected_branches=Protected Branches
|
||||
settings.protected_branches_desc=Protect branches from force pushing, accidental deletion and whitelist code committers.
|
||||
@@ -682,11 +690,13 @@ settings.change_reponame_prompt=Denna ändring kommer att påverka hur länkar r
|
||||
settings.advanced_settings=Advancerade Inställningar
|
||||
settings.wiki_desc=Aktivera wikisystem
|
||||
settings.use_internal_wiki=Använd inbyggd wiki
|
||||
settings.allow_public_wiki_desc=Allow public access to wiki when repository is private
|
||||
settings.use_external_wiki=Använd extern wiki
|
||||
settings.external_wiki_url=Extern Wiki-URL
|
||||
settings.external_wiki_url_desc=Besökare kommer att bli omdirigerade till denna URL när dom klickar på fliken.
|
||||
settings.issues_desc=Aktivera ärendehantering
|
||||
settings.use_internal_issue_tracker=Använd enkel inbyggd ärendehantering
|
||||
settings.allow_public_issues_desc=Allow public access to issues when repository is private
|
||||
settings.use_external_issue_tracker=Använd extern ärendehanterare
|
||||
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.
|
||||
@@ -740,6 +750,8 @@ settings.webhook_deletion_success=Webbhook har tagits bort!
|
||||
settings.webhook.test_delivery=Testa Leverans
|
||||
settings.webhook.test_delivery_desc=Skicka en falsk pushhändelse för att testa dina webbhook-inställningar
|
||||
settings.webhook.test_delivery_success=Testwebbhook har lagts till leveranskön. Det kan ta några sekunder innan den visas i leveranshistoriken.
|
||||
settings.webhook.redelivery=Redelivery
|
||||
settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history.
|
||||
settings.webhook.request=Begäran
|
||||
settings.webhook.response=Svar
|
||||
settings.webhook.headers=Huvuden
|
||||
|
||||
@@ -82,6 +82,8 @@ app_url=Uygulama Bağlantısı
|
||||
app_url_helper=Bu, HTTP/HTTPS klon bağlantılarını ve e-postadaki bazı kısımları etkiler.
|
||||
log_root_path=Günlük Dosyaları Yolu
|
||||
log_root_path_helper=Günlük dosyalarının yazılacağı dizin.
|
||||
enable_console_mode=Enable Console Mode
|
||||
enable_console_mode_popup=In addition to file mode, also print logs to console.
|
||||
|
||||
optional_title=İsteğe Bağlı Ayarlar
|
||||
email_title=E-Posta Servisi Ayarları
|
||||
@@ -253,11 +255,10 @@ profile=Profil
|
||||
password=Parola
|
||||
avatar=Avatar
|
||||
ssh_keys=SSH Anahtarları
|
||||
social=Sosyal Medya Hesapları
|
||||
applications=Uygulamalar
|
||||
repos=Repositories
|
||||
orgs=Organizasyonlar
|
||||
applications=Uygulamalar
|
||||
delete=Hesabı Sil
|
||||
uid=Tekil ID
|
||||
|
||||
public_profile=Herkese Açık Profil
|
||||
profile_desc=E-posta adresiniz herkese açıktır ve hesabınızla ilgili bilgilendirmelerde ve web tabanlı operasyonlarda kullanılacaktır.
|
||||
@@ -341,9 +342,14 @@ access_token_deletion_desc=Bu kişisel erişim anahtarını silerseniz uygulaman
|
||||
delete_token_success=Kişisel erişim anahtarı başarıyla kaldırıldı! Uygulamanızı güncellemeyi de unutmayın!
|
||||
|
||||
orgs.none=You are not a member of any organizations.
|
||||
orgs.leave_title=Leave an organization
|
||||
orgs.leave_title=Leave organization
|
||||
orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue?
|
||||
|
||||
repos.leave=Leave
|
||||
repos.leave_title=Leave repository
|
||||
repos.leave_desc=You will lose access to the repository after you left. Do you want to continue?
|
||||
repos.leave_success=You have left repository '%s' successfully!
|
||||
|
||||
delete_account=Hesabınızı Silin
|
||||
delete_prompt=Bu işlem hesabınızı kalıcı olarak silecektir ve <strong>GERİ ALINAMAZ</strong>!
|
||||
confirm_delete_account=Silmeyi Onayla
|
||||
@@ -414,7 +420,7 @@ quick_guide=Hızlı Başlangıç Kılavuzu
|
||||
clone_this_repo=Bu depoyu klonla
|
||||
create_new_repo_command=Komut satırında yeni bir depo oluştur
|
||||
push_exist_repo=Var olan bir depoyu komut satırında gönder
|
||||
repo_is_empty=Bu depo boş. Lütfen daha sonra tekrar gelin!
|
||||
bare_message=This repository does not have any content yet.
|
||||
|
||||
files=Files
|
||||
branch=Dal
|
||||
@@ -650,9 +656,11 @@ settings.collaboration.write=Yaz
|
||||
settings.collaboration.read=Oku
|
||||
settings.collaboration.undefined=Belirsiz
|
||||
settings.branches=Branches
|
||||
settings.branches_bare=You cannot manage branches for bare repository. Please push some content first.
|
||||
settings.default_branch=Default Branch
|
||||
settings.default_branch_desc=The default branch is considered the "base" branch for code commits, pull requests and online editing.
|
||||
settings.update=Update
|
||||
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
|
||||
settings.update_default_branch_success=Default branch of this repository has been updated successfully!
|
||||
settings.protected_branches=Protected Branches
|
||||
settings.protected_branches_desc=Protect branches from force pushing, accidental deletion and whitelist code committers.
|
||||
@@ -682,11 +690,13 @@ settings.change_reponame_prompt=Bu değişiklik, bağlantıların depoyla olan i
|
||||
settings.advanced_settings=Gelişmiş Ayarlar
|
||||
settings.wiki_desc=Viki sıstemini etkinleştir
|
||||
settings.use_internal_wiki=Use builtin wiki
|
||||
settings.allow_public_wiki_desc=Allow public access to wiki when repository is private
|
||||
settings.use_external_wiki=Harici Wiki kullan
|
||||
settings.external_wiki_url=Harici Wiki bağlantısı
|
||||
settings.external_wiki_url_desc=Ziyaretçiler, sekmeye tıkladıklarında bağlantıya yönlendirilecektir.
|
||||
settings.issues_desc=Enable issue tracker
|
||||
settings.use_internal_issue_tracker=Use builtin lightweight issue tracker
|
||||
settings.allow_public_issues_desc=Allow public access to issues when repository is private
|
||||
settings.use_external_issue_tracker=Harici sorun takipçisi kullan
|
||||
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.
|
||||
@@ -740,6 +750,8 @@ settings.webhook_deletion_success=Web isteği başarıyla silindi!
|
||||
settings.webhook.test_delivery=Test Dağıtımı
|
||||
settings.webhook.test_delivery_desc=Web isteği ayarlarınızı test etmek için sahte bir anlık olay gönderin
|
||||
settings.webhook.test_delivery_success=Test web isteği, dağıtım kuyruğuna eklendi. Bunun dağıtım geçmişinde görünmesi birkaç saniye sürebilir.
|
||||
settings.webhook.redelivery=Redelivery
|
||||
settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history.
|
||||
settings.webhook.request=İstekler
|
||||
settings.webhook.response=Cevaplar
|
||||
settings.webhook.headers=Başlıklar
|
||||
|
||||
@@ -82,6 +82,8 @@ app_url=Адреса програми
|
||||
app_url_helper=Це впливає на клонування через HTTP/HTTPS та десь у електроній пошті.
|
||||
log_root_path=Шлях до лог файлу
|
||||
log_root_path_helper=Каталог для файлів журналу.
|
||||
enable_console_mode=Увімкнути консольний режим
|
||||
enable_console_mode_popup=На додаток до файлового режиму писати логи також і до консолі.
|
||||
|
||||
optional_title=Додаткові налаштування
|
||||
email_title=Параметри електронної пошти
|
||||
@@ -253,11 +255,10 @@ profile=Профіль
|
||||
password=Пароль
|
||||
avatar=Аватар
|
||||
ssh_keys=Ключі SSH
|
||||
social=Соціальні акаунти
|
||||
applications=Додатки
|
||||
repos=Репозиторії
|
||||
orgs=Організації
|
||||
applications=Додатки
|
||||
delete=Видалити обліковий запис
|
||||
uid=Унікальний ідентифікатор користувача
|
||||
|
||||
public_profile=Загальнодоступний профіль
|
||||
profile_desc=Ваша адреса електронної пошти є публічною і буде використовуватися для будь-яких повідомлень щодо вашого облікового запису і будь-яких веб-операцій, що здійснюються через сайт.
|
||||
@@ -344,6 +345,11 @@ orgs.none=Ви не є членом будь-якої організації.
|
||||
orgs.leave_title=Залишити організацію
|
||||
orgs.leave_desc=Ви втратите доступ до всіх репозиторіїв і команд після того, як ви покинете організацію. Ви хочете продовжити?
|
||||
|
||||
repos.leave=Покинути
|
||||
repos.leave_title=Покинути репозиторій
|
||||
repos.leave_desc=Ви можете втратити доступ до репозиторію після того як покинете його. Бажаєте продовжити?
|
||||
repos.leave_success=Ви успішно покинули репозиторій '%s'!
|
||||
|
||||
delete_account=Видалити ваш обліковий запис
|
||||
delete_prompt=Ця операція остаточно видалить обліковий запис, і її <strong>НЕМОЖЛИВО</strong> буде скасувати!
|
||||
confirm_delete_account=Підтвердження видалення
|
||||
@@ -414,7 +420,7 @@ quick_guide=Короткий посібник
|
||||
clone_this_repo=Кнонувати цей репозиторій
|
||||
create_new_repo_command=Створити новий репозиторій з командного рядка
|
||||
push_exist_repo=Штовхнути існуючий репозиторій з командного рядка
|
||||
repo_is_empty=Даний репозиторій пустий, будь ласка, повертайтесь пізніше!
|
||||
bare_message=Цей репозиторій ще не має жодного вмісту.
|
||||
|
||||
files=Файли
|
||||
branch=Гілка
|
||||
@@ -650,9 +656,11 @@ settings.collaboration.write=Запис
|
||||
settings.collaboration.read=Читання
|
||||
settings.collaboration.undefined=Не визначено
|
||||
settings.branches=Гілки
|
||||
settings.branches_bare=Ви не можете керувати гілками у bare-репозиторії. Спочатку додайте у нього якогось вмісту, будь ласка.
|
||||
settings.default_branch=Гілка за замовчуванням
|
||||
settings.default_branch_desc=Гілка за замовчанням вважається базовою для комітів, запросів злиття та онлайн редагувань.
|
||||
settings.update=Оновлення
|
||||
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
|
||||
settings.update_default_branch_success=Гілку за замовчуванням цього репозиторію було успішно оновлено!
|
||||
settings.protected_branches=Захищені гілки
|
||||
settings.protected_branches_desc=Захистіть гілки від force push, випадкового видалення та коміттерів з білого списку.
|
||||
@@ -682,11 +690,13 @@ settings.change_reponame_prompt=Ця зміна вплине на відноше
|
||||
settings.advanced_settings=Додаткові налаштування
|
||||
settings.wiki_desc=Увімкнути wiki-систему
|
||||
settings.use_internal_wiki=Використовувати вбудовану wiki
|
||||
settings.allow_public_wiki_desc=Дозволити публічний доступ до wiki поки репозиторій залишається приватним
|
||||
settings.use_external_wiki=Використовувати зовнішню wiki
|
||||
settings.external_wiki_url=URL зовнішньої wiki
|
||||
settings.external_wiki_url_desc=Відвідувачі будуть переспрямовані до URL коли вони клацнуть на вкладці.
|
||||
settings.issues_desc=Увімкнути систему відстеження проблем
|
||||
settings.use_internal_issue_tracker=Використовувати вбудовану легку систему відстеження помилок
|
||||
settings.allow_public_issues_desc=Дозволити публічний доступ до проблем поки репозиторій залишається приватним
|
||||
settings.use_external_issue_tracker=Використовувати зовнішній трекер задач
|
||||
settings.external_tracker_url=URL зовнішньої системи відстеження проблем
|
||||
settings.external_tracker_url_desc=Відвідувача буде перенаправлено до URL коли він натисне на вкладку.
|
||||
@@ -740,6 +750,8 @@ settings.webhook_deletion_success=Webhook успішно видалено!
|
||||
settings.webhook.test_delivery=Перевірити поставку
|
||||
settings.webhook.test_delivery_desc=Відправити тестовий push для перевірки налаштувань web-хуків
|
||||
settings.webhook.test_delivery_success=Тестовий web-хук може бути доданий у чергу поставки. Поки він з'явиться у історії поставки, може пройти кілька секунд.
|
||||
settings.webhook.redelivery=Зворотня доставка
|
||||
settings.webhook.redelivery_success=Завдання хуку '%s' було передодано у чергу доставки. Оновлення статусу доставки в історії може зайняти якийсь час.
|
||||
settings.webhook.request=Запит
|
||||
settings.webhook.response=Відповідь
|
||||
settings.webhook.headers=Заголовки
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
app_desc=基于 Go 语言的自助 Git 服务
|
||||
app_desc=一款极易搭建的自助 Git 服务
|
||||
|
||||
home=首页
|
||||
dashboard=控制面板
|
||||
@@ -82,6 +82,8 @@ app_url=应用 URL
|
||||
app_url_helper=该设置影响 HTTP/HTTPS 克隆地址和一些邮箱中的链接。
|
||||
log_root_path=日志路径
|
||||
log_root_path_helper=存放日志文件的目录
|
||||
enable_console_mode=启用控制台模式
|
||||
enable_console_mode_popup=除了使用文件模式外,还将日志输出到控制台
|
||||
|
||||
optional_title=可选设置
|
||||
email_title=邮件服务设置
|
||||
@@ -252,12 +254,11 @@ form.name_pattern_not_allowed=用户名不允许 '%s' 的格式。
|
||||
profile=个人信息
|
||||
password=修改密码
|
||||
avatar=头像设置
|
||||
ssh_keys=管理 SSH 密钥
|
||||
social=社交帐号绑定
|
||||
applications=管理授权应用
|
||||
orgs=管理组织
|
||||
ssh_keys=SSH 密钥
|
||||
repos=仓库列表
|
||||
orgs=组织列表
|
||||
applications=授权应用
|
||||
delete=删除帐户
|
||||
uid=用户 ID
|
||||
|
||||
public_profile=公开信息
|
||||
profile_desc=您的邮箱地址将会被公开,并被用于接收帐户的所有提醒和通知。
|
||||
@@ -344,6 +345,11 @@ orgs.none=您现在还不是任何组织的成员。
|
||||
orgs.leave_title=离开组织
|
||||
orgs.leave_desc=离开组织后,组织相关的所有仓库和团队权限将被收回。是否继续?
|
||||
|
||||
repos.leave=离开仓库
|
||||
repos.leave_title=退出仓库协作
|
||||
repos.leave_desc=离开仓库后,相关权限将被收回。是否继续?
|
||||
repos.leave_success=您已经成功退出 '%s' 的仓库协作!
|
||||
|
||||
delete_account=删除当前帐户
|
||||
delete_prompt=删除操作会永久清除您的帐户信息,并且 <strong>不可恢复</strong>!
|
||||
confirm_delete_account=确认删除帐户
|
||||
@@ -414,7 +420,7 @@ quick_guide=快速帮助
|
||||
clone_this_repo=克隆当前仓库
|
||||
create_new_repo_command=从命令行创建一个新的仓库
|
||||
push_exist_repo=从命令行推送已经创建的仓库
|
||||
repo_is_empty=该仓库不包含任何内容,请稍后再进行访问!
|
||||
bare_message=这个家伙很懒,什么都没有推送。
|
||||
|
||||
files=文件
|
||||
branch=分支
|
||||
@@ -647,12 +653,14 @@ settings.options=基本设置
|
||||
settings.collaboration=管理协作者
|
||||
settings.collaboration.admin=管理权限
|
||||
settings.collaboration.write=可写权限
|
||||
settings.collaboration.read=可读权限
|
||||
settings.collaboration.read=只读权限
|
||||
settings.collaboration.undefined=未定义
|
||||
settings.branches=管理分支
|
||||
settings.branches_bare=您无法对空仓库进行分支管理,请先推送一些内容到仓库。
|
||||
settings.default_branch=默认分支
|
||||
settings.default_branch_desc=默认分支是被用于代码提交、合并请求和在线编辑的基准分支。
|
||||
settings.update=更新
|
||||
settings.update_default_branch_unsupported=服务器上的 Git 版本不支持修改默认分支。
|
||||
settings.update_default_branch_success=仓库默认分支更新成功!
|
||||
settings.protected_branches=保护分支
|
||||
settings.protected_branches_desc=保护分支不被强制推送、意外删除和限制代码提交白名单。
|
||||
@@ -682,11 +690,13 @@ settings.change_reponame_prompt=该操作将会影响到所有与该仓库有关
|
||||
settings.advanced_settings=高级设置
|
||||
settings.wiki_desc=启用 Wiki 系统
|
||||
settings.use_internal_wiki=使用内置 Wiki 系统
|
||||
settings.allow_public_wiki_desc=当仓库为私有时,允许 Wiki 的公开访问
|
||||
settings.use_external_wiki=使用外部 Wiki
|
||||
settings.external_wiki_url=外部 Wiki 链接
|
||||
settings.external_wiki_url_desc=当访问者单击分页标签时,将会被重定向到该链接。
|
||||
settings.issues_desc=启用工单管理系统
|
||||
settings.use_internal_issue_tracker=使用内置的轻量级工单管理系统
|
||||
settings.allow_public_issues_desc=当仓库为私有时,允许工单的公开访问
|
||||
settings.use_external_issue_tracker=使用外部的工单管理系统
|
||||
settings.external_tracker_url=外部工单管理系统 URL
|
||||
settings.external_tracker_url_desc=当访问者单击分页标签时,将会被重定向到该链接。
|
||||
@@ -740,6 +750,8 @@ settings.webhook_deletion_success=Web 钩子删除成功!
|
||||
settings.webhook.test_delivery=测试推送
|
||||
settings.webhook.test_delivery_desc=生成并推送一个模拟的 Push 事件
|
||||
settings.webhook.test_delivery_success=测试推送已经加入到队列,请耐心等待数秒再刷新推送记录。
|
||||
settings.webhook.redelivery=重新推送
|
||||
settings.webhook.redelivery_success=任务 '%s' 已经被重新加入到推送队列,请耐心等待数秒再刷新推送记录。
|
||||
settings.webhook.request=请求内容
|
||||
settings.webhook.response=响应内容
|
||||
settings.webhook.headers=头信息
|
||||
@@ -1246,7 +1258,7 @@ delete_tag=删除了 <a href="%[1]s">%[3]s</a> 的标签 <code>%[2]s</code>
|
||||
[tool]
|
||||
ago=之前
|
||||
from_now=之后
|
||||
now=现在
|
||||
now=刚刚
|
||||
1s=1 秒%s
|
||||
1m=1 分钟%s
|
||||
1h=1 小时%s
|
||||
|
||||
@@ -82,6 +82,8 @@ app_url=應用程式網址
|
||||
app_url_helper=該設置影響 HTTP/HTTPS 複製地址和一些郵箱中的連結。
|
||||
log_root_path=日誌路徑
|
||||
log_root_path_helper=寫入日誌檔目錄
|
||||
enable_console_mode=Enable Console Mode
|
||||
enable_console_mode_popup=In addition to file mode, also print logs to console.
|
||||
|
||||
optional_title=可選設置
|
||||
email_title=電子郵件服務設定
|
||||
@@ -253,11 +255,10 @@ profile=個人信息
|
||||
password=修改密碼
|
||||
avatar=Avatar
|
||||
ssh_keys=管理 SSH 密鑰
|
||||
social=社交帳號綁定
|
||||
applications=管理授權應用
|
||||
repos=Repositories
|
||||
orgs=管理組織
|
||||
applications=管理授權應用
|
||||
delete=刪除帳戶
|
||||
uid=用戶 ID
|
||||
|
||||
public_profile=公開信息
|
||||
profile_desc=您的郵箱地址將會被公開,並被用於接收帳戶的所有提醒和通知。
|
||||
@@ -341,9 +342,14 @@ access_token_deletion_desc=刪除此連接token將會刪除與相關應用程式
|
||||
delete_token_success=您的連接token已成功刪除。請記得更新您的應用程式。
|
||||
|
||||
orgs.none=You are not a member of any organizations.
|
||||
orgs.leave_title=Leave an organization
|
||||
orgs.leave_title=Leave organization
|
||||
orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue?
|
||||
|
||||
repos.leave=Leave
|
||||
repos.leave_title=Leave repository
|
||||
repos.leave_desc=You will lose access to the repository after you left. Do you want to continue?
|
||||
repos.leave_success=You have left repository '%s' successfully!
|
||||
|
||||
delete_account=刪除當前帳戶
|
||||
delete_prompt=刪除操作會永久清除您的帳戶信息,並且 <strong>不可恢復</strong>!
|
||||
confirm_delete_account=確認刪除帳戶
|
||||
@@ -414,7 +420,7 @@ quick_guide=快速幫助
|
||||
clone_this_repo=複製當前倉庫
|
||||
create_new_repo_command=從命令行創建一個新的倉庫
|
||||
push_exist_repo=從命令行推送已經創建的倉庫
|
||||
repo_is_empty=這倉庫不包含任何內容,請稍後再訪問!
|
||||
bare_message=This repository does not have any content yet.
|
||||
|
||||
files=Files
|
||||
branch=分支
|
||||
@@ -650,9 +656,11 @@ settings.collaboration.write=Write
|
||||
settings.collaboration.read=Read
|
||||
settings.collaboration.undefined=Undefined
|
||||
settings.branches=Branches
|
||||
settings.branches_bare=You cannot manage branches for bare repository. Please push some content first.
|
||||
settings.default_branch=Default Branch
|
||||
settings.default_branch_desc=The default branch is considered the "base" branch for code commits, pull requests and online editing.
|
||||
settings.update=Update
|
||||
settings.update_default_branch_unsupported=Change default branch is not supported by the Git version on server.
|
||||
settings.update_default_branch_success=Default branch of this repository has been updated successfully!
|
||||
settings.protected_branches=Protected Branches
|
||||
settings.protected_branches_desc=Protect branches from force pushing, accidental deletion and whitelist code committers.
|
||||
@@ -682,11 +690,13 @@ settings.change_reponame_prompt=該操作將會影響到所有與該倉庫有關
|
||||
settings.advanced_settings=高級設置
|
||||
settings.wiki_desc=Enable wiki system
|
||||
settings.use_internal_wiki=Use builtin wiki
|
||||
settings.allow_public_wiki_desc=Allow public access to wiki when repository is private
|
||||
settings.use_external_wiki=使用外部 wiki
|
||||
settings.external_wiki_url=外部 Wiki 連結
|
||||
settings.external_wiki_url_desc=當分頁上按一下,訪客將會重新導到 URL。
|
||||
settings.issues_desc=Enable issue tracker
|
||||
settings.use_internal_issue_tracker=Use builtin lightweight issue tracker
|
||||
settings.allow_public_issues_desc=Allow public access to issues when repository is private
|
||||
settings.use_external_issue_tracker=使用外部的問題管理系統
|
||||
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.
|
||||
@@ -740,6 +750,8 @@ settings.webhook_deletion_success=Web 鉤子刪除成功!
|
||||
settings.webhook.test_delivery=測試推送
|
||||
settings.webhook.test_delivery_desc=生成並推送一個模擬的 Push 事件
|
||||
settings.webhook.test_delivery_success=測試推送已經加入到隊列,請耐心等待數秒再刷新推送記錄。
|
||||
settings.webhook.redelivery=Redelivery
|
||||
settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history.
|
||||
settings.webhook.request=請求內容
|
||||
settings.webhook.response=響應內容
|
||||
settings.webhook.headers=標題
|
||||
|
||||
@@ -82,6 +82,8 @@ app_url=應用程式網址
|
||||
app_url_helper=該設置影響 HTTP/HTTPS 複製地址和一些郵箱中的連結。
|
||||
log_root_path=日誌路徑
|
||||
log_root_path_helper=寫入日誌檔目錄
|
||||
enable_console_mode=Enable Console Mode
|
||||
enable_console_mode_popup=In addition to file mode, also print logs to console.
|
||||
|
||||
optional_title=可選設置
|
||||
email_title=電子郵件服務設定
|
||||
@@ -253,11 +255,10 @@ profile=個人信息
|
||||
password=修改密碼
|
||||
avatar=頭像
|
||||
ssh_keys=管理 SSH 密鑰
|
||||
social=社交帳號綁定
|
||||
applications=管理授權應用
|
||||
repos=Repositories
|
||||
orgs=管理組織
|
||||
applications=管理授權應用
|
||||
delete=刪除帳戶
|
||||
uid=用戶 ID
|
||||
|
||||
public_profile=公開信息
|
||||
profile_desc=您的郵箱地址將會被公開,並被用於接收帳戶的所有提醒和通知。
|
||||
@@ -344,6 +345,11 @@ orgs.none=您現在還不是任何組織的成員。
|
||||
orgs.leave_title=離開組織
|
||||
orgs.leave_desc=離開組織後,所有與組織相關的倉庫和團隊權限將被取消。是否繼續?
|
||||
|
||||
repos.leave=Leave
|
||||
repos.leave_title=Leave repository
|
||||
repos.leave_desc=You will lose access to the repository after you left. Do you want to continue?
|
||||
repos.leave_success=You have left repository '%s' successfully!
|
||||
|
||||
delete_account=刪除當前帳戶
|
||||
delete_prompt=刪除操作會永久清除您的帳戶信息,並且 <strong>不可恢復</strong>!
|
||||
confirm_delete_account=確認刪除帳戶
|
||||
@@ -414,7 +420,7 @@ quick_guide=快速幫助
|
||||
clone_this_repo=複製當前倉庫
|
||||
create_new_repo_command=從命令行創建一個新的倉庫
|
||||
push_exist_repo=從命令行推送已經創建的倉庫
|
||||
repo_is_empty=這倉庫不包含任何內容,請稍後再訪問!
|
||||
bare_message=This repository does not have any content yet.
|
||||
|
||||
files=檔案
|
||||
branch=分支
|
||||
@@ -650,9 +656,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.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_success=這個 repository 的預設分支更新成功!
|
||||
settings.protected_branches=保護分支
|
||||
settings.protected_branches_desc=保護分支不被強制 Push、意外刪除以及限制 Commit 者白名單
|
||||
@@ -682,11 +690,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.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.use_external_issue_tracker=使用外部的問題管理系統
|
||||
settings.external_tracker_url=外部Issue Tracker網址
|
||||
settings.external_tracker_url_desc=當訪客在分頁上按一下,他們將會重新導向到 URL。
|
||||
@@ -740,6 +750,8 @@ settings.webhook_deletion_success=Web 鉤子刪除成功!
|
||||
settings.webhook.test_delivery=測試推送
|
||||
settings.webhook.test_delivery_desc=生成並推送一個模擬的 Push 事件
|
||||
settings.webhook.test_delivery_success=測試推送已經加入到隊列,請耐心等待數秒再刷新推送記錄。
|
||||
settings.webhook.redelivery=Redelivery
|
||||
settings.webhook.redelivery_success=Hook task '%s' has been readded to delivery queue. It may take few seconds to update delivery status in history.
|
||||
settings.webhook.request=請求內容
|
||||
settings.webhook.response=響應內容
|
||||
settings.webhook.headers=標題
|
||||
|
||||
@@ -73,7 +73,7 @@ Most of settings are obvious and easy to understand, but there are some settings
|
||||
|
||||
Full documentation of application settings can be found [here](https://gogs.io/docs/advanced/configuration_cheat_sheet.html).
|
||||
|
||||
### Container Options
|
||||
### Container Options
|
||||
|
||||
This container have some options available via environment variables, these options are opt-in features that can help the administration of this container:
|
||||
|
||||
|
||||
@@ -16,7 +16,6 @@ ln -s /app/gogs/build ${GOPATH}/src/github.com/gogits/gogs
|
||||
cd ${GOPATH}/src/github.com/gogits/gogs
|
||||
# Needed since git 2.9.3 or 2.9.4
|
||||
git config --global http.https://gopkg.in.followRedirects true
|
||||
go get -v -tags "sqlite cert pam" ./...
|
||||
make build TAGS="sqlite cert pam"
|
||||
|
||||
# Cleanup GOPATH
|
||||
|
||||
4
gogs.go
4
gogs.go
@@ -13,10 +13,10 @@ import (
|
||||
"github.com/urfave/cli"
|
||||
|
||||
"github.com/gogits/gogs/cmd"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
const APP_VER = "0.10.18.0313"
|
||||
const APP_VER = "0.11.4.0405"
|
||||
|
||||
func init() {
|
||||
setting.AppVer = APP_VER
|
||||
|
||||
@@ -8,6 +8,8 @@ import (
|
||||
"fmt"
|
||||
|
||||
log "gopkg.in/clog.v1"
|
||||
|
||||
"github.com/gogits/gogs/models/errors"
|
||||
)
|
||||
|
||||
type AccessMode int
|
||||
@@ -109,7 +111,7 @@ func (u *User) GetRepositoryAccesses() (map[*Repository]AccessMode, error) {
|
||||
for _, access := range accesses {
|
||||
repo, err := GetRepositoryByID(access.RepoID)
|
||||
if err != nil {
|
||||
if IsErrRepoNotExist(err) {
|
||||
if errors.IsRepoNotExist(err) {
|
||||
log.Error(4, "GetRepositoryByID: %v", err)
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -20,8 +20,9 @@ import (
|
||||
"github.com/gogits/git-module"
|
||||
api "github.com/gogits/go-gogs-client"
|
||||
|
||||
"github.com/gogits/gogs/modules/base"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/models/errors"
|
||||
"github.com/gogits/gogs/pkg/tool"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
type ActionType int
|
||||
@@ -107,7 +108,7 @@ func (a *Action) GetActUserName() string {
|
||||
}
|
||||
|
||||
func (a *Action) ShortActUserName() string {
|
||||
return base.EllipsisString(a.ActUserName, 20)
|
||||
return tool.EllipsisString(a.ActUserName, 20)
|
||||
}
|
||||
|
||||
func (a *Action) GetRepoUserName() string {
|
||||
@@ -115,7 +116,7 @@ func (a *Action) GetRepoUserName() string {
|
||||
}
|
||||
|
||||
func (a *Action) ShortRepoUserName() string {
|
||||
return base.EllipsisString(a.RepoUserName, 20)
|
||||
return tool.EllipsisString(a.RepoUserName, 20)
|
||||
}
|
||||
|
||||
func (a *Action) GetRepoName() string {
|
||||
@@ -123,7 +124,7 @@ func (a *Action) GetRepoName() string {
|
||||
}
|
||||
|
||||
func (a *Action) ShortRepoName() string {
|
||||
return base.EllipsisString(a.RepoName, 33)
|
||||
return tool.EllipsisString(a.RepoName, 33)
|
||||
}
|
||||
|
||||
func (a *Action) GetRepoPath() string {
|
||||
@@ -250,20 +251,30 @@ func NewPushCommits() *PushCommits {
|
||||
}
|
||||
}
|
||||
|
||||
func (pc *PushCommits) ToApiPayloadCommits(repoLink string) []*api.PayloadCommit {
|
||||
func (pc *PushCommits) ToApiPayloadCommits(repoPath, repoLink string) ([]*api.PayloadCommit, error) {
|
||||
commits := make([]*api.PayloadCommit, len(pc.Commits))
|
||||
for i, commit := range pc.Commits {
|
||||
authorUsername := ""
|
||||
author, err := GetUserByEmail(commit.AuthorEmail)
|
||||
if err == nil {
|
||||
authorUsername = author.Name
|
||||
} else if !errors.IsUserNotExist(err) {
|
||||
return nil, fmt.Errorf("GetUserByEmail: %v", err)
|
||||
}
|
||||
|
||||
committerUsername := ""
|
||||
committer, err := GetUserByEmail(commit.CommitterEmail)
|
||||
if err == nil {
|
||||
// TODO: check errors other than email not found.
|
||||
committerUsername = committer.Name
|
||||
} else if !errors.IsUserNotExist(err) {
|
||||
return nil, fmt.Errorf("GetUserByEmail: %v", err)
|
||||
}
|
||||
|
||||
fileStatus, err := git.GetCommitFileStatus(repoPath, commit.Sha1)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("FileStatus [commit_sha1: %s]: %v", commit.Sha1, err)
|
||||
}
|
||||
|
||||
commits[i] = &api.PayloadCommit{
|
||||
ID: commit.Sha1,
|
||||
Message: commit.Message,
|
||||
@@ -278,10 +289,13 @@ func (pc *PushCommits) ToApiPayloadCommits(repoLink string) []*api.PayloadCommit
|
||||
Email: commit.CommitterEmail,
|
||||
UserName: committerUsername,
|
||||
},
|
||||
Added: fileStatus.Added,
|
||||
Removed: fileStatus.Removed,
|
||||
Modified: fileStatus.Modified,
|
||||
Timestamp: commit.Timestamp,
|
||||
}
|
||||
}
|
||||
return commits
|
||||
return commits, nil
|
||||
}
|
||||
|
||||
// AvatarLink tries to match user in database with e-mail
|
||||
@@ -291,8 +305,8 @@ func (push *PushCommits) AvatarLink(email string) string {
|
||||
if !ok {
|
||||
u, err := GetUserByEmail(email)
|
||||
if err != nil {
|
||||
push.avatars[email] = base.AvatarLink(email)
|
||||
if !IsErrUserNotExist(err) {
|
||||
push.avatars[email] = tool.AvatarLink(email)
|
||||
if !errors.IsUserNotExist(err) {
|
||||
log.Error(4, "GetUserByEmail: %v", err)
|
||||
}
|
||||
} else {
|
||||
@@ -329,7 +343,7 @@ func UpdateIssuesCommit(doer *User, repo *Repository, commits []*PushCommit) err
|
||||
|
||||
issue, err := GetIssueByRef(ref)
|
||||
if err != nil {
|
||||
if IsErrIssueNotExist(err) {
|
||||
if errors.IsIssueNotExist(err) {
|
||||
continue
|
||||
}
|
||||
return err
|
||||
@@ -372,7 +386,7 @@ func UpdateIssuesCommit(doer *User, repo *Repository, commits []*PushCommit) err
|
||||
|
||||
issue, err := GetIssueByRef(ref)
|
||||
if err != nil {
|
||||
if IsErrIssueNotExist(err) {
|
||||
if errors.IsIssueNotExist(err) {
|
||||
continue
|
||||
}
|
||||
return err
|
||||
@@ -412,7 +426,7 @@ func UpdateIssuesCommit(doer *User, repo *Repository, commits []*PushCommit) err
|
||||
|
||||
issue, err := GetIssueByRef(ref)
|
||||
if err != nil {
|
||||
if IsErrIssueNotExist(err) {
|
||||
if errors.IsIssueNotExist(err) {
|
||||
continue
|
||||
}
|
||||
return err
|
||||
@@ -545,12 +559,17 @@ func CommitRepoAction(opts CommitRepoActionOptions) error {
|
||||
}
|
||||
}
|
||||
|
||||
commits, err := opts.Commits.ToApiPayloadCommits(repo.RepoPath(), repo.HTMLURL())
|
||||
if err != nil {
|
||||
return fmt.Errorf("ToApiPayloadCommits: %v", err)
|
||||
}
|
||||
|
||||
if err = PrepareWebhooks(repo, HOOK_EVENT_PUSH, &api.PushPayload{
|
||||
Ref: opts.RefFullName,
|
||||
Before: opts.OldCommitID,
|
||||
After: opts.NewCommitID,
|
||||
CompareURL: compareURL,
|
||||
Commits: opts.Commits.ToApiPayloadCommits(repo.HTMLURL()),
|
||||
Commits: commits,
|
||||
Repo: apiRepo,
|
||||
Pusher: apiPusher,
|
||||
Sender: apiPusher,
|
||||
@@ -652,9 +671,12 @@ func MergePullRequestAction(actUser *User, repo *Repository, pull *Issue) error
|
||||
// GetFeeds returns action list of given user in given context.
|
||||
// actorID is the user who's requesting, ctxUserID is the user/org that is requested.
|
||||
// actorID can be -1 when isProfile is true or to skip the permission check.
|
||||
func GetFeeds(ctxUser *User, actorID, offset int64, isProfile bool) ([]*Action, error) {
|
||||
actions := make([]*Action, 0, 20)
|
||||
sess := x.Limit(20, int(offset)).Desc("id").Where("user_id = ?", ctxUser.ID)
|
||||
func GetFeeds(ctxUser *User, actorID, afterID int64, isProfile bool) ([]*Action, error) {
|
||||
actions := make([]*Action, 0, setting.UI.User.NewsFeedPagingNum)
|
||||
sess := x.Limit(setting.UI.User.NewsFeedPagingNum).Where("user_id = ?", ctxUser.ID).Desc("id")
|
||||
if afterID > 0 {
|
||||
sess.And("id < ?", afterID)
|
||||
}
|
||||
if isProfile {
|
||||
sess.And("is_private = ?", false).And("act_user_id = ?", ctxUser.ID)
|
||||
} else if actorID != -1 && ctxUser.IsOrganization() {
|
||||
|
||||
@@ -15,8 +15,8 @@ import (
|
||||
"github.com/go-xorm/xorm"
|
||||
log "gopkg.in/clog.v1"
|
||||
|
||||
"github.com/gogits/gogs/modules/base"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/pkg/tool"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
type NoticeType int
|
||||
@@ -128,6 +128,6 @@ func DeleteNoticesByIDs(ids []int64) error {
|
||||
if len(ids) == 0 {
|
||||
return nil
|
||||
}
|
||||
_, err := x.Where("id IN (" + strings.Join(base.Int64sToStrings(ids), ",") + ")").Delete(new(Notice))
|
||||
_, err := x.Where("id IN (" + strings.Join(tool.Int64sToStrings(ids), ",") + ")").Delete(new(Notice))
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ import (
|
||||
"github.com/go-xorm/xorm"
|
||||
gouuid "github.com/satori/go.uuid"
|
||||
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
// Attachment represent a attachment of issue/comment/release.
|
||||
|
||||
@@ -15,7 +15,8 @@ import (
|
||||
|
||||
api "github.com/gogits/go-gogs-client"
|
||||
|
||||
"github.com/gogits/gogs/modules/markdown"
|
||||
"github.com/gogits/gogs/models/errors"
|
||||
"github.com/gogits/gogs/pkg/markup"
|
||||
)
|
||||
|
||||
// CommentType defines whether a comment is just a simple comment, an action (like close) or a reference.
|
||||
@@ -95,7 +96,7 @@ func (c *Comment) loadAttributes(e Engine) (err error) {
|
||||
if c.Poster == nil {
|
||||
c.Poster, err = GetUserByID(c.PosterID)
|
||||
if err != nil {
|
||||
if IsErrUserNotExist(err) {
|
||||
if errors.IsUserNotExist(err) {
|
||||
c.PosterID = -1
|
||||
c.Poster = NewGhostUser()
|
||||
} else {
|
||||
@@ -167,7 +168,7 @@ func (c *Comment) EventTag() string {
|
||||
// mailParticipants sends new comment emails to repository watchers
|
||||
// and mentioned people.
|
||||
func (cmt *Comment) mailParticipants(e Engine, opType ActionType, issue *Issue) (err error) {
|
||||
mentions := markdown.FindAllMentions(cmt.Content)
|
||||
mentions := markup.FindAllMentions(cmt.Content)
|
||||
if err = updateIssueMentions(e, cmt.IssueID, mentions); err != nil {
|
||||
return fmt.Errorf("UpdateIssueMentions [%d]: %v", cmt.IssueID, err)
|
||||
}
|
||||
|
||||
@@ -54,20 +54,6 @@ func (err ErrUserAlreadyExist) Error() string {
|
||||
return fmt.Sprintf("user already exists [name: %s]", err.Name)
|
||||
}
|
||||
|
||||
type ErrUserNotExist struct {
|
||||
UID int64
|
||||
Name string
|
||||
}
|
||||
|
||||
func IsErrUserNotExist(err error) bool {
|
||||
_, ok := err.(ErrUserNotExist)
|
||||
return ok
|
||||
}
|
||||
|
||||
func (err ErrUserNotExist) Error() string {
|
||||
return fmt.Sprintf("user does not exist [uid: %d, name: %s]", err.UID, err.Name)
|
||||
}
|
||||
|
||||
type ErrEmailAlreadyUsed struct {
|
||||
Email string
|
||||
}
|
||||
@@ -319,21 +305,6 @@ func (err ErrLastOrgOwner) Error() string {
|
||||
// |____|_ /\___ > __/ \____/____ >__||__| \____/|__| / ____|
|
||||
// \/ \/|__| \/ \/
|
||||
|
||||
type ErrRepoNotExist struct {
|
||||
ID int64
|
||||
UID int64
|
||||
Name string
|
||||
}
|
||||
|
||||
func IsErrRepoNotExist(err error) bool {
|
||||
_, ok := err.(ErrRepoNotExist)
|
||||
return ok
|
||||
}
|
||||
|
||||
func (err ErrRepoNotExist) Error() string {
|
||||
return fmt.Sprintf("repository does not exist [id: %d, uid: %d, name: %s]", err.ID, err.UID, err.Name)
|
||||
}
|
||||
|
||||
type ErrRepoAlreadyExist struct {
|
||||
Uname string
|
||||
Name string
|
||||
@@ -450,48 +421,6 @@ func (err ErrBranchNotExist) Error() string {
|
||||
return fmt.Sprintf("branch does not exist [name: %s]", err.Name)
|
||||
}
|
||||
|
||||
// __ __ ___. .__ __
|
||||
// / \ / \ ____\_ |__ | |__ ____ ____ | | __
|
||||
// \ \/\/ // __ \| __ \| | \ / _ \ / _ \| |/ /
|
||||
// \ /\ ___/| \_\ \ Y ( <_> | <_> ) <
|
||||
// \__/\ / \___ >___ /___| /\____/ \____/|__|_ \
|
||||
// \/ \/ \/ \/ \/
|
||||
|
||||
type ErrWebhookNotExist struct {
|
||||
ID int64
|
||||
}
|
||||
|
||||
func IsErrWebhookNotExist(err error) bool {
|
||||
_, ok := err.(ErrWebhookNotExist)
|
||||
return ok
|
||||
}
|
||||
|
||||
func (err ErrWebhookNotExist) Error() string {
|
||||
return fmt.Sprintf("webhook does not exist [id: %d]", err.ID)
|
||||
}
|
||||
|
||||
// .___
|
||||
// | | ______ ________ __ ____
|
||||
// | |/ ___// ___/ | \_/ __ \
|
||||
// | |\___ \ \___ \| | /\ ___/
|
||||
// |___/____ >____ >____/ \___ >
|
||||
// \/ \/ \/
|
||||
|
||||
type ErrIssueNotExist struct {
|
||||
ID int64
|
||||
RepoID int64
|
||||
Index int64
|
||||
}
|
||||
|
||||
func IsErrIssueNotExist(err error) bool {
|
||||
_, ok := err.(ErrIssueNotExist)
|
||||
return ok
|
||||
}
|
||||
|
||||
func (err ErrIssueNotExist) Error() string {
|
||||
return fmt.Sprintf("issue does not exist [id: %d, repo_id: %d, index: %d]", err.ID, err.RepoID, err.Index)
|
||||
}
|
||||
|
||||
// __________ .__ .__ __________ __
|
||||
// \______ \__ __| | | |\______ \ ____ ________ __ ____ _______/ |_
|
||||
// | ___/ | \ | | | | _// __ \/ ____/ | \_/ __ \ / ___/\ __\
|
||||
|
||||
@@ -6,6 +6,21 @@ package errors
|
||||
|
||||
import "fmt"
|
||||
|
||||
type IssueNotExist struct {
|
||||
ID int64
|
||||
RepoID int64
|
||||
Index int64
|
||||
}
|
||||
|
||||
func IsIssueNotExist(err error) bool {
|
||||
_, ok := err.(IssueNotExist)
|
||||
return ok
|
||||
}
|
||||
|
||||
func (err IssueNotExist) Error() string {
|
||||
return fmt.Sprintf("issue does not exist [id: %d, repo_id: %d, index: %d]", err.ID, err.RepoID, err.Index)
|
||||
}
|
||||
|
||||
type InvalidIssueReference struct {
|
||||
Ref string
|
||||
}
|
||||
|
||||
@@ -6,6 +6,21 @@ package errors
|
||||
|
||||
import "fmt"
|
||||
|
||||
type RepoNotExist struct {
|
||||
ID int64
|
||||
UserID int64
|
||||
Name string
|
||||
}
|
||||
|
||||
func IsRepoNotExist(err error) bool {
|
||||
_, ok := err.(RepoNotExist)
|
||||
return ok
|
||||
}
|
||||
|
||||
func (err RepoNotExist) Error() string {
|
||||
return fmt.Sprintf("repository does not exist [id: %d, user_id: %d, name: %s]", err.ID, err.UserID, err.Name)
|
||||
}
|
||||
|
||||
type InvalidRepoReference struct {
|
||||
Ref string
|
||||
}
|
||||
|
||||
@@ -17,6 +17,20 @@ func (err EmptyName) Error() string {
|
||||
return "empty name"
|
||||
}
|
||||
|
||||
type UserNotExist struct {
|
||||
UserID int64
|
||||
Name string
|
||||
}
|
||||
|
||||
func IsUserNotExist(err error) bool {
|
||||
_, ok := err.(UserNotExist)
|
||||
return ok
|
||||
}
|
||||
|
||||
func (err UserNotExist) Error() string {
|
||||
return fmt.Sprintf("user does not exist [user_id: %d, name: %s]", err.UserID, err.Name)
|
||||
}
|
||||
|
||||
type UserNotKeyOwner struct {
|
||||
KeyID int64
|
||||
}
|
||||
|
||||
34
models/errors/webhook.go
Normal file
34
models/errors/webhook.go
Normal file
@@ -0,0 +1,34 @@
|
||||
// Copyright 2017 The Gogs Authors. All rights reserved.
|
||||
// Use of this source code is governed by a MIT-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package errors
|
||||
|
||||
import "fmt"
|
||||
|
||||
type WebhookNotExist struct {
|
||||
ID int64
|
||||
}
|
||||
|
||||
func IsWebhookNotExist(err error) bool {
|
||||
_, ok := err.(WebhookNotExist)
|
||||
return ok
|
||||
}
|
||||
|
||||
func (err WebhookNotExist) Error() string {
|
||||
return fmt.Sprintf("webhook does not exist [id: %d]", err.ID)
|
||||
}
|
||||
|
||||
type HookTaskNotExist struct {
|
||||
HookID int64
|
||||
UUID string
|
||||
}
|
||||
|
||||
func IsHookTaskNotExist(err error) bool {
|
||||
_, ok := err.(HookTaskNotExist)
|
||||
return ok
|
||||
}
|
||||
|
||||
func (err HookTaskNotExist) Error() string {
|
||||
return fmt.Sprintf("hook task does not exist [hook_id: %d, uuid: %s]", err.HookID, err.UUID)
|
||||
}
|
||||
@@ -5,63 +5,25 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"fmt"
|
||||
"html"
|
||||
"html/template"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"os/exec"
|
||||
"strings"
|
||||
|
||||
"github.com/Unknwon/com"
|
||||
"github.com/sergi/go-diff/diffmatchpatch"
|
||||
"golang.org/x/net/html/charset"
|
||||
"golang.org/x/text/transform"
|
||||
log "gopkg.in/clog.v1"
|
||||
|
||||
"github.com/gogits/git-module"
|
||||
|
||||
"github.com/gogits/gogs/modules/base"
|
||||
"github.com/gogits/gogs/modules/process"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/modules/template/highlight"
|
||||
"github.com/gogits/gogs/pkg/tool"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
"github.com/gogits/gogs/pkg/template/highlight"
|
||||
)
|
||||
|
||||
type DiffLineType uint8
|
||||
|
||||
const (
|
||||
DIFF_LINE_PLAIN DiffLineType = iota + 1
|
||||
DIFF_LINE_ADD
|
||||
DIFF_LINE_DEL
|
||||
DIFF_LINE_SECTION
|
||||
)
|
||||
|
||||
type DiffFileType uint8
|
||||
|
||||
const (
|
||||
DIFF_FILE_ADD DiffFileType = iota + 1
|
||||
DIFF_FILE_CHANGE
|
||||
DIFF_FILE_DEL
|
||||
DIFF_FILE_RENAME
|
||||
)
|
||||
|
||||
type DiffLine struct {
|
||||
LeftIdx int
|
||||
RightIdx int
|
||||
Type DiffLineType
|
||||
Content string
|
||||
}
|
||||
|
||||
func (d *DiffLine) GetType() int {
|
||||
return int(d.Type)
|
||||
}
|
||||
|
||||
type DiffSection struct {
|
||||
Name string
|
||||
Lines []*DiffLine
|
||||
*git.DiffSection
|
||||
}
|
||||
|
||||
var (
|
||||
@@ -70,24 +32,24 @@ var (
|
||||
codeTagSuffix = []byte("</span>")
|
||||
)
|
||||
|
||||
func diffToHTML(diffs []diffmatchpatch.Diff, lineType DiffLineType) template.HTML {
|
||||
func diffToHTML(diffs []diffmatchpatch.Diff, lineType git.DiffLineType) template.HTML {
|
||||
buf := bytes.NewBuffer(nil)
|
||||
|
||||
// Reproduce signs which are cutted for inline diff before.
|
||||
switch lineType {
|
||||
case DIFF_LINE_ADD:
|
||||
case git.DIFF_LINE_ADD:
|
||||
buf.WriteByte('+')
|
||||
case DIFF_LINE_DEL:
|
||||
case git.DIFF_LINE_DEL:
|
||||
buf.WriteByte('-')
|
||||
}
|
||||
|
||||
for i := range diffs {
|
||||
switch {
|
||||
case diffs[i].Type == diffmatchpatch.DiffInsert && lineType == DIFF_LINE_ADD:
|
||||
case diffs[i].Type == diffmatchpatch.DiffInsert && lineType == git.DIFF_LINE_ADD:
|
||||
buf.Write(addedCodePrefix)
|
||||
buf.WriteString(html.EscapeString(diffs[i].Text))
|
||||
buf.Write(codeTagSuffix)
|
||||
case diffs[i].Type == diffmatchpatch.DiffDelete && lineType == DIFF_LINE_DEL:
|
||||
case diffs[i].Type == diffmatchpatch.DiffDelete && lineType == git.DIFF_LINE_DEL:
|
||||
buf.Write(removedCodePrefix)
|
||||
buf.WriteString(html.EscapeString(diffs[i].Text))
|
||||
buf.Write(codeTagSuffix)
|
||||
@@ -99,77 +61,34 @@ func diffToHTML(diffs []diffmatchpatch.Diff, lineType DiffLineType) template.HTM
|
||||
return template.HTML(buf.Bytes())
|
||||
}
|
||||
|
||||
// get an specific line by type (add or del) and file line number
|
||||
func (diffSection *DiffSection) GetLine(lineType DiffLineType, idx int) *DiffLine {
|
||||
var (
|
||||
difference = 0
|
||||
addCount = 0
|
||||
delCount = 0
|
||||
matchDiffLine *DiffLine
|
||||
)
|
||||
|
||||
LOOP:
|
||||
for _, diffLine := range diffSection.Lines {
|
||||
switch diffLine.Type {
|
||||
case DIFF_LINE_ADD:
|
||||
addCount++
|
||||
case DIFF_LINE_DEL:
|
||||
delCount++
|
||||
default:
|
||||
if matchDiffLine != nil {
|
||||
break LOOP
|
||||
}
|
||||
difference = diffLine.RightIdx - diffLine.LeftIdx
|
||||
addCount = 0
|
||||
delCount = 0
|
||||
}
|
||||
|
||||
switch lineType {
|
||||
case DIFF_LINE_DEL:
|
||||
if diffLine.RightIdx == 0 && diffLine.LeftIdx == idx-difference {
|
||||
matchDiffLine = diffLine
|
||||
}
|
||||
case DIFF_LINE_ADD:
|
||||
if diffLine.LeftIdx == 0 && diffLine.RightIdx == idx+difference {
|
||||
matchDiffLine = diffLine
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if addCount == delCount {
|
||||
return matchDiffLine
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
var diffMatchPatch = diffmatchpatch.New()
|
||||
|
||||
func init() {
|
||||
diffMatchPatch.DiffEditCost = 100
|
||||
}
|
||||
|
||||
// computes inline diff for the given line
|
||||
func (diffSection *DiffSection) GetComputedInlineDiffFor(diffLine *DiffLine) template.HTML {
|
||||
// ComputedInlineDiffFor computes inline diff for the given line.
|
||||
func (diffSection *DiffSection) ComputedInlineDiffFor(diffLine *git.DiffLine) template.HTML {
|
||||
if setting.Git.DisableDiffHighlight {
|
||||
return template.HTML(html.EscapeString(diffLine.Content[1:]))
|
||||
}
|
||||
var (
|
||||
compareDiffLine *DiffLine
|
||||
compareDiffLine *git.DiffLine
|
||||
diff1 string
|
||||
diff2 string
|
||||
)
|
||||
|
||||
// try to find equivalent diff line. ignore, otherwise
|
||||
switch diffLine.Type {
|
||||
case DIFF_LINE_ADD:
|
||||
compareDiffLine = diffSection.GetLine(DIFF_LINE_DEL, diffLine.RightIdx)
|
||||
case git.DIFF_LINE_ADD:
|
||||
compareDiffLine = diffSection.Line(git.DIFF_LINE_DEL, diffLine.RightIdx)
|
||||
if compareDiffLine == nil {
|
||||
return template.HTML(html.EscapeString(diffLine.Content))
|
||||
}
|
||||
diff1 = compareDiffLine.Content
|
||||
diff2 = diffLine.Content
|
||||
case DIFF_LINE_DEL:
|
||||
compareDiffLine = diffSection.GetLine(DIFF_LINE_ADD, diffLine.LeftIdx)
|
||||
case git.DIFF_LINE_DEL:
|
||||
compareDiffLine = diffSection.Line(git.DIFF_LINE_ADD, diffLine.LeftIdx)
|
||||
if compareDiffLine == nil {
|
||||
return template.HTML(html.EscapeString(diffLine.Content))
|
||||
}
|
||||
@@ -186,336 +105,90 @@ func (diffSection *DiffSection) GetComputedInlineDiffFor(diffLine *DiffLine) tem
|
||||
}
|
||||
|
||||
type DiffFile struct {
|
||||
Name string
|
||||
OldName string
|
||||
Index string // 40-byte SHA, Changed/New: new SHA; Deleted: old SHA
|
||||
Addition, Deletion int
|
||||
Type DiffFileType
|
||||
IsCreated bool
|
||||
IsDeleted bool
|
||||
IsBin bool
|
||||
IsRenamed bool
|
||||
IsSubmodule bool
|
||||
Sections []*DiffSection
|
||||
IsIncomplete bool
|
||||
*git.DiffFile
|
||||
Sections []*DiffSection
|
||||
}
|
||||
|
||||
func (diffFile *DiffFile) GetType() int {
|
||||
return int(diffFile.Type)
|
||||
}
|
||||
|
||||
func (diffFile *DiffFile) GetHighlightClass() string {
|
||||
func (diffFile *DiffFile) HighlightClass() string {
|
||||
return highlight.FileNameToHighlightClass(diffFile.Name)
|
||||
}
|
||||
|
||||
type Diff struct {
|
||||
TotalAddition, TotalDeletion int
|
||||
Files []*DiffFile
|
||||
IsIncomplete bool
|
||||
*git.Diff
|
||||
Files []*DiffFile
|
||||
}
|
||||
|
||||
func (diff *Diff) NumFiles() int {
|
||||
return len(diff.Files)
|
||||
}
|
||||
|
||||
const DIFF_HEAD = "diff --git "
|
||||
|
||||
// TODO: move this function to gogits/git-module
|
||||
func ParsePatch(maxLines, maxLineCharacteres, maxFiles int, reader io.Reader) (*Diff, error) {
|
||||
var (
|
||||
diff = &Diff{Files: make([]*DiffFile, 0)}
|
||||
|
||||
curFile *DiffFile
|
||||
curSection = &DiffSection{
|
||||
Lines: make([]*DiffLine, 0, 10),
|
||||
}
|
||||
|
||||
leftLine, rightLine int
|
||||
lineCount int
|
||||
curFileLinesCount int
|
||||
)
|
||||
|
||||
input := bufio.NewReader(reader)
|
||||
isEOF := false
|
||||
for !isEOF {
|
||||
line, err := input.ReadString('\n')
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
isEOF = true
|
||||
} else {
|
||||
return nil, fmt.Errorf("ReadString: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
if len(line) > 0 && line[len(line)-1] == '\n' {
|
||||
// Remove line break.
|
||||
line = line[:len(line)-1]
|
||||
}
|
||||
|
||||
if strings.HasPrefix(line, "+++ ") || strings.HasPrefix(line, "--- ") || len(line) == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
curFileLinesCount++
|
||||
lineCount++
|
||||
|
||||
// Diff data too large, we only show the first about maxlines lines
|
||||
if curFileLinesCount >= maxLines || len(line) >= maxLineCharacteres {
|
||||
curFile.IsIncomplete = true
|
||||
}
|
||||
|
||||
switch {
|
||||
case line[0] == ' ':
|
||||
diffLine := &DiffLine{Type: DIFF_LINE_PLAIN, Content: line, LeftIdx: leftLine, RightIdx: rightLine}
|
||||
leftLine++
|
||||
rightLine++
|
||||
curSection.Lines = append(curSection.Lines, diffLine)
|
||||
continue
|
||||
case line[0] == '@':
|
||||
curSection = &DiffSection{}
|
||||
curFile.Sections = append(curFile.Sections, curSection)
|
||||
ss := strings.Split(line, "@@")
|
||||
diffLine := &DiffLine{Type: DIFF_LINE_SECTION, Content: line}
|
||||
curSection.Lines = append(curSection.Lines, diffLine)
|
||||
|
||||
// Parse line number.
|
||||
ranges := strings.Split(ss[1][1:], " ")
|
||||
leftLine, _ = com.StrTo(strings.Split(ranges[0], ",")[0][1:]).Int()
|
||||
if len(ranges) > 1 {
|
||||
rightLine, _ = com.StrTo(strings.Split(ranges[1], ",")[0]).Int()
|
||||
} else {
|
||||
log.Warn("Parse line number failed: %v", line)
|
||||
rightLine = leftLine
|
||||
}
|
||||
continue
|
||||
case line[0] == '+':
|
||||
curFile.Addition++
|
||||
diff.TotalAddition++
|
||||
diffLine := &DiffLine{Type: DIFF_LINE_ADD, Content: line, RightIdx: rightLine}
|
||||
rightLine++
|
||||
curSection.Lines = append(curSection.Lines, diffLine)
|
||||
continue
|
||||
case line[0] == '-':
|
||||
curFile.Deletion++
|
||||
diff.TotalDeletion++
|
||||
diffLine := &DiffLine{Type: DIFF_LINE_DEL, Content: line, LeftIdx: leftLine}
|
||||
if leftLine > 0 {
|
||||
leftLine++
|
||||
}
|
||||
curSection.Lines = append(curSection.Lines, diffLine)
|
||||
case strings.HasPrefix(line, "Binary"):
|
||||
curFile.IsBin = true
|
||||
continue
|
||||
}
|
||||
|
||||
// Get new file.
|
||||
if strings.HasPrefix(line, DIFF_HEAD) {
|
||||
middle := -1
|
||||
|
||||
// Note: In case file name is surrounded by double quotes (it happens only in git-shell).
|
||||
// e.g. diff --git "a/xxx" "b/xxx"
|
||||
hasQuote := line[len(DIFF_HEAD)] == '"'
|
||||
if hasQuote {
|
||||
middle = strings.Index(line, ` "b/`)
|
||||
} else {
|
||||
middle = strings.Index(line, " b/")
|
||||
}
|
||||
|
||||
beg := len(DIFF_HEAD)
|
||||
a := line[beg+2 : middle]
|
||||
b := line[middle+3:]
|
||||
if hasQuote {
|
||||
a = string(git.UnescapeChars([]byte(a[1 : len(a)-1])))
|
||||
b = string(git.UnescapeChars([]byte(b[1 : len(b)-1])))
|
||||
}
|
||||
|
||||
curFile = &DiffFile{
|
||||
Name: a,
|
||||
Type: DIFF_FILE_CHANGE,
|
||||
Sections: make([]*DiffSection, 0, 10),
|
||||
}
|
||||
diff.Files = append(diff.Files, curFile)
|
||||
if len(diff.Files) >= maxFiles {
|
||||
diff.IsIncomplete = true
|
||||
io.Copy(ioutil.Discard, reader)
|
||||
break
|
||||
}
|
||||
curFileLinesCount = 0
|
||||
|
||||
// Check file diff type and submodule.
|
||||
CHECK_TYPE:
|
||||
for {
|
||||
line, err := input.ReadString('\n')
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
isEOF = true
|
||||
} else {
|
||||
return nil, fmt.Errorf("ReadString: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
switch {
|
||||
case strings.HasPrefix(line, "new file"):
|
||||
curFile.Type = DIFF_FILE_ADD
|
||||
curFile.IsCreated = true
|
||||
curFile.IsSubmodule = strings.HasSuffix(line, " 160000\n")
|
||||
case strings.HasPrefix(line, "deleted"):
|
||||
curFile.Type = DIFF_FILE_DEL
|
||||
curFile.IsDeleted = true
|
||||
curFile.IsSubmodule = strings.HasSuffix(line, " 160000\n")
|
||||
case strings.HasPrefix(line, "index"):
|
||||
if curFile.IsDeleted {
|
||||
curFile.Index = line[6:46]
|
||||
} else if len(line) >= 88 {
|
||||
curFile.Index = line[49:88]
|
||||
} else {
|
||||
curFile.Index = curFile.Name
|
||||
}
|
||||
break CHECK_TYPE
|
||||
case strings.HasPrefix(line, "similarity index 100%"):
|
||||
curFile.Type = DIFF_FILE_RENAME
|
||||
curFile.IsRenamed = true
|
||||
curFile.OldName = curFile.Name
|
||||
curFile.Name = b
|
||||
curFile.Index = b
|
||||
break CHECK_TYPE
|
||||
}
|
||||
}
|
||||
}
|
||||
func NewDiff(gitDiff *git.Diff) *Diff {
|
||||
diff := &Diff{
|
||||
Diff: gitDiff,
|
||||
Files: make([]*DiffFile, gitDiff.NumFiles()),
|
||||
}
|
||||
|
||||
// FIXME: detect encoding while parsing.
|
||||
var buf bytes.Buffer
|
||||
for _, f := range diff.Files {
|
||||
for i := range gitDiff.Files {
|
||||
buf.Reset()
|
||||
for _, sec := range f.Sections {
|
||||
for _, l := range sec.Lines {
|
||||
buf.WriteString(l.Content)
|
||||
|
||||
diff.Files[i] = &DiffFile{
|
||||
DiffFile: gitDiff.Files[i],
|
||||
Sections: make([]*DiffSection, gitDiff.Files[i].NumSections()),
|
||||
}
|
||||
|
||||
for j := range gitDiff.Files[i].Sections {
|
||||
diff.Files[i].Sections[j] = &DiffSection{
|
||||
DiffSection: gitDiff.Files[i].Sections[j],
|
||||
}
|
||||
|
||||
for k := range diff.Files[i].Sections[j].Lines {
|
||||
buf.WriteString(diff.Files[i].Sections[j].Lines[k].Content)
|
||||
buf.WriteString("\n")
|
||||
}
|
||||
}
|
||||
charsetLabel, err := base.DetectEncoding(buf.Bytes())
|
||||
|
||||
charsetLabel, err := tool.DetectEncoding(buf.Bytes())
|
||||
if charsetLabel != "UTF-8" && err == nil {
|
||||
encoding, _ := charset.Lookup(charsetLabel)
|
||||
if encoding != nil {
|
||||
d := encoding.NewDecoder()
|
||||
for _, sec := range f.Sections {
|
||||
for _, l := range sec.Lines {
|
||||
if c, _, err := transform.String(d, l.Content); err == nil {
|
||||
l.Content = c
|
||||
for j := range diff.Files[i].Sections {
|
||||
for k := range diff.Files[i].Sections[j].Lines {
|
||||
if c, _, err := transform.String(d, diff.Files[i].Sections[j].Lines[k].Content); err == nil {
|
||||
diff.Files[i].Sections[j].Lines[k].Content = c
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return diff, nil
|
||||
|
||||
return diff
|
||||
}
|
||||
|
||||
func ParsePatch(maxLines, maxLineCharacteres, maxFiles int, reader io.Reader) (*Diff, error) {
|
||||
done := make(chan error)
|
||||
var gitDiff *git.Diff
|
||||
go func() {
|
||||
gitDiff = git.ParsePatch(done, maxLines, maxLineCharacteres, maxFiles, reader)
|
||||
}()
|
||||
|
||||
if err := <-done; err != nil {
|
||||
return nil, fmt.Errorf("ParsePatch: %v", err)
|
||||
}
|
||||
return NewDiff(gitDiff), nil
|
||||
}
|
||||
|
||||
func GetDiffRange(repoPath, beforeCommitID, afterCommitID string, maxLines, maxLineCharacteres, maxFiles int) (*Diff, error) {
|
||||
gitRepo, err := git.OpenRepository(repoPath)
|
||||
gitDiff, err := git.GetDiffRange(repoPath, beforeCommitID, afterCommitID, maxLines, maxLineCharacteres, maxFiles)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, fmt.Errorf("GetDiffRange: %v", err)
|
||||
}
|
||||
|
||||
commit, err := gitRepo.GetCommit(afterCommitID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var cmd *exec.Cmd
|
||||
// if "after" commit given
|
||||
if len(beforeCommitID) == 0 {
|
||||
// First commit of repository.
|
||||
if commit.ParentCount() == 0 {
|
||||
cmd = exec.Command("git", "show", "--full-index", afterCommitID)
|
||||
} else {
|
||||
c, _ := commit.Parent(0)
|
||||
cmd = exec.Command("git", "diff", "--full-index", "-M", c.ID.String(), afterCommitID)
|
||||
}
|
||||
} else {
|
||||
cmd = exec.Command("git", "diff", "--full-index", "-M", beforeCommitID, afterCommitID)
|
||||
}
|
||||
cmd.Dir = repoPath
|
||||
cmd.Stderr = os.Stderr
|
||||
|
||||
stdout, err := cmd.StdoutPipe()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("StdoutPipe: %v", err)
|
||||
}
|
||||
|
||||
if err = cmd.Start(); err != nil {
|
||||
return nil, fmt.Errorf("Start: %v", err)
|
||||
}
|
||||
|
||||
pid := process.Add(fmt.Sprintf("GetDiffRange [repo_path: %s]", repoPath), cmd)
|
||||
defer process.Remove(pid)
|
||||
|
||||
diff, err := ParsePatch(maxLines, maxLineCharacteres, maxFiles, stdout)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("ParsePatch: %v", err)
|
||||
}
|
||||
|
||||
if err = cmd.Wait(); err != nil {
|
||||
return nil, fmt.Errorf("Wait: %v", err)
|
||||
}
|
||||
|
||||
return diff, nil
|
||||
}
|
||||
|
||||
type RawDiffType string
|
||||
|
||||
const (
|
||||
RAW_DIFF_NORMAL RawDiffType = "diff"
|
||||
RAW_DIFF_PATCH RawDiffType = "patch"
|
||||
)
|
||||
|
||||
// GetRawDiff dumps diff results of repository in given commit ID to io.Writer.
|
||||
// TODO: move this function to gogits/git-module
|
||||
func GetRawDiff(repoPath, commitID string, diffType RawDiffType, writer io.Writer) error {
|
||||
repo, err := git.OpenRepository(repoPath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("OpenRepository: %v", err)
|
||||
}
|
||||
|
||||
commit, err := repo.GetCommit(commitID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("GetCommit: %v", err)
|
||||
}
|
||||
|
||||
var cmd *exec.Cmd
|
||||
switch diffType {
|
||||
case RAW_DIFF_NORMAL:
|
||||
if commit.ParentCount() == 0 {
|
||||
cmd = exec.Command("git", "show", commitID)
|
||||
} else {
|
||||
c, _ := commit.Parent(0)
|
||||
cmd = exec.Command("git", "diff", "-M", c.ID.String(), commitID)
|
||||
}
|
||||
case RAW_DIFF_PATCH:
|
||||
if commit.ParentCount() == 0 {
|
||||
cmd = exec.Command("git", "format-patch", "--no-signature", "--stdout", "--root", commitID)
|
||||
} else {
|
||||
c, _ := commit.Parent(0)
|
||||
query := fmt.Sprintf("%s...%s", commitID, c.ID.String())
|
||||
cmd = exec.Command("git", "format-patch", "--no-signature", "--stdout", query)
|
||||
}
|
||||
default:
|
||||
return fmt.Errorf("invalid diffType: %s", diffType)
|
||||
}
|
||||
|
||||
stderr := new(bytes.Buffer)
|
||||
|
||||
cmd.Dir = repoPath
|
||||
cmd.Stdout = writer
|
||||
cmd.Stderr = stderr
|
||||
|
||||
if err = cmd.Run(); err != nil {
|
||||
return fmt.Errorf("Run: %v - %s", err, stderr)
|
||||
}
|
||||
return nil
|
||||
return NewDiff(gitDiff), nil
|
||||
}
|
||||
|
||||
func GetDiffCommit(repoPath, commitID string, maxLines, maxLineCharacteres, maxFiles int) (*Diff, error) {
|
||||
return GetDiffRange(repoPath, "", commitID, maxLines, maxLineCharacteres, maxFiles)
|
||||
gitDiff, err := git.GetDiffCommit(repoPath, commitID, maxLines, maxLineCharacteres, maxFiles)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("GetDiffCommit: %v", err)
|
||||
}
|
||||
return NewDiff(gitDiff), nil
|
||||
}
|
||||
|
||||
@@ -1,9 +1,15 @@
|
||||
// Copyright 2016 The Gogs Authors. All rights reserved.
|
||||
// Use of this source code is governed by a MIT-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package models
|
||||
|
||||
import (
|
||||
dmp "github.com/sergi/go-diff/diffmatchpatch"
|
||||
"html/template"
|
||||
"testing"
|
||||
|
||||
"github.com/gogits/git-module"
|
||||
dmp "github.com/sergi/go-diff/diffmatchpatch"
|
||||
)
|
||||
|
||||
func assertEqual(t *testing.T, s1 string, s2 template.HTML) {
|
||||
@@ -12,24 +18,24 @@ func assertEqual(t *testing.T, s1 string, s2 template.HTML) {
|
||||
}
|
||||
}
|
||||
|
||||
func assertLineEqual(t *testing.T, d1 *DiffLine, d2 *DiffLine) {
|
||||
func assertLineEqual(t *testing.T, d1 *git.DiffLine, d2 *git.DiffLine) {
|
||||
if d1 != d2 {
|
||||
t.Errorf("%v should be equal %v", d1, d2)
|
||||
}
|
||||
}
|
||||
|
||||
func TestDiffToHTML(t *testing.T) {
|
||||
func Test_diffToHTML(t *testing.T) {
|
||||
assertEqual(t, "+foo <span class=\"added-code\">bar</span> biz", diffToHTML([]dmp.Diff{
|
||||
dmp.Diff{dmp.DiffEqual, "foo "},
|
||||
dmp.Diff{dmp.DiffInsert, "bar"},
|
||||
dmp.Diff{dmp.DiffDelete, " baz"},
|
||||
dmp.Diff{dmp.DiffEqual, " biz"},
|
||||
}, DIFF_LINE_ADD))
|
||||
}, git.DIFF_LINE_ADD))
|
||||
|
||||
assertEqual(t, "-foo <span class=\"removed-code\">bar</span> biz", diffToHTML([]dmp.Diff{
|
||||
dmp.Diff{dmp.DiffEqual, "foo "},
|
||||
dmp.Diff{dmp.DiffDelete, "bar"},
|
||||
dmp.Diff{dmp.DiffInsert, " baz"},
|
||||
dmp.Diff{dmp.DiffEqual, " biz"},
|
||||
}, DIFF_LINE_DEL))
|
||||
}, git.DIFF_LINE_DEL))
|
||||
}
|
||||
|
||||
@@ -16,8 +16,8 @@ import (
|
||||
api "github.com/gogits/go-gogs-client"
|
||||
|
||||
"github.com/gogits/gogs/models/errors"
|
||||
"github.com/gogits/gogs/modules/base"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/pkg/tool"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -90,7 +90,7 @@ func (issue *Issue) loadAttributes(e Engine) (err error) {
|
||||
if issue.Poster == nil {
|
||||
issue.Poster, err = getUserByID(e, issue.PosterID)
|
||||
if err != nil {
|
||||
if IsErrUserNotExist(err) {
|
||||
if errors.IsUserNotExist(err) {
|
||||
issue.PosterID = -1
|
||||
issue.Poster = NewGhostUser()
|
||||
} else {
|
||||
@@ -390,7 +390,7 @@ func (i *Issue) GetAssignee() (err error) {
|
||||
}
|
||||
|
||||
i.Assignee, err = GetUserByID(i.AssigneeID)
|
||||
if IsErrUserNotExist(err) {
|
||||
if errors.IsUserNotExist(err) {
|
||||
return nil
|
||||
}
|
||||
return err
|
||||
@@ -595,7 +595,7 @@ func (issue *Issue) ChangeAssignee(doer *User, assigneeID int64) (err error) {
|
||||
}
|
||||
|
||||
issue.Assignee, err = GetUserByID(issue.AssigneeID)
|
||||
if err != nil && !IsErrUserNotExist(err) {
|
||||
if err != nil && !errors.IsUserNotExist(err) {
|
||||
log.Error(4, "GetUserByID [assignee_id: %v]: %v", issue.AssigneeID, err)
|
||||
return nil
|
||||
}
|
||||
@@ -668,7 +668,7 @@ func newIssue(e *xorm.Session, opts NewIssueOptions) (err error) {
|
||||
|
||||
if opts.Issue.AssigneeID > 0 {
|
||||
assignee, err := getUserByID(e, opts.Issue.AssigneeID)
|
||||
if err != nil && !IsErrUserNotExist(err) {
|
||||
if err != nil && !errors.IsUserNotExist(err) {
|
||||
return fmt.Errorf("getUserByID: %v", err)
|
||||
}
|
||||
|
||||
@@ -827,7 +827,7 @@ func GetRawIssueByIndex(repoID, index int64) (*Issue, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if !has {
|
||||
return nil, ErrIssueNotExist{0, repoID, index}
|
||||
return nil, errors.IssueNotExist{0, repoID, index}
|
||||
}
|
||||
return issue, nil
|
||||
}
|
||||
@@ -847,7 +847,7 @@ func getRawIssueByID(e Engine, id int64) (*Issue, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if !has {
|
||||
return nil, ErrIssueNotExist{id, 0, 0}
|
||||
return nil, errors.IssueNotExist{id, 0, 0}
|
||||
}
|
||||
return issue, nil
|
||||
}
|
||||
@@ -895,7 +895,7 @@ func buildIssuesQuery(opts *IssuesOptions) *xorm.Session {
|
||||
if len(opts.RepoIDs) == 0 {
|
||||
return nil
|
||||
}
|
||||
sess.In("issue.repo_id", base.Int64sToStrings(opts.RepoIDs)).And("issue.is_closed=?", opts.IsClosed)
|
||||
sess.In("issue.repo_id", opts.RepoIDs).And("issue.is_closed=?", opts.IsClosed)
|
||||
} else {
|
||||
sess.Where("issue.is_closed=?", opts.IsClosed)
|
||||
}
|
||||
@@ -930,7 +930,7 @@ func buildIssuesQuery(opts *IssuesOptions) *xorm.Session {
|
||||
}
|
||||
|
||||
if len(opts.Labels) > 0 && opts.Labels != "0" {
|
||||
labelIDs := base.StringsToInt64s(strings.Split(opts.Labels, ","))
|
||||
labelIDs := strings.Split(opts.Labels, ",")
|
||||
if len(labelIDs) > 0 {
|
||||
sess.Join("INNER", "issue_label", "issue.id = issue_label.issue_id").In("issue_label.label_id", labelIDs)
|
||||
}
|
||||
@@ -1213,7 +1213,7 @@ func GetIssueStats(opts *IssueStatsOptions) *IssueStats {
|
||||
sess := x.Where("issue.repo_id = ?", opts.RepoID).And("is_pull = ?", opts.IsPull)
|
||||
|
||||
if len(opts.Labels) > 0 && opts.Labels != "0" {
|
||||
labelIDs := base.StringsToInt64s(strings.Split(opts.Labels, ","))
|
||||
labelIDs := tool.StringsToInt64s(strings.Split(opts.Labels, ","))
|
||||
if len(labelIDs) > 0 {
|
||||
sess.Join("INNER", "issue_label", "issue.id = issue_id").In("label_id", labelIDs)
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ import (
|
||||
|
||||
api "github.com/gogits/go-gogs-client"
|
||||
|
||||
"github.com/gogits/gogs/modules/base"
|
||||
"github.com/gogits/gogs/pkg/tool"
|
||||
)
|
||||
|
||||
var labelColorPattern = regexp.MustCompile("#([a-fA-F0-9]{6})")
|
||||
@@ -138,7 +138,7 @@ func GetLabelOfRepoByID(repoID, labelID int64) (*Label, error) {
|
||||
// it silently ignores label IDs that are not belong to the repository.
|
||||
func GetLabelsInRepoByIDs(repoID int64, labelIDs []int64) ([]*Label, error) {
|
||||
labels := make([]*Label, 0, len(labelIDs))
|
||||
return labels, x.Where("repo_id = ?", repoID).In("id", base.Int64sToStrings(labelIDs)).Asc("name").Find(&labels)
|
||||
return labels, x.Where("repo_id = ?", repoID).In("id", tool.Int64sToStrings(labelIDs)).Asc("name").Find(&labels)
|
||||
}
|
||||
|
||||
// GetLabelsByRepoID returns all labels that belong to given repository by ID.
|
||||
@@ -161,7 +161,7 @@ func getLabelsByIssueID(e Engine, issueID int64) ([]*Label, error) {
|
||||
}
|
||||
|
||||
labels := make([]*Label, 0, len(labelIDs))
|
||||
return labels, e.Where("id > 0").In("id", base.Int64sToStrings(labelIDs)).Asc("name").Find(&labels)
|
||||
return labels, e.Where("id > 0").In("id", tool.Int64sToStrings(labelIDs)).Asc("name").Find(&labels)
|
||||
}
|
||||
|
||||
// GetLabelsByIssueID returns all labels that belong to given issue by ID.
|
||||
|
||||
@@ -10,9 +10,9 @@ import (
|
||||
"github.com/Unknwon/com"
|
||||
log "gopkg.in/clog.v1"
|
||||
|
||||
"github.com/gogits/gogs/modules/mailer"
|
||||
"github.com/gogits/gogs/modules/markdown"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/pkg/mailer"
|
||||
"github.com/gogits/gogs/pkg/markup"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
func (issue *Issue) MailSubject() string {
|
||||
@@ -162,7 +162,7 @@ func mailIssueCommentToParticipants(issue *Issue, doer *User, mentions []string)
|
||||
// MailParticipants sends new issue thread created emails to repository watchers
|
||||
// and mentioned people.
|
||||
func (issue *Issue) MailParticipants() (err error) {
|
||||
mentions := markdown.FindAllMentions(issue.Content)
|
||||
mentions := markup.FindAllMentions(issue.Content)
|
||||
if err = updateIssueMentions(x, issue.ID, mentions); err != nil {
|
||||
return fmt.Errorf("UpdateIssueMentions [%d]: %v", issue.ID, err)
|
||||
}
|
||||
|
||||
@@ -20,8 +20,8 @@ import (
|
||||
log "gopkg.in/clog.v1"
|
||||
|
||||
"github.com/gogits/gogs/models/errors"
|
||||
"github.com/gogits/gogs/modules/auth/ldap"
|
||||
"github.com/gogits/gogs/modules/auth/pam"
|
||||
"github.com/gogits/gogs/pkg/auth/ldap"
|
||||
"github.com/gogits/gogs/pkg/auth/pam"
|
||||
)
|
||||
|
||||
type LoginType int
|
||||
@@ -296,7 +296,7 @@ func LoginViaLDAP(user *User, login, password string, source *LoginSource, autoR
|
||||
username, fn, sn, mail, isAdmin, succeed := source.Cfg.(*LDAPConfig).SearchEntry(login, password, source.Type == LOGIN_DLDAP)
|
||||
if !succeed {
|
||||
// User not in LDAP, do nothing
|
||||
return nil, ErrUserNotExist{0, login}
|
||||
return nil, errors.UserNotExist{0, login}
|
||||
}
|
||||
|
||||
if !autoRegister {
|
||||
@@ -404,9 +404,9 @@ func LoginViaSMTP(user *User, login, password string, sourceID int64, cfg *SMTPC
|
||||
if len(cfg.AllowedDomains) > 0 {
|
||||
idx := strings.Index(login, "@")
|
||||
if idx == -1 {
|
||||
return nil, ErrUserNotExist{0, login}
|
||||
return nil, errors.UserNotExist{0, login}
|
||||
} else if !com.IsSliceContainsStr(strings.Split(cfg.AllowedDomains, ","), login[idx+1:]) {
|
||||
return nil, ErrUserNotExist{0, login}
|
||||
return nil, errors.UserNotExist{0, login}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -425,7 +425,7 @@ func LoginViaSMTP(user *User, login, password string, sourceID int64, cfg *SMTPC
|
||||
tperr, ok := err.(*textproto.Error)
|
||||
if (ok && tperr.Code == 535) ||
|
||||
strings.Contains(err.Error(), "Username and Password not accepted") {
|
||||
return nil, ErrUserNotExist{0, login}
|
||||
return nil, errors.UserNotExist{0, login}
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
@@ -465,7 +465,7 @@ func LoginViaSMTP(user *User, login, password string, sourceID int64, cfg *SMTPC
|
||||
func LoginViaPAM(user *User, login, password string, sourceID int64, cfg *PAMConfig, autoRegister bool) (*User, error) {
|
||||
if err := pam.PAMAuth(cfg.ServiceName, login, password); err != nil {
|
||||
if strings.Contains(err.Error(), "Authentication failure") {
|
||||
return nil, ErrUserNotExist{0, login}
|
||||
return nil, errors.UserNotExist{0, login}
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
@@ -525,7 +525,7 @@ func UserSignIn(username, password string) (*User, error) {
|
||||
return user, nil
|
||||
}
|
||||
|
||||
return nil, ErrUserNotExist{user.ID, user.Name}
|
||||
return nil, errors.UserNotExist{user.ID, user.Name}
|
||||
|
||||
default:
|
||||
var source LoginSource
|
||||
@@ -554,5 +554,5 @@ func UserSignIn(username, password string) (*User, error) {
|
||||
log.Warn("Failed to login '%s' via '%s': %v", username, source.Name, err)
|
||||
}
|
||||
|
||||
return nil, ErrUserNotExist{user.ID, user.Name}
|
||||
return nil, errors.UserNotExist{user.ID, user.Name}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ import (
|
||||
"github.com/go-xorm/xorm"
|
||||
log "gopkg.in/clog.v1"
|
||||
|
||||
"github.com/gogits/gogs/modules/base"
|
||||
"github.com/gogits/gogs/pkg/tool"
|
||||
)
|
||||
|
||||
const _MIN_DB_VER = 10
|
||||
@@ -62,6 +62,8 @@ var migrations = []Migration{
|
||||
NewMigration("generate and migrate Git hooks", generateAndMigrateGitHooks),
|
||||
// v15 -> v16:v0.10.16
|
||||
NewMigration("update repository sizes", updateRepositorySizes),
|
||||
// v16 -> v17:v0.10.31
|
||||
NewMigration("remove invalid protect branch whitelist", removeInvalidProtectBranchWhitelist),
|
||||
}
|
||||
|
||||
// Migrate database to current version
|
||||
@@ -103,7 +105,7 @@ Please save following instructions to somewhere and start working:
|
||||
Once finished downloading,
|
||||
|
||||
1. Extract the archive and to upgrade steps as usual.
|
||||
2. Run it once. To verify, you should see some migration traces.
|
||||
2. Run it once. To verify, you should see some migration traces.
|
||||
3. Once it starts web server successfully, stop it.
|
||||
4. Now it's time to put back the release archive you originally intent to upgrade.
|
||||
5. Enjoy!
|
||||
@@ -157,10 +159,10 @@ func generateOrgRandsAndSalt(x *xorm.Engine) (err error) {
|
||||
}
|
||||
|
||||
for _, org := range orgs {
|
||||
if org.Rands, err = base.GetRandomString(10); err != nil {
|
||||
if org.Rands, err = tool.GetRandomString(10); err != nil {
|
||||
return err
|
||||
}
|
||||
if org.Salt, err = base.GetRandomString(10); err != nil {
|
||||
if org.Salt, err = tool.GetRandomString(10); err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err = sess.Id(org.ID).Update(org); err != nil {
|
||||
|
||||
@@ -15,7 +15,7 @@ import (
|
||||
"github.com/go-xorm/xorm"
|
||||
log "gopkg.in/clog.v1"
|
||||
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
func generateAndMigrateGitHooks(x *xorm.Engine) (err error) {
|
||||
|
||||
@@ -14,7 +14,7 @@ import (
|
||||
|
||||
"github.com/gogits/git-module"
|
||||
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
func updateRepositorySizes(x *xorm.Engine) (err error) {
|
||||
|
||||
22
models/migrations/v17.go
Normal file
22
models/migrations/v17.go
Normal file
@@ -0,0 +1,22 @@
|
||||
// Copyright 2017 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"
|
||||
)
|
||||
|
||||
func removeInvalidProtectBranchWhitelist(x *xorm.Engine) error {
|
||||
exist, err := x.IsTableExist("protect_branch_whitelist")
|
||||
if err != nil {
|
||||
return fmt.Errorf("IsTableExist: %v", err)
|
||||
} else if !exist {
|
||||
return nil
|
||||
}
|
||||
_, err = x.Exec("DELETE FROM protect_branch_whitelist WHERE protect_branch_id = 0")
|
||||
return err
|
||||
}
|
||||
@@ -13,7 +13,7 @@ import (
|
||||
|
||||
api "github.com/gogits/go-gogs-client"
|
||||
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
// Milestone represents a milestone of repository.
|
||||
@@ -103,6 +103,15 @@ func (m *Milestone) APIFormat() *api.Milestone {
|
||||
return apiMilestone
|
||||
}
|
||||
|
||||
func (m *Milestone) CountIssues(isClosed, includePulls bool) int64 {
|
||||
sess := x.Where("milestone_id = ?", m.ID).And("is_closed = ?", isClosed)
|
||||
if !includePulls {
|
||||
sess.And("is_pull = ?", false)
|
||||
}
|
||||
count, _ := sess.Count(new(Issue))
|
||||
return count
|
||||
}
|
||||
|
||||
// NewMilestone creates new milestone of repository.
|
||||
func NewMilestone(m *Milestone) (err error) {
|
||||
sess := x.NewSession()
|
||||
|
||||
@@ -6,6 +6,7 @@ package models
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/url"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
@@ -17,9 +18,9 @@ import (
|
||||
"github.com/gogits/git-module"
|
||||
|
||||
"github.com/gogits/gogs/models/errors"
|
||||
"github.com/gogits/gogs/modules/process"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/modules/sync"
|
||||
"github.com/gogits/gogs/pkg/process"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
"github.com/gogits/gogs/pkg/sync"
|
||||
)
|
||||
|
||||
var MirrorQueue = sync.NewUniqueQueue(setting.Repository.MirrorQueueLength)
|
||||
@@ -60,7 +61,7 @@ func (m *Mirror) AfterSet(colName string, _ xorm.Cell) {
|
||||
}
|
||||
case "updated_unix":
|
||||
m.Updated = time.Unix(m.UpdatedUnix, 0).Local()
|
||||
case "next_updated_unix":
|
||||
case "next_update_unix":
|
||||
m.NextUpdate = time.Unix(m.NextUpdateUnix, 0).Local()
|
||||
}
|
||||
}
|
||||
@@ -70,6 +71,46 @@ func (m *Mirror) ScheduleNextUpdate() {
|
||||
m.NextUpdate = time.Now().Add(time.Duration(m.Interval) * time.Hour)
|
||||
}
|
||||
|
||||
// findPasswordInMirrorAddress returns start (inclusive) and end index (exclusive)
|
||||
// of password portion of credentials in given mirror address.
|
||||
// It returns a boolean value to indicate whether password portion is found.
|
||||
func findPasswordInMirrorAddress(addr string) (start int, end int, found bool) {
|
||||
// Find end of credentials (start of path)
|
||||
end = strings.LastIndex(addr, "@")
|
||||
if end == -1 {
|
||||
return -1, -1, false
|
||||
}
|
||||
|
||||
// Find delimiter of credentials (end of username)
|
||||
start = strings.Index(addr, "://")
|
||||
if start == -1 {
|
||||
return -1, -1, false
|
||||
}
|
||||
start += 3
|
||||
delim := strings.Index(addr[start:], ":")
|
||||
if delim == -1 {
|
||||
return -1, -1, false
|
||||
}
|
||||
delim += 1
|
||||
|
||||
if start+delim >= end {
|
||||
return -1, -1, false // No password portion presented
|
||||
}
|
||||
|
||||
return start + delim, end, true
|
||||
}
|
||||
|
||||
// unescapeMirrorCredentials returns mirror address with unescaped credentials.
|
||||
func unescapeMirrorCredentials(addr string) string {
|
||||
start, end, found := findPasswordInMirrorAddress(addr)
|
||||
if !found {
|
||||
return addr
|
||||
}
|
||||
|
||||
password, _ := url.QueryUnescape(addr[start:end])
|
||||
return addr[:start] + password + addr[end:]
|
||||
}
|
||||
|
||||
func (m *Mirror) readAddress() {
|
||||
if len(m.address) > 0 {
|
||||
return
|
||||
@@ -83,10 +124,10 @@ func (m *Mirror) readAddress() {
|
||||
m.address = cfg.Section("remote \"origin\"").Key("url").Value()
|
||||
}
|
||||
|
||||
// HandleCloneUserCredentials replaces user credentials from HTTP/HTTPS URL
|
||||
// HandleMirrorCredentials replaces user credentials from HTTP/HTTPS URL
|
||||
// with placeholder <credentials>.
|
||||
// It will fail for any other forms of clone addresses.
|
||||
func HandleCloneUserCredentials(url string, mosaics bool) string {
|
||||
// It returns original string if protocol is not HTTP/HTTPS.
|
||||
func HandleMirrorCredentials(url string, mosaics bool) string {
|
||||
i := strings.Index(url, "@")
|
||||
if i == -1 {
|
||||
return url
|
||||
@@ -104,21 +145,37 @@ func HandleCloneUserCredentials(url string, mosaics bool) string {
|
||||
// Address returns mirror address from Git repository config without credentials.
|
||||
func (m *Mirror) Address() string {
|
||||
m.readAddress()
|
||||
return HandleCloneUserCredentials(m.address, false)
|
||||
return HandleMirrorCredentials(m.address, false)
|
||||
}
|
||||
|
||||
// MosaicsAddress returns mirror address from Git repository config with credentials under mosaics.
|
||||
func (m *Mirror) MosaicsAddress() string {
|
||||
m.readAddress()
|
||||
return HandleCloneUserCredentials(m.address, true)
|
||||
return HandleMirrorCredentials(m.address, true)
|
||||
}
|
||||
|
||||
// FullAddress returns mirror address from Git repository config.
|
||||
func (m *Mirror) FullAddress() string {
|
||||
// RawAddress returns raw mirror address directly from Git repository config.
|
||||
func (m *Mirror) RawAddress() string {
|
||||
m.readAddress()
|
||||
return m.address
|
||||
}
|
||||
|
||||
// FullAddress returns mirror address from Git repository config with unescaped credentials.
|
||||
func (m *Mirror) FullAddress() string {
|
||||
m.readAddress()
|
||||
return unescapeMirrorCredentials(m.address)
|
||||
}
|
||||
|
||||
// escapeCredentials returns mirror address with escaped credentials.
|
||||
func escapeMirrorCredentials(addr string) string {
|
||||
start, end, found := findPasswordInMirrorAddress(addr)
|
||||
if !found {
|
||||
return addr
|
||||
}
|
||||
|
||||
return addr[:start] + url.QueryEscape(addr[start:end]) + addr[end:]
|
||||
}
|
||||
|
||||
// SaveAddress writes new address to Git repository config.
|
||||
func (m *Mirror) SaveAddress(addr string) error {
|
||||
configPath := m.Repo.GitConfigPath()
|
||||
@@ -127,7 +184,7 @@ func (m *Mirror) SaveAddress(addr string) error {
|
||||
return fmt.Errorf("Load: %v", err)
|
||||
}
|
||||
|
||||
cfg.Section("remote \"origin\"").Key("url").SetValue(addr)
|
||||
cfg.Section("remote \"origin\"").Key("url").SetValue(escapeMirrorCredentials(addr))
|
||||
return cfg.SaveToIndent(configPath, "\t")
|
||||
}
|
||||
|
||||
@@ -140,7 +197,7 @@ func (m *Mirror) runSync() bool {
|
||||
// Do a fast-fail testing against on repository URL to ensure it is accessible under
|
||||
// good condition to prevent long blocking on URL resolution without syncing anything.
|
||||
if !git.IsRepoURLAccessible(git.NetworkOptions{
|
||||
URL: m.FullAddress(),
|
||||
URL: m.RawAddress(),
|
||||
Timeout: 10 * time.Second,
|
||||
}) {
|
||||
desc := fmt.Sprintf("Source URL of mirror repository '%s' is not accessible: %s", m.Repo.FullName(), m.MosaicsAddress())
|
||||
@@ -164,6 +221,11 @@ func (m *Mirror) runSync() bool {
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
if err := m.Repo.UpdateSize(); err != nil {
|
||||
log.Error(2, "UpdateSize [repo_id: %d]: %v", m.Repo.ID, err)
|
||||
}
|
||||
|
||||
if m.Repo.HasWiki() {
|
||||
if _, stderr, err := process.ExecDir(
|
||||
timeout, wikiPath, fmt.Sprintf("Mirror.runSync: %s", wikiPath),
|
||||
|
||||
74
models/mirror_test.go
Normal file
74
models/mirror_test.go
Normal file
@@ -0,0 +1,74 @@
|
||||
// Copyright 2017 The Gogs Authors. All rights reserved.
|
||||
// Use of this source code is governed by a MIT-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package models
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
. "github.com/smartystreets/goconvey/convey"
|
||||
)
|
||||
|
||||
func Test_findPasswordInMirrorAddress(t *testing.T) {
|
||||
Convey("Find password portion in mirror address", t, func() {
|
||||
testCases := []struct {
|
||||
addr string
|
||||
start, end int
|
||||
found bool
|
||||
password string
|
||||
}{
|
||||
{"http://localhost:3000/user/repo.git", -1, -1, false, ""},
|
||||
{"http://user@localhost:3000/user/repo.git", -1, -1, false, ""},
|
||||
{"http://user:@localhost:3000/user/repo.git", -1, -1, false, ""},
|
||||
{"http://user:password@localhost:3000/user/repo.git", 12, 20, true, "password"},
|
||||
{"http://username:my%3Asecure%3Bpassword@localhost:3000/user/repo.git", 16, 38, true, "my%3Asecure%3Bpassword"},
|
||||
{"http://username:my%40secure%23password@localhost:3000/user/repo.git", 16, 38, true, "my%40secure%23password"},
|
||||
{"http://username:@@localhost:3000/user/repo.git", 16, 17, true, "@"},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
start, end, found := findPasswordInMirrorAddress(tc.addr)
|
||||
So(start, ShouldEqual, tc.start)
|
||||
So(end, ShouldEqual, tc.end)
|
||||
So(found, ShouldEqual, tc.found)
|
||||
if found {
|
||||
So(tc.addr[start:end], ShouldEqual, tc.password)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func Test_unescapeMirrorCredentials(t *testing.T) {
|
||||
Convey("Escape credentials in mirror address", t, func() {
|
||||
testCases := []string{
|
||||
"http://localhost:3000/user/repo.git", "http://localhost:3000/user/repo.git",
|
||||
"http://user@localhost:3000/user/repo.git", "http://user@localhost:3000/user/repo.git",
|
||||
"http://user:@localhost:3000/user/repo.git", "http://user:@localhost:3000/user/repo.git",
|
||||
"http://user:password@localhost:3000/user/repo.git", "http://user:password@localhost:3000/user/repo.git",
|
||||
"http://user:my%3Asecure%3Bpassword@localhost:3000/user/repo.git", "http://user:my:secure;password@localhost:3000/user/repo.git",
|
||||
"http://user:my%40secure%23password@localhost:3000/user/repo.git", "http://user:my@secure#password@localhost:3000/user/repo.git",
|
||||
}
|
||||
|
||||
for i := 0; i < len(testCases); i += 2 {
|
||||
So(unescapeMirrorCredentials(testCases[i]), ShouldEqual, testCases[i+1])
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func Test_escapeMirrorCredentials(t *testing.T) {
|
||||
Convey("Escape credentials in mirror address", t, func() {
|
||||
testCases := []string{
|
||||
"http://localhost:3000/user/repo.git", "http://localhost:3000/user/repo.git",
|
||||
"http://user@localhost:3000/user/repo.git", "http://user@localhost:3000/user/repo.git",
|
||||
"http://user:@localhost:3000/user/repo.git", "http://user:@localhost:3000/user/repo.git",
|
||||
"http://user:password@localhost:3000/user/repo.git", "http://user:password@localhost:3000/user/repo.git",
|
||||
"http://user:my:secure;password@localhost:3000/user/repo.git", "http://user:my%3Asecure%3Bpassword@localhost:3000/user/repo.git",
|
||||
"http://user:my@secure#password@localhost:3000/user/repo.git", "http://user:my%40secure%23password@localhost:3000/user/repo.git",
|
||||
}
|
||||
|
||||
for i := 0; i < len(testCases); i += 2 {
|
||||
So(escapeMirrorCredentials(testCases[i]), ShouldEqual, testCases[i+1])
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -21,9 +21,10 @@ import (
|
||||
"github.com/go-xorm/core"
|
||||
"github.com/go-xorm/xorm"
|
||||
_ "github.com/lib/pq"
|
||||
log "gopkg.in/clog.v1"
|
||||
|
||||
"github.com/gogits/gogs/models/migrations"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
// Engine represents a xorm engine or session.
|
||||
@@ -192,18 +193,22 @@ func SetEngine() (err error) {
|
||||
|
||||
// WARNING: for serv command, MUST remove the output to os.stdout,
|
||||
// so use log file to instead print to stdout.
|
||||
logPath := path.Join(setting.LogRootPath, "xorm.log")
|
||||
os.MkdirAll(path.Dir(logPath), os.ModePerm)
|
||||
|
||||
f, err := os.Create(logPath)
|
||||
sec := setting.Cfg.Section("log.xorm")
|
||||
logger, err := log.NewFileWriter(path.Join(setting.LogRootPath, "xorm.log"),
|
||||
log.FileRotationConfig{
|
||||
Rotate: sec.Key("ROTATE").MustBool(true),
|
||||
Daily: sec.Key("ROTATE_DAILY").MustBool(true),
|
||||
MaxSize: sec.Key("MAX_SIZE").MustInt64(100) * 1024 * 1024,
|
||||
MaxDays: sec.Key("MAX_DAYS").MustInt64(3),
|
||||
})
|
||||
if err != nil {
|
||||
return fmt.Errorf("Fail to create xorm.log: %v", err)
|
||||
return fmt.Errorf("Fail to create 'xorm.log': %v", err)
|
||||
}
|
||||
|
||||
if setting.ProdMode {
|
||||
x.SetLogger(xorm.NewSimpleLogger3(f, xorm.DEFAULT_LOG_PREFIX, xorm.DEFAULT_LOG_FLAG, core.LOG_WARNING))
|
||||
x.SetLogger(xorm.NewSimpleLogger3(logger, xorm.DEFAULT_LOG_PREFIX, xorm.DEFAULT_LOG_FLAG, core.LOG_WARNING))
|
||||
} else {
|
||||
x.SetLogger(xorm.NewSimpleLogger(f))
|
||||
x.SetLogger(xorm.NewSimpleLogger(logger))
|
||||
}
|
||||
x.ShowSQL(true)
|
||||
return nil
|
||||
|
||||
@@ -31,7 +31,7 @@ type Team struct {
|
||||
func (t *Team) AfterSet(colName string, _ xorm.Cell) {
|
||||
switch colName {
|
||||
case "num_repos":
|
||||
// LEGACY [0.11]: this is backward compatibility bug fix for https://github.com/gogits/gogs/issues/3671
|
||||
// LEGACY [1.0]: this is backward compatibility bug fix for https://github.com/gogits/gogs/issues/3671
|
||||
if t.NumRepos < 0 {
|
||||
t.NumRepos = 0
|
||||
}
|
||||
@@ -424,7 +424,7 @@ func IsTeamMember(orgID, teamID, uid int64) bool {
|
||||
|
||||
func getTeamMembers(e Engine, teamID int64) (_ []*User, err error) {
|
||||
teamUsers := make([]*TeamUser, 0, 10)
|
||||
if err = e.Sql("SELECT `id`, `org_id`, `team_id`, `uid` FROM `team_user` WHERE team_id=?", teamID).
|
||||
if err = e.Sql("SELECT `id`, `org_id`, `team_id`, `uid` FROM `team_user` WHERE team_id = ?", teamID).
|
||||
Find(&teamUsers); err != nil {
|
||||
return nil, fmt.Errorf("get team-users: %v", err)
|
||||
}
|
||||
|
||||
@@ -18,9 +18,10 @@ import (
|
||||
"github.com/gogits/git-module"
|
||||
api "github.com/gogits/go-gogs-client"
|
||||
|
||||
"github.com/gogits/gogs/modules/process"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/modules/sync"
|
||||
"github.com/gogits/gogs/models/errors"
|
||||
"github.com/gogits/gogs/pkg/process"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
"github.com/gogits/gogs/pkg/sync"
|
||||
)
|
||||
|
||||
var PullRequestQueue = sync.NewUniqueQueue(setting.Repository.PullRequestQueueLength)
|
||||
@@ -87,7 +88,7 @@ func (pr *PullRequest) AfterSet(colName string, _ xorm.Cell) {
|
||||
func (pr *PullRequest) loadAttributes(e Engine) (err error) {
|
||||
if pr.HeadRepo == nil {
|
||||
pr.HeadRepo, err = getRepositoryByID(e, pr.HeadRepoID)
|
||||
if err != nil && !IsErrRepoNotExist(err) {
|
||||
if err != nil && !errors.IsRepoNotExist(err) {
|
||||
return fmt.Errorf("getRepositoryByID.(HeadRepo) [%d]: %v", pr.HeadRepoID, err)
|
||||
}
|
||||
}
|
||||
@@ -101,7 +102,7 @@ func (pr *PullRequest) loadAttributes(e Engine) (err error) {
|
||||
|
||||
if pr.HasMerged && pr.Merger == nil {
|
||||
pr.Merger, err = getUserByID(e, pr.MergerID)
|
||||
if IsErrUserNotExist(err) {
|
||||
if errors.IsUserNotExist(err) {
|
||||
pr.MergerID = -1
|
||||
pr.Merger = NewGhostUser()
|
||||
} else if err != nil {
|
||||
@@ -277,12 +278,12 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository) (err error
|
||||
}
|
||||
|
||||
if err = MergePullRequestAction(doer, pr.Issue.Repo, pr.Issue); err != nil {
|
||||
log.Error(4, "MergePullRequestAction [%d]: %v", pr.ID, err)
|
||||
log.Error(2, "MergePullRequestAction [%d]: %v", pr.ID, err)
|
||||
}
|
||||
|
||||
// Reload pull request information.
|
||||
if err = pr.LoadAttributes(); err != nil {
|
||||
log.Error(4, "LoadAttributes: %v", err)
|
||||
log.Error(2, "LoadAttributes: %v", err)
|
||||
return nil
|
||||
}
|
||||
if err = PrepareWebhooks(pr.Issue.Repo, HOOK_EVENT_PULL_REQUEST, &api.PullRequestPayload{
|
||||
@@ -292,13 +293,13 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository) (err error
|
||||
Repository: pr.Issue.Repo.APIFormat(nil),
|
||||
Sender: doer.APIFormat(),
|
||||
}); err != nil {
|
||||
log.Error(4, "PrepareWebhooks: %v", err)
|
||||
log.Error(2, "PrepareWebhooks: %v", err)
|
||||
return nil
|
||||
}
|
||||
|
||||
l, err := headGitRepo.CommitsBetweenIDs(pr.MergedCommitID, pr.MergeBase)
|
||||
if err != nil {
|
||||
log.Error(4, "CommitsBetweenIDs: %v", err)
|
||||
log.Error(2, "CommitsBetweenIDs: %v", err)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -308,23 +309,30 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository) (err error
|
||||
// to avoid strange diff commits produced.
|
||||
mergeCommit, err := baseGitRepo.GetBranchCommit(pr.BaseBranch)
|
||||
if err != nil {
|
||||
log.Error(4, "GetBranchCommit: %v", err)
|
||||
log.Error(2, "GetBranchCommit: %v", err)
|
||||
return nil
|
||||
}
|
||||
l.PushFront(mergeCommit)
|
||||
|
||||
commits, err := ListToPushCommits(l).ToApiPayloadCommits(pr.BaseRepo.RepoPath(), pr.BaseRepo.HTMLURL())
|
||||
if err != nil {
|
||||
log.Error(2, "ToApiPayloadCommits: %v", err)
|
||||
return nil
|
||||
}
|
||||
|
||||
p := &api.PushPayload{
|
||||
Ref: git.BRANCH_PREFIX + pr.BaseBranch,
|
||||
Before: pr.MergeBase,
|
||||
After: pr.MergedCommitID,
|
||||
CompareURL: setting.AppUrl + pr.BaseRepo.ComposeCompareURL(pr.MergeBase, pr.MergedCommitID),
|
||||
Commits: ListToPushCommits(l).ToApiPayloadCommits(pr.BaseRepo.HTMLURL()),
|
||||
Commits: commits,
|
||||
Repo: pr.BaseRepo.APIFormat(nil),
|
||||
Pusher: pr.HeadRepo.MustOwner().APIFormat(),
|
||||
Sender: doer.APIFormat(),
|
||||
}
|
||||
if err = PrepareWebhooks(pr.BaseRepo, HOOK_EVENT_PUSH, p); err != nil {
|
||||
return fmt.Errorf("PrepareWebhooks: %v", err)
|
||||
log.Error(2, "PrepareWebhooks: %v", err)
|
||||
return nil
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -599,7 +607,7 @@ func (pr *PullRequest) AddToTaskQueue() {
|
||||
go PullRequestQueue.AddFunc(pr.ID, func() {
|
||||
pr.Status = PULL_REQUEST_STATUS_CHECKING
|
||||
if err := pr.UpdateCols("status"); err != nil {
|
||||
log.Error(5, "AddToTaskQueue.UpdateCols[%d].(add to queue): %v", pr.ID, err)
|
||||
log.Error(3, "AddToTaskQueue.UpdateCols[%d].(add to queue): %v", pr.ID, err)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -612,16 +620,18 @@ func (prs PullRequestList) loadAttributes(e Engine) (err error) {
|
||||
}
|
||||
|
||||
// Load issues
|
||||
issueIDs := make([]int64, 0, len(prs))
|
||||
set := make(map[int64]*Issue)
|
||||
for i := range prs {
|
||||
issueIDs = append(issueIDs, prs[i].IssueID)
|
||||
set[prs[i].IssueID] = nil
|
||||
}
|
||||
issueIDs := make([]int64, 0, len(prs))
|
||||
for issueID := range set {
|
||||
issueIDs = append(issueIDs, issueID)
|
||||
}
|
||||
issues := make([]*Issue, 0, len(issueIDs))
|
||||
if err = e.Where("id > 0").In("id", issueIDs).Find(&issues); err != nil {
|
||||
return fmt.Errorf("find issues: %v", err)
|
||||
}
|
||||
|
||||
set := make(map[int64]*Issue)
|
||||
for i := range issues {
|
||||
set[issues[i].ID] = issues[i]
|
||||
}
|
||||
@@ -664,20 +674,20 @@ func AddTestPullRequestTask(doer *User, repoID int64, branch string, isSync bool
|
||||
log.Trace("AddTestPullRequestTask [head_repo_id: %d, head_branch: %s]: finding pull requests", repoID, branch)
|
||||
prs, err := GetUnmergedPullRequestsByHeadInfo(repoID, branch)
|
||||
if err != nil {
|
||||
log.Error(4, "Find pull requests [head_repo_id: %d, head_branch: %s]: %v", repoID, branch, err)
|
||||
log.Error(2, "Find pull requests [head_repo_id: %d, head_branch: %s]: %v", repoID, branch, err)
|
||||
return
|
||||
}
|
||||
|
||||
if isSync {
|
||||
if err = PullRequestList(prs).LoadAttributes(); err != nil {
|
||||
log.Error(4, "PullRequestList.LoadAttributes: %v", err)
|
||||
log.Error(2, "PullRequestList.LoadAttributes: %v", err)
|
||||
}
|
||||
|
||||
if err == nil {
|
||||
for _, pr := range prs {
|
||||
pr.Issue.PullRequest = pr
|
||||
if err = pr.Issue.LoadAttributes(); err != nil {
|
||||
log.Error(4, "LoadAttributes: %v", err)
|
||||
log.Error(2, "LoadAttributes: %v", err)
|
||||
continue
|
||||
}
|
||||
if err = PrepareWebhooks(pr.Issue.Repo, HOOK_EVENT_PULL_REQUEST, &api.PullRequestPayload{
|
||||
@@ -687,10 +697,9 @@ func AddTestPullRequestTask(doer *User, repoID int64, branch string, isSync bool
|
||||
Repository: pr.Issue.Repo.APIFormat(nil),
|
||||
Sender: doer.APIFormat(),
|
||||
}); err != nil {
|
||||
log.Error(4, "PrepareWebhooks [pull_id: %v]: %v", pr.ID, err)
|
||||
log.Error(2, "PrepareWebhooks [pull_id: %v]: %v", pr.ID, err)
|
||||
continue
|
||||
}
|
||||
go HookQueue.Add(pr.Issue.Repo.ID)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -700,7 +709,7 @@ func AddTestPullRequestTask(doer *User, repoID int64, branch string, isSync bool
|
||||
log.Trace("AddTestPullRequestTask [base_repo_id: %d, base_branch: %s]: finding pull requests", repoID, branch)
|
||||
prs, err = GetUnmergedPullRequestsByBaseInfo(repoID, branch)
|
||||
if err != nil {
|
||||
log.Error(4, "Find pull requests [base_repo_id: %d, base_branch: %s]: %v", repoID, branch, err)
|
||||
log.Error(2, "Find pull requests [base_repo_id: %d, base_branch: %s]: %v", repoID, branch, err)
|
||||
return
|
||||
}
|
||||
for _, pr := range prs {
|
||||
|
||||
@@ -16,7 +16,8 @@ import (
|
||||
"github.com/gogits/git-module"
|
||||
api "github.com/gogits/go-gogs-client"
|
||||
|
||||
"github.com/gogits/gogs/modules/process"
|
||||
"github.com/gogits/gogs/models/errors"
|
||||
"github.com/gogits/gogs/pkg/process"
|
||||
)
|
||||
|
||||
// Release represents a release of repository.
|
||||
@@ -67,7 +68,7 @@ func (r *Release) loadAttributes(e Engine) (err error) {
|
||||
if r.Publisher == nil {
|
||||
r.Publisher, err = getUserByID(e, r.PublisherID)
|
||||
if err != nil {
|
||||
if IsErrUserNotExist(err) {
|
||||
if errors.IsUserNotExist(err) {
|
||||
r.PublisherID = -1
|
||||
r.Publisher = NewGhostUser()
|
||||
} else {
|
||||
|
||||
158
models/repo.go
158
models/repo.go
@@ -7,13 +7,11 @@ package models
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"html/template"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"sort"
|
||||
"strings"
|
||||
"time"
|
||||
@@ -29,11 +27,11 @@ import (
|
||||
api "github.com/gogits/go-gogs-client"
|
||||
|
||||
"github.com/gogits/gogs/models/errors"
|
||||
"github.com/gogits/gogs/modules/bindata"
|
||||
"github.com/gogits/gogs/modules/markdown"
|
||||
"github.com/gogits/gogs/modules/process"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/modules/sync"
|
||||
"github.com/gogits/gogs/pkg/bindata"
|
||||
"github.com/gogits/gogs/pkg/markup"
|
||||
"github.com/gogits/gogs/pkg/process"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
"github.com/gogits/gogs/pkg/sync"
|
||||
)
|
||||
|
||||
var repoWorkingPool = sync.NewExclusivePool()
|
||||
@@ -115,6 +113,7 @@ func NewRepoContext() {
|
||||
}
|
||||
git.HookDir = "custom_hooks"
|
||||
git.HookSampleDir = "hooks"
|
||||
git.DefaultCommitsPageSize = setting.UI.User.CommitsPagingNum
|
||||
|
||||
// Git requires setting user.name and user.email in order to commit changes.
|
||||
for configKey, defaultValue := range map[string]string{"user.name": "Gogs", "user.email": "gogs@fake.local"} {
|
||||
@@ -174,9 +173,11 @@ type Repository struct {
|
||||
|
||||
// Advanced settings
|
||||
EnableWiki bool `xorm:"NOT NULL DEFAULT true"`
|
||||
AllowPublicWiki bool
|
||||
EnableExternalWiki bool
|
||||
ExternalWikiURL string
|
||||
EnableIssues bool `xorm:"NOT NULL DEFAULT true"`
|
||||
AllowPublicIssues bool
|
||||
EnableExternalTracker bool
|
||||
ExternalTrackerURL string
|
||||
ExternalTrackerFormat string
|
||||
@@ -218,7 +219,7 @@ func (repo *Repository) AfterSet(colName string, _ xorm.Cell) {
|
||||
repo.NumOpenMilestones = repo.NumMilestones - repo.NumClosedMilestones
|
||||
case "external_tracker_style":
|
||||
if len(repo.ExternalTrackerStyle) == 0 {
|
||||
repo.ExternalTrackerStyle = markdown.ISSUE_NAME_STYLE_NUMERIC
|
||||
repo.ExternalTrackerStyle = markup.ISSUE_NAME_STYLE_NUMERIC
|
||||
}
|
||||
case "created_unix":
|
||||
repo.Created = time.Unix(repo.CreatedUnix, 0).Local()
|
||||
@@ -227,10 +228,48 @@ func (repo *Repository) AfterSet(colName string, _ xorm.Cell) {
|
||||
}
|
||||
}
|
||||
|
||||
// MustOwner always returns a valid *User object to avoid
|
||||
// conceptually impossible error handling.
|
||||
// It creates a fake object that contains error deftail
|
||||
// when error occurs.
|
||||
func (repo *Repository) loadAttributes(e Engine) (err error) {
|
||||
if repo.Owner == nil {
|
||||
repo.Owner, err = getUserByID(e, repo.OwnerID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("getUserByID [%d]: %v", repo.OwnerID, err)
|
||||
}
|
||||
}
|
||||
|
||||
if repo.IsFork && repo.BaseRepo == nil {
|
||||
repo.BaseRepo, err = getRepositoryByID(e, repo.ForkID)
|
||||
if err != nil {
|
||||
if errors.IsRepoNotExist(err) {
|
||||
repo.IsFork = false
|
||||
repo.ForkID = 0
|
||||
} else {
|
||||
return fmt.Errorf("getRepositoryByID [%d]: %v", repo.ForkID, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (repo *Repository) LoadAttributes() error {
|
||||
return repo.loadAttributes(x)
|
||||
}
|
||||
|
||||
// IsPartialPublic returns true if repository is public or allow public access to wiki or issues.
|
||||
func (repo *Repository) IsPartialPublic() bool {
|
||||
return !repo.IsPrivate || repo.AllowPublicWiki || repo.AllowPublicIssues
|
||||
}
|
||||
|
||||
func (repo *Repository) CanGuestViewWiki() bool {
|
||||
return repo.EnableWiki && !repo.EnableExternalWiki && repo.AllowPublicWiki
|
||||
}
|
||||
|
||||
func (repo *Repository) CanGuestViewIssues() bool {
|
||||
return repo.EnableIssues && !repo.EnableExternalTracker && repo.AllowPublicIssues
|
||||
}
|
||||
|
||||
// MustOwner always returns a valid *User object to avoid conceptually impossible error handling.
|
||||
// It creates a fake object that contains error deftail when error occurs.
|
||||
func (repo *Repository) MustOwner() *User {
|
||||
return repo.mustOwner(x)
|
||||
}
|
||||
@@ -317,10 +356,10 @@ func (repo *Repository) ComposeMetas() map[string]string {
|
||||
"repo": repo.Name,
|
||||
}
|
||||
switch repo.ExternalTrackerStyle {
|
||||
case markdown.ISSUE_NAME_STYLE_ALPHANUMERIC:
|
||||
repo.ExternalMetas["style"] = markdown.ISSUE_NAME_STYLE_ALPHANUMERIC
|
||||
case markup.ISSUE_NAME_STYLE_ALPHANUMERIC:
|
||||
repo.ExternalMetas["style"] = markup.ISSUE_NAME_STYLE_ALPHANUMERIC
|
||||
default:
|
||||
repo.ExternalMetas["style"] = markdown.ISSUE_NAME_STYLE_NUMERIC
|
||||
repo.ExternalMetas["style"] = markup.ISSUE_NAME_STYLE_NUMERIC
|
||||
}
|
||||
|
||||
}
|
||||
@@ -402,15 +441,6 @@ func (repo *Repository) GetMirror() (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
func (repo *Repository) GetBaseRepo() (err error) {
|
||||
if !repo.IsFork {
|
||||
return nil
|
||||
}
|
||||
|
||||
repo.BaseRepo, err = GetRepositoryByID(repo.ForkID)
|
||||
return err
|
||||
}
|
||||
|
||||
func (repo *Repository) repoPath(e Engine) string {
|
||||
return RepoPath(repo.mustOwner(e).Name, repo.Name)
|
||||
}
|
||||
@@ -451,7 +481,7 @@ func (repo *Repository) CanBeForked() bool {
|
||||
|
||||
// CanEnablePulls returns true if repository meets the requirements of accepting pulls.
|
||||
func (repo *Repository) CanEnablePulls() bool {
|
||||
return !repo.IsMirror
|
||||
return !repo.IsMirror && !repo.IsBare
|
||||
}
|
||||
|
||||
// AllowPulls returns true if repository meets the requirements of accepting pulls and has them enabled.
|
||||
@@ -474,18 +504,6 @@ func (repo *Repository) NextIssueIndex() int64 {
|
||||
return int64(repo.NumIssues+repo.NumPulls) + 1
|
||||
}
|
||||
|
||||
var (
|
||||
DescPattern = regexp.MustCompile(`https?://\S+`)
|
||||
)
|
||||
|
||||
// DescriptionHtml does special handles to description and return HTML string.
|
||||
func (repo *Repository) DescriptionHtml() template.HTML {
|
||||
sanitize := func(s string) string {
|
||||
return fmt.Sprintf(`<a href="%[1]s" target="_blank">%[1]s</a>`, s)
|
||||
}
|
||||
return template.HTML(DescPattern.ReplaceAllStringFunc(markdown.Sanitizer.Sanitize(repo.Description), sanitize))
|
||||
}
|
||||
|
||||
func (repo *Repository) LocalCopyPath() string {
|
||||
return path.Join(setting.AppDataPath, "tmp/local-repo", com.ToStr(repo.ID))
|
||||
}
|
||||
@@ -705,6 +723,10 @@ func MigrateRepository(doer, owner *User, opts MigrateRepoOptions) (*Repository,
|
||||
if headBranch != nil {
|
||||
repo.DefaultBranch = headBranch.Name
|
||||
}
|
||||
|
||||
if err = repo.UpdateSize(); err != nil {
|
||||
log.Error(2, "UpdateSize [repo_id: %d]: %v", repo.ID, err)
|
||||
}
|
||||
}
|
||||
|
||||
if opts.IsMirror {
|
||||
@@ -1365,7 +1387,7 @@ func DeleteRepository(uid, repoID int64) error {
|
||||
if err != nil {
|
||||
return err
|
||||
} else if !has {
|
||||
return ErrRepoNotExist{repoID, uid, ""}
|
||||
return errors.RepoNotExist{repoID, uid, ""}
|
||||
}
|
||||
|
||||
// In case is a organization.
|
||||
@@ -1502,9 +1524,9 @@ func GetRepositoryByName(ownerID int64, name string) (*Repository, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if !has {
|
||||
return nil, ErrRepoNotExist{0, ownerID, name}
|
||||
return nil, errors.RepoNotExist{0, ownerID, name}
|
||||
}
|
||||
return repo, err
|
||||
return repo, repo.LoadAttributes()
|
||||
}
|
||||
|
||||
func getRepositoryByID(e Engine, id int64) (*Repository, error) {
|
||||
@@ -1513,9 +1535,9 @@ func getRepositoryByID(e Engine, id int64) (*Repository, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if !has {
|
||||
return nil, ErrRepoNotExist{id, 0, ""}
|
||||
return nil, errors.RepoNotExist{id, 0, ""}
|
||||
}
|
||||
return repo, nil
|
||||
return repo, repo.loadAttributes(e)
|
||||
}
|
||||
|
||||
// GetRepositoryByID returns the repository by given id if exists.
|
||||
@@ -1558,6 +1580,24 @@ func GetRecentUpdatedRepositories(page, pageSize int) (repos []*Repository, err
|
||||
Where("is_private=?", false).Limit(pageSize).Desc("updated_unix").Find(&repos)
|
||||
}
|
||||
|
||||
// GetUserAndCollaborativeRepositories returns list of repositories the user owns and collaborates.
|
||||
func GetUserAndCollaborativeRepositories(userID int64) ([]*Repository, error) {
|
||||
repos := make([]*Repository, 0, 10)
|
||||
if err := x.Alias("repo").
|
||||
Join("INNER", "collaboration", "collaboration.repo_id = repo.id").
|
||||
Where("collaboration.user_id = ?", userID).
|
||||
Find(&repos); err != nil {
|
||||
return nil, fmt.Errorf("select collaborative repositories: %v", err)
|
||||
}
|
||||
|
||||
ownRepos := make([]*Repository, 0, 10)
|
||||
if err := x.Where("owner_id = ?", userID).Find(&ownRepos); err != nil {
|
||||
return nil, fmt.Errorf("select own repositories: %v", err)
|
||||
}
|
||||
|
||||
return append(repos, ownRepos...), nil
|
||||
}
|
||||
|
||||
func getRepositoryCount(e Engine, u *User) (int64, error) {
|
||||
return x.Count(&Repository{OwnerID: u.ID})
|
||||
}
|
||||
@@ -1580,11 +1620,6 @@ type SearchRepoOptions struct {
|
||||
// SearchRepositoryByName takes keyword and part of repository name to search,
|
||||
// it returns results in given range and number of total results.
|
||||
func SearchRepositoryByName(opts *SearchRepoOptions) (repos []*Repository, _ int64, _ error) {
|
||||
if len(opts.Keyword) == 0 {
|
||||
return repos, 0, nil
|
||||
}
|
||||
opts.Keyword = strings.ToLower(opts.Keyword)
|
||||
|
||||
if opts.Page <= 0 {
|
||||
opts.Page = 1
|
||||
}
|
||||
@@ -1595,15 +1630,16 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos []*Repository, _ int
|
||||
// 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.lower_name LIKE ? AND (repo.owner_id = ? OR access.user_id = ? OR repo.is_private = ?)",
|
||||
"%"+opts.Keyword+"%", opts.UserID, opts.UserID, false)
|
||||
Where("(repo.owner_id = ? OR access.user_id = ? OR repo.is_private = ?)", opts.UserID, opts.UserID, false)
|
||||
} else {
|
||||
sess.Where("repo.lower_name LIKE ?", "%"+opts.Keyword+"%")
|
||||
// Only return public repositories if opts.Private is not set
|
||||
if !opts.Private {
|
||||
sess.And("repo.is_private = ?", false)
|
||||
}
|
||||
}
|
||||
if len(opts.Keyword) > 0 {
|
||||
sess.And("repo.lower_name LIKE ?", "%"+strings.ToLower(opts.Keyword)+"%")
|
||||
}
|
||||
if opts.OwnerID > 0 {
|
||||
sess.And("repo.owner_id = ?", opts.OwnerID)
|
||||
}
|
||||
@@ -1618,7 +1654,7 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos []*Repository, _ int
|
||||
if len(opts.OrderBy) > 0 {
|
||||
sess.OrderBy("repo." + opts.OrderBy)
|
||||
}
|
||||
return repos, count, sess.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).Find(&repos)
|
||||
return repos, count, sess.Distinct("repo.*").Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).Find(&repos)
|
||||
}
|
||||
|
||||
func DeleteOldRepositoryArchives() {
|
||||
@@ -1948,7 +1984,7 @@ func (repos RepositoryList) loadAttributes(e Engine) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Load owners.
|
||||
// Load owners
|
||||
set := make(map[int64]*User)
|
||||
for i := range repos {
|
||||
set[repos[i].OwnerID] = nil
|
||||
@@ -2214,6 +2250,8 @@ func ForkRepository(doer, owner *User, baseRepo *Repository, name, desc string)
|
||||
}
|
||||
|
||||
repoPath := repo.repoPath(sess)
|
||||
RemoveAllWithNotice("Repository path erase before creation", repoPath)
|
||||
|
||||
_, stderr, err := process.ExecTimeout(10*time.Minute,
|
||||
fmt.Sprintf("ForkRepository 'git clone': %s/%s", owner.Name, repo.Name),
|
||||
"git", "clone", "--bare", baseRepo.RepoPath(), repoPath)
|
||||
@@ -2230,15 +2268,23 @@ func ForkRepository(doer, owner *User, baseRepo *Repository, name, desc string)
|
||||
|
||||
if err = createDelegateHooks(repoPath); err != nil {
|
||||
return nil, fmt.Errorf("createDelegateHooks: %v", err)
|
||||
} else if err = prepareWebhooks(sess, baseRepo, HOOK_EVENT_FORK, &api.ForkPayload{
|
||||
}
|
||||
|
||||
if err = sess.Commit(); err != nil {
|
||||
return nil, fmt.Errorf("Commit: %v", err)
|
||||
}
|
||||
|
||||
if err = repo.UpdateSize(); err != nil {
|
||||
log.Error(2, "UpdateSize [repo_id: %d]: %v", repo.ID, err)
|
||||
}
|
||||
if err = PrepareWebhooks(baseRepo, HOOK_EVENT_FORK, &api.ForkPayload{
|
||||
Forkee: repo.APIFormat(nil),
|
||||
Repo: baseRepo.APIFormat(nil),
|
||||
Sender: doer.APIFormat(),
|
||||
}); err != nil {
|
||||
return nil, fmt.Errorf("prepareWebhooks: %v", err)
|
||||
log.Error(2, "PrepareWebhooks [repo_id: %d]: %v", baseRepo.ID, err)
|
||||
}
|
||||
|
||||
return repo, sess.Commit()
|
||||
return repo, nil
|
||||
}
|
||||
|
||||
func (repo *Repository) GetForks() ([]*Repository, error) {
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
"github.com/Unknwon/com"
|
||||
"github.com/gogits/git-module"
|
||||
|
||||
"github.com/gogits/gogs/modules/base"
|
||||
"github.com/gogits/gogs/pkg/tool"
|
||||
)
|
||||
|
||||
type Branch struct {
|
||||
@@ -149,10 +149,10 @@ func UpdateOrgProtectBranch(repo *Repository, protectBranch *ProtectBranch, whit
|
||||
}
|
||||
|
||||
hasUsersChanged := false
|
||||
validUserIDs := base.StringsToInt64s(strings.Split(protectBranch.WhitelistUserIDs, ","))
|
||||
validUserIDs := tool.StringsToInt64s(strings.Split(protectBranch.WhitelistUserIDs, ","))
|
||||
if protectBranch.WhitelistUserIDs != whitelistUserIDs {
|
||||
hasUsersChanged = true
|
||||
userIDs := base.StringsToInt64s(strings.Split(whitelistUserIDs, ","))
|
||||
userIDs := tool.StringsToInt64s(strings.Split(whitelistUserIDs, ","))
|
||||
validUserIDs = make([]int64, 0, len(userIDs))
|
||||
for _, userID := range userIDs {
|
||||
has, err := HasAccess(userID, repo, ACCESS_MODE_WRITE)
|
||||
@@ -165,14 +165,14 @@ func UpdateOrgProtectBranch(repo *Repository, protectBranch *ProtectBranch, whit
|
||||
validUserIDs = append(validUserIDs, userID)
|
||||
}
|
||||
|
||||
protectBranch.WhitelistUserIDs = strings.Join(base.Int64sToStrings(validUserIDs), ",")
|
||||
protectBranch.WhitelistUserIDs = strings.Join(tool.Int64sToStrings(validUserIDs), ",")
|
||||
}
|
||||
|
||||
hasTeamsChanged := false
|
||||
validTeamIDs := base.StringsToInt64s(strings.Split(protectBranch.WhitelistTeamIDs, ","))
|
||||
validTeamIDs := tool.StringsToInt64s(strings.Split(protectBranch.WhitelistTeamIDs, ","))
|
||||
if protectBranch.WhitelistTeamIDs != whitelistTeamIDs {
|
||||
hasTeamsChanged = true
|
||||
teamIDs := base.StringsToInt64s(strings.Split(whitelistTeamIDs, ","))
|
||||
teamIDs := tool.StringsToInt64s(strings.Split(whitelistTeamIDs, ","))
|
||||
teams, err := GetTeamsHaveAccessToRepo(repo.OwnerID, repo.ID, ACCESS_MODE_WRITE)
|
||||
if err != nil {
|
||||
return fmt.Errorf("GetTeamsHaveAccessToRepo [org_id: %d, repo_id: %d]: %v", repo.OwnerID, repo.ID, err)
|
||||
@@ -184,7 +184,14 @@ func UpdateOrgProtectBranch(repo *Repository, protectBranch *ProtectBranch, whit
|
||||
}
|
||||
}
|
||||
|
||||
protectBranch.WhitelistTeamIDs = strings.Join(base.Int64sToStrings(validTeamIDs), ",")
|
||||
protectBranch.WhitelistTeamIDs = strings.Join(tool.Int64sToStrings(validTeamIDs), ",")
|
||||
}
|
||||
|
||||
// Make sure protectBranch.ID is not 0 for whitelists
|
||||
if protectBranch.ID == 0 {
|
||||
if _, err = x.Insert(protectBranch); err != nil {
|
||||
return fmt.Errorf("Insert: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// Merge users and members of teams
|
||||
@@ -226,12 +233,6 @@ func UpdateOrgProtectBranch(repo *Repository, protectBranch *ProtectBranch, whit
|
||||
return err
|
||||
}
|
||||
|
||||
if protectBranch.ID == 0 {
|
||||
if _, err = sess.Insert(protectBranch); err != nil {
|
||||
return fmt.Errorf("Insert: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
if _, err = sess.Id(protectBranch.ID).AllCols().Update(protectBranch); err != nil {
|
||||
return fmt.Errorf("Update: %v", err)
|
||||
}
|
||||
|
||||
@@ -7,6 +7,8 @@ package models
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
log "gopkg.in/clog.v1"
|
||||
|
||||
api "github.com/gogits/go-gogs-client"
|
||||
)
|
||||
|
||||
@@ -31,14 +33,22 @@ func (c *Collaboration) ModeI18nKey() string {
|
||||
}
|
||||
}
|
||||
|
||||
//IsCollaborator returns true if the user is a collaborator
|
||||
func (repo *Repository) IsCollaborator(uid int64) (bool, error) {
|
||||
// IsCollaborator returns true if the user is a collaborator of the repository.
|
||||
func IsCollaborator(repoID, userID int64) bool {
|
||||
collaboration := &Collaboration{
|
||||
RepoID: repo.ID,
|
||||
UserID: uid,
|
||||
RepoID: repoID,
|
||||
UserID: userID,
|
||||
}
|
||||
has, err := x.Get(collaboration)
|
||||
if err != nil {
|
||||
log.Error(2, "get collaboration [repo_id: %d, user_id: %d]: %v", repoID, userID, err)
|
||||
return false
|
||||
}
|
||||
return has
|
||||
}
|
||||
|
||||
return x.Get(collaboration)
|
||||
func (repo *Repository) IsCollaborator(userID int64) bool {
|
||||
return IsCollaborator(repo.ID, userID)
|
||||
}
|
||||
|
||||
// AddCollaborator adds new collaboration to a repository with default access mode.
|
||||
@@ -186,10 +196,14 @@ func (repo *Repository) ChangeCollaborationAccessMode(userID int64, mode AccessM
|
||||
}
|
||||
|
||||
// DeleteCollaboration removes collaboration relation between the user and repository.
|
||||
func (repo *Repository) DeleteCollaboration(uid int64) (err error) {
|
||||
func DeleteCollaboration(repo *Repository, userID int64) (err error) {
|
||||
if !IsCollaborator(repo.ID, userID) {
|
||||
return nil
|
||||
}
|
||||
|
||||
collaboration := &Collaboration{
|
||||
RepoID: repo.ID,
|
||||
UserID: uid,
|
||||
UserID: userID,
|
||||
}
|
||||
|
||||
sess := x.NewSession()
|
||||
@@ -206,3 +220,7 @@ func (repo *Repository) DeleteCollaboration(uid int64) (err error) {
|
||||
|
||||
return sess.Commit()
|
||||
}
|
||||
|
||||
func (repo *Repository) DeleteCollaboration(userID int64) error {
|
||||
return DeleteCollaboration(repo, userID)
|
||||
}
|
||||
|
||||
@@ -21,8 +21,8 @@ import (
|
||||
|
||||
git "github.com/gogits/git-module"
|
||||
|
||||
"github.com/gogits/gogs/modules/process"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/pkg/process"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
// ___________ .___.__ __ ___________.__.__
|
||||
@@ -135,12 +135,12 @@ func (repo *Repository) UpdateRepoFile(doer *User, opts UpdateRepoFileOptions) (
|
||||
|
||||
gitRepo, err := git.OpenRepository(repo.RepoPath())
|
||||
if err != nil {
|
||||
log.Error(4, "OpenRepository: %v", err)
|
||||
log.Error(2, "OpenRepository: %v", err)
|
||||
return nil
|
||||
}
|
||||
commit, err := gitRepo.GetBranchCommit(opts.NewBranch)
|
||||
if err != nil {
|
||||
log.Error(4, "GetBranchCommit [branch: %s]: %v", opts.NewBranch, err)
|
||||
log.Error(2, "GetBranchCommit [branch: %s]: %v", opts.NewBranch, err)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -162,10 +162,11 @@ func (repo *Repository) UpdateRepoFile(doer *User, opts UpdateRepoFileOptions) (
|
||||
NewCommitID: commit.ID.String(),
|
||||
Commits: pushCommits,
|
||||
}); err != nil {
|
||||
log.Error(4, "CommitRepoAction: %v", err)
|
||||
log.Error(2, "CommitRepoAction: %v", err)
|
||||
return nil
|
||||
}
|
||||
|
||||
go AddTestPullRequestTask(doer, repo.ID, opts.NewBranch, true)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -265,12 +266,12 @@ func (repo *Repository) DeleteRepoFile(doer *User, opts DeleteRepoFileOptions) (
|
||||
|
||||
gitRepo, err := git.OpenRepository(repo.RepoPath())
|
||||
if err != nil {
|
||||
log.Error(4, "OpenRepository: %v", err)
|
||||
log.Error(2, "OpenRepository: %v", err)
|
||||
return nil
|
||||
}
|
||||
commit, err := gitRepo.GetBranchCommit(opts.NewBranch)
|
||||
if err != nil {
|
||||
log.Error(4, "GetBranchCommit [branch: %s]: %v", opts.NewBranch, err)
|
||||
log.Error(2, "GetBranchCommit [branch: %s]: %v", opts.NewBranch, err)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -288,10 +289,11 @@ func (repo *Repository) DeleteRepoFile(doer *User, opts DeleteRepoFileOptions) (
|
||||
NewCommitID: commit.ID.String(),
|
||||
Commits: pushCommits,
|
||||
}); err != nil {
|
||||
log.Error(4, "CommitRepoAction: %v", err)
|
||||
log.Error(2, "CommitRepoAction: %v", err)
|
||||
return nil
|
||||
}
|
||||
|
||||
go AddTestPullRequestTask(doer, repo.ID, opts.NewBranch, true)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -489,12 +491,12 @@ func (repo *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions)
|
||||
|
||||
gitRepo, err := git.OpenRepository(repo.RepoPath())
|
||||
if err != nil {
|
||||
log.Error(4, "OpenRepository: %v", err)
|
||||
log.Error(2, "OpenRepository: %v", err)
|
||||
return nil
|
||||
}
|
||||
commit, err := gitRepo.GetBranchCommit(opts.NewBranch)
|
||||
if err != nil {
|
||||
log.Error(4, "GetBranchCommit [branch: %s]: %v", opts.NewBranch, err)
|
||||
log.Error(2, "GetBranchCommit [branch: %s]: %v", opts.NewBranch, err)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -512,9 +514,10 @@ func (repo *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions)
|
||||
NewCommitID: commit.ID.String(),
|
||||
Commits: pushCommits,
|
||||
}); err != nil {
|
||||
log.Error(4, "CommitRepoAction: %v", err)
|
||||
log.Error(2, "CommitRepoAction: %v", err)
|
||||
return nil
|
||||
}
|
||||
|
||||
go AddTestPullRequestTask(doer, repo.ID, opts.NewBranch, true)
|
||||
return DeleteUploads(uploads...)
|
||||
}
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
package models_test
|
||||
|
||||
import (
|
||||
. "github.com/gogits/gogs/models"
|
||||
. "github.com/smartystreets/goconvey/convey"
|
||||
"testing"
|
||||
|
||||
"github.com/gogits/gogs/modules/markdown"
|
||||
. "github.com/smartystreets/goconvey/convey"
|
||||
|
||||
. "github.com/gogits/gogs/models"
|
||||
"github.com/gogits/gogs/pkg/markup"
|
||||
)
|
||||
|
||||
func TestRepo(t *testing.T) {
|
||||
@@ -24,7 +25,7 @@ func TestRepo(t *testing.T) {
|
||||
Convey("It should be nil even if other settings are present", func() {
|
||||
repo.EnableExternalTracker = false
|
||||
repo.ExternalTrackerFormat = "http://someurl.com/{user}/{repo}/{issue}"
|
||||
repo.ExternalTrackerStyle = markdown.ISSUE_NAME_STYLE_NUMERIC
|
||||
repo.ExternalTrackerStyle = markup.ISSUE_NAME_STYLE_NUMERIC
|
||||
So(repo.ComposeMetas(), ShouldEqual, map[string]string(nil))
|
||||
})
|
||||
})
|
||||
@@ -33,17 +34,17 @@ func TestRepo(t *testing.T) {
|
||||
repo.EnableExternalTracker = true
|
||||
Convey("It should default to numeric issue style", func() {
|
||||
metas := repo.ComposeMetas()
|
||||
So(metas["style"], ShouldEqual, markdown.ISSUE_NAME_STYLE_NUMERIC)
|
||||
So(metas["style"], ShouldEqual, markup.ISSUE_NAME_STYLE_NUMERIC)
|
||||
})
|
||||
Convey("It should pass through numeric issue style setting", func() {
|
||||
repo.ExternalTrackerStyle = markdown.ISSUE_NAME_STYLE_NUMERIC
|
||||
repo.ExternalTrackerStyle = markup.ISSUE_NAME_STYLE_NUMERIC
|
||||
metas := repo.ComposeMetas()
|
||||
So(metas["style"], ShouldEqual, markdown.ISSUE_NAME_STYLE_NUMERIC)
|
||||
So(metas["style"], ShouldEqual, markup.ISSUE_NAME_STYLE_NUMERIC)
|
||||
})
|
||||
Convey("It should pass through alphanumeric issue style setting", func() {
|
||||
repo.ExternalTrackerStyle = markdown.ISSUE_NAME_STYLE_ALPHANUMERIC
|
||||
repo.ExternalTrackerStyle = markup.ISSUE_NAME_STYLE_ALPHANUMERIC
|
||||
metas := repo.ComposeMetas()
|
||||
So(metas["style"], ShouldEqual, markdown.ISSUE_NAME_STYLE_ALPHANUMERIC)
|
||||
So(metas["style"], ShouldEqual, markup.ISSUE_NAME_STYLE_ALPHANUMERIC)
|
||||
})
|
||||
Convey("It should contain the user name", func() {
|
||||
metas := repo.ComposeMetas()
|
||||
|
||||
@@ -23,9 +23,9 @@ import (
|
||||
"golang.org/x/crypto/ssh"
|
||||
log "gopkg.in/clog.v1"
|
||||
|
||||
"github.com/gogits/gogs/modules/base"
|
||||
"github.com/gogits/gogs/modules/process"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/pkg/tool"
|
||||
"github.com/gogits/gogs/pkg/process"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -484,7 +484,7 @@ func deletePublicKeys(e *xorm.Session, keyIDs ...int64) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
_, err := e.In("id", strings.Join(base.Int64sToStrings(keyIDs), ",")).Delete(new(PublicKey))
|
||||
_, err := e.In("id", strings.Join(tool.Int64sToStrings(keyIDs), ",")).Delete(new(PublicKey))
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
|
||||
. "github.com/smartystreets/goconvey/convey"
|
||||
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
func init() {
|
||||
|
||||
@@ -10,7 +10,7 @@ import (
|
||||
"github.com/go-xorm/xorm"
|
||||
gouuid "github.com/satori/go.uuid"
|
||||
|
||||
"github.com/gogits/gogs/modules/base"
|
||||
"github.com/gogits/gogs/pkg/tool"
|
||||
)
|
||||
|
||||
// AccessToken represents a personal access token.
|
||||
@@ -49,7 +49,7 @@ func (t *AccessToken) AfterSet(colName string, _ xorm.Cell) {
|
||||
|
||||
// NewAccessToken creates new access token.
|
||||
func NewAccessToken(t *AccessToken) error {
|
||||
t.Sha1 = base.EncodeSha1(gouuid.NewV4().String())
|
||||
t.Sha1 = tool.EncodeSha1(gouuid.NewV4().String())
|
||||
_, err := x.Insert(t)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -30,10 +30,9 @@ import (
|
||||
api "github.com/gogits/go-gogs-client"
|
||||
|
||||
"github.com/gogits/gogs/models/errors"
|
||||
"github.com/gogits/gogs/modules/avatar"
|
||||
"github.com/gogits/gogs/modules/base"
|
||||
"github.com/gogits/gogs/modules/markdown"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/pkg/avatar"
|
||||
"github.com/gogits/gogs/pkg/tool"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
type UserType int
|
||||
@@ -114,8 +113,6 @@ func (u *User) BeforeUpdate() {
|
||||
|
||||
func (u *User) AfterSet(colName string, _ xorm.Cell) {
|
||||
switch colName {
|
||||
case "full_name":
|
||||
u.FullName = markdown.Sanitizer.Sanitize(u.FullName)
|
||||
case "created_unix":
|
||||
u.Created = time.Unix(u.CreatedUnix, 0).Local()
|
||||
case "updated_unix":
|
||||
@@ -194,7 +191,7 @@ func (u *User) HTMLURL() string {
|
||||
|
||||
// GenerateEmailActivateCode generates an activate code based on user information and given e-mail.
|
||||
func (u *User) GenerateEmailActivateCode(email string) string {
|
||||
code := base.CreateTimeLimitCode(
|
||||
code := tool.CreateTimeLimitCode(
|
||||
com.ToStr(u.ID)+email+u.LowerName+u.Passwd+u.Rands,
|
||||
setting.Service.ActiveCodeLives, nil)
|
||||
|
||||
@@ -265,7 +262,7 @@ func (u *User) RelAvatarLink() string {
|
||||
|
||||
return setting.AppSubUrl + "/avatars/" + com.ToStr(u.ID)
|
||||
}
|
||||
return base.AvatarLink(u.AvatarEmail)
|
||||
return tool.AvatarLink(u.AvatarEmail)
|
||||
}
|
||||
|
||||
// AvatarLink returns user avatar absolute link.
|
||||
@@ -465,7 +462,7 @@ func (u *User) DisplayName() string {
|
||||
}
|
||||
|
||||
func (u *User) ShortName(length int) string {
|
||||
return base.EllipsisString(u.Name, length)
|
||||
return tool.EllipsisString(u.Name, length)
|
||||
}
|
||||
|
||||
// IsMailable checks if a user is elegible
|
||||
@@ -487,7 +484,7 @@ func IsUserExist(uid int64, name string) (bool, error) {
|
||||
|
||||
// GetUserSalt returns a ramdom user salt token.
|
||||
func GetUserSalt() (string, error) {
|
||||
return base.GetRandomString(10)
|
||||
return tool.GetRandomString(10)
|
||||
}
|
||||
|
||||
// NewGhostUser creates and returns a fake user for someone has deleted his/her account.
|
||||
@@ -556,7 +553,7 @@ func CreateUser(u *User) (err error) {
|
||||
|
||||
u.LowerName = strings.ToLower(u.Name)
|
||||
u.AvatarEmail = u.Email
|
||||
u.Avatar = base.HashEmail(u.AvatarEmail)
|
||||
u.Avatar = tool.HashEmail(u.AvatarEmail)
|
||||
if u.Rands, err = GetUserSalt(); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -599,12 +596,12 @@ func Users(page, pageSize int) ([]*User, error) {
|
||||
|
||||
// get user by erify code
|
||||
func getVerifyUser(code string) (user *User) {
|
||||
if len(code) <= base.TimeLimitCodeLength {
|
||||
if len(code) <= tool.TimeLimitCodeLength {
|
||||
return nil
|
||||
}
|
||||
|
||||
// use tail hex username query user
|
||||
hexStr := code[base.TimeLimitCodeLength:]
|
||||
hexStr := code[tool.TimeLimitCodeLength:]
|
||||
if b, err := hex.DecodeString(hexStr); err == nil {
|
||||
if user, err = GetUserByName(string(b)); user != nil {
|
||||
return user
|
||||
@@ -621,10 +618,10 @@ func VerifyUserActiveCode(code string) (user *User) {
|
||||
|
||||
if user = getVerifyUser(code); user != nil {
|
||||
// time limit code
|
||||
prefix := code[:base.TimeLimitCodeLength]
|
||||
prefix := code[:tool.TimeLimitCodeLength]
|
||||
data := com.ToStr(user.ID) + user.Email + user.LowerName + user.Passwd + user.Rands
|
||||
|
||||
if base.VerifyTimeLimitCode(data, minutes, prefix) {
|
||||
if tool.VerifyTimeLimitCode(data, minutes, prefix) {
|
||||
return user
|
||||
}
|
||||
}
|
||||
@@ -637,10 +634,10 @@ func VerifyActiveEmailCode(code, email string) *EmailAddress {
|
||||
|
||||
if user := getVerifyUser(code); user != nil {
|
||||
// time limit code
|
||||
prefix := code[:base.TimeLimitCodeLength]
|
||||
prefix := code[:tool.TimeLimitCodeLength]
|
||||
data := com.ToStr(user.ID) + email + user.LowerName + user.Passwd + user.Rands
|
||||
|
||||
if base.VerifyTimeLimitCode(data, minutes, prefix) {
|
||||
if tool.VerifyTimeLimitCode(data, minutes, prefix) {
|
||||
emailAddress := &EmailAddress{Email: email}
|
||||
if has, _ := x.Get(emailAddress); has {
|
||||
return emailAddress
|
||||
@@ -699,15 +696,14 @@ func updateUser(e Engine, u *User) error {
|
||||
if len(u.AvatarEmail) == 0 {
|
||||
u.AvatarEmail = u.Email
|
||||
}
|
||||
u.Avatar = base.HashEmail(u.AvatarEmail)
|
||||
u.Avatar = tool.HashEmail(u.AvatarEmail)
|
||||
}
|
||||
|
||||
u.LowerName = strings.ToLower(u.Name)
|
||||
u.Location = base.TruncateString(u.Location, 255)
|
||||
u.Website = base.TruncateString(u.Website, 255)
|
||||
u.Description = base.TruncateString(u.Description, 255)
|
||||
u.Location = tool.TruncateString(u.Location, 255)
|
||||
u.Website = tool.TruncateString(u.Website, 255)
|
||||
u.Description = tool.TruncateString(u.Description, 255)
|
||||
|
||||
u.FullName = markdown.Sanitizer.Sanitize(u.FullName)
|
||||
_, err := e.Id(u.ID).AllCols().Update(u)
|
||||
return err
|
||||
}
|
||||
@@ -896,7 +892,7 @@ func getUserByID(e Engine, id int64) (*User, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if !has {
|
||||
return nil, ErrUserNotExist{id, ""}
|
||||
return nil, errors.UserNotExist{id, ""}
|
||||
}
|
||||
return u, nil
|
||||
}
|
||||
@@ -912,7 +908,7 @@ func GetAssigneeByID(repo *Repository, userID int64) (*User, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if !has {
|
||||
return nil, ErrUserNotExist{userID, ""}
|
||||
return nil, errors.UserNotExist{userID, ""}
|
||||
}
|
||||
return GetUserByID(userID)
|
||||
}
|
||||
@@ -920,14 +916,14 @@ func GetAssigneeByID(repo *Repository, userID int64) (*User, error) {
|
||||
// GetUserByName returns user by given name.
|
||||
func GetUserByName(name string) (*User, error) {
|
||||
if len(name) == 0 {
|
||||
return nil, ErrUserNotExist{0, name}
|
||||
return nil, errors.UserNotExist{0, name}
|
||||
}
|
||||
u := &User{LowerName: strings.ToLower(name)}
|
||||
has, err := x.Get(u)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if !has {
|
||||
return nil, ErrUserNotExist{0, name}
|
||||
return nil, errors.UserNotExist{0, name}
|
||||
}
|
||||
return u, nil
|
||||
}
|
||||
@@ -1005,7 +1001,7 @@ func ValidateCommitsWithEmails(oldCommits *list.List) *list.List {
|
||||
// GetUserByEmail returns the user object by given e-mail if exists.
|
||||
func GetUserByEmail(email string) (*User, error) {
|
||||
if len(email) == 0 {
|
||||
return nil, ErrUserNotExist{0, "email"}
|
||||
return nil, errors.UserNotExist{0, "email"}
|
||||
}
|
||||
|
||||
email = strings.ToLower(email)
|
||||
@@ -1029,7 +1025,7 @@ func GetUserByEmail(email string) (*User, error) {
|
||||
return GetUserByID(emailAddress.UID)
|
||||
}
|
||||
|
||||
return nil, ErrUserNotExist{0, email}
|
||||
return nil, errors.UserNotExist{0, email}
|
||||
}
|
||||
|
||||
type SearchUserOptions struct {
|
||||
|
||||
@@ -177,7 +177,7 @@ func MakeEmailPrimary(email *EmailAddress) error {
|
||||
if err != nil {
|
||||
return err
|
||||
} else if !has {
|
||||
return ErrUserNotExist{email.UID, ""}
|
||||
return errors.UserNotExist{email.UID, ""}
|
||||
}
|
||||
|
||||
// Make sure the former primary email doesn't disappear.
|
||||
|
||||
@@ -21,9 +21,10 @@ import (
|
||||
|
||||
api "github.com/gogits/go-gogs-client"
|
||||
|
||||
"github.com/gogits/gogs/modules/httplib"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/modules/sync"
|
||||
"github.com/gogits/gogs/models/errors"
|
||||
"github.com/gogits/gogs/pkg/httplib"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
"github.com/gogits/gogs/pkg/sync"
|
||||
)
|
||||
|
||||
var HookQueue = sync.NewUniqueQueue(setting.Webhook.QueueLength)
|
||||
@@ -241,7 +242,7 @@ func getWebhook(bean *Webhook) (*Webhook, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if !has {
|
||||
return nil, ErrWebhookNotExist{bean.ID}
|
||||
return nil, errors.WebhookNotExist{bean.ID}
|
||||
}
|
||||
return bean, nil
|
||||
}
|
||||
@@ -494,6 +495,21 @@ func createHookTask(e Engine, t *HookTask) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// GetHookTaskOfWebhookByUUID returns hook task of given webhook by UUID.
|
||||
func GetHookTaskOfWebhookByUUID(webhookID int64, uuid string) (*HookTask, error) {
|
||||
hookTask := &HookTask{
|
||||
HookID: webhookID,
|
||||
UUID: uuid,
|
||||
}
|
||||
has, err := x.Get(hookTask)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if !has {
|
||||
return nil, errors.HookTaskNotExist{webhookID, uuid}
|
||||
}
|
||||
return hookTask, nil
|
||||
}
|
||||
|
||||
// UpdateHookTask updates information of hook task.
|
||||
func UpdateHookTask(t *HookTask) error {
|
||||
_, err := x.Id(t.ID).AllCols().Update(t)
|
||||
@@ -586,8 +602,8 @@ func prepareHookTasks(e Engine, repo *Repository, event HookEventType, p api.Pay
|
||||
}
|
||||
|
||||
// It's safe to fail when the whole function is called during hook execution
|
||||
// because resource released after exit.
|
||||
// FIXME: need a more safe way to not call this function if it's during hook execution.
|
||||
// because resource released after exit. Also, there is no process started to
|
||||
// consume this input during hook execution.
|
||||
go HookQueue.Add(repo.ID)
|
||||
return nil
|
||||
}
|
||||
@@ -704,7 +720,7 @@ func (t *HookTask) deliver() {
|
||||
// TODO: shoot more hooks at same time.
|
||||
func DeliverHooks() {
|
||||
tasks := make([]*HookTask, 0, 10)
|
||||
x.Where("is_delivered=?", false).Iterate(new(HookTask),
|
||||
x.Where("is_delivered = ?", false).Iterate(new(HookTask),
|
||||
func(idx int, bean interface{}) error {
|
||||
t := bean.(*HookTask)
|
||||
t.deliver()
|
||||
@@ -725,7 +741,7 @@ func DeliverHooks() {
|
||||
HookQueue.Remove(repoID)
|
||||
|
||||
tasks = make([]*HookTask, 0, 5)
|
||||
if err := x.Where("repo_id=? AND is_delivered=?", repoID, false).Find(&tasks); err != nil {
|
||||
if err := x.Where("repo_id = ?", repoID).And("is_delivered = ?", false).Find(&tasks); err != nil {
|
||||
log.Error(4, "Get repository [%s] hook tasks: %v", repoID, err)
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ import (
|
||||
"github.com/gogits/git-module"
|
||||
api "github.com/gogits/go-gogs-client"
|
||||
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
type DiscordEmbedFooterObject struct {
|
||||
|
||||
@@ -12,7 +12,7 @@ import (
|
||||
"github.com/gogits/git-module"
|
||||
api "github.com/gogits/go-gogs-client"
|
||||
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
type SlackMeta struct {
|
||||
|
||||
@@ -17,8 +17,8 @@ import (
|
||||
|
||||
"github.com/gogits/git-module"
|
||||
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/modules/sync"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
"github.com/gogits/gogs/pkg/sync"
|
||||
)
|
||||
|
||||
var wikiWorkingPool = sync.NewExclusivePool()
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
// Copyright 2014 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 base
|
||||
|
||||
const DOC_URL = "https://github.com/gogits/go-gogs-client/wiki"
|
||||
|
||||
type (
|
||||
TplName string
|
||||
)
|
||||
File diff suppressed because one or more lines are too long
@@ -14,8 +14,9 @@ import (
|
||||
"gopkg.in/macaron.v1"
|
||||
|
||||
"github.com/gogits/gogs/models"
|
||||
"github.com/gogits/gogs/modules/base"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/models/errors"
|
||||
"github.com/gogits/gogs/pkg/tool"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
func IsAPIPath(url string) bool {
|
||||
@@ -65,8 +66,8 @@ func SignedInID(ctx *macaron.Context, sess session.Store) int64 {
|
||||
}
|
||||
if id, ok := uid.(int64); ok {
|
||||
if _, err := models.GetUserByID(id); err != nil {
|
||||
if !models.IsErrUserNotExist(err) {
|
||||
log.Error(2, "GetUserById: %v", err)
|
||||
if !errors.IsUserNotExist(err) {
|
||||
log.Error(2, "GetUserByID: %v", err)
|
||||
}
|
||||
return 0
|
||||
}
|
||||
@@ -90,7 +91,7 @@ func SignedInUser(ctx *macaron.Context, sess session.Store) (*models.User, bool)
|
||||
if len(webAuthUser) > 0 {
|
||||
u, err := models.GetUserByName(webAuthUser)
|
||||
if err != nil {
|
||||
if !models.IsErrUserNotExist(err) {
|
||||
if !errors.IsUserNotExist(err) {
|
||||
log.Error(4, "GetUserByName: %v", err)
|
||||
return nil, false
|
||||
}
|
||||
@@ -121,11 +122,11 @@ func SignedInUser(ctx *macaron.Context, sess session.Store) (*models.User, bool)
|
||||
if len(baHead) > 0 {
|
||||
auths := strings.Fields(baHead)
|
||||
if len(auths) == 2 && auths[0] == "Basic" {
|
||||
uname, passwd, _ := base.BasicAuthDecode(auths[1])
|
||||
uname, passwd, _ := tool.BasicAuthDecode(auths[1])
|
||||
|
||||
u, err := models.UserSignIn(uname, passwd)
|
||||
if err != nil {
|
||||
if !models.IsErrUserNotExist(err) {
|
||||
if !errors.IsUserNotExist(err) {
|
||||
log.Error(4, "UserSignIn: %v", err)
|
||||
}
|
||||
return nil, false
|
||||
5399
pkg/bindata/bindata.go
Normal file
5399
pkg/bindata/bindata.go
Normal file
File diff suppressed because one or more lines are too long
@@ -12,8 +12,7 @@ import (
|
||||
log "gopkg.in/clog.v1"
|
||||
"gopkg.in/macaron.v1"
|
||||
|
||||
"github.com/gogits/gogs/modules/base"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
type APIContext struct {
|
||||
@@ -21,6 +20,9 @@ type APIContext struct {
|
||||
Org *APIOrganization
|
||||
}
|
||||
|
||||
// FIXME: move to github.com/gogits/go-gogs-client
|
||||
const DOC_URL = "https://github.com/gogits/go-gogs-client/wiki"
|
||||
|
||||
// Error responses error message to client with given message.
|
||||
// If status is 500, also it prints error to log.
|
||||
func (ctx *APIContext) Error(status int, title string, obj interface{}) {
|
||||
@@ -37,7 +39,7 @@ func (ctx *APIContext) Error(status int, title string, obj interface{}) {
|
||||
|
||||
ctx.JSON(status, map[string]string{
|
||||
"message": message,
|
||||
"url": base.DOC_URL,
|
||||
"url": DOC_URL,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -10,8 +10,8 @@ import (
|
||||
"github.com/go-macaron/csrf"
|
||||
"gopkg.in/macaron.v1"
|
||||
|
||||
"github.com/gogits/gogs/modules/auth"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/pkg/auth"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
type ToggleOptions struct {
|
||||
@@ -20,10 +20,9 @@ import (
|
||||
"gopkg.in/macaron.v1"
|
||||
|
||||
"github.com/gogits/gogs/models"
|
||||
"github.com/gogits/gogs/modules/auth"
|
||||
"github.com/gogits/gogs/modules/base"
|
||||
"github.com/gogits/gogs/modules/form"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/pkg/auth"
|
||||
"github.com/gogits/gogs/pkg/form"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
// Context represents context of a request.
|
||||
@@ -42,6 +41,13 @@ type Context struct {
|
||||
Org *Organization
|
||||
}
|
||||
|
||||
func (ctx *Context) UserID() int64 {
|
||||
if !ctx.IsSigned {
|
||||
return 0
|
||||
}
|
||||
return ctx.User.ID
|
||||
}
|
||||
|
||||
// HasError returns true if error occurs in form validation.
|
||||
func (ctx *Context) HasApiError() bool {
|
||||
hasErr, ok := ctx.Data["HasError"]
|
||||
@@ -72,52 +78,61 @@ func (ctx *Context) HasValue(name string) bool {
|
||||
return ok
|
||||
}
|
||||
|
||||
// HTML calls Context.HTML and converts template name to string.
|
||||
func (ctx *Context) HTML(status int, name base.TplName) {
|
||||
// HTML responses template with given status.
|
||||
func (ctx *Context) HTML(status int, name string) {
|
||||
log.Trace("Template: %s", name)
|
||||
ctx.Context.HTML(status, string(name))
|
||||
ctx.Context.HTML(status, name)
|
||||
}
|
||||
|
||||
// Success responses template with status http.StatusOK.
|
||||
func (c *Context) Success(name string) {
|
||||
c.HTML(http.StatusOK, name)
|
||||
}
|
||||
|
||||
// RenderWithErr used for page has form validation but need to prompt error to users.
|
||||
func (ctx *Context) RenderWithErr(msg string, tpl base.TplName, f interface{}) {
|
||||
func (ctx *Context) RenderWithErr(msg, tpl string, f interface{}) {
|
||||
if f != nil {
|
||||
form.Assign(f, ctx.Data)
|
||||
}
|
||||
ctx.Flash.ErrorMsg = msg
|
||||
ctx.Data["Flash"] = ctx.Flash
|
||||
ctx.HTML(200, tpl)
|
||||
ctx.HTML(http.StatusOK, tpl)
|
||||
}
|
||||
|
||||
// Handle handles and logs error by given status.
|
||||
func (ctx *Context) Handle(status int, title string, err error) {
|
||||
switch status {
|
||||
case 404:
|
||||
case http.StatusNotFound:
|
||||
ctx.Data["Title"] = "Page Not Found"
|
||||
case 500:
|
||||
case http.StatusInternalServerError:
|
||||
ctx.Data["Title"] = "Internal Server Error"
|
||||
log.Error(2, "%s: %v", title, err)
|
||||
if !setting.ProdMode || (ctx.IsSigned && ctx.User.IsAdmin) {
|
||||
ctx.Data["ErrorMsg"] = err
|
||||
}
|
||||
}
|
||||
ctx.HTML(status, base.TplName(fmt.Sprintf("status/%d", status)))
|
||||
ctx.HTML(status, fmt.Sprintf("status/%d", status))
|
||||
}
|
||||
|
||||
// NotFound simply renders the 404 page.
|
||||
// NotFound renders the 404 page.
|
||||
func (ctx *Context) NotFound() {
|
||||
ctx.Handle(404, "", nil)
|
||||
ctx.Handle(http.StatusNotFound, "", nil)
|
||||
}
|
||||
|
||||
// ServerError renders the 500 page.
|
||||
func (c *Context) ServerError(title string, err error) {
|
||||
c.Handle(http.StatusInternalServerError, title, err)
|
||||
}
|
||||
|
||||
// NotFoundOrServerError use error check function to determine if the error
|
||||
// is about not found. It responses with 404 status code for not found error,
|
||||
// or error context description for logging purpose of 500 server error.
|
||||
func (ctx *Context) NotFoundOrServerError(title string, errck func(error) bool, err error) {
|
||||
func (c *Context) NotFoundOrServerError(title string, errck func(error) bool, err error) {
|
||||
if errck(err) {
|
||||
ctx.NotFound()
|
||||
c.NotFound()
|
||||
return
|
||||
}
|
||||
|
||||
ctx.Handle(500, title, err)
|
||||
c.ServerError(title, err)
|
||||
}
|
||||
|
||||
func (ctx *Context) HandleText(status int, title string) {
|
||||
@@ -10,7 +10,8 @@ import (
|
||||
"gopkg.in/macaron.v1"
|
||||
|
||||
"github.com/gogits/gogs/models"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/models/errors"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
type Organization struct {
|
||||
@@ -49,11 +50,7 @@ func HandleOrgAssignment(ctx *Context, args ...bool) {
|
||||
var err error
|
||||
ctx.Org.Organization, err = models.GetUserByName(orgName)
|
||||
if err != nil {
|
||||
if models.IsErrUserNotExist(err) {
|
||||
ctx.Handle(404, "GetUserByName", err)
|
||||
} else {
|
||||
ctx.Handle(500, "GetUserByName", err)
|
||||
}
|
||||
ctx.NotFoundOrServerError("GetUserByName", errors.IsUserNotExist, err)
|
||||
return
|
||||
}
|
||||
org := ctx.Org.Organization
|
||||
@@ -11,14 +11,14 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/Unknwon/com"
|
||||
log "gopkg.in/clog.v1"
|
||||
"gopkg.in/editorconfig/editorconfig-core-go.v1"
|
||||
"gopkg.in/macaron.v1"
|
||||
|
||||
"github.com/gogits/git-module"
|
||||
|
||||
"github.com/gogits/gogs/models"
|
||||
"github.com/gogits/gogs/modules/setting"
|
||||
"github.com/gogits/gogs/models/errors"
|
||||
"github.com/gogits/gogs/pkg/setting"
|
||||
)
|
||||
|
||||
type PullRequest struct {
|
||||
@@ -108,22 +108,6 @@ func (r *Repository) PullRequestURL(baseBranch, headBranch string) string {
|
||||
return fmt.Sprintf("%s/compare/%s...%s:%s", repoLink, baseBranch, r.Owner.Name, headBranch)
|
||||
}
|
||||
|
||||
func RetrieveBaseRepo(ctx *Context, repo *models.Repository) {
|
||||
// Non-fork repository will not return error in this method.
|
||||
if err := repo.GetBaseRepo(); err != nil {
|
||||
if models.IsErrRepoNotExist(err) {
|
||||
repo.IsFork = false
|
||||
repo.ForkID = 0
|
||||
return
|
||||
}
|
||||
ctx.Handle(500, "GetBaseRepo", err)
|
||||
return
|
||||
} else if err = repo.BaseRepo.GetOwner(); err != nil {
|
||||
ctx.Handle(500, "BaseRepo.GetOwner", err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// composeGoGetImport returns go-get-import meta content.
|
||||
func composeGoGetImport(owner, repo string) string {
|
||||
return path.Join(setting.Domain, setting.AppSubUrl, owner, repo)
|
||||
@@ -142,19 +126,22 @@ func earlyResponseForGoGetMeta(ctx *Context) {
|
||||
})))
|
||||
}
|
||||
|
||||
func RepoAssignment(args ...bool) macaron.Handler {
|
||||
// [0]: issues, [1]: wiki
|
||||
func RepoAssignment(pages ...bool) macaron.Handler {
|
||||
return func(ctx *Context) {
|
||||
var (
|
||||
displayBare bool // To display bare page if it is a bare repo.
|
||||
owner *models.User
|
||||
err error
|
||||
isIssuesPage bool
|
||||
isWikiPage bool
|
||||
)
|
||||
if len(args) >= 1 {
|
||||
displayBare = args[0]
|
||||
}
|
||||
|
||||
var (
|
||||
owner *models.User
|
||||
err error
|
||||
)
|
||||
if len(pages) > 0 {
|
||||
isIssuesPage = pages[0]
|
||||
}
|
||||
if len(pages) > 1 {
|
||||
isWikiPage = pages[1]
|
||||
}
|
||||
|
||||
ownerName := ctx.Params(":username")
|
||||
repoName := strings.TrimSuffix(ctx.Params(":reponame"), ".git")
|
||||
@@ -169,7 +156,7 @@ func RepoAssignment(args ...bool) macaron.Handler {
|
||||
} else {
|
||||
owner, err = models.GetUserByName(ownerName)
|
||||
if err != nil {
|
||||
if models.IsErrUserNotExist(err) {
|
||||
if errors.IsUserNotExist(err) {
|
||||
if ctx.Query("go-get") == "1" {
|
||||
earlyResponseForGoGetMeta(ctx)
|
||||
return
|
||||
@@ -187,7 +174,7 @@ func RepoAssignment(args ...bool) macaron.Handler {
|
||||
// Get repository.
|
||||
repo, err := models.GetRepositoryByName(owner.ID, repoName)
|
||||
if err != nil {
|
||||
if models.IsErrRepoNotExist(err) {
|
||||
if errors.IsRepoNotExist(err) {
|
||||
if ctx.Query("go-get") == "1" {
|
||||
earlyResponseForGoGetMeta(ctx)
|
||||
return
|
||||
@@ -197,20 +184,20 @@ func RepoAssignment(args ...bool) macaron.Handler {
|
||||
ctx.Handle(500, "GetRepositoryByName", err)
|
||||
}
|
||||
return
|
||||
} else if err = repo.GetOwner(); err != nil {
|
||||
ctx.Handle(500, "GetOwner", err)
|
||||
return
|
||||
}
|
||||
|
||||
ctx.Repo.Repository = repo
|
||||
ctx.Data["RepoName"] = ctx.Repo.Repository.Name
|
||||
ctx.Data["IsBareRepo"] = ctx.Repo.Repository.IsBare
|
||||
ctx.Repo.RepoLink = repo.Link()
|
||||
ctx.Data["RepoLink"] = ctx.Repo.RepoLink
|
||||
ctx.Data["RepoRelPath"] = ctx.Repo.Owner.Name + "/" + ctx.Repo.Repository.Name
|
||||
|
||||
// Admin has super access.
|
||||
if ctx.IsSigned && ctx.User.IsAdmin {
|
||||
ctx.Repo.AccessMode = models.ACCESS_MODE_OWNER
|
||||
} else {
|
||||
var userID int64
|
||||
if ctx.IsSigned {
|
||||
userID = ctx.User.ID
|
||||
}
|
||||
mode, err := models.AccessLevel(userID, repo)
|
||||
mode, err := models.AccessLevel(ctx.UserID(), repo)
|
||||
if err != nil {
|
||||
ctx.Handle(500, "AccessLevel", err)
|
||||
return
|
||||
@@ -218,16 +205,40 @@ func RepoAssignment(args ...bool) macaron.Handler {
|
||||
ctx.Repo.AccessMode = mode
|
||||
}
|
||||
|
||||
// Check access.
|
||||
// Check access
|
||||
if ctx.Repo.AccessMode == models.ACCESS_MODE_NONE {
|
||||
if ctx.Query("go-get") == "1" {
|
||||
earlyResponseForGoGetMeta(ctx)
|
||||
return
|
||||
}
|
||||
ctx.NotFound()
|
||||
return
|
||||
|
||||
// Redirect to any accessible page if not yet on it
|
||||
if repo.IsPartialPublic() &&
|
||||
(!(isIssuesPage || isWikiPage) ||
|
||||
(isIssuesPage && !repo.CanGuestViewIssues()) ||
|
||||
(isWikiPage && !repo.CanGuestViewWiki())) {
|
||||
switch {
|
||||
case repo.CanGuestViewIssues():
|
||||
ctx.Redirect(repo.Link() + "/issues")
|
||||
case repo.CanGuestViewWiki():
|
||||
ctx.Redirect(repo.Link() + "/wiki")
|
||||
default:
|
||||
ctx.NotFound()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Response 404 if user is on completely private repository or possible accessible page but owner doesn't enabled
|
||||
if !repo.IsPartialPublic() ||
|
||||
(isIssuesPage && !repo.CanGuestViewIssues()) ||
|
||||
(isWikiPage && !repo.CanGuestViewWiki()) {
|
||||
ctx.NotFound()
|
||||
return
|
||||
}
|
||||
|
||||
ctx.Repo.Repository.EnableIssues = repo.CanGuestViewIssues()
|
||||
ctx.Repo.Repository.EnableWiki = repo.CanGuestViewWiki()
|
||||
}
|
||||
ctx.Data["HasAccess"] = true
|
||||
|
||||
if repo.IsMirror {
|
||||
ctx.Repo.Mirror, err = models.GetMirrorByRepoID(repo.ID)
|
||||
@@ -240,19 +251,12 @@ func RepoAssignment(args ...bool) macaron.Handler {
|
||||
ctx.Data["Mirror"] = ctx.Repo.Mirror
|
||||
}
|
||||
|
||||
ctx.Repo.Repository = repo
|
||||
ctx.Data["RepoName"] = ctx.Repo.Repository.Name
|
||||
ctx.Data["IsBareRepo"] = ctx.Repo.Repository.IsBare
|
||||
|
||||
gitRepo, err := git.OpenRepository(models.RepoPath(ownerName, repoName))
|
||||
if err != nil {
|
||||
ctx.Handle(500, "RepoAssignment Invalid repo "+models.RepoPath(ownerName, repoName), err)
|
||||
return
|
||||
}
|
||||
ctx.Repo.GitRepo = gitRepo
|
||||
ctx.Repo.RepoLink = repo.Link()
|
||||
ctx.Data["RepoLink"] = ctx.Repo.RepoLink
|
||||
ctx.Data["RepoRelPath"] = ctx.Repo.Owner.Name + "/" + ctx.Repo.Repository.Name
|
||||
|
||||
tags, err := ctx.Repo.GitRepo.GetTags()
|
||||
if err != nil {
|
||||
@@ -281,15 +285,6 @@ func RepoAssignment(args ...bool) macaron.Handler {
|
||||
|
||||
// repo is bare and display enable
|
||||
if ctx.Repo.Repository.IsBare {
|
||||
log.Trace("Bare repository: %s", ctx.Repo.RepoLink)
|
||||
// NOTE: to prevent templating error
|
||||
ctx.Data["BranchName"] = ""
|
||||
if displayBare {
|
||||
if !ctx.Repo.IsAdmin() {
|
||||
ctx.Flash.Info(ctx.Tr("repo.repo_is_empty"), true)
|
||||
}
|
||||
ctx.HTML(200, "repo/bare")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
@@ -320,6 +315,8 @@ func RepoAssignment(args ...bool) macaron.Handler {
|
||||
ctx.Data["GoDocDirectory"] = prefix + "{/dir}"
|
||||
ctx.Data["GoDocFile"] = prefix + "{/dir}/{file}#L{line}"
|
||||
}
|
||||
|
||||
ctx.Data["IsGuest"] = !ctx.Repo.HasAccess()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -426,23 +423,24 @@ func RepoRef() macaron.Handler {
|
||||
ctx.Data["IsViewTag"] = ctx.Repo.IsViewTag
|
||||
ctx.Data["IsViewCommit"] = ctx.Repo.IsViewCommit
|
||||
|
||||
if ctx.Repo.Repository.IsFork {
|
||||
RetrieveBaseRepo(ctx, ctx.Repo.Repository)
|
||||
if ctx.Written() {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// People who have push access or have fored repository can propose a new pull request.
|
||||
if ctx.Repo.IsWriter() || (ctx.IsSigned && ctx.User.HasForkedRepo(ctx.Repo.Repository.ID)) {
|
||||
// Pull request is allowed if this is a fork repository
|
||||
// and base repository accepts pull requests.
|
||||
if ctx.Repo.Repository.BaseRepo != nil {
|
||||
if ctx.Repo.Repository.BaseRepo.AllowsPulls() {
|
||||
ctx.Data["BaseRepo"] = ctx.Repo.Repository.BaseRepo
|
||||
ctx.Repo.PullRequest.BaseRepo = ctx.Repo.Repository.BaseRepo
|
||||
ctx.Repo.PullRequest.Allowed = true
|
||||
ctx.Repo.PullRequest.HeadInfo = ctx.Repo.Owner.Name + ":" + ctx.Repo.BranchName
|
||||
// In-repository pull requests has higher priority than cross-repository if user is viewing
|
||||
// base repository and 1) has write access to it 2) has forked it.
|
||||
if ctx.Repo.IsWriter() {
|
||||
ctx.Data["BaseRepo"] = ctx.Repo.Repository.BaseRepo
|
||||
ctx.Repo.PullRequest.BaseRepo = ctx.Repo.Repository.BaseRepo
|
||||
ctx.Repo.PullRequest.HeadInfo = ctx.Repo.Owner.Name + ":" + ctx.Repo.BranchName
|
||||
} else {
|
||||
ctx.Data["BaseRepo"] = ctx.Repo.Repository
|
||||
ctx.Repo.PullRequest.BaseRepo = ctx.Repo.Repository
|
||||
ctx.Repo.PullRequest.HeadInfo = ctx.User.Name + ":" + ctx.Repo.BranchName
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Or, this is repository accepts pull requests between branches.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user