# # patch "git.ml" # from [70d3e1cbbf278f880d0aa022142bf241adb0f8f9] # to [2d5174877cd92be4f90003777cb2cabd2f243047] # # patch "subprocess.ml" # from [e047bb5bcd5ea674256397d3f8ea0b5c2ce3f919] # to [108e578184541d73e6e98b98624c5bdaf4de0134] # # patch "subprocess.mli" # from [b509614ed2a16c4c0f88a299484cc5bb3a9adeae] # to [62bcdc81b9d9f88301f0e7b4cf99219da81ffba0] # --- git.ml +++ git.ml @@ -143,8 +143,8 @@ let ds = Filename.concat db_name ".git" in try let d, kind = - if Sys.file_exists dl then dl, `LINUS else - if Sys.file_exists ds then ds, `PASKY else failwith "unknown" in + if Sys.file_exists ds then ds, `PASKY else + if Sys.file_exists dl then dl, `LINUS else failwith "unknown" in let head = with_file_in input_channel (Filename.concat d "HEAD") in let get_commit = Viz_misc.make_cache (get_commit_object db_name) in let get_changeset = Viz_misc.make_cache (get_changeset kind db_name get_commit) in @@ -164,14 +164,18 @@ let fetch_ancestry_graph d _ = let rec proc ag id = - let c = d.get_commit id in - let node = { id = id ; - kind = if List.length c.parents > 1 then MERGE else REGULAR ; - family = List.map (fun i -> i, PARENT) c.parents } in - let n_ag = - { ag with nodes = NodeMap.add id node ag.nodes ; - ancestry = List.fold_left (fun e p -> EdgeMap.add (p, id) SAME_BRANCH e) ag.ancestry c.parents } in - List.fold_left proc n_ag c.parents in + if NodeMap.mem id ag.nodes + then ag + else begin + let c = d.get_commit id in + let node = { id = id ; + kind = if List.length c.parents > 1 then MERGE else REGULAR ; + family = List.map (fun i -> i, PARENT) c.parents } in + let n_ag = + { ag with nodes = NodeMap.add id node ag.nodes ; + ancestry = List.fold_left (fun e p -> EdgeMap.add (p, id) SAME_BRANCH e) ag.ancestry c.parents } in + List.fold_left proc n_ag c.parents + end in proc Viz_types.empty_agraph d.head @@ -227,6 +231,7 @@ status#push "Running git diff ..." ; ignore ( Subprocess.spawn_out + ~working_directory:d.base ~encoding:`LOCALE ~cmd ~reap_callback:status#pop (fun ~exceptions ~stdout ~stderr status -> --- subprocess.ml +++ subprocess.ml @@ -131,7 +131,7 @@ mutable status : int ; } -let spawn encoding input_opt cmd reap_callback done_callback = +let spawn ?working_directory encoding input_opt cmd reap_callback done_callback = let has_input = input_opt <> None in let spawn_flags = [ `PIPE_STDOUT ; `PIPE_STDERR ; @@ -139,7 +139,8 @@ let child_info = Gspawn.async_with_pipes - (if has_input then `PIPE_STDIN :: spawn_flags else spawn_flags) + ?working_directory + ~flags:(if has_input then `PIPE_STDIN :: spawn_flags else spawn_flags) cmd in let state = { watches = [] ; aborted = false ; status = -1 } in @@ -205,11 +206,11 @@ int -> unit (* spawn a process and grab its stdout and stderr *) -let spawn_out ~encoding ~cmd ~reap_callback done_callback = +let spawn_out ?working_directory ~encoding ~cmd ~reap_callback done_callback = spawn encoding None cmd reap_callback done_callback (* spawn a process, feed it a string and grab its stdout and stderr *) -let spawn_inout ~encoding ~cmd ~input ~reap_callback done_callback = +let spawn_inout ?working_directory ~encoding ~cmd ~input ~reap_callback done_callback = spawn encoding (Some input) cmd reap_callback done_callback let abort sub_data = --- subprocess.mli +++ subprocess.mli @@ -9,12 +9,14 @@ int -> unit val spawn_out : + ?working_directory:string -> encoding:encoding -> cmd:string list -> reap_callback:(unit -> unit) -> callback -> t val spawn_inout : + ?working_directory:string -> encoding:encoding -> cmd:string list -> input:string ->