Source file munged_path.ml
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
module T = struct
type t = Vcs.Num_status.Key.t =
| One_file of Vcs.Path_in_repo.t
| Two_files of
{ src : Vcs.Path_in_repo.t
; dst : Vcs.Path_in_repo.t
}
let equal = Vcs.Num_status.Key.equal
let to_dyn = Vcs.Num_status.Key.to_dyn
let sexp_of_t = Vcs.Num_status.Key.sexp_of_t
end
include T
let parse_exn str =
match
Vcs.Private.try_with (fun () ->
match Arrow_split.split str with
| Empty -> raise_notrace (Err.E (Err.create [ Pp.text "Unexpected empty path." ]))
| More_than_two -> raise_notrace (Err.E (Err.create [ Pp.text "Too many ['=>']." ]))
| One str ->
One_file (Vcs.Path_in_repo.v str)
| Two (left, right) ->
(match String.lsplit2 left ~on:'{' with
| None ->
if
String.exists str ~f:(function
| '}' -> true
| _ -> false)
then raise_notrace (Err.E (Err.create [ Pp.text "Matching '{' not found." ]))
else
Two_files { src = Vcs.Path_in_repo.v left; dst = Vcs.Path_in_repo.v right }
| Some (prefix, left_of_arrow) ->
let right_of_arrow, suffix =
match String.rsplit2 right ~on:'}' with
| Some split -> split
| None ->
raise_notrace (Err.E (Err.create [ Pp.text "Matching '}' not found." ]))
in
Two_files
{ src = Vcs.Path_in_repo.v (prefix ^ left_of_arrow ^ suffix)
; dst = Vcs.Path_in_repo.v (prefix ^ right_of_arrow ^ suffix)
}))
with
| Ok t -> t
| Error err ->
raise
(Err.E
(Err.add_context
err
[ Err.sexp
(Sexp.List
[ Sexp.Atom "Volgo_git_backend.Munged_path.parse_exn"
; sexp_field (module String) "path" str
])
]))
;;