Skip to content

Commit 1dbce07

Browse files
Add filter building API
1 parent 9535c2a commit 1dbce07

File tree

12 files changed

+288
-204
lines changed

12 files changed

+288
-204
lines changed

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

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

228228
if args.get_flag("single") {
229-
filterobj = josh_core::filter::chain(josh_core::filter::squash(None), filterobj);
229+
filterobj = josh_core::filter::Filter::new()
230+
.squash(None)
231+
.chain(filterobj);
230232
}
231233

232234
if let Some(pattern) = args.get_one::<String>("squash-pattern") {
@@ -236,11 +238,13 @@ fn run_filter(args: Vec<String>) -> josh_core::JoshResult<i32> {
236238
let target = reference.peel_to_commit()?.id();
237239
ids.push((
238240
target,
239-
josh_core::filter::message(reference.name().unwrap()),
241+
josh_core::filter::Filter::new().message(reference.name().unwrap()),
240242
));
241243
refs.push((reference.name().unwrap().to_string(), target));
242244
}
243-
filterobj = josh_core::filter::chain(josh_core::filter::squash(Some(&ids)), filterobj);
245+
filterobj = josh_core::filter::Filter::new()
246+
.squash(Some(&ids))
247+
.chain(filterobj);
244248
};
245249

246250
if let Some(filename) = args.get_one::<String>("squash-file") {
@@ -251,13 +255,15 @@ fn run_filter(args: Vec<String>) -> josh_core::JoshResult<i32> {
251255
if let [sha, name] = split.as_slice() {
252256
let target = git2::Oid::from_str(sha)?;
253257
let target = repo.find_object(target, None)?.peel_to_commit()?.id();
254-
ids.push((target, josh_core::filter::message(name)));
258+
ids.push((target, josh_core::filter::Filter::new().message(name)));
255259
refs.push((name.to_string(), target));
256260
} else if !split.is_empty() {
257261
eprintln!("Warning: malformed line: {:?}", line);
258262
}
259263
}
260-
filterobj = josh_core::filter::chain(josh_core::filter::squash(Some(&ids)), filterobj);
264+
filterobj = josh_core::filter::Filter::new()
265+
.squash(Some(&ids))
266+
.chain(filterobj);
261267
};
262268

263269
if args.get_flag("print-filter") {
@@ -318,7 +324,7 @@ fn run_filter(args: Vec<String>) -> josh_core::JoshResult<i32> {
318324
&transaction,
319325
josh_core::filter::parse(&i)?,
320326
&[(input_ref.to_string(), r.id())],
321-
josh_core::filter::empty(),
327+
josh_core::filter::Filter::new().empty(),
322328
);
323329
updated_refs[0].0 = "refs/JOSH_TMP".to_string();
324330
josh_core::update_refs(&transaction, &mut updated_refs, "");
@@ -332,7 +338,7 @@ fn run_filter(args: Vec<String>) -> josh_core::JoshResult<i32> {
332338
let reverse = args.get_flag("reverse");
333339

334340
let check_permissions = args.get_flag("check-permission");
335-
let mut permissions_filter = josh_core::filter::empty();
341+
let mut permissions_filter = josh_core::filter::Filter::new().empty();
336342
if check_permissions {
337343
let whitelist;
338344
let blacklist;
@@ -352,11 +358,11 @@ fn run_filter(args: Vec<String>) -> josh_core::JoshResult<i32> {
352358
} else {
353359
whitelist = match args.get_one::<String>("whitelist") {
354360
Some(s) => josh_core::filter::parse(s)?,
355-
_ => josh_core::filter::nop(),
361+
_ => josh_core::filter::Filter::new(),
356362
};
357363
blacklist = match args.get_one::<String>("blacklist") {
358364
Some(s) => josh_core::filter::parse(s)?,
359-
_ => josh_core::filter::empty(),
365+
_ => josh_core::filter::Filter::new().empty(),
360366
};
361367
}
362368
permissions_filter =
@@ -366,7 +372,7 @@ fn run_filter(args: Vec<String>) -> josh_core::JoshResult<i32> {
366372
let missing_permissions = args.get_flag("missing-permission");
367373
if missing_permissions {
368374
filterobj = permissions_filter;
369-
permissions_filter = josh_core::filter::empty();
375+
permissions_filter = josh_core::filter::Filter::new().empty();
370376
}
371377

372378
let old_oid = if let Ok(id) = transaction.repo().refname_to_id(target) {
@@ -401,8 +407,7 @@ fn run_filter(args: Vec<String>) -> josh_core::JoshResult<i32> {
401407
josh_core::update_refs(&transaction, &mut updated_refs, "");
402408

403409
if let Some(searchstring) = args.get_one::<String>("search") {
404-
let ifilterobj =
405-
josh_core::filter::chain(filterobj, josh_core::filter::parse(":SQUASH:INDEX")?);
410+
let ifilterobj = filterobj.chain(josh_core::filter::parse(":SQUASH:INDEX")?);
406411

407412
let max_complexity: usize = args
408413
.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
@@ -386,7 +386,7 @@ fn apply_josh_filtering(
386386
&transaction,
387387
filterobj,
388388
&input_refs,
389-
josh_core::filter::empty(),
389+
josh_core::filter::Filter::new().empty(),
390390
);
391391

392392
// Check for errors
@@ -749,7 +749,7 @@ fn handle_push(args: &PushArgs, transaction: &josh_core::cache::Transaction) ->
749749
&transaction,
750750
filter,
751751
&[(josh_remote_ref.clone(), josh_remote_oid)],
752-
josh_core::filter::empty(),
752+
josh_core::filter::Filter::new().empty(),
753753
);
754754

755755
// Check for errors
@@ -989,7 +989,7 @@ fn handle_link_add(
989989
transaction,
990990
link_filter,
991991
new_commit,
992-
josh_core::filter::empty(),
992+
josh_core::filter::Filter::new().empty(),
993993
)
994994
.map_err(from_josh_err)
995995
.context("Failed to apply :link filter")?;
@@ -1156,7 +1156,7 @@ fn handle_link_fetch(
11561156
transaction,
11571157
link_filter,
11581158
new_commit,
1159-
josh_core::filter::empty(),
1159+
josh_core::filter::Filter::new().empty(),
11601160
)
11611161
.map_err(from_josh_err)
11621162
.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 == crate::filter::Filter::new() {
413413
return Some(from);
414414
}
415415
let sequence_number = if filter != crate::filter::sequence_number() {

0 commit comments

Comments
 (0)