[Request] [+-- ] D9203: dirstate-tree: simplify the control flow in the Node.insert method
marmoute (Pierre-Yves David)
phabricator at mercurial-scm.org
Tue Oct 13 21:25:43 UTC 2020
marmoute created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.
REVISION SUMMARY
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).
REPOSITORY
rHG Mercurial
BRANCH
default
REVISION DETAIL
https://phab.mercurial-scm.org/D9203
AFFECTED FILES
rust/hg-core/src/dirstate/dirstate_tree/node.rs
CHANGE DETAILS
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 @@
// 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,
+ )
+ }
+ }
+ }
}
}
}
To: marmoute, #hg-reviewers
Cc: mercurial-patches, mercurial-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mercurial-scm.org/pipermail/mercurial-patches/attachments/20201013/81246fca/attachment-0001.html>
More information about the Mercurial-patches
mailing list