aboutsummaryrefslogtreecommitdiff
path: root/lib/grep.ml
diff options
context:
space:
mode:
Diffstat (limited to 'lib/grep.ml')
-rw-r--r--lib/grep.ml44
1 files changed, 36 insertions, 8 deletions
diff --git a/lib/grep.ml b/lib/grep.ml
index 94b4b48..cc030d9 100644
--- a/lib/grep.ml
+++ b/lib/grep.ml
@@ -1,7 +1,6 @@
let execution_directory =
Sys.getenv_opt "STITCH_DIRECTORY" |> Option.value ~default:"/anywhere"
-
let grep_cmd = Sys.getenv_opt "STICH_GREP_CMD" |> Option.value ~default:"grep"
let tag_pattern =
@@ -134,6 +133,17 @@ let get_tagged_todo tag () =
| _ -> ""
+let split_file_name_of_grep message =
+ if String.equal message ""
+ then None
+ else (
+ let split = Str.bounded_split (Str.regexp ":[0-9]+:") message 2 in
+ match split with
+ (* file, line, content *)
+ | [ file_name; content ] -> Some (file_name, content)
+ | _ -> raise (Not_A_Tuple (String.concat " SPLIT " split, message)))
+
+
let toggle_done file_name =
let open Shexp_process in
run_calls
@@ -277,19 +287,37 @@ let parse_full_content files =
files
-let get_file_names tag =
+let rec merge_commands b =
+ let open Shexp_process.Infix in
+ match b with
+ | b :: [] -> Shexp_process.call b
+ | a :: b -> Shexp_process.call a |- merge_commands b
+ | [] -> failwith "empty"
+
+
+let get_file_names tags =
+ let rec grep_list ?(init = true) b =
+ match b with
+ | [] -> [ [ grep_cmd; "-H"; "-r"; "-n" ] ]
+ | b :: [] ->
+ if init then [ [ grep_cmd; "-H"; "-n"; "-E"; b ] ] else [ [ grep_cmd; "-E"; b ] ]
+ | b :: rest ->
+ if init
+ then [ grep_cmd; "-H"; "-n"; "-E"; b ] :: grep_list ~init:false rest
+ else [ grep_cmd; "-E"; b ] :: grep_list ~init:false rest
+ in
try
let cmd =
- let open Shexp_process in
let open Shexp_process.Infix in
- find_sort_name ()
- |- call [ "xargs"; grep_cmd; "-H"; "-r"; "-l"; "--no-messages"; "-E"; tag ]
- |- call [ "sort"; "-n"; "-r" ]
- |- read_all
+ merge_commands (grep_list tags) |- Shexp_process.read_all
in
Shexp_process.eval (Shexp_process.chdir execution_directory cmd)
|> String.split_on_char '\n'
- |> List.filter (fun s -> not (String.equal "" s))
+ |> List.map (fun grep ->
+ split_file_name_of_grep grep
+ |> Option.map (fun (file_name, _) -> file_name)
+ |> Option.value ~default:"")
+ |> List.filter (fun s -> not ("" = String.trim s))
with
| _ -> []