@@ -35,9 +35,14 @@ fn make_app() -> clap::Command {
3535 . default_value ( "FILTERED_HEAD" ) ,
3636 )
3737 . arg (
38- clap:: Arg :: new ( "squash" )
38+ clap:: Arg :: new ( "squash-pattern " )
3939 . help ( "Produce a history that contains only commits pointed to by references matching the given pattern" )
40- . long ( "squash" )
40+ . long ( "squash-pattern" )
41+ )
42+ . arg (
43+ clap:: Arg :: new ( "squash-file" )
44+ . help ( "Produce a history that contains only commits listed in the given file" )
45+ . long ( "squash-file" )
4146 )
4247 . arg (
4348 clap:: Arg :: new ( "author" )
@@ -172,7 +177,7 @@ fn run_filter(args: Vec<String>) -> josh::JoshResult<i32> {
172177 filterobj = josh:: filter:: chain ( josh:: filter:: squash ( None ) , filterobj) ;
173178 }
174179
175- if let Some ( pattern) = args. get_one :: < String > ( "squash" ) {
180+ if let Some ( pattern) = args. get_one :: < String > ( "squash-pattern " ) {
176181 let pattern = pattern. to_string ( ) ;
177182 for reference in repo. references_glob ( & pattern) . unwrap ( ) {
178183 let reference = reference?;
@@ -183,6 +188,23 @@ fn run_filter(args: Vec<String>) -> josh::JoshResult<i32> {
183188 filterobj = josh:: filter:: chain ( josh:: filter:: squash ( Some ( & ids) ) , filterobj) ;
184189 } ;
185190
191+ if let Some ( filename) = args. get_one :: < String > ( "squash-file" ) {
192+ let reflist = read_to_string ( filename) ?;
193+
194+ for line in reflist. lines ( ) {
195+ let split = line. split ( " " ) . collect :: < Vec < _ > > ( ) ;
196+ if let [ sha, name] = split. as_slice ( ) {
197+ let target = git2:: Oid :: from_str ( sha) ?;
198+ let target = repo. find_object ( target, None ) ?. peel_to_commit ( ) ?. id ( ) ;
199+ ids. push ( ( target, name. to_string ( ) ) ) ;
200+ refs. push ( ( name. to_string ( ) , target) ) ;
201+ } else if split. len ( ) != 0 {
202+ eprintln ! ( "Warning: malformed line: {:?}" , line) ;
203+ }
204+ }
205+ filterobj = josh:: filter:: chain ( josh:: filter:: squash ( Some ( & ids) ) , filterobj) ;
206+ } ;
207+
186208 if args. get_flag ( "print-filter" ) {
187209 let filterobj = if args. get_flag ( "reverse" ) {
188210 josh:: filter:: invert ( filterobj) ?
0 commit comments