Source file commandSearch.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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
open EzCompat
open Ezcmd.TYPES
open EzFile.OP
let cmd_name = "search"
let iter f =
let tested_set = ref StringSet.empty in
Misc.iter_repos ~cont:ignore
( Misc.all_repos () )
(fun ~repo ~package ~version ->
if StringSet.mem version !tested_set then
false
else
let file =
( repo // "packages" // package // version // "files" //
Globals.package_info )
in
tested_set := StringSet.add version !tested_set ;
try
if Sys.file_exists file then
EzFile.iter_lines (fun line ->
if f line then
Printf.printf "%s:%s\n%!" version line
) file ;
false
with exn ->
Printf.eprintf "warning: exception %s while searching %s\n%!"
(Printexc.to_string exn) file;
false
)
let action ~i ?anon_arg () =
let find_regexp core =
let core = if i then Re.no_case core else core in
let re = Re.compile core in
iter (fun line ->
Re.execp re line
)
in
match anon_arg with
| None -> ()
| Some s ->
find_regexp ( Re.str s )
let cmd =
let anon_arg = ref None in
let i = ref false in
Arg.{
cmd_name ;
cmd_action = (fun () ->
action
~i:!i
?anon_arg:!anon_arg
()) ;
cmd_args = [
["i"], Arg.Set i,
Ezcmd.info "Case-insensitive matching" ;
[], Anon (0, fun s -> anon_arg := Some s),
Ezcmd.info "Search string" ;
];
cmd_man = [];
cmd_doc = "Search binary packages";
}