Merge branch 'master' of https://github.com/go-gitea/gitea
This commit is contained in:
commit
647296ce63
|
|
@ -56,7 +56,7 @@ pipeline:
|
|||
event: [ push, tag, pull_request ]
|
||||
|
||||
build-without-gcc:
|
||||
image: webhippie/golang:edge
|
||||
image: webhippie/golang:1.8
|
||||
pull: true
|
||||
environment:
|
||||
GOPATH: /srv/app
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ menu:
|
|||
|
||||
This section will not include basic [installation instructions](https://golang.org/doc/install).
|
||||
|
||||
**Note**: Go version 1.7 or higher is required
|
||||
**Note**: Go version 1.8 or higher is required
|
||||
|
||||
## Download
|
||||
|
||||
|
|
|
|||
85
integrations/api_releases_test.go
Normal file
85
integrations/api_releases_test.go
Normal file
|
|
@ -0,0 +1,85 @@
|
|||
// Copyright 2018 The Gitea 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 integrations
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
"code.gitea.io/git"
|
||||
"code.gitea.io/gitea/models"
|
||||
api "code.gitea.io/sdk/gitea"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestAPICreateRelease(t *testing.T) {
|
||||
prepareTestEnv(t)
|
||||
|
||||
repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository)
|
||||
owner := models.AssertExistsAndLoadBean(t, &models.User{ID: repo.OwnerID}).(*models.User)
|
||||
session := loginUser(t, owner.LowerName)
|
||||
|
||||
gitRepo, err := git.OpenRepository(repo.RepoPath())
|
||||
assert.NoError(t, err)
|
||||
|
||||
err = gitRepo.CreateTag("v0.0.1", "master")
|
||||
assert.NoError(t, err)
|
||||
|
||||
commitID, err := gitRepo.GetTagCommitID("v0.0.1")
|
||||
assert.NoError(t, err)
|
||||
|
||||
urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/releases",
|
||||
owner.Name, repo.Name)
|
||||
req := NewRequestWithJSON(t, "POST", urlStr, &api.CreateReleaseOption{
|
||||
TagName: "v0.0.1",
|
||||
Title: "v0.0.1",
|
||||
Note: "test",
|
||||
IsDraft: false,
|
||||
IsPrerelease: false,
|
||||
Target: commitID,
|
||||
})
|
||||
resp := session.MakeRequest(t, req, http.StatusCreated)
|
||||
|
||||
var newRelease api.Release
|
||||
DecodeJSON(t, resp, &newRelease)
|
||||
models.AssertExistsAndLoadBean(t, &models.Release{
|
||||
ID: newRelease.ID,
|
||||
TagName: newRelease.TagName,
|
||||
Title: newRelease.Title,
|
||||
Note: newRelease.Note,
|
||||
})
|
||||
|
||||
urlStr = fmt.Sprintf("/api/v1/repos/%s/%s/releases/%d",
|
||||
owner.Name, repo.Name, newRelease.ID)
|
||||
req = NewRequest(t, "GET", urlStr)
|
||||
resp = session.MakeRequest(t, req, http.StatusOK)
|
||||
|
||||
var release api.Release
|
||||
DecodeJSON(t, resp, &release)
|
||||
|
||||
assert.Equal(t, newRelease.TagName, release.TagName)
|
||||
assert.Equal(t, newRelease.Title, release.Title)
|
||||
assert.Equal(t, newRelease.Note, release.Note)
|
||||
|
||||
req = NewRequestWithJSON(t, "PATCH", urlStr, &api.EditReleaseOption{
|
||||
TagName: release.TagName,
|
||||
Title: release.Title,
|
||||
Note: "updated",
|
||||
IsDraft: &release.IsDraft,
|
||||
IsPrerelease: &release.IsPrerelease,
|
||||
Target: release.Target,
|
||||
})
|
||||
resp = session.MakeRequest(t, req, http.StatusOK)
|
||||
|
||||
DecodeJSON(t, resp, &newRelease)
|
||||
models.AssertExistsAndLoadBean(t, &models.Release{
|
||||
ID: newRelease.ID,
|
||||
TagName: newRelease.TagName,
|
||||
Title: newRelease.Title,
|
||||
Note: newRelease.Note,
|
||||
})
|
||||
}
|
||||
|
|
@ -6,8 +6,9 @@ package integrations
|
|||
|
||||
import (
|
||||
"context"
|
||||
"crypto/rand"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"math/rand"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/url"
|
||||
|
|
@ -17,6 +18,7 @@ import (
|
|||
"time"
|
||||
|
||||
"code.gitea.io/git"
|
||||
"code.gitea.io/gitea/models"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
api "code.gitea.io/sdk/gitea"
|
||||
|
||||
|
|
@ -24,7 +26,13 @@ import (
|
|||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func onGiteaWebRun(t *testing.T, callback func(*testing.T, *url.URL)) {
|
||||
const (
|
||||
littleSize = 1024 //1ko
|
||||
bigSize = 128 * 1024 * 1024 //128Mo
|
||||
)
|
||||
|
||||
func onGiteaRun(t *testing.T, callback func(*testing.T, *url.URL)) {
|
||||
prepareTestEnv(t)
|
||||
s := http.Server{
|
||||
Handler: mac,
|
||||
}
|
||||
|
|
@ -35,151 +43,241 @@ func onGiteaWebRun(t *testing.T, callback func(*testing.T, *url.URL)) {
|
|||
assert.NoError(t, err)
|
||||
|
||||
defer func() {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
|
||||
s.Shutdown(ctx)
|
||||
cancel()
|
||||
}()
|
||||
|
||||
go s.Serve(listener)
|
||||
//Started by config go ssh.Listen(setting.SSH.ListenHost, setting.SSH.ListenPort, setting.SSH.ServerCiphers, setting.SSH.ServerKeyExchanges, setting.SSH.ServerMACs)
|
||||
|
||||
callback(t, u)
|
||||
}
|
||||
|
||||
func TestGit(t *testing.T) {
|
||||
prepareTestEnv(t)
|
||||
|
||||
onGiteaWebRun(t, func(t *testing.T, u *url.URL) {
|
||||
dstPath, err := ioutil.TempDir("", "repo-tmp-17")
|
||||
assert.NoError(t, err)
|
||||
defer os.RemoveAll(dstPath)
|
||||
onGiteaRun(t, func(t *testing.T, u *url.URL) {
|
||||
u.Path = "user2/repo1.git"
|
||||
|
||||
t.Run("Standard", func(t *testing.T) {
|
||||
|
||||
t.Run("CloneNoLogin", func(t *testing.T) {
|
||||
dstLocalPath, err := ioutil.TempDir("", "repo1")
|
||||
assert.NoError(t, err)
|
||||
defer os.RemoveAll(dstLocalPath)
|
||||
err = git.Clone(u.String(), dstLocalPath, git.CloneRepoOptions{})
|
||||
assert.NoError(t, err)
|
||||
assert.True(t, com.IsExist(filepath.Join(dstLocalPath, "README.md")))
|
||||
})
|
||||
|
||||
t.Run("CreateRepo", func(t *testing.T) {
|
||||
session := loginUser(t, "user2")
|
||||
req := NewRequestWithJSON(t, "POST", "/api/v1/user/repos", &api.CreateRepoOption{
|
||||
AutoInit: true,
|
||||
Description: "Temporary repo",
|
||||
Name: "repo-tmp-17",
|
||||
Private: false,
|
||||
Gitignores: "",
|
||||
License: "WTFPL",
|
||||
Readme: "Default",
|
||||
t.Run("HTTP", func(t *testing.T) {
|
||||
dstPath, err := ioutil.TempDir("", "repo-tmp-17")
|
||||
assert.NoError(t, err)
|
||||
defer os.RemoveAll(dstPath)
|
||||
t.Run("Standard", func(t *testing.T) {
|
||||
t.Run("CloneNoLogin", func(t *testing.T) {
|
||||
dstLocalPath, err := ioutil.TempDir("", "repo1")
|
||||
assert.NoError(t, err)
|
||||
defer os.RemoveAll(dstLocalPath)
|
||||
err = git.Clone(u.String(), dstLocalPath, git.CloneRepoOptions{})
|
||||
assert.NoError(t, err)
|
||||
assert.True(t, com.IsExist(filepath.Join(dstLocalPath, "README.md")))
|
||||
})
|
||||
session.MakeRequest(t, req, http.StatusCreated)
|
||||
})
|
||||
|
||||
u.Path = "user2/repo-tmp-17.git"
|
||||
u.User = url.UserPassword("user2", userPassword)
|
||||
t.Run("Clone", func(t *testing.T) {
|
||||
err = git.Clone(u.String(), dstPath, git.CloneRepoOptions{})
|
||||
assert.NoError(t, err)
|
||||
assert.True(t, com.IsExist(filepath.Join(dstPath, "README.md")))
|
||||
})
|
||||
|
||||
t.Run("PushCommit", func(t *testing.T) {
|
||||
data := make([]byte, 1024)
|
||||
_, err := rand.Read(data)
|
||||
assert.NoError(t, err)
|
||||
tmpFile, err := ioutil.TempFile(dstPath, "data-file-")
|
||||
defer tmpFile.Close()
|
||||
_, err = tmpFile.Write(data)
|
||||
assert.NoError(t, err)
|
||||
|
||||
//Commit
|
||||
err = git.AddChanges(dstPath, false, filepath.Base(tmpFile.Name()))
|
||||
assert.NoError(t, err)
|
||||
err = git.CommitChanges(dstPath, git.CommitChangesOptions{
|
||||
Committer: &git.Signature{
|
||||
Email: "user2@example.com",
|
||||
Name: "User Two",
|
||||
When: time.Now(),
|
||||
},
|
||||
Author: &git.Signature{
|
||||
Email: "user2@example.com",
|
||||
Name: "User Two",
|
||||
When: time.Now(),
|
||||
},
|
||||
Message: "Testing commit",
|
||||
t.Run("CreateRepo", func(t *testing.T) {
|
||||
session := loginUser(t, "user2")
|
||||
req := NewRequestWithJSON(t, "POST", "/api/v1/user/repos", &api.CreateRepoOption{
|
||||
AutoInit: true,
|
||||
Description: "Temporary repo",
|
||||
Name: "repo-tmp-17",
|
||||
Private: false,
|
||||
Gitignores: "",
|
||||
License: "WTFPL",
|
||||
Readme: "Default",
|
||||
})
|
||||
session.MakeRequest(t, req, http.StatusCreated)
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
|
||||
//Push
|
||||
err = git.Push(dstPath, git.PushOptions{
|
||||
Branch: "master",
|
||||
Remote: u.String(),
|
||||
Force: false,
|
||||
u.Path = "user2/repo-tmp-17.git"
|
||||
u.User = url.UserPassword("user2", userPassword)
|
||||
t.Run("Clone", func(t *testing.T) {
|
||||
err = git.Clone(u.String(), dstPath, git.CloneRepoOptions{})
|
||||
assert.NoError(t, err)
|
||||
assert.True(t, com.IsExist(filepath.Join(dstPath, "README.md")))
|
||||
})
|
||||
|
||||
t.Run("PushCommit", func(t *testing.T) {
|
||||
t.Run("Little", func(t *testing.T) {
|
||||
commitAndPush(t, littleSize, dstPath)
|
||||
})
|
||||
t.Run("Big", func(t *testing.T) {
|
||||
commitAndPush(t, bigSize, dstPath)
|
||||
})
|
||||
})
|
||||
})
|
||||
t.Run("LFS", func(t *testing.T) {
|
||||
t.Run("PushCommit", func(t *testing.T) {
|
||||
//Setup git LFS
|
||||
_, err = git.NewCommand("lfs").AddArguments("install").RunInDir(dstPath)
|
||||
assert.NoError(t, err)
|
||||
_, err = git.NewCommand("lfs").AddArguments("track", "data-file-*").RunInDir(dstPath)
|
||||
assert.NoError(t, err)
|
||||
err = git.AddChanges(dstPath, false, ".gitattributes")
|
||||
assert.NoError(t, err)
|
||||
|
||||
t.Run("Little", func(t *testing.T) {
|
||||
commitAndPush(t, littleSize, dstPath)
|
||||
})
|
||||
t.Run("Big", func(t *testing.T) {
|
||||
commitAndPush(t, bigSize, dstPath)
|
||||
})
|
||||
})
|
||||
t.Run("Locks", func(t *testing.T) {
|
||||
lockTest(t, u.String(), dstPath)
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
})
|
||||
})
|
||||
t.Run("LFS", func(t *testing.T) {
|
||||
t.Run("PushCommit", func(t *testing.T) {
|
||||
/* Generate random file */
|
||||
data := make([]byte, 1024)
|
||||
_, err := rand.Read(data)
|
||||
assert.NoError(t, err)
|
||||
tmpFile, err := ioutil.TempFile(dstPath, "data-file-")
|
||||
defer tmpFile.Close()
|
||||
_, err = tmpFile.Write(data)
|
||||
assert.NoError(t, err)
|
||||
t.Run("SSH", func(t *testing.T) {
|
||||
//Setup remote link
|
||||
u.Scheme = "ssh"
|
||||
u.User = url.User("git")
|
||||
u.Host = fmt.Sprintf("%s:%d", setting.SSH.ListenHost, setting.SSH.ListenPort)
|
||||
u.Path = "user2/repo-tmp-18.git"
|
||||
|
||||
//Setup git LFS
|
||||
_, err = git.NewCommand("lfs").AddArguments("install").RunInDir(dstPath)
|
||||
assert.NoError(t, err)
|
||||
_, err = git.NewCommand("lfs").AddArguments("track", "data-file-*").RunInDir(dstPath)
|
||||
assert.NoError(t, err)
|
||||
//Setup key
|
||||
keyFile := filepath.Join(setting.AppDataPath, "my-testing-key")
|
||||
_, _, err := com.ExecCmd("ssh-keygen", "-f", keyFile, "-t", "rsa", "-N", "")
|
||||
assert.NoError(t, err)
|
||||
defer os.RemoveAll(keyFile)
|
||||
defer os.RemoveAll(keyFile + ".pub")
|
||||
|
||||
//Commit
|
||||
err = git.AddChanges(dstPath, false, ".gitattributes", filepath.Base(tmpFile.Name()))
|
||||
assert.NoError(t, err)
|
||||
err = git.CommitChanges(dstPath, git.CommitChangesOptions{
|
||||
Committer: &git.Signature{
|
||||
Email: "user2@example.com",
|
||||
Name: "User Two",
|
||||
When: time.Now(),
|
||||
},
|
||||
Author: &git.Signature{
|
||||
Email: "user2@example.com",
|
||||
Name: "User Two",
|
||||
When: time.Now(),
|
||||
},
|
||||
Message: "Testing LFS ",
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
session := loginUser(t, "user1")
|
||||
keyOwner := models.AssertExistsAndLoadBean(t, &models.User{Name: "user2"}).(*models.User)
|
||||
urlStr := fmt.Sprintf("/api/v1/admin/users/%s/keys", keyOwner.Name)
|
||||
|
||||
//Push
|
||||
u.User = url.UserPassword("user2", userPassword)
|
||||
err = git.Push(dstPath, git.PushOptions{
|
||||
Branch: "master",
|
||||
Remote: u.String(),
|
||||
Force: false,
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
})
|
||||
t.Run("Locks", func(t *testing.T) {
|
||||
_, err = git.NewCommand("remote").AddArguments("set-url", "origin", u.String()).RunInDir(dstPath) //TODO add test ssh git-lfs-creds
|
||||
assert.NoError(t, err)
|
||||
_, err = git.NewCommand("lfs").AddArguments("locks").RunInDir(dstPath)
|
||||
assert.NoError(t, err)
|
||||
_, err = git.NewCommand("lfs").AddArguments("lock", "README.md").RunInDir(dstPath)
|
||||
assert.NoError(t, err)
|
||||
_, err = git.NewCommand("lfs").AddArguments("locks").RunInDir(dstPath)
|
||||
assert.NoError(t, err)
|
||||
_, err = git.NewCommand("lfs").AddArguments("unlock", "README.md").RunInDir(dstPath)
|
||||
assert.NoError(t, err)
|
||||
dataPubKey, err := ioutil.ReadFile(keyFile + ".pub")
|
||||
assert.NoError(t, err)
|
||||
req := NewRequestWithValues(t, "POST", urlStr, map[string]string{
|
||||
"key": string(dataPubKey),
|
||||
"title": "test-key",
|
||||
})
|
||||
session.MakeRequest(t, req, http.StatusCreated)
|
||||
|
||||
//Setup ssh wrapper
|
||||
sshWrapper, err := ioutil.TempFile(setting.AppDataPath, "tmp-ssh-wrapper")
|
||||
sshWrapper.WriteString("#!/bin/sh\n\n")
|
||||
sshWrapper.WriteString("ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i \"" + filepath.Join(setting.AppWorkPath, keyFile) + "\" $* \n\n")
|
||||
err = sshWrapper.Chmod(os.ModePerm)
|
||||
assert.NoError(t, err)
|
||||
sshWrapper.Close()
|
||||
defer os.RemoveAll(sshWrapper.Name())
|
||||
|
||||
//Setup clone folder
|
||||
dstPath, err := ioutil.TempDir("", "repo-tmp-18")
|
||||
assert.NoError(t, err)
|
||||
defer os.RemoveAll(dstPath)
|
||||
|
||||
t.Run("Standard", func(t *testing.T) {
|
||||
t.Run("CreateRepo", func(t *testing.T) {
|
||||
session := loginUser(t, "user2")
|
||||
req := NewRequestWithJSON(t, "POST", "/api/v1/user/repos", &api.CreateRepoOption{
|
||||
AutoInit: true,
|
||||
Description: "Temporary repo",
|
||||
Name: "repo-tmp-18",
|
||||
Private: false,
|
||||
Gitignores: "",
|
||||
License: "WTFPL",
|
||||
Readme: "Default",
|
||||
})
|
||||
session.MakeRequest(t, req, http.StatusCreated)
|
||||
})
|
||||
//TODO get url from api
|
||||
t.Run("Clone", func(t *testing.T) {
|
||||
_, err = git.NewCommand("clone").AddArguments("--config", "core.sshCommand="+filepath.Join(setting.AppWorkPath, sshWrapper.Name()), u.String(), dstPath).Run()
|
||||
assert.NoError(t, err)
|
||||
assert.True(t, com.IsExist(filepath.Join(dstPath, "README.md")))
|
||||
})
|
||||
//time.Sleep(5 * time.Minute)
|
||||
t.Run("PushCommit", func(t *testing.T) {
|
||||
t.Run("Little", func(t *testing.T) {
|
||||
commitAndPush(t, littleSize, dstPath)
|
||||
})
|
||||
t.Run("Big", func(t *testing.T) {
|
||||
commitAndPush(t, bigSize, dstPath)
|
||||
})
|
||||
})
|
||||
})
|
||||
t.Run("LFS", func(t *testing.T) {
|
||||
os.Setenv("GIT_SSH_COMMAND", filepath.Join(setting.AppWorkPath, sshWrapper.Name())) //TODO remove when fixed https://github.com/git-lfs/git-lfs/issues/2215
|
||||
defer os.Unsetenv("GIT_SSH_COMMAND")
|
||||
t.Run("PushCommit", func(t *testing.T) {
|
||||
//Setup git LFS
|
||||
_, err = git.NewCommand("lfs").AddArguments("install").RunInDir(dstPath)
|
||||
assert.NoError(t, err)
|
||||
_, err = git.NewCommand("lfs").AddArguments("track", "data-file-*").RunInDir(dstPath)
|
||||
assert.NoError(t, err)
|
||||
err = git.AddChanges(dstPath, false, ".gitattributes")
|
||||
assert.NoError(t, err)
|
||||
|
||||
t.Run("Little", func(t *testing.T) {
|
||||
commitAndPush(t, littleSize, dstPath)
|
||||
})
|
||||
t.Run("Big", func(t *testing.T) {
|
||||
commitAndPush(t, bigSize, dstPath)
|
||||
})
|
||||
})
|
||||
/* Failed without #3152. TODO activate with fix.
|
||||
t.Run("Locks", func(t *testing.T) {
|
||||
lockTest(t, u.String(), dstPath)
|
||||
})
|
||||
*/
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func lockTest(t *testing.T, remote, repoPath string) {
|
||||
_, err := git.NewCommand("remote").AddArguments("set-url", "origin", remote).RunInDir(repoPath) //TODO add test ssh git-lfs-creds
|
||||
assert.NoError(t, err)
|
||||
_, err = git.NewCommand("lfs").AddArguments("locks").RunInDir(repoPath)
|
||||
assert.NoError(t, err)
|
||||
_, err = git.NewCommand("lfs").AddArguments("lock", "README.md").RunInDir(repoPath)
|
||||
assert.NoError(t, err)
|
||||
_, err = git.NewCommand("lfs").AddArguments("locks").RunInDir(repoPath)
|
||||
assert.NoError(t, err)
|
||||
_, err = git.NewCommand("lfs").AddArguments("unlock", "README.md").RunInDir(repoPath)
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
|
||||
func commitAndPush(t *testing.T, size int, repoPath string) {
|
||||
err := generateCommitWithNewData(size, repoPath, "user2@example.com", "User Two")
|
||||
assert.NoError(t, err)
|
||||
_, err = git.NewCommand("push").RunInDir(repoPath) //Push
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
|
||||
func generateCommitWithNewData(size int, repoPath, email, fullName string) error {
|
||||
//Generate random file
|
||||
data := make([]byte, size)
|
||||
_, err := rand.Read(data)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
tmpFile, err := ioutil.TempFile(repoPath, "data-file-")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer tmpFile.Close()
|
||||
_, err = tmpFile.Write(data)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
//Commit
|
||||
err = git.AddChanges(repoPath, false, filepath.Base(tmpFile.Name()))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = git.CommitChanges(repoPath, git.CommitChangesOptions{
|
||||
Committer: &git.Signature{
|
||||
Email: email,
|
||||
Name: fullName,
|
||||
When: time.Now(),
|
||||
},
|
||||
Author: &git.Signature{
|
||||
Email: email,
|
||||
Name: fullName,
|
||||
When: time.Now(),
|
||||
},
|
||||
Message: fmt.Sprintf("Testing commit @ %v", time.Now()),
|
||||
})
|
||||
return err
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@ NAME = {{TEST_MYSQL_DBNAME}}
|
|||
USER = {{TEST_MYSQL_USERNAME}}
|
||||
PASSWD = {{TEST_MYSQL_PASSWORD}}
|
||||
SSL_MODE = disable
|
||||
PATH = data/gitea.db
|
||||
|
||||
[indexer]
|
||||
ISSUE_INDEXER_PATH = integrations/indexers-mysql/issues.bleve
|
||||
|
|
@ -27,10 +26,14 @@ SSH_DOMAIN = localhost
|
|||
HTTP_PORT = 3001
|
||||
ROOT_URL = http://localhost:3001/
|
||||
DISABLE_SSH = false
|
||||
SSH_PORT = 22
|
||||
SSH_LISTEN_HOST = localhost
|
||||
SSH_PORT = 2201
|
||||
START_SSH_SERVER = true
|
||||
LFS_START_SERVER = true
|
||||
LFS_CONTENT_PATH = data/lfs-mysql
|
||||
OFFLINE_MODE = false
|
||||
LFS_JWT_SECRET = Tv_MjmZuHqpIY6GFl12ebgkRAMt4RlWt0v4EHKSXO0w
|
||||
APP_DATA_PATH = integrations/gitea-integration-mysql/data
|
||||
|
||||
[mailer]
|
||||
ENABLED = false
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@ NAME = {{TEST_PGSQL_DBNAME}}
|
|||
USER = {{TEST_PGSQL_USERNAME}}
|
||||
PASSWD = {{TEST_PGSQL_PASSWORD}}
|
||||
SSL_MODE = disable
|
||||
PATH = data/gitea.db
|
||||
|
||||
[indexer]
|
||||
ISSUE_INDEXER_PATH = integrations/indexers-pgsql/issues.bleve
|
||||
|
|
@ -27,23 +26,27 @@ SSH_DOMAIN = localhost
|
|||
HTTP_PORT = 3002
|
||||
ROOT_URL = http://localhost:3002/
|
||||
DISABLE_SSH = false
|
||||
SSH_PORT = 22
|
||||
SSH_LISTEN_HOST = localhost
|
||||
SSH_PORT = 2202
|
||||
START_SSH_SERVER = true
|
||||
LFS_START_SERVER = true
|
||||
LFS_CONTENT_PATH = data/lfs-pgsql
|
||||
OFFLINE_MODE = false
|
||||
LFS_JWT_SECRET = Tv_MjmZuHqpIY6GFl12ebgkRAMt4RlWt0v4EHKSXO0w
|
||||
APP_DATA_PATH = integrations/gitea-integration-pgsql/data
|
||||
|
||||
[mailer]
|
||||
ENABLED = false
|
||||
|
||||
[service]
|
||||
REGISTER_EMAIL_CONFIRM = false
|
||||
ENABLE_NOTIFY_MAIL = false
|
||||
DISABLE_REGISTRATION = false
|
||||
ENABLE_CAPTCHA = false
|
||||
REQUIRE_SIGNIN_VIEW = false
|
||||
DEFAULT_KEEP_EMAIL_PRIVATE = false
|
||||
REGISTER_EMAIL_CONFIRM = false
|
||||
ENABLE_NOTIFY_MAIL = false
|
||||
DISABLE_REGISTRATION = false
|
||||
ENABLE_CAPTCHA = false
|
||||
REQUIRE_SIGNIN_VIEW = false
|
||||
DEFAULT_KEEP_EMAIL_PRIVATE = false
|
||||
DEFAULT_ALLOW_CREATE_ORGANIZATION = true
|
||||
NO_REPLY_ADDRESS = noreply.example.org
|
||||
NO_REPLY_ADDRESS = noreply.example.org
|
||||
|
||||
[picture]
|
||||
DISABLE_GRAVATAR = false
|
||||
|
|
@ -54,7 +57,7 @@ PROVIDER = file
|
|||
PROVIDER_CONFIG = data/sessions-pgsql
|
||||
|
||||
[log]
|
||||
MODE = console,file
|
||||
MODE = console,file
|
||||
ROOT_PATH = pgsql-log
|
||||
|
||||
[log.console]
|
||||
|
|
@ -64,6 +67,6 @@ LEVEL = Warn
|
|||
LEVEL = Debug
|
||||
|
||||
[security]
|
||||
INSTALL_LOCK = true
|
||||
SECRET_KEY = 9pCviYTWSb
|
||||
INTERNAL_TOKEN = test
|
||||
INSTALL_LOCK = true
|
||||
SECRET_KEY = 9pCviYTWSb
|
||||
INTERNAL_TOKEN = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0OTU1NTE2MTh9.hhSVGOANkaKk3vfCd2jDOIww4pUk0xtg9JRde5UogyQ
|
||||
|
|
|
|||
|
|
@ -71,6 +71,6 @@ func TestViewRepo1CloneLinkAuthorized(t *testing.T) {
|
|||
assert.Equal(t, setting.AppURL+"user2/repo1.git", link)
|
||||
link, exists = htmlDoc.doc.Find("#repo-clone-ssh").Attr("data-link")
|
||||
assert.True(t, exists, "The template has changed")
|
||||
sshURL := fmt.Sprintf("%s@%s:user2/repo1.git", setting.RunUser, setting.SSH.Domain)
|
||||
sshURL := fmt.Sprintf("ssh://%s@%s:%d/user2/repo1.git", setting.RunUser, setting.SSH.Domain, setting.SSH.Port)
|
||||
assert.Equal(t, sshURL, link)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ RUN_MODE = prod
|
|||
|
||||
[database]
|
||||
DB_TYPE = sqlite3
|
||||
PATH = :memory:
|
||||
PATH = integrations/gitea-integration-sqlite/gitea.db
|
||||
|
||||
[indexer]
|
||||
ISSUE_INDEXER_PATH = integrations/indexers-sqlite/issues.bleve
|
||||
|
|
@ -22,11 +22,14 @@ SSH_DOMAIN = localhost
|
|||
HTTP_PORT = 3003
|
||||
ROOT_URL = http://localhost:3003/
|
||||
DISABLE_SSH = false
|
||||
SSH_PORT = 22
|
||||
SSH_LISTEN_HOST = localhost
|
||||
SSH_PORT = 2203
|
||||
START_SSH_SERVER = true
|
||||
LFS_START_SERVER = true
|
||||
LFS_CONTENT_PATH = data/lfs-sqlite
|
||||
OFFLINE_MODE = false
|
||||
LFS_JWT_SECRET = Tv_MjmZuHqpIY6GFl12ebgkRAMt4RlWt0v4EHKSXO0w
|
||||
APP_DATA_PATH = integrations/gitea-integration-sqlite/data
|
||||
|
||||
[mailer]
|
||||
ENABLED = false
|
||||
|
|
@ -62,4 +65,3 @@ LEVEL = Debug
|
|||
INSTALL_LOCK = true
|
||||
SECRET_KEY = 9pCviYTWSb
|
||||
INTERNAL_TOKEN = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0OTI3OTU5ODN9.OQkH5UmzID2XBdwQ9TAI6Jj2t1X-wElVTjbE7aoN4I8
|
||||
|
||||
|
|
|
|||
|
|
@ -132,6 +132,11 @@ func (pr *PullRequest) GetDefaultSquashMessage() string {
|
|||
return fmt.Sprintf("%s (#%d)", pr.Issue.Title, pr.Issue.Index)
|
||||
}
|
||||
|
||||
// GetGitRefName returns git ref for hidden pull request branch
|
||||
func (pr *PullRequest) GetGitRefName() string {
|
||||
return fmt.Sprintf("refs/pull/%d/head", pr.Index)
|
||||
}
|
||||
|
||||
// APIFormat assumes following fields have been assigned with valid values:
|
||||
// Required - Issue
|
||||
// Optional - Merger
|
||||
|
|
@ -562,7 +567,7 @@ func (pr *PullRequest) getMergeCommit() (*git.Commit, error) {
|
|||
indexTmpPath := filepath.Join(os.TempDir(), "gitea-"+pr.BaseRepo.Name+"-"+strconv.Itoa(time.Now().Nanosecond()))
|
||||
defer os.Remove(indexTmpPath)
|
||||
|
||||
headFile := fmt.Sprintf("refs/pull/%d/head", pr.Index)
|
||||
headFile := pr.GetGitRefName()
|
||||
|
||||
// Check if a pull request is merged into BaseBranch
|
||||
_, stderr, err := process.GetManager().ExecDirEnv(-1, "", fmt.Sprintf("isMerged (git merge-base --is-ancestor): %d", pr.BaseRepo.ID),
|
||||
|
|
@ -980,7 +985,7 @@ func (pr *PullRequest) UpdatePatch() (err error) {
|
|||
// corresponding branches of base repository.
|
||||
// FIXME: Only push branches that are actually updates?
|
||||
func (pr *PullRequest) PushToBaseRepo() (err error) {
|
||||
log.Trace("PushToBaseRepo[%d]: pushing commits to base repo 'refs/pull/%d/head'", pr.BaseRepoID, pr.Index)
|
||||
log.Trace("PushToBaseRepo[%d]: pushing commits to base repo '%s'", pr.BaseRepoID, pr.GetGitRefName())
|
||||
|
||||
headRepoPath := pr.HeadRepo.RepoPath()
|
||||
headGitRepo, err := git.OpenRepository(headRepoPath)
|
||||
|
|
@ -995,7 +1000,7 @@ func (pr *PullRequest) PushToBaseRepo() (err error) {
|
|||
// Make sure to remove the remote even if the push fails
|
||||
defer headGitRepo.RemoveRemote(tmpRemoteName)
|
||||
|
||||
headFile := fmt.Sprintf("refs/pull/%d/head", pr.Index)
|
||||
headFile := pr.GetGitRefName()
|
||||
|
||||
// Remove head in case there is a conflict.
|
||||
file := path.Join(pr.BaseRepo.RepoPath(), headFile)
|
||||
|
|
@ -1005,6 +1010,7 @@ func (pr *PullRequest) PushToBaseRepo() (err error) {
|
|||
if err = git.Push(headRepoPath, git.PushOptions{
|
||||
Remote: tmpRemoteName,
|
||||
Branch: fmt.Sprintf("%s:%s", pr.HeadBranch, headFile),
|
||||
Force: true,
|
||||
}); err != nil {
|
||||
return fmt.Errorf("Push: %v", err)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -86,6 +86,13 @@ func populateRepoIndexerAsynchronously() error {
|
|||
return nil
|
||||
}
|
||||
|
||||
// if there is any existing repo indexer metadata in the DB, delete it
|
||||
// since we are starting afresh. Also, xorm requires deletes to have a
|
||||
// condition, and we want to delete everything, thus 1=1.
|
||||
if _, err := x.Where("1=1").Delete(new(RepoIndexerStatus)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var maxRepoID int64
|
||||
if _, err = x.Select("MAX(id)").Table("repository").Get(&maxRepoID); err != nil {
|
||||
return err
|
||||
|
|
|
|||
|
|
@ -304,6 +304,11 @@ func CheckPublicKeyString(content string) (_ string, err error) {
|
|||
|
||||
// appendAuthorizedKeysToFile appends new SSH keys' content to authorized_keys file.
|
||||
func appendAuthorizedKeysToFile(keys ...*PublicKey) error {
|
||||
// Don't need to rewrite this file if builtin SSH server is enabled.
|
||||
if setting.SSH.StartBuiltinServer {
|
||||
return nil
|
||||
}
|
||||
|
||||
sshOpLocker.Lock()
|
||||
defer sshOpLocker.Unlock()
|
||||
|
||||
|
|
@ -382,10 +387,6 @@ func addKey(e Engine, key *PublicKey) (err error) {
|
|||
return err
|
||||
}
|
||||
|
||||
// Don't need to rewrite this file if builtin SSH server is enabled.
|
||||
if setting.SSH.StartBuiltinServer {
|
||||
return nil
|
||||
}
|
||||
return appendAuthorizedKeysToFile(key)
|
||||
}
|
||||
|
||||
|
|
@ -532,6 +533,11 @@ func DeletePublicKey(doer *User, id int64) (err error) {
|
|||
// Note: x.Iterate does not get latest data after insert/delete, so we have to call this function
|
||||
// outside any session scope independently.
|
||||
func RewriteAllPublicKeys() error {
|
||||
//Don't rewrite key if internal server
|
||||
if setting.SSH.StartBuiltinServer {
|
||||
return nil
|
||||
}
|
||||
|
||||
sshOpLocker.Lock()
|
||||
defer sshOpLocker.Unlock()
|
||||
|
||||
|
|
|
|||
|
|
@ -649,7 +649,7 @@ func NewGhostUser() *User {
|
|||
}
|
||||
|
||||
var (
|
||||
reservedUsernames = []string{"assets", "css", "explore", "img", "js", "less", "plugins", "debug", "raw", "install", "api", "avatar", "user", "org", "help", "stars", "issues", "pulls", "commits", "repo", "template", "admin", "new", ".", ".."}
|
||||
reservedUsernames = []string{"assets", "css", "explore", "img", "js", "less", "plugins", "debug", "raw", "install", "api", "avatars", "user", "org", "help", "stars", "issues", "pulls", "commits", "repo", "template", "admin", "new", ".", ".."}
|
||||
reservedUserPatterns = []string{"*.keys"}
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -62,6 +62,7 @@ Thiago Avelino <thiago AT avelino DOT xxx>
|
|||
Thomas Fanninger <gogs DOT thomas AT fanninger DOT at>
|
||||
Tilmann Bach <tilmann AT outlook DOT com>
|
||||
Toni Villena Jiménez <tonivj5 AT gmail DOT com>
|
||||
Viktor Sperl <viktike32 AT gmail DOT com>
|
||||
Vladimir Jigulin mogaika AT yandex DOT ru
|
||||
Vladimir Vissoultchev <wqweto AT gmail DOT com>
|
||||
YJSoft <yjsoft AT yjsoft DOT pe DOT kr>
|
||||
|
|
|
|||
|
|
@ -270,7 +270,7 @@ openid_been_used=OpenID-Adresse "%s" wurde bereits verwendet.
|
|||
username_password_incorrect=Falscher Benutzername oder Passwort.
|
||||
enterred_invalid_repo_name=Bitte achte darauf, dass der eingegebene Repository-Name korrekt ist.
|
||||
enterred_invalid_owner_name=Bitte achte darauf, dass der eingegebene Name des Besitzers korrekt ist.
|
||||
enterred_invalid_password=Bitte achte darauf, dass das eingegebene Passwort richtig ist.
|
||||
enterred_invalid_password=Bitte achte darauf, dass das eingegebene Passwort korrekt ist.
|
||||
user_not_exist=Dieser Benutzer ist nicht vorhanden.
|
||||
last_org_owner=Entfernen des letzten Mitglieds aus einem Eigentümer-Team ist nicht zulässig, da es immer mindestens einen Eigentümer pro Organisation geben muss.
|
||||
cannot_add_org_to_team=Organisationen können nicht als Teammitglied hinzugefügt werden.
|
||||
|
|
@ -608,10 +608,10 @@ commits.signed_by=Signiert von
|
|||
commits.gpg_key_id=GPG Schlüssel ID
|
||||
|
||||
ext_issues=Externe Issues
|
||||
ext_issues.desc=Link zu einem Externen Issuetracker.
|
||||
ext_issues.desc=Link zu einem externen Issuetracker.
|
||||
|
||||
issues.desc=Issues ist der Platz zum Verwalten der Aufgaben und Fehler.
|
||||
issues.new=Neues Issue
|
||||
issues.new=Neuer Issue
|
||||
issues.new.labels=Label
|
||||
issues.new.no_label=Kein Label
|
||||
issues.new.clear_labels=Labels entfernen
|
||||
|
|
@ -848,7 +848,7 @@ activity.title.issues_n=%d Issues
|
|||
activity.title.issues_closed_by=%s von %s geschlossen
|
||||
activity.title.issues_created_by=%s von %s erstellt
|
||||
activity.closed_issue_label=Geschlossen
|
||||
activity.new_issues_count_1=Neues Issue
|
||||
activity.new_issues_count_1=Neuer Issue
|
||||
activity.new_issues_count_n=Neue Issues
|
||||
activity.new_issue_label=Geöffnet
|
||||
activity.title.unresolved_conv_1=%d offene Konversation
|
||||
|
|
|
|||
|
|
@ -270,7 +270,7 @@ openid_been_used = OpenID address '%s' already used.
|
|||
username_password_incorrect = Incorrect username or password.
|
||||
enterred_invalid_repo_name = Please ensure that the repository name you entered is correct.
|
||||
enterred_invalid_owner_name = Please ensure that the owner name you entered is correct.
|
||||
enterred_invalid_password = Please ensure the that password you entered is correct.
|
||||
enterred_invalid_password = Please ensure that the password you entered is correct.
|
||||
user_not_exist = The user does not exist.
|
||||
last_org_owner = Removing the last user from the owner team is not allowed because there must always be at least one owner in any given organization.
|
||||
cannot_add_org_to_team = Organization cannot be added as a team member.
|
||||
|
|
|
|||
|
|
@ -240,7 +240,6 @@ openid_been_used=La Dirección de OpenID '%s' ya esta en uso.
|
|||
username_password_incorrect=Nombre de usuario o contraseña incorrectos.
|
||||
enterred_invalid_repo_name=Por favor, asegúrate de que has introducido el nombre correctamente.
|
||||
enterred_invalid_owner_name=Por favor, asegúrate de que el nombre del propietario introducido es correcto.
|
||||
enterred_invalid_password=Por favor, asegúrate de que has introducido correctamente tu contraseña.
|
||||
user_not_exist=Este usuario no existe.
|
||||
cannot_add_org_to_team=Organización no puede agregarse como un miembro del equipo.
|
||||
|
||||
|
|
|
|||
|
|
@ -269,7 +269,6 @@ openid_been_used=Adresse OpenID '%s' déjà utilisée.
|
|||
username_password_incorrect=Nom d'utilisateur ou mot de passe incorrect.
|
||||
enterred_invalid_repo_name=Veuillez vérifier que le nom saisi du dépôt soit correct.
|
||||
enterred_invalid_owner_name=Veuillez vérifier que le nom du propriétaire saisi soit correct.
|
||||
enterred_invalid_password=Veuillez vérifier que le mot de passe saisi soit correct.
|
||||
user_not_exist=Cet utilisateur n'existe pas.
|
||||
last_org_owner=L'utilisateur à exclure est le dernier membre de l'équipe propriétaire. Il doit y avoir un autre propriétaire.
|
||||
cannot_add_org_to_team=Une organisation ne peut être ajoutée comme membre d'une équipe.
|
||||
|
|
@ -517,7 +516,7 @@ copied=Copié
|
|||
unwatch=Ne plus suivre
|
||||
watch=Suivre
|
||||
unstar=Retirer le vote
|
||||
star=Voter
|
||||
star=Favoriser
|
||||
fork=Bifurcation
|
||||
download_archive=Télécharger ce dépôt
|
||||
|
||||
|
|
@ -1500,7 +1499,7 @@ reopen_issue=`tickets ré-ouverts <a href="%s/issues/%s">%s#%[2]s</a>`
|
|||
create_pull_request=`pull request créée le <a href="%s/pulls/%s">%s#%[2]s</a>`
|
||||
close_pull_request=`pull request fermé <a href="%s/pulls/%s">%s#%[2]s</a>`
|
||||
reopen_pull_request=`pull request ré-ouverte <a href="%s/pulls/%s">%s#%[2]s</a>`
|
||||
comment_issue=`a commenté le problème <a href="%s/issues/%s">%s#%[2]s</a>`
|
||||
comment_issue=`a commenté le ticket <a href="%s/issues/%s">%s#%[2]s</a>`
|
||||
merge_pull_request=`demande d'ajout fusionnée le <a href="%s/pulls/%s">%s#%[2]s</a>`
|
||||
transfer_repo=a transféré le dépôt <code>%s</code> à <a href="%s">%s</a>
|
||||
push_tag=a soumis le tag <a href="%s/src/%s">%[2]s</a> sur <a href="%[1]s">%[3]s</a>
|
||||
|
|
|
|||
|
|
@ -270,7 +270,7 @@ openid_been_used=Az OpenID cím "%s" már használatban van.
|
|||
username_password_incorrect=Helytelen felhasználónév vagy jelszó.
|
||||
enterred_invalid_repo_name=Ellenőrizze, hogy a tároló neve helyes.
|
||||
enterred_invalid_owner_name=Kérlek ellenőrizd, hogy a beírt tulajdonos neve helyes.
|
||||
enterred_invalid_password=Kérlek ellenőrizd, hogy a beírt jelszó helyes.
|
||||
enterred_invalid_password=Ellenőrizze, hogy a beírt jelszó helyes.
|
||||
user_not_exist=A fiók nem létezik.
|
||||
last_org_owner=Az utolsó felhasználót nem lehet eltávolítani a tulajdonosi csapatból, mert legalább egy tulajdonosnak lennie kell minden szervezetben.
|
||||
cannot_add_org_to_team=Szervezet nem adható hozzá egy csoport tagjaként.
|
||||
|
|
|
|||
|
|
@ -238,7 +238,6 @@ openid_been_used=OpenID 주소 '%s' 는 이미 사용중입니다.
|
|||
username_password_incorrect=사용자 이름 또는 비밀번호가 잘못되었습니다
|
||||
enterred_invalid_repo_name=입력한 저장소 이름이 올바른지 확인하십시오.
|
||||
enterred_invalid_owner_name=입력한 사용자 이름이 올바른지 확인하십시오.
|
||||
enterred_invalid_password=입력한 비밀번호가 올바른지 확인하십시오.
|
||||
user_not_exist=존재하지 않는 사용자입니다.
|
||||
last_org_owner=소유자 팀에서 마지막 사용자를 제거하는 것은 허용되지 않습니다. 최소한 한명의 소유자가 있어야 합니다.
|
||||
cannot_add_org_to_team=조직은 팀 멤버로 추가할수 없습니다.
|
||||
|
|
|
|||
|
|
@ -260,7 +260,6 @@ openid_been_used=OpenID adres '%s' reeds gebruikt.
|
|||
username_password_incorrect=Onjuiste gebruikersnaam en/of wachtwoord.
|
||||
enterred_invalid_repo_name=U heeft een onjuiste repository naam ingevoerd.
|
||||
enterred_invalid_owner_name=U heeft een onjuiste eigenaar ingevoerd.
|
||||
enterred_invalid_password=U heeft een onjuist wachtwoord ingevoerd.
|
||||
user_not_exist=De gebruiker bestaat niet.
|
||||
last_org_owner=De gebruiker die u probeert te verwijderen is het enige lid (eigenaar) van dit team. U moet eerst een nieuw lid (eigenaar) aanstellen.
|
||||
cannot_add_org_to_team=Organisatie kan niet worden toegevoegd als een teamlid.
|
||||
|
|
|
|||
|
|
@ -138,6 +138,7 @@ invalid_repo_path=Ścieżka repozytoriów nie jest poprawna: %v
|
|||
run_user_not_match=Użytkownik aplikacji nie jest aktualnym użytkownikiem: %s -> %s
|
||||
save_config_failed=Nie udało się zapisać konfiguracji: %v
|
||||
invalid_admin_setting=Nieprawidłowe ustawienia konta admina: %v
|
||||
install_success=Witaj! Dziękujemy za wybranie Gitea. Miłej zabawy i trzymaj się!
|
||||
invalid_log_root_path=Ścieżka dla logów jest niepoprawna: %v
|
||||
default_keep_email_private=Domyślnie ukrywaj adresy e-mail
|
||||
default_keep_email_private_popup=To jest domyślne ustawienie widoczności adresu e-mail użytkowników. Włączone spowoduje, że adres e-mail wszystkich nowych użytkowników zostanie domyślnie ukryty.
|
||||
|
|
@ -199,6 +200,8 @@ non_local_account=Nie lokalne konta nie mogą zmieniać haseł przez webowy inte
|
|||
verify=Potwierdź
|
||||
scratch_code=Kod jednorazowy
|
||||
use_scratch_code=Użyj kodu jednorazowego
|
||||
twofa_scratch_used=Użyłeś/aś swojego kodu jednorazowego. Przekierowano Cię do strony z ustawieniami autoryzacji dwuetapowej, gdzie możesz usunąć swoje urządzenie lub wygenerować nowy kod jednorazowy.
|
||||
twofa_passcode_incorrect=Twój kod autoryzacji jest niepoprawny. Jeśli zapodziałeś/aś swoje urządzenie, użyj swojego kodu jednorazowego do zalogowania.
|
||||
twofa_scratch_token_incorrect=Twój kod jednorazowy jest niepoprawny.
|
||||
login_userpass=Użytkownik / Hasło
|
||||
login_openid=OpenID
|
||||
|
|
@ -266,7 +269,6 @@ openid_been_used=Adres OpenID '%s' jest już używany.
|
|||
username_password_incorrect=Nieprawidłowa nazwa użytkownika lub hasło.
|
||||
enterred_invalid_repo_name=Upewnij się, że wprowadzona nazwa repozytorium jest poprawna.
|
||||
enterred_invalid_owner_name=Upewnij się, że nazwa właściciela repozytorium jest poprawna.
|
||||
enterred_invalid_password=Proszę upewnij się, że wprowadzone hasło jest poprawne.
|
||||
user_not_exist=Użytkownik nie istnieje.
|
||||
last_org_owner=Usuwany użytkownik jest ostatnim członkiem ekipy właścicieli. Musi być inny właściciel.
|
||||
cannot_add_org_to_team=Organizacja nie może zostać dodana jako członek zespołu.
|
||||
|
|
@ -401,6 +403,7 @@ key_state_desc=Ten klucz był użyty w ciągu ostatnich 7 dni
|
|||
token_state_desc=Ten token był użyty w ciągu ostatnich 7 dni
|
||||
show_openid=Pokaż w profilu
|
||||
hide_openid=Ukryj w profilu
|
||||
ssh_disabled=SSH jest wyłączony
|
||||
|
||||
manage_social=Zarządzaj powiązanymi kontami społecznościowymi
|
||||
social_desc=To lista powiązanych kont sieci społecznościowych. Ze względów bezpieczeństwa upewnij się, że rozpoznajesz je wszystkie jako, że można za ich pomocą logować się do Twojego konta.
|
||||
|
|
@ -430,14 +433,17 @@ twofa_disable_note=W razie potrzeby można wyłączyć uwierzytelnianie dwuetapo
|
|||
twofa_disable_desc=Wyłączenie dwuetapowej autoryzacji sprawi, że Twoje konto będzie mniej bezpieczne. Czy na pewno chcesz kontynuować?
|
||||
regenerate_scratch_token_desc=Jeśli zgubiłeś lub zużyłeś swój scratch token możesz go wygenerować tutaj.
|
||||
twofa_disabled=Dwuetapowa autoryzacja została wyłączona.
|
||||
scan_this_image=Zeskanuj ten obraz za pomocą swojej aplikacji uwierzytelniającej:
|
||||
or_enter_secret=Lub wprowadź sekret: %s
|
||||
then_enter_passcode=I podaj kod autoryzacji otrzymany z aplikacji:
|
||||
passcode_invalid=Kod dostępu jest nieprawidłowy. Spróbuj ponownie.
|
||||
twofa_enrolled=Twoje konto ma teraz włączoną autoryzację dwuetapową. Koniecznie zachowaj swój kod jednorazowy (%s), ponieważ zostanie pokazany tylko raz!
|
||||
|
||||
manage_account_links=Zarządzaj połączonymi kontami
|
||||
manage_account_links_desc=Zewnętrzne konta połączone z tym kontem
|
||||
account_links_not_available=Obecnie nie ma żadnych zewnętrznych kont połączonych z tym kontem
|
||||
remove_account_link=Usuń powiązane konto
|
||||
remove_account_link_desc=Usunięcie tego konta powiązanego spowoduje cofnięcie mu wszystkich dostępów. Na pewno chcesz kontynuować?
|
||||
remove_account_link_success=Link do konta zostały pomyślnie usunięty!
|
||||
|
||||
orgs_none=Nie jesteś członkiem żadnej organizacji.
|
||||
|
|
@ -454,6 +460,7 @@ owner=Właściciel
|
|||
repo_name=Nazwa repozytorium
|
||||
repo_name_helper=Dobra nazwa repozytorium jest utworzona z krótkich, łatwych do zapamiętania i unikalnych słów kluczowych.
|
||||
visibility=Widoczność
|
||||
visiblity_helper=To repozytorium jest <span class="ui red text">prywatne</span>
|
||||
visiblity_helper_forced=Administrator systemu wymaga, żeby wszystkie nowe repozytoria były <span class="ui red text">prywatne</span>
|
||||
visiblity_fork_helper=(Zmiana tej wartości wpłynie na wszystkie forki)
|
||||
clone_helper=Potrzebujesz pomocy z klonowaniem? Odwiedź <a target="_blank" rel="noopener" href="%s">Pomoc</a>!
|
||||
|
|
@ -480,6 +487,8 @@ mirror_last_synced=Ostatnia synchronizacja
|
|||
watchers=Obserwujący
|
||||
stargazers=Polubienia
|
||||
forks=Forki
|
||||
pick_reaction=Wybierz swoją reakcję
|
||||
reactions_more=i %d więcej
|
||||
|
||||
form.reach_limit_of_creation=Osiągnąłeś limit %d repozytoriów.
|
||||
form.name_reserved=Nazwa repozytorium „%s” jest zarezerwowana.
|
||||
|
|
@ -487,6 +496,7 @@ form.name_pattern_not_allowed=Wzorzec nazwy repozytorium „%s” jest niedozwol
|
|||
|
||||
need_auth=Wymaga autoryzacji
|
||||
migrate_type=Typ migracji
|
||||
migrate_type_helper=To repozytorium będzie <span class="text blue">kopią lustrzaną</span>
|
||||
migrate_repo=Przenieś repozytorium
|
||||
migrate.clone_address=Sklonuj adres
|
||||
migrate.clone_address_desc=To może być adres HTTP/HTTPS/GIT lub ścieżka lokalna serwera.
|
||||
|
|
@ -513,6 +523,8 @@ no_desc=Brak opisu
|
|||
quick_guide=Skrócona instrukcja
|
||||
clone_this_repo=Klonuj repozytorium
|
||||
create_new_repo_command=Tworzenie nowego repozytorium z linii poleceń
|
||||
push_exist_repo=Wypychanie istniejącego repozytorium z linii poleceń
|
||||
bare_message=Repozytorium jest puste.
|
||||
|
||||
code=Kod
|
||||
code.desc=Kod jest miejscem przechowywania kodu źródłowego
|
||||
|
|
@ -526,6 +538,7 @@ pulls=Pull Requests
|
|||
labels=Etykiety
|
||||
milestones=Kamienie milowe
|
||||
commits=Commity
|
||||
commit=Commit
|
||||
releases=Wydania
|
||||
file_raw=Czysty
|
||||
file_history=Historia
|
||||
|
|
@ -542,6 +555,7 @@ editor.edit_file=Edytuj plik
|
|||
editor.preview_changes=Podgląd zmian
|
||||
editor.cannot_edit_non_text_files=Nie można edytować plików binarnych przez interfejs webowy
|
||||
editor.edit_this_file=Edytuj ten plik
|
||||
editor.must_be_on_a_branch=Musisz być na gałęzi, aby zgłosić lub zaproponować zmiany tego pliku
|
||||
editor.fork_before_edit=Musisz sforkować to repozytorium przed edycją tego pliku
|
||||
editor.delete_this_file=Usuń ten plik
|
||||
editor.must_have_write_access=Musisz mieć uprawnienia do zapisu, aby zgłosić lub zaproponować zmiany do tego pliku
|
||||
|
|
@ -566,6 +580,7 @@ editor.directory_is_a_file=Wpis '%s' w ścieżce nadrzędnej jest plikiem a nie
|
|||
editor.file_is_a_symlink=Plik '%s' jest dowiązaniem symbolicznym które nie może być edytowane przez webowy interfejs
|
||||
editor.filename_is_a_directory=Nazwa '%s' jest istniejącym katalogiem w tym repozytorium.
|
||||
editor.file_editing_no_longer_exists=Plik '%s' który edytujesz nie istnieje już w tym repozytorium.
|
||||
editor.file_changed_while_editing=Zawartość pliku została w międzyczasie zmieniona. <a target="_blank" href="%s">Kliknij tutaj</a>, aby zobaczyć co zostało zmienione lub <strong>ponownie naciśnij commit</strong>, aby nadpisać te zmiany.
|
||||
editor.file_already_exists=Nazwa pliku '%s' już istnieje w tym repozytorium.
|
||||
editor.no_changes_to_show=Brak zmian do pokazania.
|
||||
editor.fail_to_update_file=Tworzenie/aktualizacja pliku '%s' nie powiodła się z błędem: %v
|
||||
|
|
@ -613,6 +628,8 @@ issues.label_templates.info=Nie ma jeszcze żadnych etykiet. Kliknij na przycisk
|
|||
issues.label_templates.helper=Wybierz zestaw etykiet
|
||||
issues.label_templates.use=Użyj ten zestaw etykiet
|
||||
issues.label_templates.fail_to_load_file=Ładowanie pliku szablonu etykiety '%s' nie powiodło się: %v
|
||||
issues.add_label_at=dodano etykietę <div class="ui label" style="color: %s\; background-color: %s">%s</div> %s
|
||||
issues.remove_label_at=usunięto etykietę <div class="ui label" style="color: %s\; background-color: %s">%s</div> %s
|
||||
issues.change_milestone_at=`zmodyfikował kamień milowy z <b>%s</b> na <b>%s</b> %s`
|
||||
issues.deleted_milestone=`(usunięto)`
|
||||
issues.self_assign_at=`samo przypisany do %s`
|
||||
|
|
@ -764,6 +781,7 @@ milestones.filter_sort.most_issues=Najwięcej problemów
|
|||
milestones.filter_sort.least_issues=Najmniej problemów
|
||||
|
||||
ext_wiki=Zewnętrzna Wiki
|
||||
ext_wiki.desc=Zewn. wiki linkuje do zewnętrznego systemu wiki
|
||||
|
||||
wiki=Wiki
|
||||
wiki.welcome=Witamy w Wiki
|
||||
|
|
@ -781,6 +799,7 @@ wiki.new_page_button=Nowa strona
|
|||
wiki.delete_page_button=Usuń stronę
|
||||
wiki.delete_page_notice_1=Spowoduje to usunięcie strony <code>"%s:</code>. Upewnij się, że chcesz ja usunąć.
|
||||
wiki.page_already_exists=Strona Wiki o tej samej nazwie już istnieje.
|
||||
wiki.reserved_page=Nazwa strony wiki "%s" jest zajęta. Proszę wybrać inną nazwę.
|
||||
wiki.pages=Strony
|
||||
wiki.last_updated=Ostatnia aktualizacja %s
|
||||
|
||||
|
|
@ -818,6 +837,8 @@ activity.new_issues_count_1=Nowy problem
|
|||
activity.new_issues_count_n=Nowe problemy
|
||||
activity.new_issue_label=Otwarte
|
||||
activity.title.unresolved_conv_1=%d nierozstrzygnięta dyskusja
|
||||
activity.title.unresolved_conv_n=Nierozstrzygniętych dyskusji: %d
|
||||
activity.unresolved_conv_desc=Lista wszystkich starych zgłoszeń i żądań ściągnięcia, które zostały ostatnio zmienione, ale nie został jeszcze rozwiązane.
|
||||
activity.unresolved_conv_label=Otwarte
|
||||
activity.title.releases_1=%d Wydanie
|
||||
activity.title.releases_n=%d Wydań
|
||||
|
|
@ -826,6 +847,7 @@ activity.published_release_label=Opublikowane
|
|||
|
||||
search=Szukaj
|
||||
search.search_repo=Szukaj repozytorium
|
||||
search.results=Wyniki wyszukiwania dla "%s" w <a href="%s">%s</a>
|
||||
|
||||
settings=Ustawienia
|
||||
settings.desc=Ustawienia to miejsce, w którym możesz zmieniać parametry repozytorium
|
||||
|
|
@ -864,6 +886,7 @@ settings.tracker_url_format_desc=Symbole zastępcze <code>{user} {repo} {index}<
|
|||
settings.enable_timetracker=Włącz śledzenie czasu
|
||||
settings.allow_only_contributors_to_track_time=Pozwól jedynie współpracownikom na śledzenie czasu
|
||||
settings.pulls_desc=Włącz obsługę pull request, aby akceptować publiczny wkład
|
||||
settings.pulls.allow_merge_commits=Zezwól na komentarze przy scalaniu
|
||||
settings.danger_zone=Strefa niebezpieczeństwa
|
||||
settings.new_owner_has_same_repo=Nowy właściciel już posiada repozytorium o tej samej nazwie.
|
||||
settings.convert=Konwersja na repozytorium regularne
|
||||
|
|
@ -883,6 +906,7 @@ settings.wiki_deletion_success=Dane wiki repozytorium zostały pomyślnie usuni
|
|||
settings.delete=Usuń to repozytorium
|
||||
settings.delete_desc=Po usunięciu repozytorium nie ma odwrotu. Upewnij się, że tego chcesz.
|
||||
settings.delete_notices_1=- Ta operacja <strong>NIE MOŻE</strong> zostać cofnięta.
|
||||
settings.delete_notices_2=- Ta operacja trwale usunie wszystko z repozytorium <strong>%s</strong>, w tym kod źródłowy, zagadnienia, komentarze, wiki i dostęp dla współpracowników.
|
||||
settings.delete_notices_fork_1=- Wszystkie forki staną się niezależnymi repozytoriami po usunięciu.
|
||||
settings.deletion_success=Repozytorium zostało usunięte.
|
||||
settings.update_settings_success=Ustawienia repozytorium zostały zaktualizowane.
|
||||
|
|
@ -900,6 +924,7 @@ settings.search_user_placeholder=Szukaj użytkownika...
|
|||
settings.org_not_allowed_to_be_collaborator=Organizacji nie można dodać jako współpracownika.
|
||||
settings.user_is_org_member=Użytkownik jest członkiem organizacji, który nie może być dodany jako współpracownik.
|
||||
settings.add_webhook=Dodaj webhooka
|
||||
settings.hooks_desc=Webhooki działają jak proste wyzwalacze żądań HTTP POST. Jeśli cokolwiek zdarzy się w Gitea, wyślemy powiadomienie do wybranego hosta. Więcej informacji można znaleźć w <a target="_blank" rel="noopener" href="%s">przewodniku webhooków</a>.
|
||||
settings.webhook_deletion=Usuń webhooka
|
||||
settings.webhook_deletion_desc=Usunięcie tego webooka spowoduje usunięcie powiązanych informacji i wpisów w historii. Czy chcesz kontynuować?
|
||||
settings.webhook_deletion_success=Webhook został pomyślnie usunięty!
|
||||
|
|
@ -950,9 +975,11 @@ settings.slack_token=Token
|
|||
settings.slack_domain=Domena
|
||||
settings.slack_channel=Kanał
|
||||
settings.add_discord_hook_desc=Dodaj integrację z <a href="%s">Discordem</a> do swojego repozytorium.
|
||||
settings.add_dingtalk_hook_desc=Dodaj integrację z <a href="%s">Dingtalk</a> do swojego repozytorium.
|
||||
settings.deploy_keys=Klucze wdrożeniowe
|
||||
settings.add_deploy_key=Dodaj klucz wdrożenia
|
||||
settings.deploy_key_desc=Klucze wdrożenia pozwalają na dostęp tylko do odczytu. To nie to samo co klucze SSH dla konta osobistego.
|
||||
settings.is_writable=Przyznaj dostęp do zapisu
|
||||
settings.no_deploy_keys=Nie dodałeś żadnego klucza wdrożenia.
|
||||
settings.title=Tytuł
|
||||
settings.deploy_key_content=Treść
|
||||
|
|
@ -969,6 +996,7 @@ settings.protected_branch_can_push_yes=Możesz wysyłać
|
|||
settings.protected_branch_can_push_no=Nie możesz wysyłać
|
||||
settings.branch_protection=Ochrona gałęzi dla <b>%s</b>
|
||||
settings.protect_this_branch=Chroń tą gałąź
|
||||
settings.protect_this_branch_desc=Wyłącz wymuszone wypchnięcia i zabroń usuwania.
|
||||
settings.protect_whitelist_committers=Użytkownicy, którzy mogą wypychać do tej gałęzi
|
||||
settings.protect_whitelist_committers_desc=Dodaj użytkowników lub zespoły do białej listy tej gałęzi. Użytkowników z białej listy nie dotyczą typowe ograniczenia wypchnięć.
|
||||
settings.protect_whitelist_users=Użytkownicy, którzy mogą wypychać do tej gałęzi
|
||||
|
|
@ -981,6 +1009,7 @@ settings.update_protect_branch_success=Pomyślnie zmieniono ustawienia ochrony g
|
|||
settings.remove_protected_branch_success=Pomyślnie usunięto ustawienia ochrony gałęzi %s
|
||||
settings.protected_branch_deletion=W celu usunięcia chronionej gałęzi
|
||||
settings.protected_branch_deletion_desc=Każdy z prawami zapisu będzie w stanie wypychać zmiany bezpośrednio do tej gałęzi. Jesteś pewien/pewna?
|
||||
settings.default_branch_desc=Domyślna gałąź jest uznawana za "bazową". Dopóki nie ustawisz innej gałęzi, wszystkie pull requesty i commity będą automatycznie kierowane do bazowej.
|
||||
settings.choose_branch=Wybierz gałąź...
|
||||
settings.no_protected_branch=Nie ma chronionych gałęzi
|
||||
|
||||
|
|
@ -1160,11 +1189,16 @@ dashboard.delete_inactivate_accounts=Usuń wszystkie nieaktywne konta
|
|||
dashboard.delete_inactivate_accounts_success=Wszystkie nieaktywne konta zostały usunięte.
|
||||
dashboard.delete_repo_archives=Usuń wszystkie archiwa repozytoriów
|
||||
dashboard.delete_repo_archives_success=Pomyślnie usunięto wszystkie archiwa repozytoriów.
|
||||
dashboard.delete_missing_repos=Usuń wszystkie rekordy repozytoriów, które nie mają plików Git
|
||||
dashboard.delete_missing_repos_success=Wszystkie repozytoria, które nie miały plików Git zostały usunięte.
|
||||
dashboard.git_gc_repos=Uruchom usuwanie śmieci ze wszystkich repozytoriów
|
||||
dashboard.git_gc_repos_success=Wszystkie repozytoria zakończyły procedurę usuwania śmieci.
|
||||
dashboard.resync_all_sshkeys=Przepisz plik '.ssh/authorized_keys' (dla kluczy SSH Gitea). Nie ma potrzeby tego robić, jeśli używasz wbudowanego serwera SSH.
|
||||
dashboard.resync_all_sshkeys_success=Wszystkie klucze publiczne zarządzane przez Gitea zostały przepisane.
|
||||
dashboard.resync_all_hooks=Ponownie synchronizuj "hooki" "pre-receive", "update" i "post-receive" wszystkich repozytoriów.
|
||||
dashboard.resync_all_hooks_success=Hooki" "pre-receive", "update" i "post-receive" wszystkich repozytoriów zostały ponownie zsynchronizowane.
|
||||
dashboard.reinit_missing_repos=Ponownie zainicjalizuj wszystkie brakujące repozytoria Git, dla których istnieją rekordy
|
||||
dashboard.reinit_missing_repos_success=Wszystkie brakujące repozytoria Git, dla których istnieją rekordy, zostały zainicjalizowane.
|
||||
dashboard.sync_external_users=Synchronizuj zewnętrzne dane użytkownika
|
||||
dashboard.sync_external_users_started=Synchronizacja zewnętrznych danych użytkownika rozpoczęta
|
||||
dashboard.server_uptime=Uptime serwera
|
||||
|
|
@ -1220,11 +1254,13 @@ users.max_repo_creation_desc=(Ustaw -1, aby użyć globalnego limitu)
|
|||
users.is_activated=Konto aktywowane
|
||||
users.prohibit_login=Logowanie wyłączone
|
||||
users.is_admin=Uprawnienia administratora
|
||||
users.allow_git_hook=Może tworzyć hooki Git
|
||||
users.allow_import_local=Może importować lokalne repozytoria
|
||||
users.allow_create_organization=Może tworzyć organizacje
|
||||
users.update_profile=Zaktualizuj profil konta
|
||||
users.delete_account=Usuń konto
|
||||
users.still_own_repo=Ten użytkownik wciąż posiada jedno lub więcej repozytoriów. Muszą one najpierw zostać usunięte lub przetransferowane.
|
||||
users.still_has_org=Ten użytkownik dalej posiada członkostwo w przynajmniej jednej organizacji. Musi ją najpierw opuścić lub usunąć.
|
||||
users.deletion_success=Konto usunięte pomyślnie.
|
||||
|
||||
orgs.org_manage_panel=Zarządzanie organizacją
|
||||
|
|
@ -1255,7 +1291,9 @@ auths.security_protocol=Protokół zabezpieczeń
|
|||
auths.domain=Domena
|
||||
auths.host=Serwer
|
||||
auths.port=Port
|
||||
auths.bind_dn=DN powiązania
|
||||
auths.bind_password=Hasło Bind
|
||||
auths.bind_password_helper=Uwaga: To hasło jest przechowywane bez szyfrowania. Zdecydowanie zalecane jest użycie konta z uprawnieniami tylko do odczytu.
|
||||
auths.user_base=Baza wyszukiwania
|
||||
auths.user_dn=DN użytkownika
|
||||
auths.attribute_username=Atrybut nazwy użytkownika
|
||||
|
|
@ -1266,6 +1304,7 @@ auths.attribute_mail=Atrybut e-mail
|
|||
auths.attributes_in_bind=Pobierz atrybuty w kontekście Bind DN
|
||||
auths.filter=Filtr użytkownika
|
||||
auths.admin_filter=Filtr administratora
|
||||
auths.ms_ad_sa=Atrybuty wyszukiwania MS AD
|
||||
auths.smtp_auth=Typ uwierzytelnienia SMTP
|
||||
auths.smtphost=Serwer SMTP
|
||||
auths.smtpport=Port SMTP
|
||||
|
|
@ -1276,6 +1315,10 @@ auths.skip_tls_verify=Pomiń weryfikację protokołu TLS
|
|||
auths.pam_service_name=Nazwa usługi PAM
|
||||
auths.oauth2_provider=Dostawca OAuth2
|
||||
auths.oauth2_clientID=ID klienta (klucz)
|
||||
auths.oauth2_clientSecret=Sekretny Token
|
||||
auths.openIdConnectAutoDiscoveryURL=OpenID Connect Auto Discovery URL
|
||||
auths.oauth2_use_custom_url=Użyj niestandardowych adresów URL, zamiast domyślnych adresów URL
|
||||
auths.oauth2_tokenURL=Adres URL tokena
|
||||
auths.oauth2_authURL=URL autoryzacji
|
||||
auths.oauth2_profileURL=URL profilu
|
||||
auths.oauth2_emailURL=URL adresu e-mail
|
||||
|
|
@ -1284,13 +1327,16 @@ auths.tips=Wskazówki
|
|||
auths.tips.oauth2.general=Uwierzytelnianie OAuth2
|
||||
auths.tips.oauth2.general.tip=Przy rejestracji nowego uwierzytelnienia OAuth2, URL zwrotny/przekierowań powinien mieć postać <serwer>/user/oauth2/<nazwa uwierzytelnienia>/callback
|
||||
auths.tip.oauth2_provider=Dostawca OAuth2
|
||||
auths.tip.bitbucket=Zarejestruj nowego konsumenta OAuth na https://bitbucket.org/account/user/<your username>/oauth-consumers/new i dodaj uprawnienie "Account"-"Read
|
||||
auths.tip.dropbox=Stwórz nową aplikację na https://www.dropbox.com/developers/apps
|
||||
auths.tip.facebook=Zarejestruj nową aplikację na https://developers.facebook.com/apps i dodaj produkt "Facebook Login
|
||||
auths.tip.github=Zarejestruj nową aplikację OAuth na https://github.com/settings/applications/new
|
||||
auths.tip.gitlab=Zarejestruj nową aplikację na https://gitlab.com/profile/applications
|
||||
auths.tip.google_plus=Uzyskaj dane uwierzytelniające klienta OAuth2 z konsoli Google API (https://console.developers.google.com/)
|
||||
auths.tip.twitter=Przejdź na https://dev.twitter.com/apps, stwórz aplikację i upewnij się że opcja “Allow this application to be used to Sign in with Twitter” jest włączona.
|
||||
auths.edit=Edytuj ustawienia uwierzytelniania
|
||||
auths.activated=To uwierzytelnienie zostało aktywowane
|
||||
auths.new_success=Uwierzytelnienie '%s' zostało dodane.
|
||||
auths.update_success=Ustawienia uwierzytelniania zostały zaktualizowane.
|
||||
auths.update=Aktualizuj ustawienia uwierzytelniania
|
||||
auths.delete=Usuń to źródło uwierzytelniania
|
||||
|
|
@ -1437,6 +1483,7 @@ notices.type=Typ
|
|||
notices.type_1=Repozytorium
|
||||
notices.desc=Opis
|
||||
notices.op=Operacja
|
||||
notices.delete_success=Powiadomienia systemu zostały usunięte.
|
||||
|
||||
[action]
|
||||
create_repo=tworzy repozytorium <a href="%s">%s</a>
|
||||
|
|
@ -1453,6 +1500,7 @@ merge_pull_request=`scala pull request <a href="%s/pulls/%s">%s#%[2]s</a>`
|
|||
transfer_repo=przenosi repozytorium <code>%s</code> do <a href="%s">%s</a>
|
||||
push_tag=taguje <a href="%s/src/%s">%[2]s</a> w <a href="%[1]s">%[3]s</a>
|
||||
delete_tag=usunięto tag %[2]s z <a href="%[1]s">%[3]s</a>
|
||||
delete_branch=usunięto gałąź %[2]s z <a href="%[1]s">%[3]s</a>
|
||||
compare_commits=Porównaj %d commitów
|
||||
|
||||
[tool]
|
||||
|
|
@ -1492,11 +1540,17 @@ no_read=Nie masz żadnych przeczytanych powiadomień.
|
|||
pin=Przypnij powiadomienie
|
||||
mark_as_read=Oznacz jako przeczytane
|
||||
mark_as_unread=Oznacz jak nieprzeczytane
|
||||
mark_all_as_read=Oznacz wszystkie jako przeczytane
|
||||
|
||||
[gpg]
|
||||
error.extract_sign=Nie udało się wyłuskać podpisu
|
||||
error.generate_hash=Nie udało się wygenerować skrótu dla commitu
|
||||
error.no_committer_account=Brak konta powiązanego z e-mailem autora
|
||||
error.no_gpg_keys_found=Nie znaleziono w bazie danych klucza dla tego podpisu
|
||||
error.not_signed_commit=Commit nie podpisany
|
||||
error.failed_retrieval_gpg_keys=Nie udało się odzyskać żadnego klucza powiązanego z kontem autora
|
||||
|
||||
[units]
|
||||
error.no_unit_allowed_repo=Nie można w tym repozytorium znaleźć żadnego modułu, do którego masz dostęp
|
||||
error.unit_not_allowed=Nie masz uprawnień do przeglądania tego modułu repozytorium
|
||||
|
||||
|
|
|
|||
|
|
@ -63,6 +63,7 @@ cancel=Cancelar
|
|||
install=Instalação
|
||||
title=Configuração inicial
|
||||
docker_helper=Se você está rodando o Gitea dentro do Docker, por favor leia as <a target="_blank" rel="noopener" href="%s">instruções</a> cuidadosamente antes de alterar qualquer coisa nesta página.
|
||||
requite_db_desc=Gitea requer MySQL, MSSQL, PostgreSQL, SQLite3 ou TiDB.
|
||||
db_title=Configurações de banco de dados
|
||||
db_type=Tipo de banco de dados
|
||||
host=Servidor
|
||||
|
|
@ -400,6 +401,8 @@ valid_until=Válido até
|
|||
valid_forever=Válido para sempre
|
||||
last_used=Última vez usado em
|
||||
no_activity=Nenhuma atividade recente
|
||||
can_read_info=Leitura
|
||||
can_write_info=Escrita
|
||||
key_state_desc=Essa chave tem sido utilizada nos últimos 7 dias
|
||||
token_state_desc=Esse token tem sido utilizado nos últimos 7 dias
|
||||
show_openid=Mostrar no perfil
|
||||
|
|
@ -754,7 +757,12 @@ pulls.is_checking=A verificação do conflito ainda está em progresso, por favo
|
|||
pulls.can_auto_merge_desc=O merge deste pull request pode ser aplicado automaticamente.
|
||||
pulls.cannot_auto_merge_desc=O merge deste pull request não pode ser aplicado automaticamente pois há conflitos.
|
||||
pulls.cannot_auto_merge_helper=Por favor, aplique o merge manualmente para resolver os conflitos.
|
||||
pulls.no_merge_desc=O merge deste pull request não pode ser aplicado porque nenhuma opção de merge está habilitada.
|
||||
pulls.no_merge_helper=Para aplicar o merge deste pull request, habilite pelo menos uma opção de mesclagem nas configurações do repositório ou aplique o merge do manualmente.
|
||||
pulls.merge_pull_request=Aplicar merge de Pull Request
|
||||
pulls.rebase_merge_pull_request=Aplicar Rebase e Merge
|
||||
pulls.squash_merge_pull_request=Aplicar Squash e Merge
|
||||
pulls.invalid_merge_option=Você não pode usar esta opção de merge neste pull request
|
||||
pulls.open_unmerged_pull_exists=`Você não pode executar a operação de reabrir porque já existe um pull request aberto (#%d) do mesmo repositório com as mesmas informações de merge e está esperando pelo merge.`
|
||||
|
||||
milestones.new=Novo marco
|
||||
|
|
@ -893,6 +901,10 @@ settings.tracker_url_format_desc=Você pode usar o espaço reservado <code>{user
|
|||
settings.enable_timetracker=Habilitar contador de tempo
|
||||
settings.allow_only_contributors_to_track_time=Permitir apenas colaboradores controlar o contador de tempo
|
||||
settings.pulls_desc=Habilitar pull requests para aceitar contribuições públicas
|
||||
settings.pulls.ignore_whitespace=Ignorar alterações com espaço em branco ao verificar conflitos
|
||||
settings.pulls.allow_merge_commits=Permitir commits via merge
|
||||
settings.pulls.allow_rebase_merge=Permitir rebase para commits via merge
|
||||
settings.pulls.allow_squash_commits=Permitir aplicação do squash antes do merge
|
||||
settings.danger_zone=Zona de perigo
|
||||
settings.new_owner_has_same_repo=O novo dono já tem um repositório com o mesmo nome. Por favor, escolha outro nome.
|
||||
settings.convert=Converter para repositório tradicional
|
||||
|
|
@ -985,6 +997,8 @@ settings.add_dingtalk_hook_desc=Adicionar integração com <a href="%s">Dingtalk
|
|||
settings.deploy_keys=Chaves de Deploy
|
||||
settings.add_deploy_key=Nova chave
|
||||
settings.deploy_key_desc=Chave de Deploy só tem acesso somente leitura. Não é igual as chaves SSH de conta pessoal.
|
||||
settings.is_writable=Permitir acesso de escrita
|
||||
settings.is_writable_info=Essa chave pode ser usada para <strong>push</strong> neste repositório? As chaves de implantação sempre têm acesso de pull.
|
||||
settings.no_deploy_keys=Você ainda não adicionou nenhuma chave de Deploy.
|
||||
settings.title=Título
|
||||
settings.deploy_key_content=Conteúdo da chave
|
||||
|
|
@ -1309,6 +1323,7 @@ auths.attribute_mail=Atributo e-mail
|
|||
auths.attributes_in_bind=Buscar os atributos no contexto de Bind DN
|
||||
auths.filter=Filtro de usuário
|
||||
auths.admin_filter=Filtro de administrador
|
||||
auths.ms_ad_sa=Atributos de pesquisa do MS AD
|
||||
auths.smtp_auth=Tipo de autenticação SMTP
|
||||
auths.smtphost=Host SMTP
|
||||
auths.smtpport=Porta SMTP
|
||||
|
|
|
|||
|
|
@ -270,7 +270,7 @@ openid_been_used=Адрес OpenID '%s' уже используется.
|
|||
username_password_incorrect=Неверное имя пользователя или пароль.
|
||||
enterred_invalid_repo_name=Пожалуйста, убедитесь, что введено правильное имя репозитория.
|
||||
enterred_invalid_owner_name=Убедитесь, что введенное имя владельца верное.
|
||||
enterred_invalid_password=Убедитесь, что введенный пароль верен.
|
||||
enterred_invalid_password=Убедитесь, что введённый пароль верен.
|
||||
user_not_exist=Пользователь не существует.
|
||||
last_org_owner=Удаление последнего пользователя из команды владельцев не разрешается, поскольку всегда должен быть по крайней мере один владелец в любой организации.
|
||||
cannot_add_org_to_team=Организацию нельзя добавить в качестве члена команды.
|
||||
|
|
|
|||
|
|
@ -252,7 +252,6 @@ email_been_used=E-postadress används redan.
|
|||
openid_been_used=OpenID-adressen '%s' används redan.
|
||||
username_password_incorrect=Felaktigt användarnamn eller lösenord.
|
||||
enterred_invalid_owner_name=Kontrollera att ägarnamnet som du angav är rätt.
|
||||
enterred_invalid_password=Kontrollera att lösenordet som du angav är rätt.
|
||||
user_not_exist=Användaren finns inte.
|
||||
last_org_owner=Att ta bort den sista användaren i ägare-teamet är inte tillåtet då det måste finnas minst en användare i ägare-teamet.
|
||||
cannot_add_org_to_team=En organisation kan inte läggas till som en gruppmedlem.
|
||||
|
|
|
|||
|
|
@ -269,7 +269,6 @@ openid_been_used=OpenID 地址 '%s' 已被使用。
|
|||
username_password_incorrect=用户名或密码错误
|
||||
enterred_invalid_repo_name=请检查您输入的仓库名称是正确。
|
||||
enterred_invalid_owner_name=请检查您输入的新所有者用户名是否正确。
|
||||
enterred_invalid_password=请检查您输入的密码是否正确。
|
||||
user_not_exist=该用户名不存在
|
||||
last_org_owner=被移除用户为最后一位管理员。请添加一位新的管理员再进行移除成员操作!
|
||||
cannot_add_org_to_team=组织不能被加入到团队中。
|
||||
|
|
|
|||
|
|
@ -259,7 +259,6 @@ openid_been_used=OpenID 位址 '%s' 已被使用。
|
|||
username_password_incorrect=帳戶名稱或密碼有誤
|
||||
enterred_invalid_repo_name=請檢查您輸入的儲存庫名稱是否正確。
|
||||
enterred_invalid_owner_name=請檢查您輸入的擁有者名稱是否正確。
|
||||
enterred_invalid_password=請檢查您輸入的密碼是否正確。
|
||||
user_not_exist=該使用者名稱並不存在
|
||||
last_org_owner=無法移除群組內唯一的管理員
|
||||
cannot_add_org_to_team=組織不能被新增為團隊成員。
|
||||
|
|
|
|||
|
|
@ -269,7 +269,6 @@ openid_been_used=OpenID 位址 '%s' 已被使用。
|
|||
username_password_incorrect=帳戶名稱或密碼有誤
|
||||
enterred_invalid_repo_name=請檢查您輸入的儲存庫名稱是否正確。
|
||||
enterred_invalid_owner_name=請檢查您輸入的擁有者名稱是否正確。
|
||||
enterred_invalid_password=請檢查您輸入的密碼是否正確。
|
||||
user_not_exist=該用戶名不存在
|
||||
last_org_owner=無法移除群組內唯一的管理員
|
||||
cannot_add_org_to_team=組織不能被新增為團隊成員。
|
||||
|
|
|
|||
|
|
@ -1683,7 +1683,10 @@ function showDeletePopup() {
|
|||
filter += "#" + $this.attr("id")
|
||||
}
|
||||
|
||||
$('.delete.modal' + filter).modal({
|
||||
var dialog = $('.delete.modal' + filter);
|
||||
dialog.find('.repo-name').text($this.data('repo-name'));
|
||||
|
||||
dialog.modal({
|
||||
closable: false,
|
||||
onApprove: function() {
|
||||
if ($this.data('type') == "form") {
|
||||
|
|
|
|||
|
|
@ -463,9 +463,9 @@ func RegisterRoutes(m *macaron.Macaron) {
|
|||
})
|
||||
m.Group("/releases", func() {
|
||||
m.Combo("").Get(repo.ListReleases).
|
||||
Post(reqToken(), reqRepoWriter(), bind(api.CreateReleaseOption{}), repo.CreateRelease)
|
||||
Post(reqToken(), reqRepoWriter(), context.ReferencesGitRepo(), bind(api.CreateReleaseOption{}), repo.CreateRelease)
|
||||
m.Combo("/:id").Get(repo.GetRelease).
|
||||
Patch(reqToken(), reqRepoWriter(), bind(api.EditReleaseOption{}), repo.EditRelease).
|
||||
Patch(reqToken(), reqRepoWriter(), context.ReferencesGitRepo(), bind(api.EditReleaseOption{}), repo.EditRelease).
|
||||
Delete(reqToken(), reqRepoWriter(), repo.DeleteRelease)
|
||||
})
|
||||
m.Post("/mirror-sync", reqToken(), reqRepoWriter(), repo.MirrorSync)
|
||||
|
|
|
|||
|
|
@ -96,7 +96,7 @@ func ListReleases(ctx *context.APIContext) {
|
|||
|
||||
// CreateRelease create a release
|
||||
func CreateRelease(ctx *context.APIContext, form api.CreateReleaseOption) {
|
||||
// swagger:operation GET /repos/{owner}/{repo}/releases repository repoCreateRelease
|
||||
// swagger:operation POST /repos/{owner}/{repo}/releases repository repoCreateRelease
|
||||
// ---
|
||||
// summary: Create a release
|
||||
// consumes:
|
||||
|
|
@ -146,6 +146,7 @@ func CreateRelease(ctx *context.APIContext, form api.CreateReleaseOption) {
|
|||
IsDraft: form.IsDraft,
|
||||
IsPrerelease: form.IsPrerelease,
|
||||
IsTag: false,
|
||||
Repo: ctx.Repo.Repository,
|
||||
}
|
||||
if err := models.CreateRelease(ctx.Repo.GitRepo, rel, nil); err != nil {
|
||||
if models.IsErrReleaseAlreadyExist(err) {
|
||||
|
|
@ -167,6 +168,8 @@ func CreateRelease(ctx *context.APIContext, form api.CreateReleaseOption) {
|
|||
rel.IsPrerelease = form.IsPrerelease
|
||||
rel.PublisherID = ctx.User.ID
|
||||
rel.IsTag = false
|
||||
rel.Repo = ctx.Repo.Repository
|
||||
rel.Publisher = ctx.User
|
||||
|
||||
if err = models.UpdateRelease(ctx.Repo.GitRepo, rel, nil); err != nil {
|
||||
ctx.ServerError("UpdateRelease", err)
|
||||
|
|
|
|||
|
|
@ -253,40 +253,30 @@ func setMergeTarget(ctx *context.Context, pull *models.PullRequest) {
|
|||
}
|
||||
|
||||
// PrepareMergedViewPullInfo show meta information for a merged pull request view page
|
||||
func PrepareMergedViewPullInfo(ctx *context.Context, issue *models.Issue) {
|
||||
func PrepareMergedViewPullInfo(ctx *context.Context, issue *models.Issue) *git.PullRequestInfo {
|
||||
pull := issue.PullRequest
|
||||
|
||||
var err error
|
||||
if err = pull.GetHeadRepo(); err != nil {
|
||||
ctx.ServerError("GetHeadRepo", err)
|
||||
return
|
||||
}
|
||||
|
||||
setMergeTarget(ctx, pull)
|
||||
ctx.Data["HasMerged"] = true
|
||||
|
||||
mergedCommit, err := ctx.Repo.GitRepo.GetCommit(pull.MergedCommitID)
|
||||
if err != nil {
|
||||
ctx.ServerError("GetCommit", err)
|
||||
return
|
||||
}
|
||||
// the ID of the last commit in the PR (not including the merge commit)
|
||||
endCommitID, err := mergedCommit.ParentID(mergedCommit.ParentCount() - 1)
|
||||
if err != nil {
|
||||
ctx.ServerError("ParentID", err)
|
||||
return
|
||||
}
|
||||
prInfo, err := ctx.Repo.GitRepo.GetPullRequestInfo(ctx.Repo.Repository.RepoPath(),
|
||||
pull.MergeBase, pull.GetGitRefName())
|
||||
|
||||
ctx.Data["NumCommits"], err = ctx.Repo.GitRepo.CommitsCountBetween(pull.MergeBase, endCommitID.String())
|
||||
if err != nil {
|
||||
ctx.ServerError("Repo.GitRepo.CommitsCountBetween", err)
|
||||
return
|
||||
}
|
||||
ctx.Data["NumFiles"], err = ctx.Repo.GitRepo.FilesCountBetween(pull.MergeBase, endCommitID.String())
|
||||
if err != nil {
|
||||
ctx.ServerError("Repo.GitRepo.FilesCountBetween", err)
|
||||
return
|
||||
if strings.Contains(err.Error(), "fatal: Not a valid object name") {
|
||||
ctx.Data["IsPullReuqestBroken"] = true
|
||||
ctx.Data["BaseTarget"] = "deleted"
|
||||
ctx.Data["NumCommits"] = 0
|
||||
ctx.Data["NumFiles"] = 0
|
||||
return nil
|
||||
}
|
||||
|
||||
ctx.ServerError("GetPullRequestInfo", err)
|
||||
return nil
|
||||
}
|
||||
ctx.Data["NumCommits"] = prInfo.Commits.Len()
|
||||
ctx.Data["NumFiles"] = prInfo.NumFiles
|
||||
return prInfo
|
||||
}
|
||||
|
||||
// PrepareViewPullInfo show meta information for a pull request preview page
|
||||
|
|
@ -351,28 +341,16 @@ func ViewPullCommits(ctx *context.Context) {
|
|||
|
||||
var commits *list.List
|
||||
if pull.HasMerged {
|
||||
PrepareMergedViewPullInfo(ctx, issue)
|
||||
prInfo := PrepareMergedViewPullInfo(ctx, issue)
|
||||
if ctx.Written() {
|
||||
return
|
||||
} else if prInfo == nil {
|
||||
ctx.NotFound("ViewPullCommits", nil)
|
||||
return
|
||||
}
|
||||
ctx.Data["Username"] = ctx.Repo.Owner.Name
|
||||
ctx.Data["Reponame"] = ctx.Repo.Repository.Name
|
||||
|
||||
mergedCommit, err := ctx.Repo.GitRepo.GetCommit(pull.MergedCommitID)
|
||||
if err != nil {
|
||||
ctx.ServerError("Repo.GitRepo.GetCommit", err)
|
||||
return
|
||||
}
|
||||
endCommitID, err := mergedCommit.ParentID(mergedCommit.ParentCount() - 1)
|
||||
if err != nil {
|
||||
ctx.ServerError("ParentID", err)
|
||||
return
|
||||
}
|
||||
commits, err = ctx.Repo.GitRepo.CommitsBetweenIDs(endCommitID.String(), pull.MergeBase)
|
||||
if err != nil {
|
||||
ctx.ServerError("Repo.GitRepo.CommitsBetweenIDs", err)
|
||||
return
|
||||
}
|
||||
commits = prInfo.Commits
|
||||
} else {
|
||||
prInfo := PrepareViewPullInfo(ctx, issue)
|
||||
if ctx.Written() {
|
||||
|
|
@ -415,26 +393,26 @@ func ViewPullFiles(ctx *context.Context) {
|
|||
|
||||
var headTarget string
|
||||
if pull.HasMerged {
|
||||
PrepareMergedViewPullInfo(ctx, issue)
|
||||
prInfo := PrepareMergedViewPullInfo(ctx, issue)
|
||||
if ctx.Written() {
|
||||
return
|
||||
} else if prInfo == nil {
|
||||
ctx.NotFound("ViewPullFiles", nil)
|
||||
return
|
||||
}
|
||||
|
||||
diffRepoPath = ctx.Repo.GitRepo.Path
|
||||
startCommitID = pull.MergeBase
|
||||
mergedCommit, err := ctx.Repo.GitRepo.GetCommit(pull.MergedCommitID)
|
||||
if err != nil {
|
||||
ctx.ServerError("GetCommit", err)
|
||||
return
|
||||
}
|
||||
endCommitSha, err := mergedCommit.ParentID(mergedCommit.ParentCount() - 1)
|
||||
if err != nil {
|
||||
ctx.ServerError("ParentID", err)
|
||||
return
|
||||
}
|
||||
endCommitID = endCommitSha.String()
|
||||
gitRepo = ctx.Repo.GitRepo
|
||||
|
||||
headCommitID, err := gitRepo.GetRefCommitID(pull.GetGitRefName())
|
||||
if err != nil {
|
||||
ctx.ServerError("GetRefCommitID", err)
|
||||
return
|
||||
}
|
||||
|
||||
startCommitID = prInfo.MergeBase
|
||||
endCommitID = headCommitID
|
||||
|
||||
headTarget = path.Join(ctx.Repo.Owner.Name, ctx.Repo.Repository.Name)
|
||||
ctx.Data["Username"] = ctx.Repo.Owner.Name
|
||||
ctx.Data["Reponame"] = ctx.Repo.Repository.Name
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@
|
|||
<td>{{.NumIssues}}</td>
|
||||
<td>{{SizeFmt .Size}}</td>
|
||||
<td><span title="{{.CreatedUnix.FormatLong}}">{{.CreatedUnix.FormatShort}}</span></td>
|
||||
<td><a class="delete-button" href="" data-url="{{$.Link}}/delete?page={{$.Page.Current}}" data-id="{{.ID}}"><i class="trash icon text red"></i></a></td>
|
||||
<td><a class="delete-button" href="" data-url="{{$.Link}}/delete?page={{$.Page.Current}}" data-id="{{.ID}}" data-repo-name="{{.Name}}"><i class="trash icon text red"></i></a></td>
|
||||
</tr>
|
||||
{{end}}
|
||||
</tbody>
|
||||
|
|
@ -55,7 +55,7 @@
|
|||
</div>
|
||||
<div class="content">
|
||||
<p>{{.i18n.Tr "repo.settings.delete_desc"}}</p>
|
||||
{{.i18n.Tr "repo.settings.delete_notices_2"}}<br>
|
||||
{{.i18n.Tr "repo.settings.delete_notices_2" `<span class="repo-name"></span>` | Safe}}<br>
|
||||
{{.i18n.Tr "repo.settings.delete_notices_fork_1"}}<br>
|
||||
</div>
|
||||
{{template "base/delete_modal_actions" .}}
|
||||
|
|
|
|||
8
vendor/code.gitea.io/git/repo_commit.go
generated
vendored
8
vendor/code.gitea.io/git/repo_commit.go
generated
vendored
|
|
@ -11,8 +11,8 @@ import (
|
|||
"strings"
|
||||
)
|
||||
|
||||
// getRefCommitID returns the last commit ID string of given reference (branch or tag).
|
||||
func (repo *Repository) getRefCommitID(name string) (string, error) {
|
||||
// GetRefCommitID returns the last commit ID string of given reference (branch or tag).
|
||||
func (repo *Repository) GetRefCommitID(name string) (string, error) {
|
||||
stdout, err := NewCommand("show-ref", "--verify", name).RunInDir(repo.Path)
|
||||
if err != nil {
|
||||
if strings.Contains(err.Error(), "not a valid ref") {
|
||||
|
|
@ -25,12 +25,12 @@ func (repo *Repository) getRefCommitID(name string) (string, error) {
|
|||
|
||||
// GetBranchCommitID returns last commit ID string of given branch.
|
||||
func (repo *Repository) GetBranchCommitID(name string) (string, error) {
|
||||
return repo.getRefCommitID(BranchPrefix + name)
|
||||
return repo.GetRefCommitID(BranchPrefix + name)
|
||||
}
|
||||
|
||||
// GetTagCommitID returns last commit ID string of given tag.
|
||||
func (repo *Repository) GetTagCommitID(name string) (string, error) {
|
||||
return repo.getRefCommitID(TagPrefix + name)
|
||||
return repo.GetRefCommitID(TagPrefix + name)
|
||||
}
|
||||
|
||||
// parseCommitData parses commit information from the (uncompressed) raw
|
||||
|
|
|
|||
6
vendor/vendor.json
vendored
6
vendor/vendor.json
vendored
|
|
@ -3,10 +3,10 @@
|
|||
"ignore": "test appengine",
|
||||
"package": [
|
||||
{
|
||||
"checksumSHA1": "1WHdGmDRsFRTD5N69l+MEbZr+nM=",
|
||||
"checksumSHA1": "Gz+a5Qo4PCiB/Gf2f02v8HEAxDM=",
|
||||
"path": "code.gitea.io/git",
|
||||
"revision": "f4a91053671bee69f1995e456c1541668717c19d",
|
||||
"revisionTime": "2018-01-07T06:11:05Z"
|
||||
"revision": "6798d0f202cdc7187c00a467b586a4bdee27e8c9",
|
||||
"revisionTime": "2018-01-14T14:37:32Z"
|
||||
},
|
||||
{
|
||||
"checksumSHA1": "Qtq0kW+BnpYMOriaoCjMa86WGG8=",
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user