@@ -9,6 +9,8 @@ use serde::{Deserialize, Serialize};
99use std:: cmp:: Ordering ;
1010use std:: collections:: BTreeMap ;
1111
12+ use crate :: packagesystem:: * ;
13+
1214/// The directory where updates are stored
1315pub ( crate ) const BOOTUPD_UPDATES_DIR : & str = "usr/lib/bootupd/updates" ;
1416
@@ -19,11 +21,17 @@ pub(crate) struct ContentMetadata {
1921 pub ( crate ) timestamp : DateTime < Utc > ,
2022 /// Human readable version number, like ostree it is not ever parsed, just displayed
2123 pub ( crate ) version : String ,
24+ /// Transfer version into Module struct list
25+ pub ( crate ) versions : Option < Vec < Module > > ,
2226}
2327
2428impl ContentMetadata {
2529 pub ( crate ) fn can_upgrade_to ( & self , target : & Self ) -> Ordering {
26- crate :: packagesystem:: compare_package_versions ( & self . version , & target. version )
30+ if let ( Some ( self_versions) , Some ( target_versions) ) = ( & self . versions , & target. versions ) {
31+ compare_package_slices ( self_versions, target_versions)
32+ } else {
33+ compare_package_versions ( & self . version , & target. version )
34+ }
2735 }
2836}
2937
@@ -128,10 +136,44 @@ mod test {
128136 let a = ContentMetadata {
129137 timestamp : t,
130138 version : "grub2-efi-ia32-1:2.12-21.fc41.x86_64,grub2-efi-x64-1:2.12-21.fc41.x86_64,shim-ia32-15.8-3.x86_64,shim-x64-15.8-3.x86_64" . into ( ) ,
139+ versions : None ,
131140 } ;
132141 let b = ContentMetadata {
133142 timestamp : t + Duration :: try_seconds ( 1 ) . unwrap ( ) ,
134143 version : "grub2-efi-ia32-1:2.12-28.fc41.x86_64,grub2-efi-x64-1:2.12-28.fc41.x86_64,shim-ia32-15.8-3.x86_64,shim-x64-15.8-3.x86_64" . into ( ) ,
144+ versions : None ,
145+ } ;
146+ assert_eq ! ( a. can_upgrade_to( & b) , Ordering :: Less ) ; // means upgradable
147+ assert_eq ! ( b. can_upgrade_to( & a) , Ordering :: Greater ) ;
148+
149+ // Compare versions if it is not none
150+ let a = ContentMetadata {
151+ timestamp : t,
152+ version : "test" . into ( ) ,
153+ versions : Some ( vec ! [
154+ Module {
155+ name: "grub2" . into( ) ,
156+ rpm_evr: "1:2.12-21.fc41" . into( ) ,
157+ } ,
158+ Module {
159+ name: "shim" . into( ) ,
160+ rpm_evr: "15.8-3" . into( ) ,
161+ } ,
162+ ] ) ,
163+ } ;
164+ let b = ContentMetadata {
165+ timestamp : t + Duration :: try_seconds ( 1 ) . unwrap ( ) ,
166+ version : "test" . into ( ) ,
167+ versions : Some ( vec ! [
168+ Module {
169+ name: "grub2" . into( ) ,
170+ rpm_evr: "1:2.12-28.fc41" . into( ) ,
171+ } ,
172+ Module {
173+ name: "shim" . into( ) ,
174+ rpm_evr: "15.8-3" . into( ) ,
175+ } ,
176+ ] ) ,
135177 } ;
136178 assert_eq ! ( a. can_upgrade_to( & b) , Ordering :: Less ) ; // means upgradable
137179 assert_eq ! ( b. can_upgrade_to( & a) , Ordering :: Greater ) ;
@@ -147,6 +189,26 @@ mod test {
147189 efi. meta. version,
148190 "grub2-efi-x64-1:2.04-23.fc32.x86_64,shim-x64-15-8.x86_64"
149191 ) ;
192+ assert_eq ! ( efi. meta. versions, None ) ;
193+
194+ // Test the new versions
195+ let data = include_str ! ( "../tests/fixtures/example-state-versions-v0.json" ) ;
196+ let state: SavedState = serde_json:: from_str ( data) ?;
197+ let efi = state. installed . get ( "EFI" ) . expect ( "EFI" ) ;
198+ assert_eq ! ( efi. meta. version, "grub2-1:2.12-41.fc44,shim-15.8-4" ) ;
199+ assert_eq ! (
200+ efi. meta. versions,
201+ Some ( vec![
202+ Module {
203+ name: "grub2" . into( ) ,
204+ rpm_evr: "1:2.12-41.fc44" . into( ) ,
205+ } ,
206+ Module {
207+ name: "shim" . into( ) ,
208+ rpm_evr: "15.8-4" . into( ) ,
209+ } ,
210+ ] )
211+ ) ;
150212 Ok ( ( ) )
151213 }
152214
@@ -160,6 +222,7 @@ mod test {
160222 efi. installed. version,
161223 "grub2-efi-x64-1:2.04-23.fc32.x86_64,shim-x64-15-8.x86_64"
162224 ) ;
225+ assert_eq ! ( efi. installed. versions, None ) ;
163226 Ok ( ( ) )
164227 }
165228}
0 commit comments