File tree Expand file tree Collapse file tree 1 file changed +67
-14
lines changed Expand file tree Collapse file tree 1 file changed +67
-14
lines changed Original file line number Diff line number Diff line change @@ -227,21 +227,74 @@ impl ConsumeHunk for FileDiff {
227
227
) -> std:: io:: Result < ( ) > {
228
228
let lines = hunk
229
229
. lines ( )
230
- . zip ( 0 ..)
231
- . map ( |( line, index) | DiffLine {
232
- position : DiffLinePosition {
233
- old_lineno : Some ( before_hunk_start + index) ,
234
- new_lineno : Some ( after_hunk_start + index) ,
230
+ . scan (
231
+ ( before_hunk_start, after_hunk_start) ,
232
+ |( old_lineno, new_lineno) , line| {
233
+ let ( line_type, content, old_lineno, new_lineno) =
234
+ match line {
235
+ [ b'+' , rest @ ..] => {
236
+ let result = (
237
+ DiffLineType :: Add ,
238
+ rest,
239
+ None ,
240
+ Some ( * new_lineno) ,
241
+ ) ;
242
+ * new_lineno += 1 ;
243
+ result
244
+ }
245
+ [ b'-' , rest @ ..] => {
246
+ let result = (
247
+ DiffLineType :: Delete ,
248
+ rest,
249
+ Some ( * old_lineno) ,
250
+ None ,
251
+ ) ;
252
+ * old_lineno += 1 ;
253
+ result
254
+ }
255
+ [ b' ' , rest @ ..] => {
256
+ let result = (
257
+ DiffLineType :: None ,
258
+ rest,
259
+ Some ( * old_lineno) ,
260
+ Some ( * new_lineno) ,
261
+ ) ;
262
+ * old_lineno += 1 ;
263
+ * new_lineno += 1 ;
264
+ result
265
+ }
266
+ [ b'@' , ..] => (
267
+ DiffLineType :: Header ,
268
+ line,
269
+ None ,
270
+ None ,
271
+ ) ,
272
+ _ => {
273
+ // Empty lines or unknown prefixes are treated as context.
274
+ let result = (
275
+ DiffLineType :: None ,
276
+ line,
277
+ Some ( * old_lineno) ,
278
+ Some ( * new_lineno) ,
279
+ ) ;
280
+ * old_lineno += 1 ;
281
+ * new_lineno += 1 ;
282
+ result
283
+ }
284
+ } ;
285
+
286
+ Some ( DiffLine {
287
+ position : DiffLinePosition {
288
+ old_lineno,
289
+ new_lineno,
290
+ } ,
291
+ content : String :: from_utf8_lossy ( content)
292
+ . trim_matches ( is_newline)
293
+ . into ( ) ,
294
+ line_type,
295
+ } )
235
296
} ,
236
- content : String :: from_utf8_lossy ( line)
237
- . trim_matches ( is_newline)
238
- . into ( ) ,
239
- // TODO:
240
- // Get correct `line_type`. We could potentially do this by looking at the line's first
241
- // character. We probably want to split it anyway as `gitui` takes care of that character
242
- // itself later in the UI.
243
- line_type : DiffLineType :: default ( ) ,
244
- } )
297
+ )
245
298
. collect ( ) ;
246
299
247
300
let hunk_header = HunkHeader {
You can’t perform that action at this time.
0 commit comments