This commit is contained in:
Konrad 2018-01-21 16:23:15 +01:00
commit 647296ce63
No known key found for this signature in database
GPG Key ID: F40E70337AB24C9B
34 changed files with 495 additions and 239 deletions

View File

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

View File

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

View 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,
})
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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=조직은 팀 멤버로 추가할수 없습니다.

View File

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

View File

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

View File

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

View File

@ -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=Организацию нельзя добавить в качестве члена команды.

View File

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

View File

@ -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=组织不能被加入到团队中。

View File

@ -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=組織不能被新增為團隊成員。

View File

@ -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=組織不能被新增為團隊成員。

View File

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

View File

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

View File

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

View File

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

View File

@ -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" .}}

View File

@ -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
View File

@ -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=",