From: Valentin Lorentz Date: Thu, 13 Aug 2015 09:59:04 +0000 (+0200) Subject: Enable ocamldoc to build reproducible manpages X-Git-Tag: archive/raspbian/4.02.3-10+rpi1~2^2~7 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=c1815f42e38e3aa59ac2d338e6745b66dd97fa83;p=ocaml.git Enable ocamldoc to build reproducible manpages Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=794586 Signed-off-by: Stephane Glondu Gbp-Pq: Name 0010-Enable-ocamldoc-to-build-reproducible-manpages.patch --- diff --git a/ocamldoc/odoc_man.ml b/ocamldoc/odoc_man.ml index e97db4bc..2170fc90 100644 --- a/ocamldoc/odoc_man.ml +++ b/ocamldoc/odoc_man.ml @@ -857,14 +857,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"); @@ -916,14 +915,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"); @@ -1009,14 +1007,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"); @@ -1092,14 +1089,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"); @@ -1199,14 +1195,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"; diff --git a/ocamldoc/odoc_misc.ml b/ocamldoc/odoc_misc.ml index e938dbe6..273a0ba3 100644 --- a/ocamldoc/odoc_misc.ml +++ b/ocamldoc/odoc_misc.ml @@ -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))^ @@ -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 diff --git a/ocamldoc/odoc_misc.mli b/ocamldoc/odoc_misc.mli index 5958be91..4fe26472 100644 --- a/ocamldoc/odoc_misc.mli +++ b/ocamldoc/odoc_misc.mli @@ -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],