mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Remove git.Command.Run and git.Command.RunInDir* (#19280)
				
					
				
			Follows #19266, #8553, Close #18553, now there are only three `Run..(&RunOpts{})` functions. * before: `stdout, err := RunInDir(path)` * now: `stdout, _, err := RunStdString(&git.RunOpts{Dir:path})`
This commit is contained in:
		@@ -141,7 +141,7 @@ func rawMerge(ctx context.Context, pr *models.PullRequest, doer *user_model.User
 | 
			
		||||
	stagingBranch := "staging"
 | 
			
		||||
 | 
			
		||||
	if expectedHeadCommitID != "" {
 | 
			
		||||
		trackingCommitID, err := git.NewCommand(ctx, "show-ref", "--hash", git.BranchPrefix+trackingBranch).RunInDir(tmpBasePath)
 | 
			
		||||
		trackingCommitID, _, err := git.NewCommand(ctx, "show-ref", "--hash", git.BranchPrefix+trackingBranch).RunStdString(&git.RunOpts{Dir: tmpBasePath})
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.Error("show-ref[%s] --hash refs/heads/trackingn: %v", tmpBasePath, git.BranchPrefix+trackingBranch, err)
 | 
			
		||||
			return "", fmt.Errorf("getDiffTree: %v", err)
 | 
			
		||||
@@ -188,11 +188,10 @@ func rawMerge(ctx context.Context, pr *models.PullRequest, doer *user_model.User
 | 
			
		||||
 | 
			
		||||
	// Switch off LFS process (set required, clean and smudge here also)
 | 
			
		||||
	if err := gitConfigCommand().AddArguments("filter.lfs.process", "").
 | 
			
		||||
		RunWithContext(&git.RunContext{
 | 
			
		||||
			Timeout: -1,
 | 
			
		||||
			Dir:     tmpBasePath,
 | 
			
		||||
			Stdout:  &outbuf,
 | 
			
		||||
			Stderr:  &errbuf,
 | 
			
		||||
		Run(&git.RunOpts{
 | 
			
		||||
			Dir:    tmpBasePath,
 | 
			
		||||
			Stdout: &outbuf,
 | 
			
		||||
			Stderr: &errbuf,
 | 
			
		||||
		}); err != nil {
 | 
			
		||||
		log.Error("git config [filter.lfs.process -> <> ]: %v\n%s\n%s", err, outbuf.String(), errbuf.String())
 | 
			
		||||
		return "", fmt.Errorf("git config [filter.lfs.process -> <> ]: %v\n%s\n%s", err, outbuf.String(), errbuf.String())
 | 
			
		||||
@@ -201,11 +200,10 @@ func rawMerge(ctx context.Context, pr *models.PullRequest, doer *user_model.User
 | 
			
		||||
	errbuf.Reset()
 | 
			
		||||
 | 
			
		||||
	if err := gitConfigCommand().AddArguments("filter.lfs.required", "false").
 | 
			
		||||
		RunWithContext(&git.RunContext{
 | 
			
		||||
			Timeout: -1,
 | 
			
		||||
			Dir:     tmpBasePath,
 | 
			
		||||
			Stdout:  &outbuf,
 | 
			
		||||
			Stderr:  &errbuf,
 | 
			
		||||
		Run(&git.RunOpts{
 | 
			
		||||
			Dir:    tmpBasePath,
 | 
			
		||||
			Stdout: &outbuf,
 | 
			
		||||
			Stderr: &errbuf,
 | 
			
		||||
		}); err != nil {
 | 
			
		||||
		log.Error("git config [filter.lfs.required -> <false> ]: %v\n%s\n%s", err, outbuf.String(), errbuf.String())
 | 
			
		||||
		return "", fmt.Errorf("git config [filter.lfs.required -> <false> ]: %v\n%s\n%s", err, outbuf.String(), errbuf.String())
 | 
			
		||||
@@ -214,11 +212,10 @@ func rawMerge(ctx context.Context, pr *models.PullRequest, doer *user_model.User
 | 
			
		||||
	errbuf.Reset()
 | 
			
		||||
 | 
			
		||||
	if err := gitConfigCommand().AddArguments("filter.lfs.clean", "").
 | 
			
		||||
		RunWithContext(&git.RunContext{
 | 
			
		||||
			Timeout: -1,
 | 
			
		||||
			Dir:     tmpBasePath,
 | 
			
		||||
			Stdout:  &outbuf,
 | 
			
		||||
			Stderr:  &errbuf,
 | 
			
		||||
		Run(&git.RunOpts{
 | 
			
		||||
			Dir:    tmpBasePath,
 | 
			
		||||
			Stdout: &outbuf,
 | 
			
		||||
			Stderr: &errbuf,
 | 
			
		||||
		}); err != nil {
 | 
			
		||||
		log.Error("git config [filter.lfs.clean -> <> ]: %v\n%s\n%s", err, outbuf.String(), errbuf.String())
 | 
			
		||||
		return "", fmt.Errorf("git config [filter.lfs.clean -> <> ]: %v\n%s\n%s", err, outbuf.String(), errbuf.String())
 | 
			
		||||
@@ -227,11 +224,10 @@ func rawMerge(ctx context.Context, pr *models.PullRequest, doer *user_model.User
 | 
			
		||||
	errbuf.Reset()
 | 
			
		||||
 | 
			
		||||
	if err := gitConfigCommand().AddArguments("filter.lfs.smudge", "").
 | 
			
		||||
		RunWithContext(&git.RunContext{
 | 
			
		||||
			Timeout: -1,
 | 
			
		||||
			Dir:     tmpBasePath,
 | 
			
		||||
			Stdout:  &outbuf,
 | 
			
		||||
			Stderr:  &errbuf,
 | 
			
		||||
		Run(&git.RunOpts{
 | 
			
		||||
			Dir:    tmpBasePath,
 | 
			
		||||
			Stdout: &outbuf,
 | 
			
		||||
			Stderr: &errbuf,
 | 
			
		||||
		}); err != nil {
 | 
			
		||||
		log.Error("git config [filter.lfs.smudge -> <> ]: %v\n%s\n%s", err, outbuf.String(), errbuf.String())
 | 
			
		||||
		return "", fmt.Errorf("git config [filter.lfs.smudge -> <> ]: %v\n%s\n%s", err, outbuf.String(), errbuf.String())
 | 
			
		||||
@@ -240,11 +236,10 @@ func rawMerge(ctx context.Context, pr *models.PullRequest, doer *user_model.User
 | 
			
		||||
	errbuf.Reset()
 | 
			
		||||
 | 
			
		||||
	if err := gitConfigCommand().AddArguments("core.sparseCheckout", "true").
 | 
			
		||||
		RunWithContext(&git.RunContext{
 | 
			
		||||
			Timeout: -1,
 | 
			
		||||
			Dir:     tmpBasePath,
 | 
			
		||||
			Stdout:  &outbuf,
 | 
			
		||||
			Stderr:  &errbuf,
 | 
			
		||||
		Run(&git.RunOpts{
 | 
			
		||||
			Dir:    tmpBasePath,
 | 
			
		||||
			Stdout: &outbuf,
 | 
			
		||||
			Stderr: &errbuf,
 | 
			
		||||
		}); err != nil {
 | 
			
		||||
		log.Error("git config [core.sparseCheckout -> true ]: %v\n%s\n%s", err, outbuf.String(), errbuf.String())
 | 
			
		||||
		return "", fmt.Errorf("git config [core.sparsecheckout -> true]: %v\n%s\n%s", err, outbuf.String(), errbuf.String())
 | 
			
		||||
@@ -254,11 +249,10 @@ func rawMerge(ctx context.Context, pr *models.PullRequest, doer *user_model.User
 | 
			
		||||
 | 
			
		||||
	// Read base branch index
 | 
			
		||||
	if err := git.NewCommand(ctx, "read-tree", "HEAD").
 | 
			
		||||
		RunWithContext(&git.RunContext{
 | 
			
		||||
			Timeout: -1,
 | 
			
		||||
			Dir:     tmpBasePath,
 | 
			
		||||
			Stdout:  &outbuf,
 | 
			
		||||
			Stderr:  &errbuf,
 | 
			
		||||
		Run(&git.RunOpts{
 | 
			
		||||
			Dir:    tmpBasePath,
 | 
			
		||||
			Stdout: &outbuf,
 | 
			
		||||
			Stderr: &errbuf,
 | 
			
		||||
		}); err != nil {
 | 
			
		||||
		log.Error("git read-tree HEAD: %v\n%s\n%s", err, outbuf.String(), errbuf.String())
 | 
			
		||||
		return "", fmt.Errorf("Unable to read base branch in to the index: %v\n%s\n%s", err, outbuf.String(), errbuf.String())
 | 
			
		||||
@@ -315,11 +309,10 @@ func rawMerge(ctx context.Context, pr *models.PullRequest, doer *user_model.User
 | 
			
		||||
	case repo_model.MergeStyleRebaseMerge:
 | 
			
		||||
		// Checkout head branch
 | 
			
		||||
		if err := git.NewCommand(ctx, "checkout", "-b", stagingBranch, trackingBranch).
 | 
			
		||||
			RunWithContext(&git.RunContext{
 | 
			
		||||
				Timeout: -1,
 | 
			
		||||
				Dir:     tmpBasePath,
 | 
			
		||||
				Stdout:  &outbuf,
 | 
			
		||||
				Stderr:  &errbuf,
 | 
			
		||||
			Run(&git.RunOpts{
 | 
			
		||||
				Dir:    tmpBasePath,
 | 
			
		||||
				Stdout: &outbuf,
 | 
			
		||||
				Stderr: &errbuf,
 | 
			
		||||
			}); err != nil {
 | 
			
		||||
			log.Error("git checkout base prior to merge post staging rebase [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String())
 | 
			
		||||
			return "", fmt.Errorf("git checkout base prior to merge post staging rebase  [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String())
 | 
			
		||||
@@ -329,11 +322,10 @@ func rawMerge(ctx context.Context, pr *models.PullRequest, doer *user_model.User
 | 
			
		||||
 | 
			
		||||
		// Rebase before merging
 | 
			
		||||
		if err := git.NewCommand(ctx, "rebase", baseBranch).
 | 
			
		||||
			RunWithContext(&git.RunContext{
 | 
			
		||||
				Timeout: -1,
 | 
			
		||||
				Dir:     tmpBasePath,
 | 
			
		||||
				Stdout:  &outbuf,
 | 
			
		||||
				Stderr:  &errbuf,
 | 
			
		||||
			Run(&git.RunOpts{
 | 
			
		||||
				Dir:    tmpBasePath,
 | 
			
		||||
				Stdout: &outbuf,
 | 
			
		||||
				Stderr: &errbuf,
 | 
			
		||||
			}); err != nil {
 | 
			
		||||
			// Rebase will leave a REBASE_HEAD file in .git if there is a conflict
 | 
			
		||||
			if _, statErr := os.Stat(filepath.Join(tmpBasePath, ".git", "REBASE_HEAD")); statErr == nil {
 | 
			
		||||
@@ -383,11 +375,10 @@ func rawMerge(ctx context.Context, pr *models.PullRequest, doer *user_model.User
 | 
			
		||||
 | 
			
		||||
		// Checkout base branch again
 | 
			
		||||
		if err := git.NewCommand(ctx, "checkout", baseBranch).
 | 
			
		||||
			RunWithContext(&git.RunContext{
 | 
			
		||||
				Timeout: -1,
 | 
			
		||||
				Dir:     tmpBasePath,
 | 
			
		||||
				Stdout:  &outbuf,
 | 
			
		||||
				Stderr:  &errbuf,
 | 
			
		||||
			Run(&git.RunOpts{
 | 
			
		||||
				Dir:    tmpBasePath,
 | 
			
		||||
				Stdout: &outbuf,
 | 
			
		||||
				Stderr: &errbuf,
 | 
			
		||||
			}); err != nil {
 | 
			
		||||
			log.Error("git checkout base prior to merge post staging rebase [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String())
 | 
			
		||||
			return "", fmt.Errorf("git checkout base prior to merge post staging rebase  [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String())
 | 
			
		||||
@@ -429,12 +420,11 @@ func rawMerge(ctx context.Context, pr *models.PullRequest, doer *user_model.User
 | 
			
		||||
		sig := pr.Issue.Poster.NewGitSig()
 | 
			
		||||
		if signArg == "" {
 | 
			
		||||
			if err := git.NewCommand(ctx, "commit", fmt.Sprintf("--author='%s <%s>'", sig.Name, sig.Email), "-m", message).
 | 
			
		||||
				RunWithContext(&git.RunContext{
 | 
			
		||||
					Env:     env,
 | 
			
		||||
					Timeout: -1,
 | 
			
		||||
					Dir:     tmpBasePath,
 | 
			
		||||
					Stdout:  &outbuf,
 | 
			
		||||
					Stderr:  &errbuf,
 | 
			
		||||
				Run(&git.RunOpts{
 | 
			
		||||
					Env:    env,
 | 
			
		||||
					Dir:    tmpBasePath,
 | 
			
		||||
					Stdout: &outbuf,
 | 
			
		||||
					Stderr: &errbuf,
 | 
			
		||||
				}); err != nil {
 | 
			
		||||
				log.Error("git commit [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String())
 | 
			
		||||
				return "", fmt.Errorf("git commit [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String())
 | 
			
		||||
@@ -445,12 +435,11 @@ func rawMerge(ctx context.Context, pr *models.PullRequest, doer *user_model.User
 | 
			
		||||
				message += fmt.Sprintf("\nCo-authored-by: %s\nCo-committed-by: %s\n", sig.String(), sig.String())
 | 
			
		||||
			}
 | 
			
		||||
			if err := git.NewCommand(ctx, "commit", signArg, fmt.Sprintf("--author='%s <%s>'", sig.Name, sig.Email), "-m", message).
 | 
			
		||||
				RunWithContext(&git.RunContext{
 | 
			
		||||
					Env:     env,
 | 
			
		||||
					Timeout: -1,
 | 
			
		||||
					Dir:     tmpBasePath,
 | 
			
		||||
					Stdout:  &outbuf,
 | 
			
		||||
					Stderr:  &errbuf,
 | 
			
		||||
				Run(&git.RunOpts{
 | 
			
		||||
					Env:    env,
 | 
			
		||||
					Dir:    tmpBasePath,
 | 
			
		||||
					Stdout: &outbuf,
 | 
			
		||||
					Stderr: &errbuf,
 | 
			
		||||
				}); err != nil {
 | 
			
		||||
				log.Error("git commit [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String())
 | 
			
		||||
				return "", fmt.Errorf("git commit [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String())
 | 
			
		||||
@@ -515,12 +504,11 @@ func rawMerge(ctx context.Context, pr *models.PullRequest, doer *user_model.User
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Push back to upstream.
 | 
			
		||||
	if err := pushCmd.RunWithContext(&git.RunContext{
 | 
			
		||||
		Env:     env,
 | 
			
		||||
		Timeout: -1,
 | 
			
		||||
		Dir:     tmpBasePath,
 | 
			
		||||
		Stdout:  &outbuf,
 | 
			
		||||
		Stderr:  &errbuf,
 | 
			
		||||
	if err := pushCmd.Run(&git.RunOpts{
 | 
			
		||||
		Env:    env,
 | 
			
		||||
		Dir:    tmpBasePath,
 | 
			
		||||
		Stdout: &outbuf,
 | 
			
		||||
		Stderr: &errbuf,
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		if strings.Contains(errbuf.String(), "non-fast-forward") {
 | 
			
		||||
			return "", &git.ErrPushOutOfDate{
 | 
			
		||||
@@ -549,24 +537,22 @@ func commitAndSignNoAuthor(ctx context.Context, pr *models.PullRequest, message,
 | 
			
		||||
	var outbuf, errbuf strings.Builder
 | 
			
		||||
	if signArg == "" {
 | 
			
		||||
		if err := git.NewCommand(ctx, "commit", "-m", message).
 | 
			
		||||
			RunWithContext(&git.RunContext{
 | 
			
		||||
				Env:     env,
 | 
			
		||||
				Timeout: -1,
 | 
			
		||||
				Dir:     tmpBasePath,
 | 
			
		||||
				Stdout:  &outbuf,
 | 
			
		||||
				Stderr:  &errbuf,
 | 
			
		||||
			Run(&git.RunOpts{
 | 
			
		||||
				Env:    env,
 | 
			
		||||
				Dir:    tmpBasePath,
 | 
			
		||||
				Stdout: &outbuf,
 | 
			
		||||
				Stderr: &errbuf,
 | 
			
		||||
			}); err != nil {
 | 
			
		||||
			log.Error("git commit [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String())
 | 
			
		||||
			return fmt.Errorf("git commit [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String())
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		if err := git.NewCommand(ctx, "commit", signArg, "-m", message).
 | 
			
		||||
			RunWithContext(&git.RunContext{
 | 
			
		||||
				Env:     env,
 | 
			
		||||
				Timeout: -1,
 | 
			
		||||
				Dir:     tmpBasePath,
 | 
			
		||||
				Stdout:  &outbuf,
 | 
			
		||||
				Stderr:  &errbuf,
 | 
			
		||||
			Run(&git.RunOpts{
 | 
			
		||||
				Env:    env,
 | 
			
		||||
				Dir:    tmpBasePath,
 | 
			
		||||
				Stdout: &outbuf,
 | 
			
		||||
				Stderr: &errbuf,
 | 
			
		||||
			}); err != nil {
 | 
			
		||||
			log.Error("git commit [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String())
 | 
			
		||||
			return fmt.Errorf("git commit [%s:%s -> %s:%s]: %v\n%s\n%s", pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseRepo.FullName(), pr.BaseBranch, err, outbuf.String(), errbuf.String())
 | 
			
		||||
@@ -577,11 +563,10 @@ func commitAndSignNoAuthor(ctx context.Context, pr *models.PullRequest, message,
 | 
			
		||||
 | 
			
		||||
func runMergeCommand(pr *models.PullRequest, mergeStyle repo_model.MergeStyle, cmd *git.Command, tmpBasePath string) error {
 | 
			
		||||
	var outbuf, errbuf strings.Builder
 | 
			
		||||
	if err := cmd.RunWithContext(&git.RunContext{
 | 
			
		||||
		Timeout: -1,
 | 
			
		||||
		Dir:     tmpBasePath,
 | 
			
		||||
		Stdout:  &outbuf,
 | 
			
		||||
		Stderr:  &errbuf,
 | 
			
		||||
	if err := cmd.Run(&git.RunOpts{
 | 
			
		||||
		Dir:    tmpBasePath,
 | 
			
		||||
		Stdout: &outbuf,
 | 
			
		||||
		Stderr: &errbuf,
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		// Merge will leave a MERGE_HEAD file in the .git folder if there is a conflict
 | 
			
		||||
		if _, statErr := os.Stat(filepath.Join(tmpBasePath, ".git", "MERGE_HEAD")); statErr == nil {
 | 
			
		||||
@@ -616,11 +601,10 @@ func getDiffTree(ctx context.Context, repoPath, baseBranch, headBranch string) (
 | 
			
		||||
		var outbuf, errbuf strings.Builder
 | 
			
		||||
		// Compute the diff-tree for sparse-checkout
 | 
			
		||||
		if err := git.NewCommand(ctx, "diff-tree", "--no-commit-id", "--name-only", "-r", "-z", "--root", baseBranch, headBranch, "--").
 | 
			
		||||
			RunWithContext(&git.RunContext{
 | 
			
		||||
				Timeout: -1,
 | 
			
		||||
				Dir:     repoPath,
 | 
			
		||||
				Stdout:  &outbuf,
 | 
			
		||||
				Stderr:  &errbuf,
 | 
			
		||||
			Run(&git.RunOpts{
 | 
			
		||||
				Dir:    repoPath,
 | 
			
		||||
				Stdout: &outbuf,
 | 
			
		||||
				Stderr: &errbuf,
 | 
			
		||||
			}); err != nil {
 | 
			
		||||
			return "", fmt.Errorf("git diff-tree [%s base:%s head:%s]: %s", repoPath, baseBranch, headBranch, errbuf.String())
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user