* gnu/packages/patches/ocaml-enable-ocamldoc-reproducibility.patch: New file. * gnu/packages/ocaml.scm (ocaml)[origin]: Use it. * gnu/local.mk (dist_patch_DATA): Add it.
		
			
				
	
	
		
			149 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From a87c3f20e846c00e53d695497dba7038edbd12f0 Mon Sep 17 00:00:00 2001
 | |
| From: Valentin Lorentz <progval@progval.net>
 | |
| Date: Thu, 13 Aug 2015 11:59:04 +0200
 | |
| Subject: [PATCH] Enable ocamldoc to build reproducible manpages
 | |
| 
 | |
| Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=794586
 | |
| Signed-off-by: Stephane Glondu <steph@glondu.net>
 | |
| ---
 | |
|  ocamldoc/odoc_man.ml   | 15 +++++----------
 | |
|  ocamldoc/odoc_misc.ml  | 12 ++++++++++--
 | |
|  ocamldoc/odoc_misc.mli |  7 ++++++-
 | |
|  3 files changed, 21 insertions(+), 13 deletions(-)
 | |
| 
 | |
| diff --git a/ocamldoc/odoc_man.ml b/ocamldoc/odoc_man.ml
 | |
| index 615c5e172..3c85aa32a 100644
 | |
| --- a/ocamldoc/odoc_man.ml
 | |
| +++ b/ocamldoc/odoc_man.ml
 | |
| @@ -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");
 | |
|  
 | |
| @@ -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");
 | |
|  
 | |
| @@ -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");
 | |
|  
 | |
| @@ -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");
 | |
|  
 | |
| @@ -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";
 | |
| diff --git a/ocamldoc/odoc_misc.ml b/ocamldoc/odoc_misc.ml
 | |
| index 4c74476da..456225f62 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 dd5a7fcb9..38ff0612b 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],
 | |
| -- 
 | |
| 2.17.1
 | |
| 
 |