@@ -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,14 @@ fn lazy_refs2(op: &Op) -> Vec<String> {
441443 av
442444 }
443445 Op :: Rev ( filters) => lazy_refs2 ( & Op :: Join ( filters. clone ( ) ) ) ,
446+ Op :: HistoryConcat ( r, f) => {
447+ let mut lr = Vec :: new ( ) ;
448+ if let LazyRef :: Lazy ( s) = r {
449+ lr. push ( s. to_owned ( ) ) ;
450+ }
451+ lr. append ( & mut lazy_refs ( * f) ) ;
452+ lr
453+ }
444454 Op :: Join ( filters) => {
445455 let mut lr = lazy_refs2 ( & Op :: Compose ( filters. values ( ) . copied ( ) . collect ( ) ) ) ;
446456 lr. extend ( filters. keys ( ) . filter_map ( |x| {
@@ -501,6 +511,19 @@ fn resolve_refs2(refs: &std::collections::HashMap<String, git2::Oid>, op: &Op) -
501511 . collect ( ) ;
502512 Op :: Rev ( lr)
503513 }
514+ Op :: HistoryConcat ( r, filter) => {
515+ let f = resolve_refs ( refs, * filter) ;
516+ let resolved_ref = if let LazyRef :: Lazy ( s) = r {
517+ if let Some ( res) = refs. get ( s) {
518+ LazyRef :: Resolved ( * res)
519+ } else {
520+ r. clone ( )
521+ }
522+ } else {
523+ r. clone ( )
524+ } ;
525+ Op :: HistoryConcat ( resolved_ref, f)
526+ }
504527 Op :: Join ( filters) => {
505528 let lr = filters
506529 . iter ( )
@@ -658,6 +681,9 @@ fn spec2(op: &Op) -> String {
658681 Op :: Message ( m, r) => {
659682 format ! ( ":{};{}" , parse:: quote( m) , parse:: quote( r. as_str( ) ) )
660683 }
684+ Op :: HistoryConcat ( r, filter) => {
685+ format ! ( ":concat({}{})" , r. to_string( ) , spec( * filter) )
686+ }
661687 Op :: Hook ( hook) => {
662688 format ! ( ":hook={}" , parse:: quote( hook) )
663689 }
@@ -1113,6 +1139,19 @@ fn apply_to_commit2(
11131139
11141140 return per_rev_filter ( transaction, commit, filter, commit_filter, parent_filters) ;
11151141 }
1142+ Op :: HistoryConcat ( r, f) => {
1143+ if let LazyRef :: Resolved ( c) = r {
1144+ let a = apply_to_commit2 ( & to_op ( * f) , & repo. find_commit ( * c) ?, transaction) ?;
1145+ let a = some_or ! ( a, { return Ok ( None ) } ) ;
1146+ if commit. id ( ) == a {
1147+ transaction. insert ( filter, commit. id ( ) , * c, true ) ;
1148+ return Ok ( Some ( * c) ) ;
1149+ }
1150+ } else {
1151+ return Err ( josh_error ( "unresolved lazy ref" ) ) ;
1152+ }
1153+ Apply :: from_commit ( commit) ?
1154+ }
11161155 _ => apply ( transaction, filter, Apply :: from_commit ( commit) ?) ?,
11171156 } ;
11181157
@@ -1177,6 +1216,7 @@ fn apply2<'a>(transaction: &'a cache::Transaction, op: &Op, x: Apply<'a>) -> Jos
11771216
11781217 Ok ( x. with_message ( text:: transform_with_template ( & r, & m, & message, & hm) ?) )
11791218 }
1219+ Op :: HistoryConcat ( ..) => Ok ( x) ,
11801220 Op :: Linear => Ok ( x) ,
11811221 Op :: Prune => Ok ( x) ,
11821222 Op :: Unsign => Ok ( x) ,
0 commit comments