Skip to content

Commit b343587

Browse files
committed
tugger-debian: store digests with strong typing
This will enable us to more easily obtain by-hash paths from entries since the digest variant is now encoded next to the digest value.
1 parent 62a2863 commit b343587

File tree

1 file changed

+66
-15
lines changed

1 file changed

+66
-15
lines changed

tugger-debian/src/repository/release.rs

Lines changed: 66 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,36 @@ impl ChecksumType {
9191
}
9292
}
9393

94+
/// A typed digest in a release file.
95+
#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd)]
96+
pub enum ReleaseFileDigest<'a> {
97+
Md5(&'a str),
98+
Sha1(&'a str),
99+
Sha256(&'a str),
100+
}
101+
102+
impl<'a> ReleaseFileDigest<'a> {
103+
/// Create a new instance given the checksum type and a digest value.
104+
pub fn new(checksum: ChecksumType, value: &'a str) -> Self {
105+
match checksum {
106+
ChecksumType::Md5 => Self::Md5(value),
107+
ChecksumType::Sha1 => Self::Sha1(value),
108+
ChecksumType::Sha256 => Self::Sha256(value),
109+
}
110+
}
111+
112+
/// The name of the `Release` paragraph field from which this digest came.
113+
///
114+
/// Is also the `by-hash` path component.
115+
pub fn field_name(&self) -> &'static str {
116+
match self {
117+
Self::Md5(_) => ChecksumType::Md5.field_name(),
118+
Self::Sha1(_) => ChecksumType::Sha1.field_name(),
119+
Self::Sha256(_) => ChecksumType::Sha256.field_name(),
120+
}
121+
}
122+
}
123+
94124
/// An entry for a file in a parsed `Release` file.
95125
///
96126
/// Instances correspond to a line in a `MD5Sum`, `SHA1`, or `SHA256` field.
@@ -100,7 +130,7 @@ pub struct ReleaseFileEntry<'a> {
100130
pub path: &'a str,
101131

102132
/// The hex digest of this file.
103-
pub digest: &'a str,
133+
pub digest: ReleaseFileDigest<'a>,
104134

105135
/// The size of the file in bytes.
106136
pub size: usize,
@@ -411,7 +441,7 @@ impl<'a> ReleaseFile<'a> {
411441
.paragraph
412442
.first_field_iter_values(checksum.field_name())
413443
{
414-
Some(Box::new(iter.map(|v| {
444+
Some(Box::new(iter.map(move |v| {
415445
// Values are of form: <digest> <size> <path>
416446

417447
let mut parts = v.split_ascii_whitespace();
@@ -425,6 +455,7 @@ impl<'a> ReleaseFile<'a> {
425455
return Err(ReleaseError::PathWithSpaces(v.to_string()));
426456
}
427457

458+
let digest = ReleaseFileDigest::new(checksum, digest);
428459
let size = usize::from_str(size)?;
429460

430461
Ok(ReleaseFileEntry { path, digest, size })
@@ -573,23 +604,23 @@ mod test {
573604
entries[0],
574605
ReleaseFileEntry {
575606
path: "contrib/Contents-all",
576-
digest: "7fdf4db15250af5368cc52a91e8edbce",
607+
digest: ReleaseFileDigest::Md5("7fdf4db15250af5368cc52a91e8edbce"),
577608
size: 738242,
578609
}
579610
);
580611
assert_eq!(
581612
entries[1],
582613
ReleaseFileEntry {
583614
path: "contrib/Contents-all.gz",
584-
digest: "cbd7bc4d3eb517ac2b22f929dfc07b47",
615+
digest: ReleaseFileDigest::Md5("cbd7bc4d3eb517ac2b22f929dfc07b47"),
585616
size: 57319,
586617
}
587618
);
588619
assert_eq!(
589620
entries[599],
590621
ReleaseFileEntry {
591622
path: "non-free/source/Sources.xz",
592-
digest: "e3830f6fc5a946b5a5b46e8277e1d86f",
623+
digest: ReleaseFileDigest::Md5("e3830f6fc5a946b5a5b46e8277e1d86f"),
593624
size: 80488,
594625
}
595626
);
@@ -605,22 +636,28 @@ mod test {
605636
entries[0],
606637
ReleaseFileEntry {
607638
path: "contrib/Contents-all",
608-
digest: "3957f28db16e3f28c7b34ae84f1c929c567de6970f3f1b95dac9b498dd80fe63",
639+
digest: ReleaseFileDigest::Sha256(
640+
"3957f28db16e3f28c7b34ae84f1c929c567de6970f3f1b95dac9b498dd80fe63"
641+
),
609642
size: 738242,
610643
}
611644
);
612645
assert_eq!(
613646
entries[1],
614647
ReleaseFileEntry {
615648
path: "contrib/Contents-all.gz",
616-
digest: "3e9a121d599b56c08bc8f144e4830807c77c29d7114316d6984ba54695d3db7b",
649+
digest: ReleaseFileDigest::Sha256(
650+
"3e9a121d599b56c08bc8f144e4830807c77c29d7114316d6984ba54695d3db7b"
651+
),
617652
size: 57319,
618653
}
619654
);
620655
assert_eq!(
621656
entries[599],
622657
ReleaseFileEntry {
623-
digest: "30f3f996941badb983141e3b29b2ed5941d28cf81f9b5f600bb48f782d386fc7",
658+
digest: ReleaseFileDigest::Sha256(
659+
"30f3f996941badb983141e3b29b2ed5941d28cf81f9b5f600bb48f782d386fc7"
660+
),
624661
size: 80488,
625662
path: "non-free/source/Sources.xz",
626663
}
@@ -637,7 +674,9 @@ mod test {
637674
ContentsFileEntry {
638675
entry: ReleaseFileEntry {
639676
path: "contrib/Contents-all",
640-
digest: "3957f28db16e3f28c7b34ae84f1c929c567de6970f3f1b95dac9b498dd80fe63",
677+
digest: ReleaseFileDigest::Sha256(
678+
"3957f28db16e3f28c7b34ae84f1c929c567de6970f3f1b95dac9b498dd80fe63"
679+
),
641680
size: 738242,
642681
},
643682
component: "contrib".into(),
@@ -651,7 +690,9 @@ mod test {
651690
ContentsFileEntry {
652691
entry: ReleaseFileEntry {
653692
path: "contrib/Contents-all.gz",
654-
digest: "3e9a121d599b56c08bc8f144e4830807c77c29d7114316d6984ba54695d3db7b",
693+
digest: ReleaseFileDigest::Sha256(
694+
"3e9a121d599b56c08bc8f144e4830807c77c29d7114316d6984ba54695d3db7b"
695+
),
655696
size: 57319,
656697
},
657698
component: "contrib".into(),
@@ -665,7 +706,9 @@ mod test {
665706
ContentsFileEntry {
666707
entry: ReleaseFileEntry {
667708
path: "contrib/Contents-udeb-amd64",
668-
digest: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
709+
digest: ReleaseFileDigest::Sha256(
710+
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
711+
),
669712
size: 0,
670713
},
671714
component: "contrib".into(),
@@ -686,7 +729,9 @@ mod test {
686729
PackagesFileEntry {
687730
entry: ReleaseFileEntry {
688731
path: "contrib/binary-all/Packages",
689-
digest: "48cfe101cd84f16baf720b99e8f2ff89fd7e063553966d8536b472677acb82f0",
732+
digest: ReleaseFileDigest::Sha256(
733+
"48cfe101cd84f16baf720b99e8f2ff89fd7e063553966d8536b472677acb82f0"
734+
),
690735
size: 103223,
691736
},
692737
component: "contrib".into(),
@@ -700,7 +745,9 @@ mod test {
700745
PackagesFileEntry {
701746
entry: ReleaseFileEntry {
702747
path: "contrib/binary-all/Packages.gz",
703-
digest: "86057fcd3eff667ec8e3fbabb2a75e229f5e99f39ace67ff0db4a8509d0707e4",
748+
digest: ReleaseFileDigest::Sha256(
749+
"86057fcd3eff667ec8e3fbabb2a75e229f5e99f39ace67ff0db4a8509d0707e4"
750+
),
704751
size: 27334,
705752
},
706753
component: "contrib".into(),
@@ -714,7 +761,9 @@ mod test {
714761
PackagesFileEntry {
715762
entry: ReleaseFileEntry {
716763
path: "contrib/binary-all/Packages.xz",
717-
digest: "706c840235798e098d4d6013d1dabbc967f894d0ffa02c92ac959dcea85ddf54",
764+
digest: ReleaseFileDigest::Sha256(
765+
"706c840235798e098d4d6013d1dabbc967f894d0ffa02c92ac959dcea85ddf54"
766+
),
718767
size: 23912,
719768
},
720769
component: "contrib".into(),
@@ -735,7 +784,9 @@ mod test {
735784
PackagesFileEntry {
736785
entry: ReleaseFileEntry {
737786
path: "contrib/debian-installer/binary-all/Packages",
738-
digest: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
787+
digest: ReleaseFileDigest::Sha256(
788+
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
789+
),
739790
size: 0,
740791
},
741792
component: "contrib".into(),

0 commit comments

Comments
 (0)