mirror of https://github.com/go-gitea/gitea
Move repofiles from modules/repofiles to services/repository/files (#17774)
* Move repofiles from modules to services * rename services/repository/repofiles -> services/repository/files * Fix test Co-authored-by: 6543 <6543@obermui.de>pull/17724/head^2
parent
754fdd8f9c
commit
c97d66d23c
@ -1,41 +0,0 @@ |
|||||||
// Copyright 2019 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 repofiles |
|
||||||
|
|
||||||
import ( |
|
||||||
"net/url" |
|
||||||
|
|
||||||
"code.gitea.io/gitea/models" |
|
||||||
"code.gitea.io/gitea/modules/git" |
|
||||||
"code.gitea.io/gitea/modules/setting" |
|
||||||
api "code.gitea.io/gitea/modules/structs" |
|
||||||
) |
|
||||||
|
|
||||||
// GetBlobBySHA get the GitBlobResponse of a repository using a sha hash.
|
|
||||||
func GetBlobBySHA(repo *models.Repository, sha string) (*api.GitBlobResponse, error) { |
|
||||||
gitRepo, err := git.OpenRepository(repo.RepoPath()) |
|
||||||
if err != nil { |
|
||||||
return nil, err |
|
||||||
} |
|
||||||
defer gitRepo.Close() |
|
||||||
gitBlob, err := gitRepo.GetBlob(sha) |
|
||||||
if err != nil { |
|
||||||
return nil, err |
|
||||||
} |
|
||||||
content := "" |
|
||||||
if gitBlob.Size() <= setting.API.DefaultMaxBlobSize { |
|
||||||
content, err = gitBlob.GetBlobContentBase64() |
|
||||||
if err != nil { |
|
||||||
return nil, err |
|
||||||
} |
|
||||||
} |
|
||||||
return &api.GitBlobResponse{ |
|
||||||
SHA: gitBlob.ID.String(), |
|
||||||
URL: repo.APIURL() + "/git/blobs/" + url.PathEscape(gitBlob.ID.String()), |
|
||||||
Size: gitBlob.Size(), |
|
||||||
Encoding: "base64", |
|
||||||
Content: content, |
|
||||||
}, nil |
|
||||||
} |
|
@ -1,40 +0,0 @@ |
|||||||
// Copyright 2019 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 repofiles |
|
||||||
|
|
||||||
import ( |
|
||||||
"testing" |
|
||||||
|
|
||||||
"code.gitea.io/gitea/models/unittest" |
|
||||||
api "code.gitea.io/gitea/modules/structs" |
|
||||||
"code.gitea.io/gitea/modules/test" |
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert" |
|
||||||
) |
|
||||||
|
|
||||||
func TestGetBlobBySHA(t *testing.T) { |
|
||||||
unittest.PrepareTestEnv(t) |
|
||||||
ctx := test.MockContext(t, "user2/repo1") |
|
||||||
test.LoadRepo(t, ctx, 1) |
|
||||||
test.LoadRepoCommit(t, ctx) |
|
||||||
test.LoadUser(t, ctx, 2) |
|
||||||
test.LoadGitRepo(t, ctx) |
|
||||||
defer ctx.Repo.GitRepo.Close() |
|
||||||
|
|
||||||
sha := "65f1bf27bc3bf70f64657658635e66094edbcb4d" |
|
||||||
ctx.SetParams(":id", "1") |
|
||||||
ctx.SetParams(":sha", sha) |
|
||||||
|
|
||||||
gbr, err := GetBlobBySHA(ctx.Repo.Repository, ctx.Params(":sha")) |
|
||||||
expectedGBR := &api.GitBlobResponse{ |
|
||||||
Content: "dHJlZSAyYTJmMWQ0NjcwNzI4YTJlMTAwNDllMzQ1YmQ3YTI3NjQ2OGJlYWI2CmF1dGhvciB1c2VyMSA8YWRkcmVzczFAZXhhbXBsZS5jb20+IDE0ODk5NTY0NzkgLTA0MDAKY29tbWl0dGVyIEV0aGFuIEtvZW5pZyA8ZXRoYW50a29lbmlnQGdtYWlsLmNvbT4gMTQ4OTk1NjQ3OSAtMDQwMAoKSW5pdGlhbCBjb21taXQK", |
|
||||||
Encoding: "base64", |
|
||||||
URL: "https://try.gitea.io/api/v1/repos/user2/repo1/git/blobs/65f1bf27bc3bf70f64657658635e66094edbcb4d", |
|
||||||
SHA: "65f1bf27bc3bf70f64657658635e66094edbcb4d", |
|
||||||
Size: 180, |
|
||||||
} |
|
||||||
assert.NoError(t, err) |
|
||||||
assert.Equal(t, expectedGBR, gbr) |
|
||||||
} |
|
@ -1,19 +0,0 @@ |
|||||||
// Copyright 2019 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 repofiles |
|
||||||
|
|
||||||
import ( |
|
||||||
"code.gitea.io/gitea/models" |
|
||||||
"code.gitea.io/gitea/modules/git" |
|
||||||
) |
|
||||||
|
|
||||||
// CountDivergingCommits determines how many commits a branch is ahead or behind the repository's base branch
|
|
||||||
func CountDivergingCommits(repo *models.Repository, branch string) (*git.DivergeObject, error) { |
|
||||||
divergence, err := git.GetDivergingCommits(repo.RepoPath(), repo.DefaultBranch, branch) |
|
||||||
if err != nil { |
|
||||||
return nil, err |
|
||||||
} |
|
||||||
return &divergence, nil |
|
||||||
} |
|
@ -1,41 +0,0 @@ |
|||||||
// Copyright 2019 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 repofiles |
|
||||||
|
|
||||||
import ( |
|
||||||
"fmt" |
|
||||||
|
|
||||||
"code.gitea.io/gitea/models" |
|
||||||
"code.gitea.io/gitea/modules/git" |
|
||||||
) |
|
||||||
|
|
||||||
// CreateCommitStatus creates a new CommitStatus given a bunch of parameters
|
|
||||||
// NOTE: All text-values will be trimmed from whitespaces.
|
|
||||||
// Requires: Repo, Creator, SHA
|
|
||||||
func CreateCommitStatus(repo *models.Repository, creator *models.User, sha string, status *models.CommitStatus) error { |
|
||||||
repoPath := repo.RepoPath() |
|
||||||
|
|
||||||
// confirm that commit is exist
|
|
||||||
gitRepo, err := git.OpenRepository(repoPath) |
|
||||||
if err != nil { |
|
||||||
return fmt.Errorf("OpenRepository[%s]: %v", repoPath, err) |
|
||||||
} |
|
||||||
if _, err := gitRepo.GetCommit(sha); err != nil { |
|
||||||
gitRepo.Close() |
|
||||||
return fmt.Errorf("GetCommit[%s]: %v", sha, err) |
|
||||||
} |
|
||||||
gitRepo.Close() |
|
||||||
|
|
||||||
if err := models.NewCommitStatus(models.NewCommitStatusOptions{ |
|
||||||
Repo: repo, |
|
||||||
Creator: creator, |
|
||||||
SHA: sha, |
|
||||||
CommitStatus: status, |
|
||||||
}); err != nil { |
|
||||||
return fmt.Errorf("NewCommitStatus[repo_id: %d, user_id: %d, sha: %s]: %v", repo.ID, creator.ID, sha, err) |
|
||||||
} |
|
||||||
|
|
||||||
return nil |
|
||||||
} |
|
@ -1,23 +0,0 @@ |
|||||||
// Copyright 2019 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 repofiles
|
|
||||||
|
|
||||||
package repofiles |
|
||||||
|
|
||||||
import ( |
|
||||||
"path" |
|
||||||
"strings" |
|
||||||
) |
|
||||||
|
|
||||||
// CleanUploadFileName Trims a filename and returns empty string if it is a .git directory
|
|
||||||
func CleanUploadFileName(name string) string { |
|
||||||
// Rebase the filename
|
|
||||||
name = strings.Trim(path.Clean("/"+name), " /") |
|
||||||
// Git disallows any filenames to have a .git directory in them.
|
|
||||||
for _, part := range strings.Split(name, "/") { |
|
||||||
if strings.ToLower(part) == ".git" { |
|
||||||
return "" |
|
||||||
} |
|
||||||
} |
|
||||||
return name |
|
||||||
} |
|
@ -1,27 +0,0 @@ |
|||||||
// Copyright 2019 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 repofiles |
|
||||||
|
|
||||||
import ( |
|
||||||
"testing" |
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert" |
|
||||||
) |
|
||||||
|
|
||||||
func TestCleanUploadFileName(t *testing.T) { |
|
||||||
t.Run("Clean regular file", func(t *testing.T) { |
|
||||||
name := "this/is/test" |
|
||||||
cleanName := CleanUploadFileName(name) |
|
||||||
expectedCleanName := name |
|
||||||
assert.EqualValues(t, expectedCleanName, cleanName) |
|
||||||
}) |
|
||||||
|
|
||||||
t.Run("Clean a .git path", func(t *testing.T) { |
|
||||||
name := "this/is/test/.git" |
|
||||||
cleanName := CleanUploadFileName(name) |
|
||||||
expectedCleanName := "" |
|
||||||
assert.EqualValues(t, expectedCleanName, cleanName) |
|
||||||
}) |
|
||||||
} |
|
@ -1,33 +0,0 @@ |
|||||||
// Copyright 2019 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 repofiles |
|
||||||
|
|
||||||
import ( |
|
||||||
"code.gitea.io/gitea/models" |
|
||||||
"code.gitea.io/gitea/modules/git" |
|
||||||
"code.gitea.io/gitea/modules/structs" |
|
||||||
) |
|
||||||
|
|
||||||
// GetPayloadCommitVerification returns the verification information of a commit
|
|
||||||
func GetPayloadCommitVerification(commit *git.Commit) *structs.PayloadCommitVerification { |
|
||||||
verification := &structs.PayloadCommitVerification{} |
|
||||||
commitVerification := models.ParseCommitWithSignature(commit) |
|
||||||
if commit.Signature != nil { |
|
||||||
verification.Signature = commit.Signature.Signature |
|
||||||
verification.Payload = commit.Signature.Payload |
|
||||||
} |
|
||||||
if commitVerification.SigningUser != nil { |
|
||||||
verification.Signer = &structs.PayloadUser{ |
|
||||||
Name: commitVerification.SigningUser.Name, |
|
||||||
Email: commitVerification.SigningUser.Email, |
|
||||||
} |
|
||||||
} |
|
||||||
verification.Verified = commitVerification.Verified |
|
||||||
verification.Reason = commitVerification.Reason |
|
||||||
if verification.Reason == "" && !verification.Verified { |
|
||||||
verification.Reason = "gpg.error.not_signed_commit" |
|
||||||
} |
|
||||||
return verification |
|
||||||
} |
|
@ -1,26 +0,0 @@ |
|||||||
// Copyright 2020 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 repository |
|
||||||
|
|
||||||
import ( |
|
||||||
"fmt" |
|
||||||
|
|
||||||
"code.gitea.io/gitea/models" |
|
||||||
"code.gitea.io/gitea/modules/git" |
|
||||||
) |
|
||||||
|
|
||||||
// GetBranch returns a branch by its name
|
|
||||||
func GetBranch(repo *models.Repository, branch string) (*git.Branch, error) { |
|
||||||
if len(branch) == 0 { |
|
||||||
return nil, fmt.Errorf("GetBranch: empty string for branch") |
|
||||||
} |
|
||||||
gitRepo, err := git.OpenRepository(repo.RepoPath()) |
|
||||||
if err != nil { |
|
||||||
return nil, err |
|
||||||
} |
|
||||||
defer gitRepo.Close() |
|
||||||
|
|
||||||
return gitRepo.GetBranch(branch) |
|
||||||
} |
|
@ -0,0 +1,73 @@ |
|||||||
|
// Copyright 2019 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 files |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
|
||||||
|
"code.gitea.io/gitea/models" |
||||||
|
"code.gitea.io/gitea/modules/git" |
||||||
|
"code.gitea.io/gitea/modules/structs" |
||||||
|
) |
||||||
|
|
||||||
|
// CreateCommitStatus creates a new CommitStatus given a bunch of parameters
|
||||||
|
// NOTE: All text-values will be trimmed from whitespaces.
|
||||||
|
// Requires: Repo, Creator, SHA
|
||||||
|
func CreateCommitStatus(repo *models.Repository, creator *models.User, sha string, status *models.CommitStatus) error { |
||||||
|
repoPath := repo.RepoPath() |
||||||
|
|
||||||
|
// confirm that commit is exist
|
||||||
|
gitRepo, err := git.OpenRepository(repoPath) |
||||||
|
if err != nil { |
||||||
|
return fmt.Errorf("OpenRepository[%s]: %v", repoPath, err) |
||||||
|
} |
||||||
|
if _, err := gitRepo.GetCommit(sha); err != nil { |
||||||
|
gitRepo.Close() |
||||||
|
return fmt.Errorf("GetCommit[%s]: %v", sha, err) |
||||||
|
} |
||||||
|
gitRepo.Close() |
||||||
|
|
||||||
|
if err := models.NewCommitStatus(models.NewCommitStatusOptions{ |
||||||
|
Repo: repo, |
||||||
|
Creator: creator, |
||||||
|
SHA: sha, |
||||||
|
CommitStatus: status, |
||||||
|
}); err != nil { |
||||||
|
return fmt.Errorf("NewCommitStatus[repo_id: %d, user_id: %d, sha: %s]: %v", repo.ID, creator.ID, sha, err) |
||||||
|
} |
||||||
|
|
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
// CountDivergingCommits determines how many commits a branch is ahead or behind the repository's base branch
|
||||||
|
func CountDivergingCommits(repo *models.Repository, branch string) (*git.DivergeObject, error) { |
||||||
|
divergence, err := git.GetDivergingCommits(repo.RepoPath(), repo.DefaultBranch, branch) |
||||||
|
if err != nil { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
return &divergence, nil |
||||||
|
} |
||||||
|
|
||||||
|
// GetPayloadCommitVerification returns the verification information of a commit
|
||||||
|
func GetPayloadCommitVerification(commit *git.Commit) *structs.PayloadCommitVerification { |
||||||
|
verification := &structs.PayloadCommitVerification{} |
||||||
|
commitVerification := models.ParseCommitWithSignature(commit) |
||||||
|
if commit.Signature != nil { |
||||||
|
verification.Signature = commit.Signature.Signature |
||||||
|
verification.Payload = commit.Signature.Payload |
||||||
|
} |
||||||
|
if commitVerification.SigningUser != nil { |
||||||
|
verification.Signer = &structs.PayloadUser{ |
||||||
|
Name: commitVerification.SigningUser.Name, |
||||||
|
Email: commitVerification.SigningUser.Email, |
||||||
|
} |
||||||
|
} |
||||||
|
verification.Verified = commitVerification.Verified |
||||||
|
verification.Reason = commitVerification.Reason |
||||||
|
if verification.Reason == "" && !verification.Verified { |
||||||
|
verification.Reason = "gpg.error.not_signed_commit" |
||||||
|
} |
||||||
|
return verification |
||||||
|
} |
Loading…
Reference in new issue