mirror of
https://github.com/go-gitea/gitea.git
synced 2025-06-20 21:50:27 +02:00
Backport #34457 by @lunny Fix #34454 Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
This commit is contained in:
parent
d0ec1788b8
commit
a6a14c9a92
@ -132,18 +132,22 @@ func (r *BlameReader) Close() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// CreateBlameReader creates reader for given repository, commit and file
|
// CreateBlameReader creates reader for given repository, commit and file
|
||||||
func CreateBlameReader(ctx context.Context, objectFormat ObjectFormat, repoPath string, commit *Commit, file string, bypassBlameIgnore bool) (*BlameReader, error) {
|
func CreateBlameReader(ctx context.Context, objectFormat ObjectFormat, repoPath string, commit *Commit, file string, bypassBlameIgnore bool) (rd *BlameReader, err error) {
|
||||||
reader, stdout, err := os.Pipe()
|
var ignoreRevsFileName string
|
||||||
if err != nil {
|
var ignoreRevsFileCleanup func()
|
||||||
return nil, err
|
defer func() {
|
||||||
}
|
if err != nil && ignoreRevsFileCleanup != nil {
|
||||||
|
ignoreRevsFileCleanup()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
cmd := NewCommandNoGlobals("blame", "--porcelain")
|
cmd := NewCommandNoGlobals("blame", "--porcelain")
|
||||||
|
|
||||||
var ignoreRevsFileName string
|
|
||||||
var ignoreRevsFileCleanup func() // TODO: maybe it should check the returned err in a defer func to make sure the cleanup could always be executed correctly
|
|
||||||
if DefaultFeatures().CheckVersionAtLeast("2.23") && !bypassBlameIgnore {
|
if DefaultFeatures().CheckVersionAtLeast("2.23") && !bypassBlameIgnore {
|
||||||
ignoreRevsFileName, ignoreRevsFileCleanup = tryCreateBlameIgnoreRevsFile(commit)
|
ignoreRevsFileName, ignoreRevsFileCleanup, err = tryCreateBlameIgnoreRevsFile(commit)
|
||||||
|
if err != nil && !IsErrNotExist(err) {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
if ignoreRevsFileName != "" {
|
if ignoreRevsFileName != "" {
|
||||||
// Possible improvement: use --ignore-revs-file /dev/stdin on unix
|
// Possible improvement: use --ignore-revs-file /dev/stdin on unix
|
||||||
// There is no equivalent on Windows. May be implemented if Gitea uses an external git backend.
|
// There is no equivalent on Windows. May be implemented if Gitea uses an external git backend.
|
||||||
@ -154,6 +158,10 @@ func CreateBlameReader(ctx context.Context, objectFormat ObjectFormat, repoPath
|
|||||||
cmd.AddDynamicArguments(commit.ID.String()).AddDashesAndList(file)
|
cmd.AddDynamicArguments(commit.ID.String()).AddDashesAndList(file)
|
||||||
|
|
||||||
done := make(chan error, 1)
|
done := make(chan error, 1)
|
||||||
|
reader, stdout, err := os.Pipe()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
go func() {
|
go func() {
|
||||||
stderr := bytes.Buffer{}
|
stderr := bytes.Buffer{}
|
||||||
// TODO: it doesn't work for directories (the directories shouldn't be "blamed"), and the "err" should be returned by "Read" but not by "Close"
|
// TODO: it doesn't work for directories (the directories shouldn't be "blamed"), and the "err" should be returned by "Read" but not by "Close"
|
||||||
@ -182,33 +190,29 @@ func CreateBlameReader(ctx context.Context, objectFormat ObjectFormat, repoPath
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func tryCreateBlameIgnoreRevsFile(commit *Commit) (string, func()) {
|
func tryCreateBlameIgnoreRevsFile(commit *Commit) (string, func(), error) {
|
||||||
entry, err := commit.GetTreeEntryByPath(".git-blame-ignore-revs")
|
entry, err := commit.GetTreeEntryByPath(".git-blame-ignore-revs")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("Unable to get .git-blame-ignore-revs file: GetTreeEntryByPath: %v", err)
|
return "", nil, err
|
||||||
return "", nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
r, err := entry.Blob().DataAsync()
|
r, err := entry.Blob().DataAsync()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("Unable to get .git-blame-ignore-revs file data: DataAsync: %v", err)
|
return "", nil, err
|
||||||
return "", nil
|
|
||||||
}
|
}
|
||||||
defer r.Close()
|
defer r.Close()
|
||||||
|
|
||||||
f, cleanup, err := setting.AppDataTempDir("git-repo-content").CreateTempFileRandom("git-blame-ignore-revs")
|
f, cleanup, err := setting.AppDataTempDir("git-repo-content").CreateTempFileRandom("git-blame-ignore-revs")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("Unable to get .git-blame-ignore-revs file data: CreateTempFileRandom: %v", err)
|
return "", nil, err
|
||||||
return "", nil
|
|
||||||
}
|
}
|
||||||
filename := f.Name()
|
filename := f.Name()
|
||||||
_, err = io.Copy(f, r)
|
_, err = io.Copy(f, r)
|
||||||
_ = f.Close()
|
_ = f.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
cleanup()
|
cleanup()
|
||||||
log.Error("Unable to get .git-blame-ignore-revs file data: Copy: %v", err)
|
return "", nil, err
|
||||||
return "", nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return filename, cleanup
|
return filename, cleanup, nil
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user