aboutsummaryrefslogtreecommitdiffstats
path: root/modules/git/repo.go
diff options
context:
space:
mode:
Diffstat (limited to 'modules/git/repo.go')
-rw-r--r--modules/git/repo.go169
1 files changed, 14 insertions, 155 deletions
diff --git a/modules/git/repo.go b/modules/git/repo.go
index b19e80cd44..591ef7362b 100644
--- a/modules/git/repo.go
+++ b/modules/git/repo.go
@@ -34,7 +34,7 @@ const prettyLogFormat = `--pretty=format:%H`
// GetAllCommitsCount returns count of all commits in repository
func (repo *Repository) GetAllCommitsCount() (int64, error) {
- return AllCommitsCount(repo.Path, false)
+ return AllCommitsCount(repo.Ctx, repo.Path, false)
}
func (repo *Repository) parsePrettyFormatLogToList(logs []byte) ([]*Commit, error) {
@@ -57,19 +57,19 @@ func (repo *Repository) parsePrettyFormatLogToList(logs []byte) ([]*Commit, erro
}
// IsRepoURLAccessible checks if given repository URL is accessible.
-func IsRepoURLAccessible(url string) bool {
- _, err := NewCommand("ls-remote", "-q", "-h", url, "HEAD").Run()
+func IsRepoURLAccessible(ctx context.Context, url string) bool {
+ _, err := NewCommandContext(ctx, "ls-remote", "-q", "-h", url, "HEAD").Run()
return err == nil
}
// InitRepository initializes a new Git repository.
-func InitRepository(repoPath string, bare bool) error {
+func InitRepository(ctx context.Context, repoPath string, bare bool) error {
err := os.MkdirAll(repoPath, os.ModePerm)
if err != nil {
return err
}
- cmd := NewCommand("init")
+ cmd := NewCommandContext(ctx, "init")
if bare {
cmd.AddArguments("--bare")
}
@@ -80,7 +80,7 @@ func InitRepository(repoPath string, bare bool) error {
// IsEmpty Check if repository is empty.
func (repo *Repository) IsEmpty() (bool, error) {
var errbuf strings.Builder
- if err := NewCommand("log", "-1").RunInDirPipeline(repo.Path, nil, &errbuf); err != nil {
+ if err := NewCommandContext(repo.Ctx, "log", "-1").RunInDirPipeline(repo.Path, nil, &errbuf); err != nil {
if strings.Contains(errbuf.String(), "fatal: bad default revision 'HEAD'") ||
strings.Contains(errbuf.String(), "fatal: your current branch 'master' does not have any commits yet") {
return true, nil
@@ -104,12 +104,7 @@ type CloneRepoOptions struct {
}
// Clone clones original repository to target path.
-func Clone(from, to string, opts CloneRepoOptions) error {
- return CloneWithContext(DefaultContext, from, to, opts)
-}
-
-// CloneWithContext clones original repository to target path.
-func CloneWithContext(ctx context.Context, from, to string, opts CloneRepoOptions) error {
+func Clone(ctx context.Context, from, to string, opts CloneRepoOptions) error {
cargs := make([]string, len(GlobalCommandArgs))
copy(cargs, GlobalCommandArgs)
return CloneWithArgs(ctx, from, to, cargs, opts)
@@ -171,35 +166,6 @@ func CloneWithArgs(ctx context.Context, from, to string, args []string, opts Clo
return nil
}
-// PullRemoteOptions options when pull from remote
-type PullRemoteOptions struct {
- Timeout time.Duration
- All bool
- Rebase bool
- Remote string
- Branch string
-}
-
-// Pull pulls changes from remotes.
-func Pull(repoPath string, opts PullRemoteOptions) error {
- cmd := NewCommand("pull")
- if opts.Rebase {
- cmd.AddArguments("--rebase")
- }
- if opts.All {
- cmd.AddArguments("--all")
- } else {
- cmd.AddArguments("--", opts.Remote, opts.Branch)
- }
-
- if opts.Timeout <= 0 {
- opts.Timeout = -1
- }
-
- _, err := cmd.RunInDirTimeout(opts.Timeout, repoPath)
- return err
-}
-
// PushOptions options when push to remote
type PushOptions struct {
Remote string
@@ -262,116 +228,9 @@ func Push(ctx context.Context, repoPath string, opts PushOptions) error {
return err
}
-// CheckoutOptions options when heck out some branch
-type CheckoutOptions struct {
- Timeout time.Duration
- Branch string
- OldBranch string
-}
-
-// Checkout checkouts a branch
-func Checkout(repoPath string, opts CheckoutOptions) error {
- cmd := NewCommand("checkout")
- if len(opts.OldBranch) > 0 {
- cmd.AddArguments("-b")
- }
-
- if opts.Timeout <= 0 {
- opts.Timeout = -1
- }
-
- cmd.AddArguments(opts.Branch)
-
- if len(opts.OldBranch) > 0 {
- cmd.AddArguments(opts.OldBranch)
- }
-
- _, err := cmd.RunInDirTimeout(opts.Timeout, repoPath)
- return err
-}
-
-// ResetHEAD resets HEAD to given revision or head of branch.
-func ResetHEAD(repoPath string, hard bool, revision string) error {
- cmd := NewCommand("reset")
- if hard {
- cmd.AddArguments("--hard")
- }
- _, err := cmd.AddArguments(revision).RunInDir(repoPath)
- return err
-}
-
-// MoveFile moves a file to another file or directory.
-func MoveFile(repoPath, oldTreeName, newTreeName string) error {
- _, err := NewCommand("mv").AddArguments(oldTreeName, newTreeName).RunInDir(repoPath)
- return err
-}
-
-// CountObject represents repository count objects report
-type CountObject struct {
- Count int64
- Size int64
- InPack int64
- Packs int64
- SizePack int64
- PrunePack int64
- Garbage int64
- SizeGarbage int64
-}
-
-const (
- statCount = "count: "
- statSize = "size: "
- statInpack = "in-pack: "
- statPacks = "packs: "
- statSizePack = "size-pack: "
- statPrunePackage = "prune-package: "
- statGarbage = "garbage: "
- statSizeGarbage = "size-garbage: "
-)
-
-// CountObjects returns the results of git count-objects on the repoPath
-func CountObjects(repoPath string) (*CountObject, error) {
- cmd := NewCommand("count-objects", "-v")
- stdout, err := cmd.RunInDir(repoPath)
- if err != nil {
- return nil, err
- }
-
- return parseSize(stdout), nil
-}
-
-// parseSize parses the output from count-objects and return a CountObject
-func parseSize(objects string) *CountObject {
- repoSize := new(CountObject)
- for _, line := range strings.Split(objects, "\n") {
- switch {
- case strings.HasPrefix(line, statCount):
- repoSize.Count, _ = strconv.ParseInt(line[7:], 10, 64)
- case strings.HasPrefix(line, statSize):
- repoSize.Size, _ = strconv.ParseInt(line[6:], 10, 64)
- repoSize.Size *= 1024
- case strings.HasPrefix(line, statInpack):
- repoSize.InPack, _ = strconv.ParseInt(line[9:], 10, 64)
- case strings.HasPrefix(line, statPacks):
- repoSize.Packs, _ = strconv.ParseInt(line[7:], 10, 64)
- case strings.HasPrefix(line, statSizePack):
- repoSize.Count, _ = strconv.ParseInt(line[11:], 10, 64)
- repoSize.Count *= 1024
- case strings.HasPrefix(line, statPrunePackage):
- repoSize.PrunePack, _ = strconv.ParseInt(line[16:], 10, 64)
- case strings.HasPrefix(line, statGarbage):
- repoSize.Garbage, _ = strconv.ParseInt(line[9:], 10, 64)
- case strings.HasPrefix(line, statSizeGarbage):
- repoSize.SizeGarbage, _ = strconv.ParseInt(line[14:], 10, 64)
- repoSize.SizeGarbage *= 1024
- }
- }
- return repoSize
-}
-
// GetLatestCommitTime returns time for latest commit in repository (across all branches)
-func GetLatestCommitTime(repoPath string) (time.Time, error) {
- cmd := NewCommand("for-each-ref", "--sort=-committerdate", BranchPrefix, "--count", "1", "--format=%(committerdate)")
+func GetLatestCommitTime(ctx context.Context, repoPath string) (time.Time, error) {
+ cmd := NewCommandContext(ctx, "for-each-ref", "--sort=-committerdate", BranchPrefix, "--count", "1", "--format=%(committerdate)")
stdout, err := cmd.RunInDir(repoPath)
if err != nil {
return time.Time{}, err
@@ -386,9 +245,9 @@ type DivergeObject struct {
Behind int
}
-func checkDivergence(repoPath, baseBranch, targetBranch string) (int, error) {
+func checkDivergence(ctx context.Context, repoPath, baseBranch, targetBranch string) (int, error) {
branches := fmt.Sprintf("%s..%s", baseBranch, targetBranch)
- cmd := NewCommand("rev-list", "--count", branches)
+ cmd := NewCommandContext(ctx, "rev-list", "--count", branches)
stdout, err := cmd.RunInDir(repoPath)
if err != nil {
return -1, err
@@ -401,15 +260,15 @@ func checkDivergence(repoPath, baseBranch, targetBranch string) (int, error) {
}
// GetDivergingCommits returns the number of commits a targetBranch is ahead or behind a baseBranch
-func GetDivergingCommits(repoPath, baseBranch, targetBranch string) (DivergeObject, error) {
+func GetDivergingCommits(ctx context.Context, repoPath, baseBranch, targetBranch string) (DivergeObject, error) {
// $(git rev-list --count master..feature) commits ahead of master
- ahead, errorAhead := checkDivergence(repoPath, baseBranch, targetBranch)
+ ahead, errorAhead := checkDivergence(ctx, repoPath, baseBranch, targetBranch)
if errorAhead != nil {
return DivergeObject{}, errorAhead
}
// $(git rev-list --count feature..master) commits behind master
- behind, errorBehind := checkDivergence(repoPath, targetBranch, baseBranch)
+ behind, errorBehind := checkDivergence(ctx, repoPath, targetBranch, baseBranch)
if errorBehind != nil {
return DivergeObject{}, errorBehind
}