diff options
Diffstat (limited to 'modules/git/repo.go')
-rw-r--r-- | modules/git/repo.go | 169 |
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 } |