Specify and test sorting behaviour
This commit is contained in:
parent
89fd99a683
commit
f229456f88
|
@ -60,10 +60,10 @@ where
|
|||
/// - `RENAMED` -> `Modify(Name(_))`
|
||||
/// - `WRITTEN` -> `Modify(Data(_))`, `Access(Close(Write))`
|
||||
/// - `OTHERWISE_CHANGED` -> anything else
|
||||
/// - plus `COMMON_PATH` if there is a common prefix of all paths, in which case all paths are also
|
||||
/// truncated to omit that common prefix.
|
||||
/// - plus `COMMON_PATH` with the common prefix of all paths (even if there's only one path).
|
||||
///
|
||||
/// It ignores non-path events and pathed events without event kind.
|
||||
/// It ignores non-path events and pathed events without event kind. Multiple events are sorted in
|
||||
/// byte order and joined with the platform-specific path separator (`:` for unix, `;` for Windows).
|
||||
pub fn summarise_events_to_env<'events>(
|
||||
events: impl IntoIterator<Item = &'events Event>,
|
||||
) -> HashMap<&'static OsStr, OsString> {
|
||||
|
@ -141,16 +141,17 @@ pub fn summarise_events_to_env<'events>(
|
|||
|
||||
let mut res: HashMap<&'static OsStr, OsString> = grouped_buckets
|
||||
.into_iter()
|
||||
.map(|(kind, paths)| {
|
||||
.map(|(kind, mut paths)| {
|
||||
let mut joined =
|
||||
OsString::with_capacity(paths.iter().map(|p| p.len()).sum::<usize>() + paths.len());
|
||||
|
||||
for (i, path) in paths.into_iter().enumerate() {
|
||||
paths.sort();
|
||||
paths.into_iter().enumerate().for_each(|(i, path)| {
|
||||
if i > 0 {
|
||||
joined.push(ENV_SEP);
|
||||
}
|
||||
joined.push(path);
|
||||
}
|
||||
});
|
||||
|
||||
(kind, joined)
|
||||
})
|
||||
|
|
|
@ -25,12 +25,10 @@ fn ospath(path: &str) -> OsString {
|
|||
}
|
||||
|
||||
fn event(path: &str, kind: FileEventKind) -> Event {
|
||||
tracing_subscriber::fmt::try_init().ok();
|
||||
let path = dunce::canonicalize(".").unwrap().join(path);
|
||||
Event {
|
||||
tags: vec![
|
||||
Tag::Path {
|
||||
path,
|
||||
path: ospath(path).into(),
|
||||
file_type: None,
|
||||
},
|
||||
Tag::FileEventKind(kind),
|
||||
|
@ -177,9 +175,10 @@ fn single_type_multipath() {
|
|||
OsStr::new("CREATED"),
|
||||
OsString::from(
|
||||
"".to_string()
|
||||
+ "root.txt" + ENV_SEP + "sub/folder.txt"
|
||||
+ "deeper/sub/folder.txt"
|
||||
+ ENV_SEP + "dom/folder.txt"
|
||||
+ ENV_SEP + "deeper/sub/folder.txt"
|
||||
+ ENV_SEP + "root.txt" + ENV_SEP
|
||||
+ "sub/folder.txt"
|
||||
)
|
||||
),
|
||||
(OsStr::new("COMMON_PATH"), ospath("")),
|
||||
|
@ -198,7 +197,7 @@ fn single_type_divergent_paths() {
|
|||
HashMap::from([
|
||||
(
|
||||
OsStr::new("CREATED"),
|
||||
OsString::from("".to_string() + "sub/folder.txt" + ENV_SEP + "dom/folder.txt")
|
||||
OsString::from("".to_string() + "dom/folder.txt" + ENV_SEP + "sub/folder.txt")
|
||||
),
|
||||
(OsStr::new("COMMON_PATH"), ospath("")),
|
||||
])
|
||||
|
@ -234,3 +233,98 @@ fn multitype_multipath() {
|
|||
])
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn multiple_paths_in_one_event() {
|
||||
let events = vec![Event {
|
||||
tags: vec![
|
||||
Tag::Path {
|
||||
path: ospath("one.txt").into(),
|
||||
file_type: None,
|
||||
},
|
||||
Tag::Path {
|
||||
path: ospath("two.txt").into(),
|
||||
file_type: None,
|
||||
},
|
||||
Tag::FileEventKind(FileEventKind::Any),
|
||||
],
|
||||
metadata: Default::default(),
|
||||
}];
|
||||
assert_eq!(
|
||||
summarise_events_to_env(&events),
|
||||
HashMap::from([
|
||||
(
|
||||
OsStr::new("OTHERWISE_CHANGED"),
|
||||
OsString::from("".to_string() + "one.txt" + ENV_SEP + "two.txt")
|
||||
),
|
||||
(OsStr::new("COMMON_PATH"), ospath("")),
|
||||
])
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn mixed_non_paths_events() {
|
||||
let events = vec![
|
||||
event("one.txt", FileEventKind::Any),
|
||||
Event {
|
||||
tags: vec![Tag::Process(1234)],
|
||||
metadata: Default::default(),
|
||||
},
|
||||
event("two.txt", FileEventKind::Any),
|
||||
Event {
|
||||
tags: vec![Tag::FileEventKind(FileEventKind::Any)],
|
||||
metadata: Default::default(),
|
||||
},
|
||||
];
|
||||
assert_eq!(
|
||||
summarise_events_to_env(&events),
|
||||
HashMap::from([
|
||||
(
|
||||
OsStr::new("OTHERWISE_CHANGED"),
|
||||
OsString::from("".to_string() + "one.txt" + ENV_SEP + "two.txt")
|
||||
),
|
||||
(OsStr::new("COMMON_PATH"), ospath("")),
|
||||
])
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn only_non_paths_events() {
|
||||
let events = vec![
|
||||
Event {
|
||||
tags: vec![Tag::Process(1234)],
|
||||
metadata: Default::default(),
|
||||
},
|
||||
Event {
|
||||
tags: vec![Tag::FileEventKind(FileEventKind::Any)],
|
||||
metadata: Default::default(),
|
||||
},
|
||||
];
|
||||
assert_eq!(summarise_events_to_env(&events), HashMap::new());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn multipath_is_sorted() {
|
||||
let events = vec![
|
||||
event("0123.txt", FileEventKind::Any),
|
||||
event("a.txt", FileEventKind::Any),
|
||||
event("b.txt", FileEventKind::Any),
|
||||
event("c.txt", FileEventKind::Any),
|
||||
event("ᄁ.txt", FileEventKind::Any),
|
||||
];
|
||||
assert_eq!(
|
||||
summarise_events_to_env(&events),
|
||||
HashMap::from([
|
||||
(
|
||||
OsStr::new("OTHERWISE_CHANGED"),
|
||||
OsString::from(
|
||||
"".to_string()
|
||||
+ "0123.txt" + ENV_SEP + "a.txt"
|
||||
+ ENV_SEP + "b.txt" + ENV_SEP
|
||||
+ "c.txt" + ENV_SEP + "ᄁ.txt"
|
||||
)
|
||||
),
|
||||
(OsStr::new("COMMON_PATH"), ospath("")),
|
||||
])
|
||||
);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue