##// END OF EJS Templates
dirstate-v2: add test that shows a collision in ignore patterns hash...
dirstate-v2: add test that shows a collision in ignore patterns hash This hash is used for optimizing dirstate `status`. We demonstrate that the hash is incorrectly ignoring the changes to the semantics of the ignore files just because the contents (but not their source) haven't changed. This is fixed in the next changeset.

File last commit:

r48062:ebf84336 default
r50452:ca19335e stable
Show More
tests_support.rs
202 lines | 5.1 KiB | application/rls-services+xml | RustLexer
//! Supporting macros for `tests.rs` in the same directory.
//! See comments there for usage.
/// Python-like set literal
macro_rules! set {
(
$Type: ty {
$( $value: expr ),* $(,)?
}
) => {{
#[allow(unused_mut)]
let mut set = <$Type>::new();
$( set.insert($value); )*
set
}}
}
/// `{key => value}` map literal
macro_rules! map {
(
$Type: ty {
$( $key: expr => $value: expr ),* $(,)?
}
) => {{
#[allow(unused_mut)]
let mut set = <$Type>::new();
$( set.insert($key, $value); )*
set
}}
}
macro_rules! copy_source {
($rev: expr, $path: expr, $overwritten: tt) => {
CopySource {
rev: $rev,
path: $path,
overwritten: set!(OrdSet<Revision> $overwritten),
}
};
}
macro_rules! compare_value {
(
$merge_revision: expr,
$merge_case_for_dest: ident,
($min_rev: expr, $min_path: expr, $min_overwrite: tt),
($maj_rev: expr, $maj_path: expr, $maj_overwrite: tt) $(,)?
) => {
compare_value(
$merge_revision,
|| $merge_case_for_dest,
&copy_source!($min_rev, $min_path, $min_overwrite),
&copy_source!($maj_rev, $maj_path, $maj_overwrite),
)
};
}
macro_rules! tokenized_path_copies {
(
$path_map: ident, {$(
$dest: expr => (
$src_rev: expr,
$src_path: expr,
$src_overwrite: tt
)
),*}
$(,)*
) => {
map!(InternalPathCopies {$(
$path_map.tokenize(HgPath::new($dest)) =>
copy_source!(
$src_rev,
Option::map($src_path, |p: &str| {
$path_map.tokenize(HgPath::new(p))
}),
$src_overwrite
)
)*})
}
}
macro_rules! merge_case_callback {
(
$( $merge_path: expr => $merge_case: ident ),*
$(,)?
) => {
#[allow(unused)]
|merge_path| -> MergeCase {
$(
if (merge_path == HgPath::new($merge_path)) {
return $merge_case
}
)*
MergeCase::Normal
}
};
}
macro_rules! merge_copies_dict {
(
$current_merge: expr,
$minor_copies: tt,
$major_copies: tt,
$get_merge_case: tt $(,)?
) => {
{
#[allow(unused_mut)]
let mut map = TwoWayPathMap::default();
let minor = tokenized_path_copies!(map, $minor_copies);
let major = tokenized_path_copies!(map, $major_copies);
merge_copies_dict(
&map, $current_merge, minor, major,
merge_case_callback! $get_merge_case,
)
.into_iter()
.map(|(token, source)| {
(
map.untokenize(token).to_string(),
(
source.rev,
source.path.map(|t| map.untokenize(t).to_string()),
source.overwritten.into_iter().collect(),
),
)
})
.collect::<OrdMap<
String,
(Revision, Option<String>, OrdSet<Revision>)
>>()
}
};
}
macro_rules! internal_path_copies {
(
$(
$dest: expr => (
$src_rev: expr,
$src_path: expr,
$src_overwrite: tt $(,)?
)
),*
$(,)*
) => {
map!(OrdMap<_, _> {$(
String::from($dest) => (
$src_rev,
$src_path,
set!(OrdSet<Revision> $src_overwrite)
)
),*})
};
}
macro_rules! combine_changeset_copies {
(
$children_count: tt,
[
$(
{
rev: $rev: expr,
p1: $p1: expr,
p2: $p2: expr,
actions: [
$(
$Action: ident($( $action_path: expr ),+)
),*
$(,)?
],
merge_cases: $merge: tt
$(,)?
}
),*
$(,)?
],
$target_rev: expr $(,)*
) => {{
let count = map!(HashMap<Revision, usize> $children_count);
let mut combine_changeset_copies = CombineChangesetCopies::new(count);
$(
let actions = vec![$(
$Action($( HgPath::new($action_path) ),*)
),*];
combine_changeset_copies.add_revision_inner(
$rev, $p1, $p2, actions.into_iter(),
merge_case_callback! $merge
);
)*
combine_changeset_copies.finish($target_rev)
}};
}
macro_rules! path_copies {
(
$( $expected_destination: expr => $expected_source: expr ),* $(,)?
) => {
map!(PathCopies {$(
HgPath::new($expected_destination).to_owned()
=> HgPath::new($expected_source).to_owned(),
),*})
};
}