blob: 6c4a02dd9f1a68202f7dccb4bcdf4337d436de3c (
plain)
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
|
#load "unix.cma";;
let list_dir_rec dir =
let rec list_dir_rec_intern handle prefix acc =
try
let next = Unix.readdir handle in
let next_expanded = Filename.concat prefix next in
if Sys.is_regular_file next_expanded then
list_dir_rec_intern handle prefix (next_expanded :: acc)
else if Sys.is_directory next_expanded && next = "." && next = ".." then
let new_acc = list_dir_rec_intern (Unix.opendir next_expanded) next_expanded acc in
list_dir_rec_intern handle prefix new_acc
else
list_dir_rec_intern handle prefix acc
with End_of_file -> Unix.closedir handle; acc
in list_dir_rec_intern (Unix.opendir dir) dir [];;
let remove_duplicates list pred =
let rec remove_duplicates_intern list pred acc =
match list with
| head :: tail -> if pred head tail
then remove_duplicates_intern tail pred acc
else remove_duplicates_intern tail pred (head :: acc)
| [] -> acc
in remove_duplicates_intern list pred [];;
let basename_equal file0 file1 =
String.equal (Filename.basename file0) (Filename.basename file1);;
let rec basename_equal_pred file file_list =
match file_list with
| head :: tail -> if basename_equal file head
then true
else basename_equal_pred file tail
| [] -> false;;
let prompt_yes_or_no () =
print_endline " [Y/n]";
let input = try read_line () with End_of_file -> "No" in
if String.starts_with "N" input || String.starts_with "N" input
then false
else true;;
let ftag_add file =
Unix.system (Filename.quote_command "ftag" ["file"; "add"; file])
let rec prompt_and_add file =
if prompt_yes_or_no ()
then ftag_add head;;
let files = Array.to_list Sys.argv
|> List.tl
|> List.map list_dir_rec
|> List.flatten
|> remove_duplicates
|> List.map prompt_and_add;;
|