@@ -160,6 +160,8 @@ enum Op {
160160 Pattern ( String ) ,
161161 Message ( String ) ,
162162
163+ HistoryConcat ( LazyRef , Filter ) ,
164+
163165 Compose ( Vec < Filter > ) ,
164166 Chain ( Filter , Filter ) ,
165167 Subtract ( Filter , Filter ) ,
@@ -308,6 +310,13 @@ fn lazy_refs2(op: &Op) -> Vec<String> {
308310 av
309311 }
310312 Op :: Rev ( filters) => lazy_refs2 ( & Op :: Join ( filters. clone ( ) ) ) ,
313+ Op :: HistoryConcat ( r, _) => {
314+ let mut lr = Vec :: new ( ) ;
315+ if let LazyRef :: Lazy ( s) = r {
316+ lr. push ( s. to_owned ( ) ) ;
317+ }
318+ lr
319+ }
311320 Op :: Join ( filters) => {
312321 let mut lr = lazy_refs2 ( & Op :: Compose ( filters. values ( ) . copied ( ) . collect ( ) ) ) ;
313322 lr. extend ( filters. keys ( ) . filter_map ( |x| {
@@ -367,6 +376,19 @@ fn resolve_refs2(refs: &std::collections::HashMap<String, git2::Oid>, op: &Op) -
367376 . collect ( ) ;
368377 Op :: Rev ( lr)
369378 }
379+ Op :: HistoryConcat ( r, filter) => {
380+ let f = resolve_refs ( refs, * filter) ;
381+ let resolved_ref = if let LazyRef :: Lazy ( s) = r {
382+ if let Some ( res) = refs. get ( s) {
383+ LazyRef :: Resolved ( * res)
384+ } else {
385+ r. clone ( )
386+ }
387+ } else {
388+ r. clone ( )
389+ } ;
390+ Op :: HistoryConcat ( resolved_ref, f)
391+ }
370392 Op :: Join ( filters) => {
371393 let lr = filters
372394 . iter ( )
@@ -502,6 +524,9 @@ fn spec2(op: &Op) -> String {
502524 Op :: Message ( m) => {
503525 format ! ( ":{}" , parse:: quote( m) )
504526 }
527+ Op :: HistoryConcat ( r, filter) => {
528+ format ! ( ":concat({}{})" , r. to_string( ) , spec( * filter) )
529+ }
505530 }
506531}
507532
@@ -974,6 +999,24 @@ fn apply_to_commit2(
974999 & std:: collections:: HashMap :: < String , & dyn strfmt:: DisplayStr > :: new ( ) ,
9751000 ) ?) ,
9761001 } ,
1002+ Op :: HistoryConcat ( r, f) => {
1003+ if let LazyRef :: Resolved ( c) = r {
1004+ let a = apply_to_commit2 ( & to_op ( * f) , & repo. find_commit ( * c) ?, transaction) ?;
1005+ let a = some_or ! ( a, { return Ok ( None ) } ) ;
1006+ if commit. id ( ) == a {
1007+ transaction. insert ( filter, commit. id ( ) , * c, true ) ;
1008+ return Ok ( Some ( * c) ) ;
1009+ }
1010+ } else {
1011+ return Err ( josh_error ( "unresolved lazy ref" ) ) ;
1012+ }
1013+ RewriteData {
1014+ tree : commit. tree ( ) ?,
1015+ message : None ,
1016+ author : None ,
1017+ committer : None ,
1018+ }
1019+ }
9771020 _ => RewriteData {
9781021 tree : apply ( transaction, filter, commit. tree ( ) ?) ?,
9791022 message : None ,
@@ -1019,6 +1062,7 @@ fn apply2<'a>(
10191062 let repo = transaction. repo ( ) ;
10201063 match op {
10211064 Op :: Nop => Ok ( tree) ,
1065+ Op :: HistoryConcat ( ..) => Ok ( tree) ,
10221066 Op :: Empty => Ok ( tree:: empty ( repo) ) ,
10231067 Op :: Fold => Ok ( tree) ,
10241068 Op :: Squash ( None ) => Ok ( tree) ,
0 commit comments