mirror of
https://github.com/go-gitea/gitea.git
synced 2026-07-21 22:05:17 +02:00
before: gitrepo vs git packages after: git package fully handle all git operations by the way, use `WithRepo(repo)` instead of `WithDir(repo.Path)` to hide path details. benefits: 1. remove all unnecessary wrappers, developers no need to struggle with "which package should be used" 2. simplify code, RepositoryFacade can (will) be used everywhere, all "path" details are (will be) hidden
96 lines
2.9 KiB
Go
96 lines
2.9 KiB
Go
// Copyright 2024 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package git
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"strings"
|
|
|
|
"gitea.dev/modules/git/gitcmd"
|
|
)
|
|
|
|
// GetBranchesByPath returns a branch by its path
|
|
// if limit = 0 it will not limit
|
|
func GetBranchesByPath(ctx context.Context, repo RepositoryFacade, skip, limit int) ([]string, int, error) {
|
|
gitRepo, err := OpenRepository(repo)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
defer gitRepo.Close()
|
|
|
|
return gitRepo.GetBranchNames(ctx, skip, limit)
|
|
}
|
|
|
|
func GetBranchCommitID(ctx context.Context, repo RepositoryFacade, branch string) (string, error) {
|
|
gitRepo, err := OpenRepository(repo)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer gitRepo.Close()
|
|
|
|
return gitRepo.GetBranchCommitID(ctx, branch)
|
|
}
|
|
|
|
// SetDefaultBranch sets default branch of repository.
|
|
func SetDefaultBranch(ctx context.Context, repo RepositoryFacade, name string) error {
|
|
_, _, err := gitcmd.NewCommand("symbolic-ref", "HEAD").
|
|
AddDynamicArguments(BranchPrefix + name).WithRepo(repo).RunStdString(ctx)
|
|
return err
|
|
}
|
|
|
|
// GetDefaultBranch gets default branch of repository.
|
|
func GetDefaultBranch(ctx context.Context, repo RepositoryFacade) (string, error) {
|
|
stdout, _, err := gitcmd.NewCommand("symbolic-ref", "HEAD").WithRepo(repo).RunStdString(ctx)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
stdout = strings.TrimSpace(stdout)
|
|
if !strings.HasPrefix(stdout, BranchPrefix) {
|
|
return "", errors.New("the HEAD is not a branch: " + stdout)
|
|
}
|
|
return strings.TrimPrefix(stdout, BranchPrefix), nil
|
|
}
|
|
|
|
// IsReferenceExist returns true if given reference exists in the repository.
|
|
func IsReferenceExist(ctx context.Context, repo RepositoryFacade, name string) bool {
|
|
_, _, err := gitcmd.NewCommand("show-ref", "--verify").AddDashesAndList(name).WithRepo(repo).RunStdString(ctx)
|
|
return err == nil
|
|
}
|
|
|
|
// IsBranchExist returns true if given branch exists in the repository.
|
|
func IsBranchExist(ctx context.Context, repo RepositoryFacade, name string) bool {
|
|
return IsReferenceExist(ctx, repo, BranchPrefix+name)
|
|
}
|
|
|
|
// DeleteBranch delete a branch by name on repository.
|
|
func DeleteBranch(ctx context.Context, repo RepositoryFacade, name string, force bool) error {
|
|
cmd := gitcmd.NewCommand("branch")
|
|
|
|
if force {
|
|
cmd.AddArguments("-D")
|
|
} else {
|
|
cmd.AddArguments("-d")
|
|
}
|
|
|
|
cmd.AddDashesAndList(name)
|
|
_, _, err := cmd.WithRepo(repo).RunStdString(ctx)
|
|
return err
|
|
}
|
|
|
|
// CreateBranch create a new branch
|
|
func CreateBranch(ctx context.Context, repo RepositoryFacade, branch, oldbranchOrCommit string) error {
|
|
cmd := gitcmd.NewCommand("branch")
|
|
cmd.AddDashesAndList(branch, oldbranchOrCommit)
|
|
|
|
_, _, err := cmd.WithRepo(repo).RunStdString(ctx)
|
|
return err
|
|
}
|
|
|
|
// RenameBranch rename a branch
|
|
func RenameBranch(ctx context.Context, repo RepositoryFacade, from, to string) error {
|
|
_, _, err := gitcmd.NewCommand("branch", "-m").AddDynamicArguments(from, to).WithRepo(repo).RunStdString(ctx)
|
|
return err
|
|
}
|