Skip to content

Commit cf40b29

Browse files
Add filter building API
1 parent 44613cf commit cf40b29

File tree

12 files changed

+292
-204
lines changed

12 files changed

+292
-204
lines changed

josh-cli/src/bin/josh-filter.rs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,9 @@ fn run_filter(args: Vec<String>) -> josh_core::JoshResult<i32> {
237237
refs.push((input_ref.clone(), reference.target().unwrap()));
238238

239239
if args.get_flag("single") {
240-
filterobj = josh_core::filter::chain(josh_core::filter::squash(None), filterobj);
240+
filterobj = josh_core::filter::Filter::new()
241+
.squash(None)
242+
.chain(filterobj);
241243
}
242244

243245
if let Some(pattern) = args.get_one::<String>("squash-pattern") {
@@ -247,11 +249,13 @@ fn run_filter(args: Vec<String>) -> josh_core::JoshResult<i32> {
247249
let target = reference.peel_to_commit()?.id();
248250
ids.push((
249251
target,
250-
josh_core::filter::message(reference.name().unwrap()),
252+
josh_core::filter::Filter::new().message(reference.name().unwrap()),
251253
));
252254
refs.push((reference.name().unwrap().to_string(), target));
253255
}
254-
filterobj = josh_core::filter::chain(josh_core::filter::squash(Some(&ids)), filterobj);
256+
filterobj = josh_core::filter::Filter::new()
257+
.squash(Some(&ids))
258+
.chain(filterobj);
255259
};
256260

257261
if let Some(filename) = args.get_one::<String>("squash-file") {
@@ -262,13 +266,15 @@ fn run_filter(args: Vec<String>) -> josh_core::JoshResult<i32> {
262266
if let [sha, name] = split.as_slice() {
263267
let target = git2::Oid::from_str(sha)?;
264268
let target = repo.find_object(target, None)?.peel_to_commit()?.id();
265-
ids.push((target, josh_core::filter::message(name)));
269+
ids.push((target, josh_core::filter::Filter::new().message(name)));
266270
refs.push((name.to_string(), target));
267271
} else if !split.is_empty() {
268272
eprintln!("Warning: malformed line: {:?}", line);
269273
}
270274
}
271-
filterobj = josh_core::filter::chain(josh_core::filter::squash(Some(&ids)), filterobj);
275+
filterobj = josh_core::filter::Filter::new()
276+
.squash(Some(&ids))
277+
.chain(filterobj);
272278
};
273279

274280
if args.get_flag("print-filter") {
@@ -329,7 +335,7 @@ fn run_filter(args: Vec<String>) -> josh_core::JoshResult<i32> {
329335
&transaction,
330336
josh_core::filter::parse(&i)?,
331337
&[(input_ref.to_string(), r.id())],
332-
josh_core::filter::empty(),
338+
josh_core::filter::Filter::new().empty(),
333339
);
334340
updated_refs[0].0 = "refs/JOSH_TMP".to_string();
335341
josh_core::update_refs(&transaction, &mut updated_refs, "");
@@ -343,7 +349,7 @@ fn run_filter(args: Vec<String>) -> josh_core::JoshResult<i32> {
343349
let reverse = args.get_flag("reverse");
344350

345351
let check_permissions = args.get_flag("check-permission");
346-
let mut permissions_filter = josh_core::filter::empty();
352+
let mut permissions_filter = josh_core::filter::Filter::new().empty();
347353
if check_permissions {
348354
let whitelist;
349355
let blacklist;
@@ -363,11 +369,11 @@ fn run_filter(args: Vec<String>) -> josh_core::JoshResult<i32> {
363369
} else {
364370
whitelist = match args.get_one::<String>("whitelist") {
365371
Some(s) => josh_core::filter::parse(s)?,
366-
_ => josh_core::filter::nop(),
372+
_ => josh_core::filter::Filter::new(),
367373
};
368374
blacklist = match args.get_one::<String>("blacklist") {
369375
Some(s) => josh_core::filter::parse(s)?,
370-
_ => josh_core::filter::empty(),
376+
_ => josh_core::filter::Filter::new().empty(),
371377
};
372378
}
373379
permissions_filter =
@@ -377,7 +383,7 @@ fn run_filter(args: Vec<String>) -> josh_core::JoshResult<i32> {
377383
let missing_permissions = args.get_flag("missing-permission");
378384
if missing_permissions {
379385
filterobj = permissions_filter;
380-
permissions_filter = josh_core::filter::empty();
386+
permissions_filter = josh_core::filter::Filter::new().empty();
381387
}
382388

383389
let old_oid = if let Ok(id) = transaction.repo().refname_to_id(target) {
@@ -412,8 +418,7 @@ fn run_filter(args: Vec<String>) -> josh_core::JoshResult<i32> {
412418
josh_core::update_refs(&transaction, &mut updated_refs, "");
413419

414420
if let Some(searchstring) = args.get_one::<String>("search") {
415-
let ifilterobj =
416-
josh_core::filter::chain(filterobj, josh_core::filter::parse(":SQUASH:INDEX")?);
421+
let ifilterobj = filterobj.chain(josh_core::filter::parse(":SQUASH:INDEX")?);
417422

418423
let max_complexity: usize = args
419424
.get_one::<String>("max_comp")

josh-cli/src/bin/josh.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ fn apply_josh_filtering(
387387
&transaction,
388388
filterobj,
389389
&input_refs,
390-
josh_core::filter::empty(),
390+
josh_core::filter::Filter::new().empty(),
391391
);
392392

393393
// Check for errors
@@ -750,7 +750,7 @@ fn handle_push(args: &PushArgs, transaction: &josh_core::cache::Transaction) ->
750750
&transaction,
751751
filter,
752752
&[(josh_remote_ref.clone(), josh_remote_oid)],
753-
josh_core::filter::empty(),
753+
josh_core::filter::Filter::new().empty(),
754754
);
755755

756756
// Check for errors
@@ -990,7 +990,7 @@ fn handle_link_add(
990990
transaction,
991991
link_filter,
992992
new_commit,
993-
josh_core::filter::empty(),
993+
josh_core::filter::Filter::new().empty(),
994994
)
995995
.map_err(from_josh_err)
996996
.context("Failed to apply :link filter")?;
@@ -1157,7 +1157,7 @@ fn handle_link_fetch(
11571157
transaction,
11581158
link_filter,
11591159
new_commit,
1160-
josh_core::filter::empty(),
1160+
josh_core::filter::Filter::new().empty(),
11611161
)
11621162
.map_err(from_josh_err)
11631163
.context("Failed to apply :link filter")?;

josh-core/src/build.rs

Lines changed: 2 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,9 @@
1-
use crate::filter::op::{LazyRef, Op};
1+
use crate::filter::Filter;
2+
use crate::filter::op::Op;
23
use crate::filter::opt;
34
use crate::filter::persist::to_filter;
4-
use crate::filter::{Filter, MESSAGE_MATCH_ALL_REGEX};
5-
6-
/// Create a no-op filter that passes everything through unchanged
7-
pub fn nop() -> Filter {
8-
to_filter(Op::Nop)
9-
}
10-
11-
/// Create an empty filter that matches nothing
12-
pub fn empty() -> Filter {
13-
to_filter(Op::Empty)
14-
}
15-
16-
/// Create a message filter that transforms commit messages
17-
pub fn message(m: &str) -> Filter {
18-
to_filter(Op::Message(m.to_string(), MESSAGE_MATCH_ALL_REGEX.clone()))
19-
}
20-
21-
/// Create a file filter that selects a single file
22-
pub fn file(path: impl Into<std::path::PathBuf>) -> Filter {
23-
let p = path.into();
24-
to_filter(Op::File(p.clone(), p))
25-
}
26-
27-
/// Create a hook filter
28-
pub fn hook(h: &str) -> Filter {
29-
to_filter(Op::Hook(h.to_string()))
30-
}
31-
32-
/// Create a squash filter
33-
pub fn squash(ids: Option<&[(git2::Oid, Filter)]>) -> Filter {
34-
if let Some(ids) = ids {
35-
to_filter(Op::Squash(Some(
36-
ids.iter()
37-
.map(|(x, y)| (LazyRef::Resolved(*x), *y))
38-
.collect(),
39-
)))
40-
} else {
41-
to_filter(Op::Squash(None))
42-
}
43-
}
44-
45-
/// Create a filter that is the result of feeding the output of `first` into `second`
46-
pub fn chain(first: Filter, second: Filter) -> Filter {
47-
opt::optimize(to_filter(Op::Chain(vec![first, second])))
48-
}
495

506
/// Create a filter that is the result of overlaying the output of `first` onto `second`
517
pub fn compose(first: Filter, second: Filter) -> Filter {
528
opt::optimize(to_filter(Op::Compose(vec![first, second])))
539
}
54-
55-
/// Create a sequence_number filter used for tracking commit sequence numbers
56-
pub fn sequence_number() -> Filter {
57-
Filter::from_oid(git2::Oid::zero())
58-
}

josh-core/src/cache/cache.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,7 @@ impl Transaction {
409409
}
410410

411411
fn get2(&self, filter: crate::filter::Filter, from: git2::Oid) -> Option<git2::Oid> {
412-
if filter == crate::filter::nop() {
412+
if filter.is_nop() {
413413
return Some(from);
414414
}
415415
let sequence_number = if filter != crate::filter::sequence_number() {

0 commit comments

Comments
 (0)