@@ -32,7 +32,6 @@ impl Delegate {
32
32
if change. location . contains ( & b'.' ) {
33
33
return Ok ( Default :: default ( ) ) ;
34
34
}
35
- let mut line_changes = Vec :: new ( ) ;
36
35
match change. event {
37
36
Addition { entry_mode, id } => {
38
37
if let Some ( obj) = entry_data ( entry_mode, id) ? {
@@ -57,55 +56,64 @@ impl Delegate {
57
56
if let Some ( diff) = change. event . diff ( ) . transpose ( ) ? {
58
57
let location = change. location ;
59
58
60
- enum Op {
61
- Delete ,
62
- Add ,
63
- }
64
- diff. lines (
65
- |input : & git:: diff:: text:: imara:: intern:: InternedInput < & [ u8 ] > | {
66
- |before : Range < u32 > , after : Range < u32 > | {
67
- let mut line_before = input. before
68
- [ before. start as usize ..before. end as usize ]
69
- . iter ( )
70
- . map ( |& line| input. interner [ line] ) ;
71
- let mut line_after = input. after
72
- [ after. start as usize ..after. end as usize ]
73
- . iter ( )
74
- . map ( |& line| input. interner [ line] ) ;
75
- match ( line_before. next ( ) , line_after. next ( ) ) {
76
- ( Some ( removed) , None ) => {
77
- line_changes. push (
78
- version_from_json_line ( removed. as_bstr ( ) , location)
79
- . map ( |v| ( v, Op :: Delete ) ) ,
80
- ) ;
81
- }
82
- ( None , Some ( inserted) ) => {
83
- line_changes. push (
84
- version_from_json_line ( inserted. as_bstr ( ) , location)
85
- . map ( |v| ( v, Op :: Add ) ) ,
86
- ) ;
59
+ let input = diff. line_tokens ( ) ;
60
+ let mut err = None ;
61
+ git:: diff:: blob:: diff (
62
+ diff. algo ,
63
+ & input,
64
+ |before : Range < u32 > , after : Range < u32 > | {
65
+ if err. is_some ( ) {
66
+ return ;
67
+ }
68
+ let mut lines_before = input. before
69
+ [ before. start as usize ..before. end as usize ]
70
+ . iter ( )
71
+ . map ( |& line| input. interner [ line] )
72
+ . peekable ( ) ;
73
+ let mut lines_after = input. after
74
+ [ after. start as usize ..after. end as usize ]
75
+ . iter ( )
76
+ . map ( |& line| input. interner [ line] )
77
+ . peekable ( ) ;
78
+ match ( lines_before. peek ( ) . is_some ( ) , lines_after. next ( ) . is_some ( ) ) {
79
+ ( true , false ) => {
80
+ for removed in lines_before {
81
+ match version_from_json_line ( removed. as_bstr ( ) , location) {
82
+ Ok ( version) => {
83
+ self . delete_version_ids . insert ( version. id ( ) ) ;
84
+ }
85
+ Err ( e) => {
86
+ err = Some ( e) ;
87
+ break ;
88
+ }
89
+ }
87
90
}
88
- ( Some ( _) , Some ( _) ) | ( None , None ) => {
89
- /* ignore modifications, shouldn't exist */
91
+ }
92
+ ( false , true ) => {
93
+ for inserted in lines_after {
94
+ match version_from_json_line ( inserted. as_bstr ( ) , location) {
95
+ Ok ( version) => {
96
+ self . changes . push ( if version. yanked {
97
+ Change :: Yanked ( version)
98
+ } else {
99
+ Change :: Added ( version)
100
+ } ) ;
101
+ }
102
+ Err ( e) => {
103
+ err = Some ( e) ;
104
+ break ;
105
+ }
106
+ }
90
107
}
91
108
}
109
+ ( true , true ) | ( false , false ) => {
110
+ /* ignore modifications, shouldn't exist */
111
+ }
92
112
}
93
113
} ,
94
114
) ;
95
- for op in line_changes. drain ( ..) {
96
- let ( version, op) = op?;
97
- match op {
98
- Op :: Add => {
99
- self . changes . push ( if version. yanked {
100
- Change :: Yanked ( version)
101
- } else {
102
- Change :: Added ( version)
103
- } ) ;
104
- }
105
- Op :: Delete => {
106
- self . delete_version_ids . insert ( version. id ( ) ) ;
107
- }
108
- } ;
115
+ if let Some ( err) = err {
116
+ return Err ( err. into ( ) ) ;
109
117
}
110
118
}
111
119
}
0 commit comments