refactor(tvix/cli/refscan): use wu-manber crate with &[u8] support

PR'ed at https://github.com/tvlfyi/wu-manber/pull/1, and now merged.

Change-Id: I8c71e359196396a1d42a3ea2ab7ac15b137b2db0
Reviewed-on: https://cl.tvl.fyi/c/depot/+/8992
Tested-by: BuildkiteCI
Autosubmit: flokli <flokli@flokli.de>
Reviewed-by: raitobezarius <tvl@lahfa.xyz>
This commit is contained in:
Florian Klink 2023-07-30 00:38:55 +02:00 committed by clbot
parent aa1982c085
commit 737a6ca01e
6 changed files with 15 additions and 29 deletions

View file

@ -311,9 +311,9 @@ mod derivation_builtins {
Default::default()
} else {
let mut refscan = state.reference_scanner();
drv.arguments.iter().for_each(|s| refscan.scan_str(s));
drv.environment.values().for_each(|s| refscan.scan_bytes(s));
refscan.scan_str(&drv.builder);
drv.arguments.iter().for_each(|s| refscan.scan(s));
drv.environment.values().for_each(|s| refscan.scan(s));
refscan.scan(&drv.builder);
refscan.finalise()
}
};
@ -400,7 +400,7 @@ mod derivation_builtins {
.context("evaluating the `content` parameter of builtins.toFile")?;
let mut refscan = state.borrow().reference_scanner();
refscan.scan_str(content.as_str());
refscan.scan(content.as_str());
let refs = {
let paths = state.borrow();
refscan

View file

@ -37,29 +37,15 @@ impl<P: Clone + Ord + AsRef<[u8]>> ReferenceScanner<P> {
}
}
/// If the given &[u8] is also a valid UTF-8 string, scan for all non-
/// overlapping matches and collect them in the scanner.
/// TODO: ideally, wu-manber would just work with &[u8] directly.
pub fn scan_bytes(&mut self, haystack: &[u8]) {
if haystack.len() < STORE_PATH_LEN {
return;
}
match std::str::from_utf8(haystack) {
Ok(s) => self.scan_str(s),
Err(_) => {}
}
}
/// Scan the given str for all non-overlapping matches and collect them
/// in the scanner.
pub fn scan_str(&mut self, haystack: &str) {
if haystack.len() < STORE_PATH_LEN {
pub fn scan<S: AsRef<[u8]>>(&mut self, haystack: S) {
if haystack.as_ref().len() < STORE_PATH_LEN {
return;
}
if let Some(searcher) = &self.searcher {
for m in searcher.find(&haystack) {
for m in searcher.find(haystack) {
self.matches.push(m.pat_idx);
}
}
@ -85,7 +71,7 @@ mod tests {
fn test_no_patterns() {
let mut scanner: ReferenceScanner<String> = ReferenceScanner::new(vec![]);
scanner.scan_str(HELLO_DRV);
scanner.scan(HELLO_DRV);
let result = scanner.finalise();
@ -97,7 +83,7 @@ mod tests {
let mut scanner = ReferenceScanner::new(vec![
"/nix/store/4xw8n979xpivdc46a9ndcvyhwgif00hz-bash-5.1-p16".to_string(),
]);
scanner.scan_str(HELLO_DRV);
scanner.scan(HELLO_DRV);
let result = scanner.finalise();
@ -117,7 +103,7 @@ mod tests {
];
let mut scanner = ReferenceScanner::new(candidates.clone());
scanner.scan_str(HELLO_DRV);
scanner.scan(HELLO_DRV);
let result = scanner.finalise();
assert_eq!(result.len(), 3);