@@ -4,6 +4,7 @@ use git_repository::bstr::BStr;
44use git_repository:: diff:: tree:: visit:: Action ;
55use git_repository:: prelude:: { FindExt , ObjectIdExt , TreeIterExt } ;
66use git_repository:: refs:: transaction:: PreviousValue ;
7+ use similar:: ChangeTag ;
78use std:: convert:: TryFrom ;
89
910static LINE_ADDED_INDICATOR : char = '+' ;
@@ -209,11 +210,8 @@ impl Index {
209210 Addition { entry_mode, oid } => {
210211 if let Some ( obj) = entry_data ( self . repo , entry_mode, oid) ? {
211212 for line in ( & obj. data ) . lines ( ) {
212- self . changes . push ( Change :: Added ( serde_json:: from_slice :: <
213- CrateVersion ,
214- > (
215- line
216- ) ?) ) ;
213+ self . changes
214+ . push ( Change :: Added ( serde_json:: from_slice ( line) ?) ) ;
217215 }
218216 }
219217 }
@@ -230,8 +228,25 @@ impl Index {
230228 } => {
231229 let pair = entry_data ( self . repo , previous_entry_mode, previous_oid) ?
232230 . zip ( entry_data ( self . repo , entry_mode, oid) ?) ;
233- if let Some ( ( _prev, _new) ) = pair {
234- todo ! ( "modification" )
231+ if let Some ( ( old, new) ) = pair {
232+ let diff = similar:: TextDiffConfig :: default ( )
233+ . algorithm ( similar:: Algorithm :: Myers )
234+ . diff_lines ( old. data . as_slice ( ) , new. data . as_slice ( ) ) ;
235+ for change in diff. iter_all_changes ( ) {
236+ match change. tag ( ) {
237+ ChangeTag :: Delete => todo ! ( "deletion" ) ,
238+ ChangeTag :: Insert => {
239+ let version =
240+ serde_json:: from_slice :: < CrateVersion > ( change. value ( ) ) ?;
241+ self . changes . push ( if version. yanked {
242+ Change :: Yanked ( version)
243+ } else {
244+ Change :: Added ( version)
245+ } ) ;
246+ }
247+ ChangeTag :: Equal => { }
248+ }
249+ }
235250 }
236251 }
237252 }
0 commit comments