mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-30 19:08:37 +00:00 
			
		
		
		
	Move some functions to gitrepo package (#35543)
Refactor Git command functions to use WithXXX methods instead of exposing RunOpts. This change simplifies reuse across gitrepo and improves consistency, encapsulation, and maintainability of command options. --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
		| @@ -32,15 +32,14 @@ type mergeContext struct { | ||||
| 	env       []string | ||||
| } | ||||
|  | ||||
| func (ctx *mergeContext) RunOpts() *gitcmd.RunOpts { | ||||
| func (ctx *mergeContext) PrepareGitCmd(cmd *gitcmd.Command) *gitcmd.Command { | ||||
| 	ctx.outbuf.Reset() | ||||
| 	ctx.errbuf.Reset() | ||||
| 	return &gitcmd.RunOpts{ | ||||
| 		Env:    ctx.env, | ||||
| 		Dir:    ctx.tmpBasePath, | ||||
| 		Stdout: ctx.outbuf, | ||||
| 		Stderr: ctx.errbuf, | ||||
| 	} | ||||
| 	return cmd.WithEnv(ctx.env). | ||||
| 		WithDir(ctx.tmpBasePath). | ||||
| 		WithParentCallerInfo(). | ||||
| 		WithStdout(ctx.outbuf). | ||||
| 		WithStderr(ctx.errbuf) | ||||
| } | ||||
|  | ||||
| // ErrSHADoesNotMatch represents a "SHADoesNotMatch" kind of error. | ||||
| @@ -74,7 +73,7 @@ func createTemporaryRepoForMerge(ctx context.Context, pr *issues_model.PullReque | ||||
| 	} | ||||
|  | ||||
| 	if expectedHeadCommitID != "" { | ||||
| 		trackingCommitID, _, err := gitcmd.NewCommand("show-ref", "--hash").AddDynamicArguments(git.BranchPrefix+trackingBranch).RunStdString(ctx, &gitcmd.RunOpts{Dir: mergeCtx.tmpBasePath}) | ||||
| 		trackingCommitID, _, err := mergeCtx.PrepareGitCmd(gitcmd.NewCommand("show-ref", "--hash").AddDynamicArguments(git.BranchPrefix + trackingBranch)).RunStdString(ctx) | ||||
| 		if err != nil { | ||||
| 			defer cancel() | ||||
| 			log.Error("failed to get sha of head branch in %-v: show-ref[%s] --hash refs/heads/tracking: %v", mergeCtx.pr, mergeCtx.tmpBasePath, err) | ||||
| @@ -152,8 +151,8 @@ func prepareTemporaryRepoForMerge(ctx *mergeContext) error { | ||||
| 	} | ||||
|  | ||||
| 	setConfig := func(key, value string) error { | ||||
| 		if err := gitcmd.NewCommand("config", "--local").AddDynamicArguments(key, value). | ||||
| 			Run(ctx, ctx.RunOpts()); err != nil { | ||||
| 		if err := ctx.PrepareGitCmd(gitcmd.NewCommand("config", "--local").AddDynamicArguments(key, value)). | ||||
| 			Run(ctx); err != nil { | ||||
| 			log.Error("git config [%s -> %q]: %v\n%s\n%s", key, value, err, ctx.outbuf.String(), ctx.errbuf.String()) | ||||
| 			return fmt.Errorf("git config [%s -> %q]: %w\n%s\n%s", key, value, err, ctx.outbuf.String(), ctx.errbuf.String()) | ||||
| 		} | ||||
| @@ -185,8 +184,8 @@ func prepareTemporaryRepoForMerge(ctx *mergeContext) error { | ||||
| 	} | ||||
|  | ||||
| 	// Read base branch index | ||||
| 	if err := gitcmd.NewCommand("read-tree", "HEAD"). | ||||
| 		Run(ctx, ctx.RunOpts()); err != nil { | ||||
| 	if err := ctx.PrepareGitCmd(gitcmd.NewCommand("read-tree", "HEAD")). | ||||
| 		Run(ctx); err != nil { | ||||
| 		log.Error("git read-tree HEAD: %v\n%s\n%s", err, ctx.outbuf.String(), ctx.errbuf.String()) | ||||
| 		return fmt.Errorf("Unable to read base branch in to the index: %w\n%s\n%s", err, ctx.outbuf.String(), ctx.errbuf.String()) | ||||
| 	} | ||||
| @@ -222,31 +221,31 @@ func getDiffTree(ctx context.Context, repoPath, baseBranch, headBranch string, o | ||||
| 		return 0, nil, nil | ||||
| 	} | ||||
|  | ||||
| 	err = gitcmd.NewCommand("diff-tree", "--no-commit-id", "--name-only", "-r", "-r", "-z", "--root").AddDynamicArguments(baseBranch, headBranch). | ||||
| 		Run(ctx, &gitcmd.RunOpts{ | ||||
| 			Dir:    repoPath, | ||||
| 			Stdout: diffOutWriter, | ||||
| 			PipelineFunc: func(ctx context.Context, cancel context.CancelFunc) error { | ||||
| 				// Close the writer end of the pipe to begin processing | ||||
| 				_ = diffOutWriter.Close() | ||||
| 				defer func() { | ||||
| 					// Close the reader on return to terminate the git command if necessary | ||||
| 					_ = diffOutReader.Close() | ||||
| 				}() | ||||
| 	err = gitcmd.NewCommand("diff-tree", "--no-commit-id", "--name-only", "-r", "-r", "-z", "--root"). | ||||
| 		AddDynamicArguments(baseBranch, headBranch). | ||||
| 		WithDir(repoPath). | ||||
| 		WithStdout(diffOutWriter). | ||||
| 		WithPipelineFunc(func(ctx context.Context, cancel context.CancelFunc) error { | ||||
| 			// Close the writer end of the pipe to begin processing | ||||
| 			_ = diffOutWriter.Close() | ||||
| 			defer func() { | ||||
| 				// Close the reader on return to terminate the git command if necessary | ||||
| 				_ = diffOutReader.Close() | ||||
| 			}() | ||||
|  | ||||
| 				// Now scan the output from the command | ||||
| 				scanner := bufio.NewScanner(diffOutReader) | ||||
| 				scanner.Split(scanNullTerminatedStrings) | ||||
| 				for scanner.Scan() { | ||||
| 					filepath := scanner.Text() | ||||
| 					// escape '*', '?', '[', spaces and '!' prefix | ||||
| 					filepath = escapedSymbols.ReplaceAllString(filepath, `\$1`) | ||||
| 					// no necessary to escape the first '#' symbol because the first symbol is '/' | ||||
| 					fmt.Fprintf(out, "/%s\n", filepath) | ||||
| 				} | ||||
| 				return scanner.Err() | ||||
| 			}, | ||||
| 		}) | ||||
| 			// Now scan the output from the command | ||||
| 			scanner := bufio.NewScanner(diffOutReader) | ||||
| 			scanner.Split(scanNullTerminatedStrings) | ||||
| 			for scanner.Scan() { | ||||
| 				filepath := scanner.Text() | ||||
| 				// escape '*', '?', '[', spaces and '!' prefix | ||||
| 				filepath = escapedSymbols.ReplaceAllString(filepath, `\$1`) | ||||
| 				// no necessary to escape the first '#' symbol because the first symbol is '/' | ||||
| 				fmt.Fprintf(out, "/%s\n", filepath) | ||||
| 			} | ||||
| 			return scanner.Err() | ||||
| 		}). | ||||
| 		Run(ctx) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| @@ -273,16 +272,16 @@ func (err ErrRebaseConflicts) Error() string { | ||||
| // if there is a conflict it will return an ErrRebaseConflicts | ||||
| func rebaseTrackingOnToBase(ctx *mergeContext, mergeStyle repo_model.MergeStyle) error { | ||||
| 	// Checkout head branch | ||||
| 	if err := gitcmd.NewCommand("checkout", "-b").AddDynamicArguments(stagingBranch, trackingBranch). | ||||
| 		Run(ctx, ctx.RunOpts()); err != nil { | ||||
| 	if err := ctx.PrepareGitCmd(gitcmd.NewCommand("checkout", "-b").AddDynamicArguments(stagingBranch, trackingBranch)). | ||||
| 		Run(ctx); err != nil { | ||||
| 		return fmt.Errorf("unable to git checkout tracking as staging in temp repo for %v: %w\n%s\n%s", ctx.pr, err, ctx.outbuf.String(), ctx.errbuf.String()) | ||||
| 	} | ||||
| 	ctx.outbuf.Reset() | ||||
| 	ctx.errbuf.Reset() | ||||
|  | ||||
| 	// Rebase before merging | ||||
| 	if err := gitcmd.NewCommand("rebase").AddDynamicArguments(baseBranch). | ||||
| 		Run(ctx, ctx.RunOpts()); err != nil { | ||||
| 	if err := ctx.PrepareGitCmd(gitcmd.NewCommand("rebase").AddDynamicArguments(baseBranch)). | ||||
| 		Run(ctx); err != nil { | ||||
| 		// Rebase will leave a REBASE_HEAD file in .git if there is a conflict | ||||
| 		if _, statErr := os.Stat(filepath.Join(ctx.tmpBasePath, ".git", "REBASE_HEAD")); statErr == nil { | ||||
| 			var commitSha string | ||||
|   | ||||
		Reference in New Issue
	
	Block a user