Skip to content

Commit 780b639

Browse files
Cleanup :rev filter code
Improve style and reduce duplication
1 parent bbc9cea commit 780b639

3 files changed

Lines changed: 28 additions & 60 deletions

File tree

‎josh-core/src/filter/mod.rs‎

Lines changed: 15 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -221,8 +221,8 @@ fn lazy_refs2(op: &Op) -> Vec<String> {
221221
}
222222
Op::Rev(filters) => {
223223
let mut lr = lazy_refs2(&Op::Compose(filters.iter().map(|(_, _, f)| *f).collect()));
224-
lr.extend(filters.iter().filter_map(|(_, x, _)| {
225-
if let LazyRef::Lazy(s) = x {
224+
lr.extend(filters.iter().filter_map(|(_, nested, _)| {
225+
if let LazyRef::Lazy(s) = nested {
226226
Some(s.to_owned())
227227
} else {
228228
None
@@ -234,8 +234,8 @@ fn lazy_refs2(op: &Op) -> Vec<String> {
234234
}
235235
Op::Squash(Some(revs)) => {
236236
let mut lr = vec![];
237-
lr.extend(revs.keys().filter_map(|x| {
238-
if let LazyRef::Lazy(s) = x {
237+
lr.extend(revs.keys().filter_map(|nested| {
238+
if let LazyRef::Lazy(s) = nested {
239239
Some(s.to_owned())
240240
} else {
241241
None
@@ -466,55 +466,30 @@ fn get_rev_filter(
466466

467467
// First match wins - iterate in order
468468
for (match_op, filter_tip_ref, startfilter) in filters.iter() {
469+
let filter_tip = if let LazyRef::Resolved(filter_tip) = filter_tip_ref {
470+
filter_tip
471+
} else {
472+
return Err(josh_error("unresolved lazy ref"));
473+
};
474+
if match_op != &RevMatch::Default && !transaction.repo().odb()?.exists(*filter_tip) {
475+
return Err(josh_error(&format!(
476+
"`:rev(...)` with nonexistent OID: {}",
477+
filter_tip
478+
)));
479+
}
469480
let matches = match match_op {
470481
RevMatch::AncestorStrict => {
471482
// `<` - matches if commit is ancestor of tip AND commit != tip (strict)
472-
let filter_tip = if let LazyRef::Resolved(filter_tip) = filter_tip_ref {
473-
filter_tip
474-
} else {
475-
return Err(josh_error("unresolved lazy ref"));
476-
};
477-
478-
if !transaction.repo().odb()?.exists(*filter_tip) {
479-
return Err(josh_error(&format!(
480-
"`:rev(...)` with nonexistent OID: {}",
481-
filter_tip
482-
)));
483-
}
484483

485484
is_ancestor_of(transaction, commit_id, *filter_tip)? && commit_id != *filter_tip
486485
}
487486
RevMatch::AncestorInclusive => {
488487
// `<=` - matches if commit is ancestor of tip OR commit == tip (inclusive)
489-
let filter_tip = if let LazyRef::Resolved(filter_tip) = filter_tip_ref {
490-
filter_tip
491-
} else {
492-
return Err(josh_error("unresolved lazy ref"));
493-
};
494-
495-
if !transaction.repo().odb()?.exists(*filter_tip) {
496-
return Err(josh_error(&format!(
497-
"`:rev(...)` with nonexistent OID: {}",
498-
filter_tip
499-
)));
500-
}
501488

502489
is_ancestor_of(transaction, commit_id, *filter_tip)?
503490
}
504491
RevMatch::Equal => {
505492
// `==` - matches if commit == tip
506-
let filter_tip = if let LazyRef::Resolved(filter_tip) = filter_tip_ref {
507-
filter_tip
508-
} else {
509-
return Err(josh_error("unresolved lazy ref"));
510-
};
511-
512-
if !transaction.repo().odb()?.exists(*filter_tip) {
513-
return Err(josh_error(&format!(
514-
"`:rev(...)` with nonexistent OID: {}",
515-
filter_tip
516-
)));
517-
}
518493

519494
commit_id == *filter_tip
520495
}

‎josh-filter/src/persist.rs‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -924,18 +924,18 @@ fn from_tree2(repo: &git2::Repository, tree_oid: git2::Oid) -> Result<Op, String
924924
let (match_op, lazy_ref) = if key == "_" {
925925
// Default filter - no SHA needed
926926
(RevMatch::Default, LazyRef::Resolved(git2::Oid::zero()))
927-
} else if key.starts_with("<=") {
928-
let ref_str = &key[2..];
927+
} else if let Some(ref_str) = key.strip_prefix("<=") {
929928
(
930929
RevMatch::AncestorInclusive,
931930
LazyRef::parse(ref_str).map_err(|e| e)?,
932931
)
933-
} else if key.starts_with('<') {
934-
let ref_str = &key[1..];
935-
(RevMatch::AncestorStrict, LazyRef::parse(ref_str)?)
936-
} else if key.starts_with("==") {
937-
let ref_str = &key[2..];
938-
(RevMatch::Equal, LazyRef::parse(ref_str)?)
932+
} else if let Some(ref_str) = key.strip_prefix('<') {
933+
(
934+
RevMatch::AncestorStrict,
935+
LazyRef::parse(ref_str).map_err(|e| e)?,
936+
)
937+
} else if let Some(ref_str) = key.strip_prefix("==") {
938+
(RevMatch::Equal, LazyRef::parse(ref_str).map_err(|e| e)?)
939939
} else {
940940
return Err(format!(
941941
"rev: invalid key format, must start with '<', '<=', '==', or be '_': {}",

‎tests/filter/rev.t‎

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -50,18 +50,11 @@
5050
|/
5151
* 9f0db868b59a422c114df33bc6a8b2950f80490b:a087bfbdb1a5bad499b40ccd1363d30db1313f54
5252

53-
$ josh-filter -s ":rev(ffffffffffffffffffffffffffffffffffffffff:prefix=x/y)" --update refs/heads/filtered
54-
ERROR: Invalid workspace:
55-
----
56-
--> 1:6
57-
|
58-
1 | :rev(ffffffffffffffffffffffffffffffffffffffff:prefix=x/y)
59-
| ^---
60-
|
61-
= expected rev_entry
62-
63-
:rev(ffffffffffffffffffffffffffffffffffffffff:prefix=x/y)
64-
----
53+
$ josh-filter -s ":rev(==ffffffffffffffffffffffffffffffffffffffff:prefix=x/y)" --update refs/heads/filtered
54+
[5] :prefix=x
55+
[5] :prefix=y
56+
[10] sequence_number
57+
ERROR: `:rev(...)` with nonexistent OID: ffffffffffffffffffffffffffffffffffffffff
6558
[1]
6659

6760
$ josh-filter -s ":rev(975d4c4975912729482cc864d321c5196a969271:prefix=x/y)" --update refs/heads/filtered

0 commit comments

Comments
 (0)