@@ -132,18 +132,22 @@ func (r *BlameReader) Close() error {
132
132
}
133
133
134
134
// 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
+ }()
140
143
141
144
cmd := NewCommandNoGlobals ("blame" , "--porcelain" )
142
145
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
145
146
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
+ }
147
151
if ignoreRevsFileName != "" {
148
152
// Possible improvement: use --ignore-revs-file /dev/stdin on unix
149
153
// 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
154
158
cmd .AddDynamicArguments (commit .ID .String ()).AddDashesAndList (file )
155
159
156
160
done := make (chan error , 1 )
161
+ reader , stdout , err := os .Pipe ()
162
+ if err != nil {
163
+ return nil , err
164
+ }
157
165
go func () {
158
166
stderr := bytes.Buffer {}
159
167
// 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
182
190
}, nil
183
191
}
184
192
185
- func tryCreateBlameIgnoreRevsFile (commit * Commit ) (string , func ()) {
193
+ func tryCreateBlameIgnoreRevsFile (commit * Commit ) (string , func (), error ) {
186
194
entry , err := commit .GetTreeEntryByPath (".git-blame-ignore-revs" )
187
195
if err != nil {
188
- log .Error ("Unable to get .git-blame-ignore-revs file: GetTreeEntryByPath: %v" , err )
189
- return "" , nil
196
+ return "" , nil , err
190
197
}
191
198
192
199
r , err := entry .Blob ().DataAsync ()
193
200
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
196
202
}
197
203
defer r .Close ()
198
204
199
205
f , cleanup , err := setting .AppDataTempDir ("git-repo-content" ).CreateTempFileRandom ("git-blame-ignore-revs" )
200
206
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
203
208
}
204
209
filename := f .Name ()
205
210
_ , err = io .Copy (f , r )
206
211
_ = f .Close ()
207
212
if err != nil {
208
213
cleanup ()
209
- log .Error ("Unable to get .git-blame-ignore-revs file data: Copy: %v" , err )
210
- return "" , nil
214
+ return "" , nil , err
211
215
}
212
216
213
- return filename , cleanup
217
+ return filename , cleanup , nil
214
218
}
0 commit comments