@@ -101,7 +101,18 @@ fn run_filter(args: Vec<String>) -> josh::JoshResult<i32> {
101101 . arg (
102102 clap:: Arg :: with_name ( "check-permission" )
103103 . long ( "check-permission" )
104- . short ( "c" )
104+ . short ( "c" ) ,
105+ )
106+ . arg (
107+ clap:: Arg :: with_name ( "whitelist" )
108+ . long ( "whitelist" )
109+ . short ( "w" )
110+ . takes_value ( true ) ,
111+ )
112+ . arg (
113+ clap:: Arg :: with_name ( "blacklist" )
114+ . long ( "blacklist" )
115+ . short ( "b" )
105116 . takes_value ( true ) ,
106117 )
107118 . arg ( clap:: Arg :: with_name ( "version" ) . long ( "version" ) . short ( "v" ) )
@@ -183,6 +194,7 @@ fn run_filter(args: Vec<String>) -> josh::JoshResult<i32> {
183194 josh:: filter:: parse ( & i) ?,
184195 input_ref,
185196 "refs/JOSH_TMP" ,
197+ josh:: filter:: empty ( ) ,
186198 ) ?;
187199 }
188200 }
@@ -193,12 +205,6 @@ fn run_filter(args: Vec<String>) -> josh::JoshResult<i32> {
193205 let target = update_target;
194206
195207 let reverse = args. is_present ( "reverse" ) ;
196- let check_permissions = args. is_present ( "check-permission" ) ;
197-
198- if check_permissions {
199- filterobj = josh:: filter:: chain ( josh:: filter:: parse ( ":PATHS" ) ?, filterobj) ;
200- filterobj = josh:: filter:: chain ( filterobj, josh:: filter:: parse ( ":FOLD" ) ?) ;
201- }
202208
203209 let t = if reverse {
204210 "refs/JOSH_TMP" . to_owned ( )
@@ -213,21 +219,32 @@ fn run_filter(args: Vec<String>) -> josh::JoshResult<i32> {
213219 . unwrap ( )
214220 . to_string ( ) ;
215221
216- josh:: filter_ref ( & transaction, filterobj, & src, & t) ?;
217-
218- let mut all_paths = vec ! [ ] ;
219-
222+ let check_permissions = args. is_present ( "check-permission" ) ;
223+ let mut permissions_filter = josh:: filter:: empty ( ) ;
220224 if check_permissions {
221- let result_tree = repo. find_reference ( & t) ?. peel_to_tree ( ) ?;
225+ let whitelist = match args. value_of ( "whitelist" ) {
226+ Some ( s) => josh:: filter:: parse ( s) ?,
227+ _ => josh:: filter:: nop ( ) ,
228+ } ;
229+ let blacklist = match args. value_of ( "blacklist" ) {
230+ Some ( s) => josh:: filter:: parse ( s) ?,
231+ _ => josh:: filter:: empty ( ) ,
232+ } ;
233+ permissions_filter = josh:: filter:: make_permissions_filter ( filterobj, whitelist, blacklist)
234+ }
222235
223- result_tree. walk ( git2:: TreeWalkMode :: PreOrder , |_, entry| {
224- let name = entry. name ( ) . unwrap ( ) ;
225- if name. starts_with ( "JOSH_ORIG_PATH_" ) {
226- let pathname = josh:: from_ns ( & name. replacen ( "JOSH_ORIG_PATH_" , "" , 1 ) ) ;
227- all_paths. push ( pathname) ;
228- }
229- git2:: TreeWalkResult :: Ok
230- } ) ?;
236+ let updated_refs = josh:: filter_ref (
237+ & transaction,
238+ filterobj,
239+ & src,
240+ & t,
241+ permissions_filter,
242+ ) ?;
243+ if args. value_of ( "update" ) != Some ( "FILTERED_HEAD" ) && updated_refs == 0 {
244+ println ! (
245+ "Warning: reference {} wasn't updated" ,
246+ args. value_of( "update" ) . unwrap( )
247+ ) ;
231248 }
232249
233250 #[ cfg( feature = "search" ) ]
@@ -264,39 +281,6 @@ fn run_filter(args: Vec<String>) -> josh::JoshResult<i32> {
264281 /* println!("\n Search took {:?}", duration); */
265282 }
266283
267- let mut dedup = vec ! [ ] ;
268-
269- for w in all_paths. as_slice ( ) . windows ( 2 ) {
270- if let [ a, b, ..] = w {
271- if !b. starts_with ( a) {
272- dedup. push ( a. to_owned ( ) ) ;
273- }
274- }
275- }
276-
277- let dedup = all_paths;
278-
279- let options = glob:: MatchOptions {
280- case_sensitive : true ,
281- require_literal_separator : true ,
282- require_literal_leading_dot : true ,
283- } ;
284-
285- if let Some ( cp) = args. value_of ( "check-permission" ) {
286- let pattern = glob:: Pattern :: new ( cp) ?;
287-
288- let mut allowed = !dedup. is_empty ( ) ;
289- for d in dedup. iter ( ) {
290- let d = std:: path:: PathBuf :: from ( d) ;
291- let m = pattern. matches_path_with ( & d, options) ;
292- if !m {
293- allowed = false ;
294- println ! ( "missing permission for: {:?}" , & d) ;
295- }
296- }
297- println ! ( "Allowed = {:?}" , allowed) ;
298- }
299-
300284 if reverse {
301285 let new = repo. revparse_single ( target) . unwrap ( ) . id ( ) ;
302286 let old = repo. revparse_single ( "JOSH_TMP" ) . unwrap ( ) . id ( ) ;
0 commit comments