Skip to content

Commit eaf0f93

Browse files
committed
Parse raw hex delta names from list_static_delta_names
1 parent 462251c commit eaf0f93

1 file changed

Lines changed: 42 additions & 9 deletions

File tree

common/src/ostree.rs

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
269276
impl 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

Comments
 (0)