@@ -2,13 +2,13 @@ use crate::index::diff::Error;
2
2
use crate :: { Change , CrateVersion } ;
3
3
use bstr:: BStr ;
4
4
use git_repository as git;
5
- use std:: collections:: BTreeMap ;
5
+ use std:: collections:: BTreeSet ;
6
6
use std:: ops:: Range ;
7
7
8
8
#[ derive( Default ) ]
9
9
pub ( crate ) struct Delegate {
10
- map : BTreeMap < [ u8 ; 32 ] , CrateVersion > ,
11
- deletions : Vec < Change > ,
10
+ changes : Vec < Change > ,
11
+ deleted_version_ids : BTreeSet < u64 > ,
12
12
err : Option < Error > ,
13
13
}
14
14
@@ -37,7 +37,11 @@ impl Delegate {
37
37
if let Some ( obj) = entry_data ( entry_mode, id) ? {
38
38
for line in obj. data . lines ( ) {
39
39
let version = version_from_json_line ( line, change. location ) ?;
40
- self . map . insert ( version. checksum , version. into ( ) ) ;
40
+ self . changes . push ( if version. yanked {
41
+ Change :: Yanked ( version)
42
+ } else {
43
+ Change :: Added ( version)
44
+ } ) ;
41
45
}
42
46
}
43
47
}
@@ -48,7 +52,7 @@ impl Delegate {
48
52
for line in obj. data . lines ( ) {
49
53
deleted. push ( version_from_json_line ( line, change. location ) ?) ;
50
54
}
51
- self . deletions . push ( Change :: Deleted {
55
+ self . changes . push ( Change :: Deleted {
52
56
name : change. location . to_string ( ) ,
53
57
versions : deleted,
54
58
} ) ;
@@ -77,14 +81,21 @@ impl Delegate {
77
81
. iter ( )
78
82
. map ( |& line| input. interner [ line] . as_bstr ( ) )
79
83
. peekable ( ) ;
84
+ let mut remember = |version : CrateVersion | {
85
+ self . changes . push ( if version. yanked {
86
+ Change :: Yanked ( version)
87
+ } else {
88
+ Change :: Added ( version)
89
+ } ) ;
90
+ } ;
80
91
' outer: loop {
81
92
match ( lines_before. peek ( ) . is_some ( ) , lines_after. peek ( ) . is_some ( ) )
82
93
{
83
94
( true , false ) => {
84
95
for removed in lines_before {
85
96
match version_from_json_line ( removed, location) {
86
97
Ok ( version) => {
87
- self . map . insert ( version. checksum , version ) ;
98
+ self . deleted_version_ids . insert ( version. id ( ) ) ;
88
99
}
89
100
Err ( e) => {
90
101
err = Some ( e) ;
@@ -97,10 +108,7 @@ impl Delegate {
97
108
( false , true ) => {
98
109
for inserted in lines_after {
99
110
match version_from_json_line ( inserted, location) {
100
- Ok ( version) => {
101
- self . map
102
- . insert ( version. checksum , version. into ( ) ) ;
103
- }
111
+ Ok ( version) => remember ( version) ,
104
112
Err ( e) => {
105
113
err = Some ( e) ;
106
114
break ;
@@ -119,14 +127,11 @@ impl Delegate {
119
127
. map ( |removed| ( removed, inserted) )
120
128
} ) {
121
129
Ok ( ( removed_version, inserted_version) ) => {
122
- self . map . insert (
123
- removed_version. checksum ,
124
- removed_version,
125
- ) ;
126
- self . map . insert (
127
- inserted_version. checksum ,
128
- inserted_version,
129
- ) ;
130
+ if removed_version. yanked
131
+ != inserted_version. yanked
132
+ {
133
+ remember ( inserted_version) ;
134
+ }
130
135
}
131
136
Err ( e) => {
132
137
err = Some ( e) ;
@@ -149,18 +154,20 @@ impl Delegate {
149
154
Ok ( Default :: default ( ) )
150
155
}
151
156
152
- pub fn into_result ( self ) -> Result < Vec < Change > , Error > {
157
+ pub fn into_result ( mut self ) -> Result < Vec < Change > , Error > {
153
158
match self . err {
154
159
Some ( err) => Err ( err) ,
155
160
None => {
156
- let mut changes = self . map . into_values ( ) . map ( Into :: into) . collect :: < Vec < _ > > ( ) ;
157
- changes. sort_by ( |a : & Change , b : & Change | {
158
- let a = a. version ( ) ;
159
- let b = b. version ( ) ;
160
- a. name . cmp ( & b. name ) . then_with ( || a. version . cmp ( & b. version ) )
161
- } ) ;
162
- changes. extend ( self . deletions ) ;
163
- Ok ( changes)
161
+ if !self . deleted_version_ids . is_empty ( ) {
162
+ let deleted_version_ids = & self . deleted_version_ids ;
163
+ self . changes . retain ( |change| match change {
164
+ Change :: Added ( v) | Change :: Yanked ( v) => {
165
+ !deleted_version_ids. contains ( & v. id ( ) )
166
+ }
167
+ Change :: Deleted { .. } => true ,
168
+ } )
169
+ }
170
+ Ok ( self . changes )
164
171
}
165
172
}
166
173
}
0 commit comments