Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #321 from gasche/reproducible-ocamldoc
Enable ocamldoc to build reproducible manpages [debian patch]
  • Loading branch information
gasche committed Dec 12, 2015
2 parents d071da2 + a87c3f2 commit 0319173
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 13 deletions.
15 changes: 5 additions & 10 deletions ocamldoc/odoc_man.ml
Expand Up @@ -864,14 +864,13 @@ class man =
(** Generate the man page for the given class.*)
method generate_for_class cl =
Odoc_info.reset_type_names () ;
let date = Unix.time () in
let file = self#file_name cl.cl_name in
try
let chanout = self#open_out file in
let b = new_buf () in
bs b (".TH \""^cl.cl_name^"\" ");
bs b !man_section ;
bs b (" "^(Odoc_misc.string_of_date ~hour: false date)^" ");
bs b (" source: "^Odoc_misc.current_date^" ");
bs b "OCamldoc ";
bs b ("\""^(match !Global.title with Some t -> t | None -> "")^"\"\n");

Expand Down Expand Up @@ -923,14 +922,13 @@ class man =
(** Generate the man page for the given class type.*)
method generate_for_class_type ct =
Odoc_info.reset_type_names () ;
let date = Unix.time () in
let file = self#file_name ct.clt_name in
try
let chanout = self#open_out file in
let b = new_buf () in
bs b (".TH \""^ct.clt_name^"\" ");
bs b !man_section ;
bs b (" "^(Odoc_misc.string_of_date ~hour: false date)^" ");
bs b (" source: "^Odoc_misc.current_date^" ");
bs b "OCamldoc ";
bs b ("\""^(match !Global.title with Some t -> t | None -> "")^"\"\n");

Expand Down Expand Up @@ -1016,14 +1014,13 @@ class man =
(** Generate the man file for the given module type.
@raise Failure if an error occurs.*)
method generate_for_module_type mt =
let date = Unix.time () in
let file = self#file_name mt.mt_name in
try
let chanout = self#open_out file in
let b = new_buf () in
bs b (".TH \""^mt.mt_name^"\" ");
bs b !man_section ;
bs b (" "^(Odoc_misc.string_of_date ~hour: false date)^" ");
bs b (" source: "^Odoc_misc.current_date^" ");
bs b "OCamldoc ";
bs b ("\""^(match !Global.title with Some t -> t | None -> "")^"\"\n");

Expand Down Expand Up @@ -1099,14 +1096,13 @@ class man =
(** Generate the man file for the given module.
@raise Failure if an error occurs.*)
method generate_for_module m =
let date = Unix.time () in
let file = self#file_name m.m_name in
try
let chanout = self#open_out file in
let b = new_buf () in
bs b (".TH \""^m.m_name^"\" ");
bs b !man_section ;
bs b (" "^(Odoc_misc.string_of_date ~hour: false date)^" ");
bs b (" source: "^Odoc_misc.current_date^" ");
bs b "OCamldoc ";
bs b ("\""^(match !Global.title with Some t -> t | None -> "")^"\"\n");

Expand Down Expand Up @@ -1206,14 +1202,13 @@ class man =
| Res_const (_,f) -> f.vc_name
)
in
let date = Unix.time () in
let file = self#file_name name in
try
let chanout = self#open_out file in
let b = new_buf () in
bs b (".TH \""^name^"\" ");
bs b !man_section ;
bs b (" "^(Odoc_misc.string_of_date ~hour: false date)^" ");
bs b (" source: "^Odoc_misc.current_date^" ");
bs b "OCamldoc ";
bs b ("\""^(match !Global.title with Some t -> t | None -> "")^"\"\n");
bs b ".SH NAME\n";
Expand Down
12 changes: 10 additions & 2 deletions ocamldoc/odoc_misc.ml
Expand Up @@ -223,9 +223,9 @@ let apply_opt f v_opt =
None -> None
| Some v -> Some (f v)

let string_of_date ?(hour=true) d =
let string_of_date ?(absolute=false) ?(hour=true) d =
let add_0 s = if String.length s < 2 then "0"^s else s in
let t = Unix.localtime d in
let t = (if absolute then Unix.gmtime else Unix.localtime) d in
(string_of_int (t.Unix.tm_year + 1900))^"-"^
(add_0 (string_of_int (t.Unix.tm_mon + 1)))^"-"^
(add_0 (string_of_int t.Unix.tm_mday))^
Expand All @@ -238,6 +238,14 @@ let string_of_date ?(hour=true) d =
""
)

let current_date =
let time =
try
float_of_string (Sys.getenv "SOURCE_DATE_EPOCH")
with
Not_found -> Unix.time ()
in string_of_date ~absolute: true ~hour: false time


let rec text_list_concat sep l =
match l with
Expand Down
7 changes: 6 additions & 1 deletion ocamldoc/odoc_misc.mli
Expand Up @@ -62,7 +62,12 @@ val apply_opt : ('a -> 'b) -> 'a option -> 'b option

(** Return a string representing a date given as a number of seconds
since 1970. The hour is optionnaly displayed. *)
val string_of_date : ?hour:bool -> float -> string
val string_of_date : ?absolute:bool -> ?hour:bool -> float -> string

(* Value returned by string_of_date for current time.
* Uses environment variable SOURCE_DATE_EPOCH if set; falls back to
* current timestamp otherwise. *)
val current_date : string

(** Return the first sentence (until the first dot) of a text.
Don't stop in the middle of [Code], [Verbatim], [List], [Lnum],
Expand Down

0 comments on commit 0319173

Please sign in to comment.