summaryrefslogtreecommitdiffstats
path: root/modules/gitrepo
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--modules/gitrepo/branch.go49
-rw-r--r--modules/gitrepo/gitrepo.go103
-rw-r--r--modules/gitrepo/walk.go15
3 files changed, 167 insertions, 0 deletions
diff --git a/modules/gitrepo/branch.go b/modules/gitrepo/branch.go
new file mode 100644
index 0000000..e13a4c8
--- /dev/null
+++ b/modules/gitrepo/branch.go
@@ -0,0 +1,49 @@
+// Copyright 2024 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package gitrepo
+
+import (
+ "context"
+
+ "code.gitea.io/gitea/modules/git"
+)
+
+// GetBranchesByPath returns a branch by its path
+// if limit = 0 it will not limit
+func GetBranchesByPath(ctx context.Context, repo Repository, skip, limit int) ([]*git.Branch, int, error) {
+ gitRepo, err := OpenRepository(ctx, repo)
+ if err != nil {
+ return nil, 0, err
+ }
+ defer gitRepo.Close()
+
+ return gitRepo.GetBranches(skip, limit)
+}
+
+func GetBranchCommitID(ctx context.Context, repo Repository, branch string) (string, error) {
+ gitRepo, err := OpenRepository(ctx, repo)
+ if err != nil {
+ return "", err
+ }
+ defer gitRepo.Close()
+
+ return gitRepo.GetBranchCommitID(branch)
+}
+
+// SetDefaultBranch sets default branch of repository.
+func SetDefaultBranch(ctx context.Context, repo Repository, name string) error {
+ _, _, err := git.NewCommand(ctx, "symbolic-ref", "HEAD").
+ AddDynamicArguments(git.BranchPrefix + name).
+ RunStdString(&git.RunOpts{Dir: repoPath(repo)})
+ return err
+}
+
+// GetDefaultBranch gets default branch of repository.
+func GetDefaultBranch(ctx context.Context, repo Repository) (string, error) {
+ return git.GetDefaultBranch(ctx, repoPath(repo))
+}
+
+func GetWikiDefaultBranch(ctx context.Context, repo Repository) (string, error) {
+ return git.GetDefaultBranch(ctx, wikiPath(repo))
+}
diff --git a/modules/gitrepo/gitrepo.go b/modules/gitrepo/gitrepo.go
new file mode 100644
index 0000000..d89f8f9
--- /dev/null
+++ b/modules/gitrepo/gitrepo.go
@@ -0,0 +1,103 @@
+// Copyright 2024 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package gitrepo
+
+import (
+ "context"
+ "io"
+ "path/filepath"
+ "strings"
+
+ "code.gitea.io/gitea/modules/git"
+ "code.gitea.io/gitea/modules/setting"
+)
+
+type Repository interface {
+ GetName() string
+ GetOwnerName() string
+}
+
+func repoPath(repo Repository) string {
+ return filepath.Join(setting.RepoRootPath, strings.ToLower(repo.GetOwnerName()), strings.ToLower(repo.GetName())+".git")
+}
+
+func wikiPath(repo Repository) string {
+ return filepath.Join(setting.RepoRootPath, strings.ToLower(repo.GetOwnerName()), strings.ToLower(repo.GetName())+".wiki.git")
+}
+
+// OpenRepository opens the repository at the given relative path with the provided context.
+func OpenRepository(ctx context.Context, repo Repository) (*git.Repository, error) {
+ return git.OpenRepository(ctx, repoPath(repo))
+}
+
+func OpenWikiRepository(ctx context.Context, repo Repository) (*git.Repository, error) {
+ return git.OpenRepository(ctx, wikiPath(repo))
+}
+
+// contextKey is a value for use with context.WithValue.
+type contextKey struct {
+ name string
+}
+
+// RepositoryContextKey is a context key. It is used with context.Value() to get the current Repository for the context
+var RepositoryContextKey = &contextKey{"repository"}
+
+// RepositoryFromContext attempts to get the repository from the context
+func repositoryFromContext(ctx context.Context, repo Repository) *git.Repository {
+ value := ctx.Value(RepositoryContextKey)
+ if value == nil {
+ return nil
+ }
+
+ if gitRepo, ok := value.(*git.Repository); ok && gitRepo != nil {
+ if gitRepo.Path == repoPath(repo) {
+ return gitRepo
+ }
+ }
+
+ return nil
+}
+
+type nopCloser func()
+
+func (nopCloser) Close() error { return nil }
+
+// RepositoryFromContextOrOpen attempts to get the repository from the context or just opens it
+func RepositoryFromContextOrOpen(ctx context.Context, repo Repository) (*git.Repository, io.Closer, error) {
+ gitRepo := repositoryFromContext(ctx, repo)
+ if gitRepo != nil {
+ return gitRepo, nopCloser(nil), nil
+ }
+
+ gitRepo, err := OpenRepository(ctx, repo)
+ return gitRepo, gitRepo, err
+}
+
+// repositoryFromContextPath attempts to get the repository from the context
+func repositoryFromContextPath(ctx context.Context, path string) *git.Repository {
+ value := ctx.Value(RepositoryContextKey)
+ if value == nil {
+ return nil
+ }
+
+ if repo, ok := value.(*git.Repository); ok && repo != nil {
+ if repo.Path == path {
+ return repo
+ }
+ }
+
+ return nil
+}
+
+// RepositoryFromContextOrOpenPath attempts to get the repository from the context or just opens it
+// Deprecated: Use RepositoryFromContextOrOpen instead
+func RepositoryFromContextOrOpenPath(ctx context.Context, path string) (*git.Repository, io.Closer, error) {
+ gitRepo := repositoryFromContextPath(ctx, path)
+ if gitRepo != nil {
+ return gitRepo, nopCloser(nil), nil
+ }
+
+ gitRepo, err := git.OpenRepository(ctx, path)
+ return gitRepo, gitRepo, err
+}
diff --git a/modules/gitrepo/walk.go b/modules/gitrepo/walk.go
new file mode 100644
index 0000000..8c672ea
--- /dev/null
+++ b/modules/gitrepo/walk.go
@@ -0,0 +1,15 @@
+// Copyright 2024 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package gitrepo
+
+import (
+ "context"
+
+ "code.gitea.io/gitea/modules/git"
+)
+
+// WalkReferences walks all the references from the repository
+func WalkReferences(ctx context.Context, repo Repository, walkfn func(sha1, refname string) error) (int, error) {
+ return git.WalkShowRef(ctx, repoPath(repo), nil, 0, 0, walkfn)
+}