diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2022-01-23 13:57:52 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-23 00:57:52 -0500 |
commit | 35fdefc1ff253522f101ffb1337437b59676c302 (patch) | |
tree | 56f3556eb1ed153af37fb2e965db073272307d94 /services | |
parent | f066b293accb8aed5809de87ae56140c90978d66 (diff) | |
download | gitea-35fdefc1ff253522f101ffb1337437b59676c302.tar.gz gitea-35fdefc1ff253522f101ffb1337437b59676c302.zip |
Always use git command but not os.Command (#18363)
Diffstat (limited to 'services')
-rw-r--r-- | services/gitdiff/gitdiff.go | 47 |
1 files changed, 22 insertions, 25 deletions
diff --git a/services/gitdiff/gitdiff.go b/services/gitdiff/gitdiff.go index 25d5e139d9..80e706b5ed 100644 --- a/services/gitdiff/gitdiff.go +++ b/services/gitdiff/gitdiff.go @@ -15,7 +15,6 @@ import ( "io" "net/url" "os" - "os/exec" "regexp" "sort" "strings" @@ -30,7 +29,6 @@ import ( "code.gitea.io/gitea/modules/highlight" "code.gitea.io/gitea/modules/lfs" "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/process" "code.gitea.io/gitea/modules/setting" "github.com/sergi/go-diff/diffmatchpatch" @@ -1322,10 +1320,6 @@ func GetDiff(gitRepo *git.Repository, opts *DiffOptions, files ...string) (*Diff return nil, err } - timeout := time.Duration(setting.Git.Timeout.Default) * time.Second - ctx, _, finished := process.GetManager().AddContextTimeout(gitRepo.Ctx, timeout, fmt.Sprintf("GetDiffRange [repo_path: %s]", repoPath)) - defer finished() - argsLength := 6 if len(opts.WhitespaceBehavior) > 0 { argsLength++ @@ -1375,21 +1369,28 @@ func GetDiff(gitRepo *git.Repository, opts *DiffOptions, files ...string) (*Diff diffArgs = append(diffArgs, files...) } - cmd := exec.CommandContext(ctx, git.GitExecutable, diffArgs...) - - cmd.Dir = repoPath - cmd.Stderr = os.Stderr + reader, writer := io.Pipe() + defer func() { + _ = reader.Close() + _ = writer.Close() + }() - stdout, err := cmd.StdoutPipe() - if err != nil { - return nil, fmt.Errorf("error creating StdoutPipe: %w", err) - } + go func(ctx context.Context, diffArgs []string, repoPath string, writer *io.PipeWriter) { + cmd := git.NewCommandContextNoGlobals(ctx, diffArgs...) + cmd.SetDescription(fmt.Sprintf("GetDiffRange [repo_path: %s]", repoPath)) + if err := cmd.RunWithContext(&git.RunContext{ + Timeout: time.Duration(setting.Git.Timeout.Default) * time.Second, + Dir: repoPath, + Stderr: os.Stderr, + Stdout: writer, + }); err != nil { + log.Error("error during RunWithContext: %w", err) + } - if err = cmd.Start(); err != nil { - return nil, fmt.Errorf("error during Start: %w", err) - } + _ = writer.Close() + }(gitRepo.Ctx, diffArgs, repoPath, writer) - diff, err := ParsePatch(opts.MaxLines, opts.MaxLineCharacters, opts.MaxFiles, stdout, parsePatchSkipToFile) + diff, err := ParsePatch(opts.MaxLines, opts.MaxLineCharacters, opts.MaxFiles, reader, parsePatchSkipToFile) if err != nil { return nil, fmt.Errorf("unable to ParsePatch: %w", err) } @@ -1408,7 +1409,7 @@ func GetDiff(gitRepo *git.Repository, opts *DiffOptions, files ...string) (*Diff IndexFile: indexFilename, WorkTree: worktree, } - ctx, cancel := context.WithCancel(ctx) + ctx, cancel := context.WithCancel(gitRepo.Ctx) if err := checker.Init(ctx); err != nil { log.Error("Unable to open checker for %s. Error: %v", opts.AfterCommitID, err) } else { @@ -1472,10 +1473,6 @@ func GetDiff(gitRepo *git.Repository, opts *DiffOptions, files ...string) (*Diff } } - if err = cmd.Wait(); err != nil { - return nil, fmt.Errorf("error during cmd.Wait: %w", err) - } - separator := "..." if opts.DirectComparison { separator = ".." @@ -1485,12 +1482,12 @@ func GetDiff(gitRepo *git.Repository, opts *DiffOptions, files ...string) (*Diff if len(opts.BeforeCommitID) == 0 || opts.BeforeCommitID == git.EmptySHA { shortstatArgs = []string{git.EmptyTreeSHA, opts.AfterCommitID} } - diff.NumFiles, diff.TotalAddition, diff.TotalDeletion, err = git.GetDiffShortStat(ctx, repoPath, shortstatArgs...) + diff.NumFiles, diff.TotalAddition, diff.TotalDeletion, err = git.GetDiffShortStat(gitRepo.Ctx, repoPath, shortstatArgs...) if err != nil && strings.Contains(err.Error(), "no merge base") { // git >= 2.28 now returns an error if base and head have become unrelated. // previously it would return the results of git diff --shortstat base head so let's try that... shortstatArgs = []string{opts.BeforeCommitID, opts.AfterCommitID} - diff.NumFiles, diff.TotalAddition, diff.TotalDeletion, err = git.GetDiffShortStat(ctx, repoPath, shortstatArgs...) + diff.NumFiles, diff.TotalAddition, diff.TotalDeletion, err = git.GetDiffShortStat(gitRepo.Ctx, repoPath, shortstatArgs...) } if err != nil { return nil, err |