@@ -317,6 +317,8 @@ enum Op {
317317 Pattern ( String ) ,
318318 Message ( String , regex:: Regex ) ,
319319
320+ HistoryConcat ( LazyRef , Filter ) ,
321+
320322 Compose ( Vec < Filter > ) ,
321323 Chain ( Filter , Filter ) ,
322324 Subtract ( Filter , Filter ) ,
@@ -441,6 +443,13 @@ fn lazy_refs2(op: &Op) -> Vec<String> {
441443 av
442444 }
443445 Op :: Rev ( filters) => lazy_refs2 ( & Op :: Join ( filters. clone ( ) ) ) ,
446+ Op :: HistoryConcat ( r, _) => {
447+ let mut lr = Vec :: new ( ) ;
448+ if let LazyRef :: Lazy ( s) = r {
449+ lr. push ( s. to_owned ( ) ) ;
450+ }
451+ lr
452+ }
444453 Op :: Join ( filters) => {
445454 let mut lr = lazy_refs2 ( & Op :: Compose ( filters. values ( ) . copied ( ) . collect ( ) ) ) ;
446455 lr. extend ( filters. keys ( ) . filter_map ( |x| {
@@ -501,6 +510,19 @@ fn resolve_refs2(refs: &std::collections::HashMap<String, git2::Oid>, op: &Op) -
501510 . collect ( ) ;
502511 Op :: Rev ( lr)
503512 }
513+ Op :: HistoryConcat ( r, filter) => {
514+ let f = resolve_refs ( refs, * filter) ;
515+ let resolved_ref = if let LazyRef :: Lazy ( s) = r {
516+ if let Some ( res) = refs. get ( s) {
517+ LazyRef :: Resolved ( * res)
518+ } else {
519+ r. clone ( )
520+ }
521+ } else {
522+ r. clone ( )
523+ } ;
524+ Op :: HistoryConcat ( resolved_ref, f)
525+ }
504526 Op :: Join ( filters) => {
505527 let lr = filters
506528 . iter ( )
@@ -658,6 +680,9 @@ fn spec2(op: &Op) -> String {
658680 Op :: Message ( m, r) => {
659681 format ! ( ":{};{}" , parse:: quote( m) , parse:: quote( r. as_str( ) ) )
660682 }
683+ Op :: HistoryConcat ( r, filter) => {
684+ format ! ( ":concat({}{})" , r. to_string( ) , spec( * filter) )
685+ }
661686 Op :: Hook ( hook) => {
662687 format ! ( ":hook={}" , parse:: quote( hook) )
663688 }
@@ -1113,6 +1138,19 @@ fn apply_to_commit2(
11131138
11141139 return per_rev_filter ( transaction, commit, filter, commit_filter, parent_filters) ;
11151140 }
1141+ Op :: HistoryConcat ( r, f) => {
1142+ if let LazyRef :: Resolved ( c) = r {
1143+ let a = apply_to_commit2 ( & to_op ( * f) , & repo. find_commit ( * c) ?, transaction) ?;
1144+ let a = some_or ! ( a, { return Ok ( None ) } ) ;
1145+ if commit. id ( ) == a {
1146+ transaction. insert ( filter, commit. id ( ) , * c, true ) ;
1147+ return Ok ( Some ( * c) ) ;
1148+ }
1149+ } else {
1150+ return Err ( josh_error ( "unresolved lazy ref" ) ) ;
1151+ }
1152+ Apply :: from_commit ( commit) ?
1153+ }
11161154 _ => apply ( transaction, filter, Apply :: from_commit ( commit) ?) ?,
11171155 } ;
11181156
@@ -1177,6 +1215,7 @@ fn apply2<'a>(transaction: &'a cache::Transaction, op: &Op, x: Apply<'a>) -> Jos
11771215
11781216 Ok ( x. with_message ( text:: transform_with_template ( & r, & m, & message, & hm) ?) )
11791217 }
1218+ Op :: HistoryConcat ( ..) => Ok ( x) ,
11801219 Op :: Linear => Ok ( x) ,
11811220 Op :: Prune => Ok ( x) ,
11821221 Op :: Unsign => Ok ( x) ,
0 commit comments