Initial stabilization #1

Merged
dzu merged 11 commits from stabilize-v1 into master 2026-02-21 04:17:06 +01:00
Showing only changes of commit 9a9032f358 - Show all commits

fix: correct directory entry handling
All checks were successful
Build and update the action / build-and-upload (push) Successful in 2m34s

- do not warn about double file if contained files are seen before the
directory itself
- do not warn about unused file if directory entry is not found
Artem Diachenko 2026-02-20 11:25:33 +00:00

View file

@ -23,7 +23,7 @@ struct Input {
key: CacheKey, key: CacheKey,
} }
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq, Clone, Copy)]
enum PathState { enum PathState {
Unused, Unused,
File, File,
@ -62,22 +62,36 @@ fn main() -> Result<()> {
entry_path.push(entry.path().context("reading entry path")?.as_ref()); entry_path.push(entry.path().context("reading entry path")?.as_ref());
if let Some(state) = paths.get_mut(&entry_path) { if let Some(state) = paths.get_mut(&entry_path) {
// exact match on one of cached paths // exact match on one of cached paths
match core::mem::replace(state, PathState::File) { let new_state = if entry.header().entry_type().is_dir() {
PathState::Unused => { PathState::Directory
} else {
PathState::File
};
// match on (old, new)
match (core::mem::replace(state, new_state), new_state) {
(PathState::Unused, _) => {
// a previously-unseen entry, unpack normally
entry.unpack(&entry_path).context("writing cache entry")?; entry.unpack(&entry_path).context("writing cache entry")?;
} }
PathState::File => { (PathState::File, PathState::File) => {
println!("warn: double file in the archive: {}", entry_path.display());
}
(PathState::Directory, PathState::Directory) => {
// entry could be marked as directory because of previous contained file entries; nothing to warn about here
}
(PathState::Directory, PathState::File) => {
println!( println!(
"warn: double entry in the archive: {}", "WARN: found a directory path that was previously assumed to be a regular file: {}",
entry_path.display() directory_path.display()
); );
} }
PathState::Directory => { (PathState::File, PathState::Directory) => {
println!( println!(
"WARN: found a regular file that was previously assumed to be a directory: {}", "WARN: found a regular file that was previously assumed to be a directory: {}",
entry_path.display() entry_path.display()
); );
} }
(_, PathState::Unused) => unreachable!(),
} }
} }
if let Some(directory) = paths.keys().find(|p| entry_path.starts_with(p)) { if let Some(directory) = paths.keys().find(|p| entry_path.starts_with(p)) {