ocamlspot / dotfile.ml

(*                                                                     *)
(*                            OCamlSpotter                             *)
(*                                                                     *)
(*                             Jun FURUSE                              *)
(*                                                                     *)
(*   Copyright 2008-2012 Jun Furuse. All rights reserved.              *)
(*   This file is distributed under the terms of the GNU Library       *)
(*   General Public License, with the special exception on linking     *)
(*   described in file LICENSE.                                        *)
(*                                                                     *)

(* module for .ocamlspot file 


      Work around for build systems which create object files to exotic places.
      If .ocamlspot is placed in a directory $DIR,
      then .cmt* files of source files under $DIR ex. $DIR/subdir/subdir/source.ml
      is searched in $DIR/dirname/subdir/subdir/.

open Utils

let name = ".ocamlspot"

let rec find absdir =
  let path = absdir ^/ name in
  if Sys.file_exists path then Some (absdir, path)
  else if absdir = "/" then None
  else find (Filename.dirname absdir)

type t = {
  build_dir : string option;

(* very strict .ini file style format *)
let split_by_equal s =
    let pos = String.index s '=' in
    let key = String.sub s 0 pos in
    let value = String.sub s (pos+1) (String.length s - pos - 1) in
    key, Some value
  | Not_found -> s, None

let load s =
  let build_dir = ref None in
  let set name ref v =
    match !ref with
    | Some _ -> failwithf "key %s is defined twice" name
    | None -> ref := Some v
  let ic = open_in s in
  let rec load () =
    let line = input_line ic in
    let key, value = split_by_equal line in
    match key, value with
    | "build_dir", Some s -> 
        set "build_dir" build_dir s;
        load ()
    | "build_dir", None -> failwithf "key %S must have a value" key
    | key, _ -> failwithf "unknown key %S" key
  try load () with End_of_file ->
    close_in ic;
    { build_dir = !build_dir }

let find_and_load absdir =
  match find absdir with
  | None -> None
  | Some (dir, path) -> Some (dir, load path)
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.