@@ -101,7 +101,18 @@ fn run_filter(args: Vec<String>) -> josh::JoshResult<i32> {
101
101
. arg (
102
102
clap:: Arg :: with_name ( "check-permission" )
103
103
. 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" )
105
116
. takes_value ( true ) ,
106
117
)
107
118
. arg ( clap:: Arg :: with_name ( "version" ) . long ( "version" ) . short ( "v" ) )
@@ -183,6 +194,7 @@ fn run_filter(args: Vec<String>) -> josh::JoshResult<i32> {
183
194
josh:: filter:: parse ( & i) ?,
184
195
input_ref,
185
196
"refs/JOSH_TMP" ,
197
+ josh:: filter:: empty ( ) ,
186
198
) ?;
187
199
}
188
200
}
@@ -193,12 +205,6 @@ fn run_filter(args: Vec<String>) -> josh::JoshResult<i32> {
193
205
let target = update_target;
194
206
195
207
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
- }
202
208
203
209
let t = if reverse {
204
210
"refs/JOSH_TMP" . to_owned ( )
@@ -213,21 +219,32 @@ fn run_filter(args: Vec<String>) -> josh::JoshResult<i32> {
213
219
. unwrap ( )
214
220
. to_string ( ) ;
215
221
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 ( ) ;
220
224
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
+ }
222
235
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
+ ) ;
231
248
}
232
249
233
250
#[ cfg( feature = "search" ) ]
@@ -264,39 +281,6 @@ fn run_filter(args: Vec<String>) -> josh::JoshResult<i32> {
264
281
/* println!("\n Search took {:?}", duration); */
265
282
}
266
283
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
-
300
284
if reverse {
301
285
let new = repo. revparse_single ( target) . unwrap ( ) . id ( ) ;
302
286
let old = repo. revparse_single ( "JOSH_TMP" ) . unwrap ( ) . id ( ) ;
0 commit comments