mirror of
https://github.com/martinvonz/jj.git
synced 2025-01-31 00:12:06 +00:00
cleanup: simplify some uses of Option
, mostly by using ?
This commit is contained in:
parent
3305e045ef
commit
99d2ef8883
6 changed files with 77 additions and 95 deletions
|
@ -33,8 +33,8 @@ where
|
|||
type Item = T;
|
||||
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
while !self.work.is_empty() {
|
||||
let c = self.work.pop().unwrap();
|
||||
loop {
|
||||
let c = self.work.pop()?;
|
||||
let id = (self.id_fn)(&c);
|
||||
if self.visited.contains(&id) {
|
||||
continue;
|
||||
|
@ -45,7 +45,6 @@ where
|
|||
self.visited.insert(id);
|
||||
return Some(c);
|
||||
}
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -938,7 +938,8 @@ impl<'repo> Iterator for ChildrenRevsetIterator<'_, 'repo> {
|
|||
type Item = IndexEntry<'repo>;
|
||||
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
while let Some(candidate) = self.candidate_iter.next() {
|
||||
loop {
|
||||
let candidate = self.candidate_iter.next()?;
|
||||
if candidate
|
||||
.parent_positions()
|
||||
.iter()
|
||||
|
@ -947,7 +948,6 @@ impl<'repo> Iterator for ChildrenRevsetIterator<'_, 'repo> {
|
|||
return Some(candidate);
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -294,16 +294,13 @@ impl<'revset, 'repo> Iterator for RevsetGraphIterator<'revset, 'repo> {
|
|||
type Item = (IndexEntry<'repo>, Vec<RevsetGraphEdge>);
|
||||
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
if let Some(index_entry) = self.next_index_entry() {
|
||||
let mut edges = self.edges_from_internal_commit(&index_entry);
|
||||
if self.skip_transitive_edges {
|
||||
edges = self.remove_transitive_edges(edges);
|
||||
}
|
||||
let mut edges: Vec<_> = edges.into_iter().collect();
|
||||
edges.sort_by(|edge1, edge2| edge2.target.cmp(&edge1.target));
|
||||
Some((index_entry, edges))
|
||||
} else {
|
||||
None
|
||||
let index_entry = self.next_index_entry()?;
|
||||
let mut edges = self.edges_from_internal_commit(&index_entry);
|
||||
if self.skip_transitive_edges {
|
||||
edges = self.remove_transitive_edges(edges);
|
||||
}
|
||||
let mut edges: Vec<_> = edges.into_iter().collect();
|
||||
edges.sort_by(|edge1, edge2| edge2.target.cmp(&edge1.target));
|
||||
Some((index_entry, edges))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -51,15 +51,13 @@ pub trait TableSegment {
|
|||
|
||||
fn get_value<'a>(&'a self, key: &[u8]) -> Option<&'a [u8]> {
|
||||
if let Some(value) = self.segment_get_value(key) {
|
||||
Some(value)
|
||||
} else if let Some(parent_file) = self.segment_parent_file() {
|
||||
let parent_file: &ReadonlyTable = parent_file.as_ref();
|
||||
// The parent ReadonlyIndex outlives the child
|
||||
let parent_file: &'a ReadonlyTable = unsafe { std::mem::transmute(parent_file) };
|
||||
parent_file.get_value(key)
|
||||
} else {
|
||||
None
|
||||
return Some(value);
|
||||
}
|
||||
let parent_file = self.segment_parent_file()?;
|
||||
let parent_file: &ReadonlyTable = parent_file.as_ref();
|
||||
// The parent ReadonlyIndex outlives the child
|
||||
let parent_file: &'a ReadonlyTable = unsafe { std::mem::transmute(parent_file) };
|
||||
parent_file.get_value(key)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
126
lib/src/tree.rs
126
lib/src/tree.rs
|
@ -248,24 +248,21 @@ impl Iterator for TreeEntriesIterator<'_> {
|
|||
}
|
||||
self.subdir_iterator = None;
|
||||
}
|
||||
if let Some(entry) = self.entry_iterator.next() {
|
||||
match entry.value() {
|
||||
TreeValue::Tree(id) => {
|
||||
let subtree = self.tree.known_sub_tree(entry.name(), id);
|
||||
self.subdir_iterator =
|
||||
Some(Box::new(TreeEntriesIterator::new(subtree, self.matcher)));
|
||||
let entry = self.entry_iterator.next()?;
|
||||
match entry.value() {
|
||||
TreeValue::Tree(id) => {
|
||||
let subtree = self.tree.known_sub_tree(entry.name(), id);
|
||||
self.subdir_iterator =
|
||||
Some(Box::new(TreeEntriesIterator::new(subtree, self.matcher)));
|
||||
}
|
||||
other => {
|
||||
let path = self.tree.dir().join(entry.name());
|
||||
if !self.matcher.matches(&path) {
|
||||
continue;
|
||||
}
|
||||
other => {
|
||||
let path = self.tree.dir().join(entry.name());
|
||||
if !self.matcher.matches(&path) {
|
||||
continue;
|
||||
}
|
||||
return Some((path, other.clone()));
|
||||
}
|
||||
};
|
||||
} else {
|
||||
return None;
|
||||
}
|
||||
return Some((path, other.clone()));
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -444,63 +441,58 @@ impl Iterator for TreeDiffIterator<'_> {
|
|||
}
|
||||
|
||||
// Note: whenever we say "file" below, it may also be a symlink or a conflict.
|
||||
if let Some((name, before, after)) = self.entry_iterator.next() {
|
||||
let tree_before = matches!(before, Some(TreeValue::Tree(_)));
|
||||
let tree_after = matches!(after, Some(TreeValue::Tree(_)));
|
||||
if tree_before || tree_after {
|
||||
let subdir = &name;
|
||||
let subdir_path = self.dir.join(subdir);
|
||||
let before_tree = match before {
|
||||
Some(TreeValue::Tree(id_before)) => {
|
||||
self.tree1.known_sub_tree(subdir, id_before)
|
||||
let (name, before, after) = self.entry_iterator.next()?;
|
||||
let tree_before = matches!(before, Some(TreeValue::Tree(_)));
|
||||
let tree_after = matches!(after, Some(TreeValue::Tree(_)));
|
||||
if tree_before || tree_after {
|
||||
let subdir = &name;
|
||||
let subdir_path = self.dir.join(subdir);
|
||||
let before_tree = match before {
|
||||
Some(TreeValue::Tree(id_before)) => {
|
||||
self.tree1.known_sub_tree(subdir, id_before)
|
||||
}
|
||||
_ => Tree::null(self.tree1.store().clone(), subdir_path.clone()),
|
||||
};
|
||||
let after_tree = match after {
|
||||
Some(TreeValue::Tree(id_after)) => self.tree2.known_sub_tree(subdir, id_after),
|
||||
_ => Tree::null(self.tree2.store().clone(), subdir_path.clone()),
|
||||
};
|
||||
self.subdir_iterator = Some(Box::new(TreeDiffIterator::new(
|
||||
subdir_path,
|
||||
before_tree,
|
||||
after_tree,
|
||||
self.matcher,
|
||||
)));
|
||||
}
|
||||
let file_path = self.dir.join(&name);
|
||||
if self.matcher.matches(&file_path) {
|
||||
if !tree_before && tree_after {
|
||||
if let Some(file_before) = before {
|
||||
return Some((file_path, Diff::Removed(file_before.clone())));
|
||||
}
|
||||
} else if tree_before && !tree_after {
|
||||
if let Some(file_after) = after {
|
||||
self.added_file = Some((file_path, file_after.clone()));
|
||||
}
|
||||
} else if !tree_before && !tree_after {
|
||||
match (before, after) {
|
||||
(Some(file_before), Some(file_after)) => {
|
||||
return Some((
|
||||
file_path,
|
||||
Diff::Modified(file_before.clone(), file_after.clone()),
|
||||
));
|
||||
}
|
||||
_ => Tree::null(self.tree1.store().clone(), subdir_path.clone()),
|
||||
};
|
||||
let after_tree = match after {
|
||||
Some(TreeValue::Tree(id_after)) => {
|
||||
self.tree2.known_sub_tree(subdir, id_after)
|
||||
(None, Some(file_after)) => {
|
||||
return Some((file_path, Diff::Added(file_after.clone())));
|
||||
}
|
||||
_ => Tree::null(self.tree2.store().clone(), subdir_path.clone()),
|
||||
};
|
||||
self.subdir_iterator = Some(Box::new(TreeDiffIterator::new(
|
||||
subdir_path,
|
||||
before_tree,
|
||||
after_tree,
|
||||
self.matcher,
|
||||
)));
|
||||
}
|
||||
let file_path = self.dir.join(&name);
|
||||
if self.matcher.matches(&file_path) {
|
||||
if !tree_before && tree_after {
|
||||
if let Some(file_before) = before {
|
||||
(Some(file_before), None) => {
|
||||
return Some((file_path, Diff::Removed(file_before.clone())));
|
||||
}
|
||||
} else if tree_before && !tree_after {
|
||||
if let Some(file_after) = after {
|
||||
self.added_file = Some((file_path, file_after.clone()));
|
||||
}
|
||||
} else if !tree_before && !tree_after {
|
||||
match (before, after) {
|
||||
(Some(file_before), Some(file_after)) => {
|
||||
return Some((
|
||||
file_path,
|
||||
Diff::Modified(file_before.clone(), file_after.clone()),
|
||||
));
|
||||
}
|
||||
(None, Some(file_after)) => {
|
||||
return Some((file_path, Diff::Added(file_after.clone())));
|
||||
}
|
||||
(Some(file_before), None) => {
|
||||
return Some((file_path, Diff::Removed(file_before.clone())));
|
||||
}
|
||||
(None, None) => {
|
||||
panic!("unexpected diff")
|
||||
}
|
||||
(None, None) => {
|
||||
panic!("unexpected diff")
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return None;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -251,10 +251,6 @@ fn find_jj_dir(mut workspace_root: &Path) -> Option<PathBuf> {
|
|||
if jj_path.is_dir() {
|
||||
return Some(jj_path);
|
||||
}
|
||||
if let Some(wc_dir_parent) = workspace_root.parent() {
|
||||
workspace_root = wc_dir_parent;
|
||||
} else {
|
||||
return None;
|
||||
}
|
||||
workspace_root = workspace_root.parent()?;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue