# HG changeset patch # User Pierre-Yves David # Date 2020-10-09 08:33:19 # Node ID ae2873e92250c255c1671a98cf1aa4b82083c632 # Parent 8719a5b684199bcdfb8e5137573e91c9f5a8a62b dirstate-tree: simplify the control flow in the Node.insert method But explicitly with the special case early, laying out the various case become simpler. (The initial motivation was to make some future lifetime error simpler). Differential Revision: https://phab.mercurial-scm.org/D9203 diff --git a/rust/hg-core/src/dirstate/dirstate_tree/node.rs b/rust/hg-core/src/dirstate/dirstate_tree/node.rs --- a/rust/hg-core/src/dirstate/dirstate_tree/node.rs +++ b/rust/hg-core/src/dirstate/dirstate_tree/node.rs @@ -60,43 +60,46 @@ impl Node { // Are we're modifying the current file ? Is the the end of the path ? let is_current_file = tail.is_empty() && head.is_empty(); - if let NodeKind::File(file) = &mut self.kind { - if is_current_file { - let new = Self { - kind: NodeKind::File(File { - entry: new_entry, - ..file.clone() - }), - }; - return InsertResult { - did_insert: false, - old_entry: Some(std::mem::replace(self, new)), - }; - } else { - match file.entry.state { - // Only replace the current file with a directory if it's - // marked as `Removed` - EntryState::Removed => { - self.kind = NodeKind::Directory(Directory { - was_file: Some(Box::from(file.clone())), - children: Default::default(), - }) - } - _ => { - return Node::insert_in_file( - file, new_entry, head, tail, - ) - } + // Potentially Replace the current file with a directory if it's marked + // as `Removed` + if !is_current_file { + if let NodeKind::File(file) = &mut self.kind { + if file.entry.state == EntryState::Removed { + self.kind = NodeKind::Directory(Directory { + was_file: Some(Box::from(file.clone())), + children: Default::default(), + }) } } } - match &mut self.kind { NodeKind::Directory(directory) => { Node::insert_in_directory(directory, new_entry, head, tail) } - NodeKind::File(_) => { - unreachable!("The file case has already been handled") + NodeKind::File(file) => { + if is_current_file { + let new = Self { + kind: NodeKind::File(File { + entry: new_entry, + ..file.clone() + }), + }; + InsertResult { + did_insert: false, + old_entry: Some(std::mem::replace(self, new)), + } + } else { + match file.entry.state { + EntryState::Removed => { + unreachable!("Removed file turning into a directory was dealt with earlier") + } + _ => { + Node::insert_in_file( + file, new_entry, head, tail, + ) + } + } + } } } }