aboutsummaryrefslogtreecommitdiff
path: root/ocaml/ftag-add-dir-rec.ml
blob: 3a325b681d20fdfe1cb49280a26d52712fdfcf7b (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
57
58
59
60
61
62
63
#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 basename_equal file0 file1 =
  String.equal (Filename.basename file0) (Filename.basename file1);;

(* Check whether a file with the same basename as FILE exists in FILE_LIST. *)
let rec basename_equal_in file file_list =
  match file_list with
  | head :: tail -> if basename_equal file head
                    then true
                    else basename_equal_in file tail
  | [] -> false;;

let remove_duplicates list =
  let rec remove_duplicates_intern list acc =
    match list with
    | head :: tail -> if basename_equal_in head tail
                      then remove_duplicates_intern tail acc
                      else remove_duplicates_intern tail (head :: acc)
    | [] -> acc
  in remove_duplicates_intern list [];;

let prompt_yes_or_no () =
  print_endline " [Y/n]";
  let input = try read_line () with End_of_file -> "N" in
  if String.starts_with "N" input || String.starts_with "n" input
  then false
  else true;;

let ftag_add file =
  Filename.quote_command "ftag" ["file"; "add"; file]
  |> Unix.system
  |> ignore;;

let rec prompt_and_add file =
  Printf.printf "Add \"%s\" to ftag database ?" file;
  if prompt_yes_or_no ()
  then ftag_add file;;

print_endline "===start===";

Array.to_list Sys.argv
(* |> List.map print_endline *)
|> List.tl
|> List.map list_dir_rec
|> List.flatten
|> remove_duplicates
|> List.map prompt_and_add;;