@@ -132,18 +132,22 @@ func (r *BlameReader) Close() error {
132132}
133133
134134// CreateBlameReader creates reader for given repository, commit and file
135- func CreateBlameReader (ctx context.Context , objectFormat ObjectFormat , repoPath string , commit * Commit , file string , bypassBlameIgnore bool ) (* BlameReader , error ) {
136- reader , stdout , err := os .Pipe ()
137- if err != nil {
138- return nil , err
139- }
135+ func CreateBlameReader (ctx context.Context , objectFormat ObjectFormat , repoPath string , commit * Commit , file string , bypassBlameIgnore bool ) (rd * BlameReader , err error ) {
136+ var ignoreRevsFileName string
137+ var ignoreRevsFileCleanup func ()
138+ defer func () {
139+ if err != nil && ignoreRevsFileCleanup != nil {
140+ ignoreRevsFileCleanup ()
141+ }
142+ }()
140143
141144 cmd := NewCommandNoGlobals ("blame" , "--porcelain" )
142145
143- var ignoreRevsFileName string
144- 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
145146 if DefaultFeatures ().CheckVersionAtLeast ("2.23" ) && ! bypassBlameIgnore {
146- ignoreRevsFileName , ignoreRevsFileCleanup = tryCreateBlameIgnoreRevsFile (commit )
147+ ignoreRevsFileName , ignoreRevsFileCleanup , err = tryCreateBlameIgnoreRevsFile (commit )
148+ if err != nil && ! IsErrNotExist (err ) {
149+ return nil , err
150+ }
147151 if ignoreRevsFileName != "" {
148152 // Possible improvement: use --ignore-revs-file /dev/stdin on unix
149153 // 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
154158 cmd .AddDynamicArguments (commit .ID .String ()).AddDashesAndList (file )
155159
156160 done := make (chan error , 1 )
161+ reader , stdout , err := os .Pipe ()
162+ if err != nil {
163+ return nil , err
164+ }
157165 go func () {
158166 stderr := bytes.Buffer {}
159167 // 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
182190 }, nil
183191}
184192
185- func tryCreateBlameIgnoreRevsFile (commit * Commit ) (string , func ()) {
193+ func tryCreateBlameIgnoreRevsFile (commit * Commit ) (string , func (), error ) {
186194 entry , err := commit .GetTreeEntryByPath (".git-blame-ignore-revs" )
187195 if err != nil {
188- log .Error ("Unable to get .git-blame-ignore-revs file: GetTreeEntryByPath: %v" , err )
189- return "" , nil
196+ return "" , nil , err
190197 }
191198
192199 r , err := entry .Blob ().DataAsync ()
193200 if err != nil {
194- log .Error ("Unable to get .git-blame-ignore-revs file data: DataAsync: %v" , err )
195- return "" , nil
201+ return "" , nil , err
196202 }
197203 defer r .Close ()
198204
199205 f , cleanup , err := setting .AppDataTempDir ("git-repo-content" ).CreateTempFileRandom ("git-blame-ignore-revs" )
200206 if err != nil {
201- log .Error ("Unable to get .git-blame-ignore-revs file data: CreateTempFileRandom: %v" , err )
202- return "" , nil
207+ return "" , nil , err
203208 }
204209 filename := f .Name ()
205210 _ , err = io .Copy (f , r )
206211 _ = f .Close ()
207212 if err != nil {
208213 cleanup ()
209- log .Error ("Unable to get .git-blame-ignore-revs file data: Copy: %v" , err )
210- return "" , nil
214+ return "" , nil , err
211215 }
212216
213- return filename , cleanup
217+ return filename , cleanup , nil
214218}
0 commit comments