Source

ocamlspot / compdir.ml

camlspotter 5214e6d 


















camlspotter 74e0106 


















camlspotter 5214e6d 
camlspotter 74e0106 












camlspotter 5214e6d 
camlspotter c5e6e89 

camlspotter 74e0106 

camlspotter c5e6e89 

camlspotter 5214e6d 

camlspotter 21d724d 
camlspotter 74e0106 









camlspotter 5214e6d 
camlspotter 21d724d 

camlspotter 74e0106 
camlspotter 21d724d 
camlspotter 74e0106 
camlspotter 5214e6d 
camlspotter 21d724d 

(***********************************************************************)
(*                                                                     *)
(*                            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.                                        *)
(*                                                                     *)
(***********************************************************************)

(** ocamlbuild compilation directory tweak *)

open Utils

module FP = Filepath

let rec find_dot_ocamlspot fp = 
  let open FP in
  match
    if Unix.is_dir (FP.to_string (fp ^/ "_build")) then Some (fp, "_build")
    else
      let dot_ocamlspot = fp ^/ ".ocamlspot" in
      if Sys.file_exists (FP.to_string dot_ocamlspot) then
        match (Dotfile.load (FP.to_string dot_ocamlspot)).Dotfile.build_dir with
        | Some dir -> Some (fp, dir)
        | None -> None
      else None
  with
  | (Some _ as res) -> res
  | None ->
      if FP.is_root fp then None
      else match FP.dirbase fp with
      | dir, Some _ -> find_dot_ocamlspot dir
      | _ -> None

let comp_dir fp0 =
  if not  (FP.is_absolute fp0) then fp0
  else
    match find_dot_ocamlspot fp0 with
    | None -> fp0
    | Some (dir, mv) ->
        match FP.contains_abs dir fp0 with
        | None -> fp0
        | Some postfixes ->
            match FP.contains_abs (FP.(^/) dir mv) fp0 with
            | Some _ -> fp0 (* already in the comp dir *)
            | None -> 
                (* CR jfuruse: inefficient *)
                FP.of_string (Filename.concats (FP.to_string dir :: mv :: postfixes))

let comp_dir x =
  let y = comp_dir x in
  if not (FP.equal x y) then
    Format.eprintf "comp_dir: %s => %s@." (FP.to_string x) (FP.to_string y);
  y

let comp_dir = Hashtbl.memoize (Hashtbl.create 107) comp_dir

let src_file fp0 =
  if not (FP.is_absolute fp0) then fp0
  else
    match find_dot_ocamlspot fp0 with
    | None -> fp0
    | Some (dir, mv) ->
        match FP.contains_abs (FP.(^/) dir mv) fp0 with
        | None -> fp0
        | Some postfixes -> 
            (* CR jfuruse: inefficient *)
            FP.of_string (Filename.concats (FP.to_string dir :: postfixes))

let src_file x =
  let y = src_file x in
  if not (FP.equal x y) then
    Format.eprintf "src_file: %s => %s@." (FP.to_string x) (FP.to_string y);
  y

(* No need of memoize
let src_file = Hashtbl.memoize (Hashtbl.create 107) src_file
*)
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.