package comby

  1. Overview
  2. Docs
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source

Source file ripgrep.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
open Core
open Lwt

let debug =
  Sys.getenv "DEBUG_COMBY"
  |> Option.is_some

let run ~pattern ~args =
  let options = ["--files-with-matches"; "--multiline"] in
  let pattern = Format.sprintf {|'%s'|} pattern in
  let command = ("rg" :: options @ args @ [pattern]) |> String.concat ~sep:" " in
  if debug then Format.printf "Executing: %s@." command;
  let lwt_command = Lwt_process.shell command in
  let recv proc =
    let ic = proc#stdout in
    Lwt.finalize
      (fun () -> Lwt_io.read ic)
      (fun () -> Lwt_io.close ic)
  in
  let f () =
    Lwt_process.with_process_in lwt_command (fun proc ->
        recv proc >>= fun result ->
        proc#status >>= function
        | WEXITED v when v = 1 -> return (Ok None) (* no matches *)
        | WEXITED v when v <> 0 -> return @@ Or_error.errorf "Error executing rg, exit status %d." v
        | _ -> return (Ok (Some (String.split ~on:'\n' result |> List.filter ~f:(String.(<>) "")))))
  in
  try Lwt_main.run (f ()) with Sys.Break -> exit 0
OCaml

Innovation. Community. Security.