mirage / ocaml-git

Pure OCaml Git format and protocol

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Git_index.add supports absolute file paths, but Git_index.fold throws when it traverses them

nosman opened this issue · comments

Consider this example in the top-level:

let index = Git_index.load ~hash:Git_index.SHA1 (Fpath.v "/Users/stsoucas/shadowgraph/save/.git/index") |> Result.get_ok;;
val index : Store.hash Git_index.t = <abstr>
Git_index.add ~hash:Git_index.SHA1 (Fpath.v "/Users/stsoucas/shadowgraph/save/testfile.txt") index |> Result.get_ok;; unit = ()

At this point, I can verify that testfile.txt has been added to the index with git ls-files:

git ls-files
/Users/stsoucas/shadowgraph/save/testfile.txt
Now when I do Git_index.fold:

Git_index.fold ~f:(fun e lst acc -> Lwt_result.return ()) () index;;
Exception: Invalid_argument "\"\": invalid path". Raised at Stdlib.invalid_arg in file "stdlib.ml", line 30, characters 20-45 Called from Git_index.create_graph.insert.(fun) in file "src/git-index/git_index.ml", line 586, characters 41-54 Called from Stdlib__List.fold_left in file "list.ml", line 121, characters 24-34 Called from Git_index.create_graph.insert in file "src/git-index/git_index.ml", line 582, characters 10-398 Called from Stdlib__Array.iter in file "array.ml", line 95, characters 31-48 Called from Git_index.create_graph in file "src/git-index/git_index.ml", line 599, characters 2-29 Called from Git_index.fold in file "src/git-index/git_index.ml", line 669, characters 14-28 Called from unknown location Called from Stdlib__Fun.protect in file "fun.ml", line 33, characters 8-15 Re-raised at Stdlib__Fun.protect in file "fun.ml", line 38, characters 6-52 Called from Topeval.load_lambda in file "toplevel/byte/topeval.ml", line 89, characters 4-150

Valid input should be consistent across these two functions.

Hi, sorry for the large delay.

I just pushed a new PR which add a new test and reproduce your usage with a fix here: #596
This patch breaks the API when load/make requires a root argument which is the root of the Git repository. By this way, we are able to relativize internal paths with the given root value. Tell me if this proposal fix your issue, I will happy to cut a release then 👍.