@@ -7,8 +7,8 @@ use std::ops::Range;
7
7
8
8
#[ derive( Default ) ]
9
9
pub ( crate ) struct Delegate {
10
- changes : Vec < Change > ,
11
- deleted_version_ids : BTreeMap < u64 , CrateVersion > ,
10
+ map : BTreeMap < [ u8 ; 32 ] , CrateVersion > ,
11
+ deletions : Vec < Change > ,
12
12
err : Option < Error > ,
13
13
}
14
14
@@ -37,7 +37,7 @@ 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 . changes . push ( version. into ( ) ) ;
40
+ self . map . insert ( version . checksum , version. into ( ) ) ;
41
41
}
42
42
}
43
43
}
@@ -48,7 +48,7 @@ impl Delegate {
48
48
for line in obj. data . lines ( ) {
49
49
deleted. push ( version_from_json_line ( line, change. location ) ?) ;
50
50
}
51
- self . changes . push ( Change :: Deleted {
51
+ self . deletions . push ( Change :: Deleted {
52
52
name : change. location . to_string ( ) ,
53
53
versions : deleted,
54
54
} ) ;
@@ -84,8 +84,7 @@ impl Delegate {
84
84
for removed in lines_before {
85
85
match version_from_json_line ( removed, location) {
86
86
Ok ( version) => {
87
- self . deleted_version_ids
88
- . insert ( version. id ( ) , version) ;
87
+ self . map . insert ( version. checksum , version) ;
89
88
}
90
89
Err ( e) => {
91
90
err = Some ( e) ;
@@ -98,7 +97,10 @@ impl Delegate {
98
97
( false , true ) => {
99
98
for inserted in lines_after {
100
99
match version_from_json_line ( inserted, location) {
101
- Ok ( version) => self . changes . push ( version. into ( ) ) ,
100
+ Ok ( version) => {
101
+ self . map
102
+ . insert ( version. checksum , version. into ( ) ) ;
103
+ }
102
104
Err ( e) => {
103
105
err = Some ( e) ;
104
106
break ;
@@ -117,11 +119,14 @@ impl Delegate {
117
119
. map ( |removed| ( removed, inserted) )
118
120
} ) {
119
121
Ok ( ( removed_version, inserted_version) ) => {
120
- if removed_version. yanked
121
- != inserted_version. yanked
122
- {
123
- self . changes . push ( inserted_version. into ( ) ) ;
124
- }
122
+ self . map . insert (
123
+ removed_version. checksum ,
124
+ removed_version,
125
+ ) ;
126
+ self . map . insert (
127
+ inserted_version. checksum ,
128
+ inserted_version,
129
+ ) ;
125
130
}
126
131
Err ( e) => {
127
132
err = Some ( e) ;
@@ -144,22 +149,18 @@ impl Delegate {
144
149
Ok ( Default :: default ( ) )
145
150
}
146
151
147
- pub fn into_result ( mut self ) -> Result < Vec < Change > , Error > {
152
+ pub fn into_result ( self ) -> Result < Vec < Change > , Error > {
148
153
match self . err {
149
154
Some ( err) => Err ( err) ,
150
155
None => {
151
- if !self . deleted_version_ids . is_empty ( ) {
152
- let deleted_version_ids = & mut self . deleted_version_ids ;
153
- self . changes . retain ( |change| match change {
154
- Change :: Added ( v) | Change :: Yanked ( v) => {
155
- deleted_version_ids. remove ( & v. id ( ) ) . is_some ( )
156
- }
157
- Change :: Deleted { .. } => true ,
158
- } ) ;
159
- self . changes
160
- . extend ( self . deleted_version_ids . into_values ( ) . map ( Into :: into) )
161
- }
162
- Ok ( self . changes )
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)
163
164
}
164
165
}
165
166
}
0 commit comments