@@ -266,6 +266,13 @@ fn hex_to_delta_part(hex: &str) -> OstreeResult<String> {
266266 Ok ( part. replace ( '/' , "_" ) )
267267}
268268
269+ fn is_lower_hex_checksum ( value : & str ) -> bool {
270+ value. len ( ) == 64
271+ && value
272+ . chars ( )
273+ . all ( |ch| ch. is_ascii_hexdigit ( ) && !ch. is_ascii_uppercase ( ) )
274+ }
275+
269276impl Delta {
270277 pub fn new ( from : Option < & str > , to : & str ) -> Delta {
271278 Delta {
@@ -275,16 +282,22 @@ impl Delta {
275282 }
276283 pub fn from_name ( name : & str ) -> OstreeResult < Delta > {
277284 let parts: Vec < & str > = name. split ( '-' ) . collect ( ) ;
278- if parts. len ( ) == 1 {
279- Ok ( Delta {
285+ match parts. as_slice ( ) {
286+ [ to] if is_lower_hex_checksum ( to) => Ok ( Delta :: new ( None , to) ) ,
287+ [ from, to] if is_lower_hex_checksum ( from) && is_lower_hex_checksum ( to) => {
288+ Ok ( Delta :: new ( Some ( from) , to) )
289+ }
290+ [ to] => Ok ( Delta {
280291 from : None ,
281- to : delta_part_to_hex ( parts[ 0 ] ) ?,
282- } )
283- } else {
284- Ok ( Delta {
285- from : Some ( delta_part_to_hex ( parts[ 0 ] ) ?) ,
286- to : delta_part_to_hex ( parts[ 1 ] ) ?,
287- } )
292+ to : delta_part_to_hex ( to) ?,
293+ } ) ,
294+ [ from, to] => Ok ( Delta {
295+ from : Some ( delta_part_to_hex ( from) ?) ,
296+ to : delta_part_to_hex ( to) ?,
297+ } ) ,
298+ _ => Err ( OstreeError :: InternalError ( format ! (
299+ "Invalid delta name '{name}'"
300+ ) ) ) ,
288301 }
289302 }
290303
@@ -476,6 +489,26 @@ mod tests {
476489 ) ;
477490 assert_eq ! ( Delta :: from_name( "OkiocD9GLq_Nt660BvWyrH8G62dAvtLv7RPqngWqf5c-3dpOrJG4MNyKHDDGXHpH_zd9NXugnexr5jpvSFQ77S4" ) ,
478491 Ok ( Delta { from: Some ( "3a48a8703f462eafcdb7aeb406f5b2ac7f06eb6740bed2efed13ea9e05aa7f97" . to_string( ) ) , to: "ddda4eac91b830dc8a1c30c65c7a47ff377d357ba09dec6be63a6f48543bed2e" . to_string( ) } ) ) ;
492+ assert_eq ! (
493+ Delta :: from_name( "3a48a8703f462eafcdb7aeb406f5b2ac7f06eb6740bed2efed13ea9e05aa7f97" ) ,
494+ Ok ( Delta {
495+ from: None ,
496+ to: "3a48a8703f462eafcdb7aeb406f5b2ac7f06eb6740bed2efed13ea9e05aa7f97" . to_string( )
497+ } )
498+ ) ;
499+ assert_eq ! (
500+ Delta :: from_name(
501+ "3a48a8703f462eafcdb7aeb406f5b2ac7f06eb6740bed2efed13ea9e05aa7f97-ddda4eac91b830dc8a1c30c65c7a47ff377d357ba09dec6be63a6f48543bed2e"
502+ ) ,
503+ Ok ( Delta {
504+ from: Some (
505+ "3a48a8703f462eafcdb7aeb406f5b2ac7f06eb6740bed2efed13ea9e05aa7f97"
506+ . to_string( )
507+ ) ,
508+ to: "ddda4eac91b830dc8a1c30c65c7a47ff377d357ba09dec6be63a6f48543bed2e"
509+ . to_string( )
510+ } )
511+ ) ;
479512 }
480513
481514 #[ test]
0 commit comments