Add support for hooks
This commit is contained in:
parent
024477dc54
commit
c937dc9183
|
@ -1,5 +1,4 @@
|
||||||
* JBUILDER - A composable build system for OCaml and Reason
|
* JBUILDER - A composable build system for OCaml and Reason
|
||||||
%%VERSION%%
|
|
||||||
|
|
||||||
Jbuilder is a build system designed for OCaml/Reason projects only. It
|
Jbuilder is a build system designed for OCaml/Reason projects only. It
|
||||||
focuses on providing the user with a consistent experience and takes
|
focuses on providing the user with a consistent experience and takes
|
||||||
|
|
12
bin/main.ml
12
bin/main.ml
|
@ -647,6 +647,18 @@ let subst =
|
||||||
; `P {|If you use topkg to handle the releases of your project, then you
|
; `P {|If you use topkg to handle the releases of your project, then you
|
||||||
should add this line to the $(b,build:) instructions in your opam file:|}
|
should add this line to the $(b,build:) instructions in your opam file:|}
|
||||||
; `Pre {| ["jbuilder" "subst" name] {pinned}|}
|
; `Pre {| ["jbuilder" "subst" name] {pinned}|}
|
||||||
|
; `S "HOOKS"
|
||||||
|
; `I ("pre_subst",
|
||||||
|
{|If a a file $(b,pkg/pre_subst_hook.ml) exists, it is evaluated before
|
||||||
|
performing the expansion.|})
|
||||||
|
; `I ("post_subst",
|
||||||
|
{|If a a file $(b,pkg/post_subst_hook.ml) exists, it is evaluated after
|
||||||
|
performing the expansion.|})
|
||||||
|
; `P ({|A typical example of $(b,pre_subst) hook is a script that adds %%|} ^
|
||||||
|
{|VERSION%%
|
||||||
|
to the README, so that the version is present in releases and you
|
||||||
|
don't get the variable unexpanded on github.
|
||||||
|
Jbuilder itself does this.|})
|
||||||
; `Blocks help_secs
|
; `Blocks help_secs
|
||||||
]
|
]
|
||||||
in
|
in
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
let split_at_first_empty_line s =
|
||||||
|
let len = String.length s in
|
||||||
|
let rec loop i =
|
||||||
|
if i + 1 >= len then
|
||||||
|
(s, "")
|
||||||
|
else if s.[i] = '\n' && s.[i + 1] = '\n' then
|
||||||
|
let i = i + 1 in
|
||||||
|
(String.sub s 0 i,
|
||||||
|
String.sub s i (len - i))
|
||||||
|
else
|
||||||
|
loop (i + 1)
|
||||||
|
in
|
||||||
|
loop 0
|
||||||
|
|
||||||
|
let () =
|
||||||
|
let ic = open_in_bin "README.org" in
|
||||||
|
let len = in_channel_length ic in
|
||||||
|
let s = really_input_string ic len in
|
||||||
|
close_in ic;
|
||||||
|
let oc = open_out_bin "README.org" in
|
||||||
|
let before, after = split_at_first_empty_line s in
|
||||||
|
Printf.fprintf oc "%s%%%%%,VERSION%%%%\n%s" before after;
|
||||||
|
close_out oc
|
|
@ -204,6 +204,19 @@ let get_name ~files ?name () =
|
||||||
die "@{<error>Error@}: cannot determine name automatically.\n\
|
die "@{<error>Error@}: cannot determine name automatically.\n\
|
||||||
You must pass a [--name] command line argument."
|
You must pass a [--name] command line argument."
|
||||||
|
|
||||||
|
let ocaml = lazy (
|
||||||
|
match Bin.which "ocaml" with
|
||||||
|
| None -> Utils.program_not_found "ocaml"
|
||||||
|
| Some p -> Path.to_string p
|
||||||
|
)
|
||||||
|
|
||||||
|
let run_hook ~files hook =
|
||||||
|
let fn = sprintf "pkg/%s_hook.ml" hook in
|
||||||
|
if List.mem fn ~set:files then
|
||||||
|
Future.run Strict (Lazy.force ocaml) [fn]
|
||||||
|
else
|
||||||
|
Future.return ()
|
||||||
|
|
||||||
let subst_git ?name () =
|
let subst_git ?name () =
|
||||||
let rev = "HEAD" in
|
let rev = "HEAD" in
|
||||||
let git =
|
let git =
|
||||||
|
@ -217,6 +230,8 @@ let subst_git ?name () =
|
||||||
(Future.run_capture Strict git ["rev-parse"; rev]))
|
(Future.run_capture Strict git ["rev-parse"; rev]))
|
||||||
(Future.run_capture_lines Strict git ["ls-tree"; "-r"; "--name-only"; rev])
|
(Future.run_capture_lines Strict git ["ls-tree"; "-r"; "--name-only"; rev])
|
||||||
>>= fun ((version, commit), files) ->
|
>>= fun ((version, commit), files) ->
|
||||||
|
run_hook "pre_subst" ~files
|
||||||
|
>>= fun () ->
|
||||||
let version = String.trim version in
|
let version = String.trim version in
|
||||||
let commit = String.trim commit in
|
let commit = String.trim commit in
|
||||||
let name = get_name ~files ?name () in
|
let name = get_name ~files ?name () in
|
||||||
|
@ -224,7 +239,7 @@ let subst_git ?name () =
|
||||||
List.iter files ~f:(fun fn ->
|
List.iter files ~f:(fun fn ->
|
||||||
if is_a_source_file fn then
|
if is_a_source_file fn then
|
||||||
subst_file fn ~map:watermarks);
|
subst_file fn ~map:watermarks);
|
||||||
Future.return ()
|
run_hook "post_subst" ~files
|
||||||
|
|
||||||
let subst ?name () =
|
let subst ?name () =
|
||||||
if Sys.file_exists ".git" then
|
if Sys.file_exists ".git" then
|
||||||
|
|
Loading…
Reference in New Issue