# HG changeset patch # User Simon Sapin # Date 1621422900 -7200 # Node ID ce41ee53263f06fd5e056f8b2861ed01fe0d1432 # Parent 6763913fa1754bf2ab1c634f8c829e2360fd6a21 dirstate-tree: Extract into a method sorting children of a given node A later changset will use this in another place. This is an associated function (that Python would call static method) instead of a free function so it doesn’t need to be imported separately. It’s on `Node` rather than `ChildNodes` because the latter is a type alias to an external type (`HashMap`) so that would require an extension trait which needs to be imported separately. Differential Revision: https://phab.mercurial-scm.org/D10721 diff -r 6763913fa175 -r ce41ee53263f rust/hg-core/src/dirstate_tree/dirstate_map.rs --- a/rust/hg-core/src/dirstate_tree/dirstate_map.rs Wed May 19 13:15:00 2021 +0200 +++ b/rust/hg-core/src/dirstate_tree/dirstate_map.rs Wed May 19 13:15:00 2021 +0200 @@ -45,10 +45,11 @@ /// Using a plain `HgPathBuf` of the full path from the repository root as a /// map key would also work: all paths in a given map have the same parent /// path, so comparing full paths gives the same result as comparing base -/// names. However `BTreeMap` would waste time always re-comparing the same +/// names. However `HashMap` would waste time always re-hashing the same /// string prefix. +pub(super) type NodeKey<'on_disk> = WithBasename>; pub(super) type ChildNodes<'on_disk> = - FastHashMap>, Node<'on_disk>>; + FastHashMap, Node<'on_disk>>; /// Represents a file or a directory #[derive(Default)] @@ -64,10 +65,20 @@ tracked_descendants_count: usize, } -impl Node<'_> { +impl<'on_disk> Node<'on_disk> { pub(super) fn state(&self) -> Option { self.entry.as_ref().map(|entry| entry.state) } + + pub(super) fn sorted<'tree>( + nodes: &'tree mut ChildNodes<'on_disk>, + ) -> Vec<(&'tree NodeKey<'on_disk>, &'tree mut Self)> { + let mut vec: Vec<_> = nodes.iter_mut().collect(); + // `sort_unstable_by_key` doesn’t allow keys borrowing from the value: + // https://github.com/rust-lang/rust/issues/34162 + vec.sort_unstable_by(|(path1, _), (path2, _)| path1.cmp(path2)); + vec + } } /// `(full_path, entry, copy_source)` diff -r 6763913fa175 -r ce41ee53263f rust/hg-core/src/dirstate_tree/status.rs --- a/rust/hg-core/src/dirstate_tree/status.rs Wed May 19 13:15:00 2021 +0200 +++ b/rust/hg-core/src/dirstate_tree/status.rs Wed May 19 13:15:00 2021 +0200 @@ -110,11 +110,9 @@ // `merge_join_by` requires both its input iterators to be sorted: - let mut dirstate_nodes: Vec<_> = dirstate_nodes.iter_mut().collect(); + let dirstate_nodes = Node::sorted(dirstate_nodes); // `sort_unstable_by_key` doesn’t allow keys borrowing from the value: // https://github.com/rust-lang/rust/issues/34162 - dirstate_nodes - .sort_unstable_by(|(path1, _), (path2, _)| path1.cmp(path2)); fs_entries.sort_unstable_by(|e1, e2| e1.base_name.cmp(&e2.base_name)); itertools::merge_join_by(