Add option to ignore filepaths matching a pattern
authorSiraaj Khandkar <siraaj@khandkar.net>
Sun, 18 Nov 2018 17:44:04 +0000 (12:44 -0500)
committerSiraaj Khandkar <siraaj@khandkar.net>
Sun, 18 Nov 2018 17:44:04 +0000 (12:44 -0500)
Makefile
dups.ml

index 13520a8..2807b9b 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -8,7 +8,7 @@ all:
        @$(MAKE) -s build
 
 build:
        @$(MAKE) -s build
 
 build:
-       @ocamlbuild -cflags '-w A' -pkg 'unix' $(EXE_NAME).$(EXE_TYPE)
+       @ocamlbuild -cflags '-w A' -pkgs 'str,unix' $(EXE_NAME).$(EXE_TYPE)
        @cp _build/$(EXE_NAME).$(EXE_TYPE) $(EXE_NAME)
        @rm -f $(EXE_NAME).$(EXE_TYPE)
 
        @cp _build/$(EXE_NAME).$(EXE_TYPE) $(EXE_NAME)
        @rm -f $(EXE_NAME).$(EXE_TYPE)
 
diff --git a/dups.ml b/dups.ml
index 67a4fd3..697894d 100644 (file)
--- a/dups.ml
+++ b/dups.ml
@@ -108,14 +108,13 @@ let make_output_fun = function
         );
         close_out oc
 
         );
         close_out oc
 
-let main input output =
+let main input output ignore =
   let output = make_output_fun  output in
   let input  = make_input_stream input in
   let paths_by_digest = Hashtbl.create 1_000_000 in
   let path_count = ref 0 in
   let t0 = Sys.time () in
   let output = make_output_fun  output in
   let input  = make_input_stream input in
   let paths_by_digest = Hashtbl.create 1_000_000 in
   let path_count = ref 0 in
   let t0 = Sys.time () in
-  Stream.iter input ~f:(fun path ->
-    incr path_count;
+  let process path =
     try
       let digest = Digest.file path in
       let count, paths =
     try
       let digest = Digest.file path in
       let count, paths =
@@ -128,6 +127,14 @@ let main input output =
       Hashtbl.replace paths_by_digest digest (count + 1, StrSet.add path paths)
     with Sys_error e ->
       eprintf "WARNING: Failed to process %S: %S\n%!" path e
       Hashtbl.replace paths_by_digest digest (count + 1, StrSet.add path paths)
     with Sys_error e ->
       eprintf "WARNING: Failed to process %S: %S\n%!" path e
+  in
+  Stream.iter input ~f:(fun path ->
+    incr path_count;
+    match ignore with
+    | Some regexp when (Str.string_match regexp path 0) ->
+        ()
+    | Some _ | None ->
+        process path
   );
   Hashtbl.iter (fun d (n, ps) -> if n > 1 then output d n ps) paths_by_digest;
   let t1 = Sys.time () in
   );
   Hashtbl.iter (fun d (n, ps) -> if n > 1 then output d n ps) paths_by_digest;
   let t1 = Sys.time () in
@@ -136,6 +143,7 @@ let main input output =
 let () =
   let input  = ref Stdin in
   let output = ref Stdout in
 let () =
   let input  = ref Stdin in
   let output = ref Stdout in
+  let ignore = ref None in
   let assert_file_exists path =
     if Sys.file_exists path then
       ()
   let assert_file_exists path =
     if Sys.file_exists path then
       ()
@@ -161,6 +169,10 @@ let () =
         )
       , " Output to this directory instead of stdout."
       )
         )
       , " Output to this directory instead of stdout."
       )
+    ; ( "-ignore"
+      , Arg.String (fun regexp -> ignore := Some (Str.regexp regexp))
+      , " Ignore file paths which match this regexp pattern (see Str module)."
+      )
     ]
   in
   Arg.parse
     ]
   in
   Arg.parse
@@ -175,4 +187,4 @@ let () =
           input := Directories (path :: paths)
     )
     "";
           input := Directories (path :: paths)
     )
     "";
-  main !input !output
+  main !input !output !ignore
This page took 0.02195 seconds and 4 git commands to generate.