[Pkg-ocaml-maint-commits] r6295 - /trunk/tools/ocaml_transition_monitor/ocaml_transition_monitor.mll
glondu-guest at users.alioth.debian.org
glondu-guest at users.alioth.debian.org
Sun Mar 1 16:33:32 UTC 2009
Author: glondu-guest
Date: Sun Mar 1 16:33:32 2009
New Revision: 6295
URL: http://svn.debian.org/wsvn/?sc=1&rev=6295
Log:
Refactoring to uncouple computations and XHTML generation
Modified:
trunk/tools/ocaml_transition_monitor/ocaml_transition_monitor.mll
Modified: trunk/tools/ocaml_transition_monitor/ocaml_transition_monitor.mll
URL: http://svn.debian.org/wsvn/trunk/tools/ocaml_transition_monitor/ocaml_transition_monitor.mll?rev=6295&op=diff
==============================================================================
--- trunk/tools/ocaml_transition_monitor/ocaml_transition_monitor.mll (original)
+++ trunk/tools/ocaml_transition_monitor/ocaml_transition_monitor.mll Sun Mar 1 16:33:32 2009
@@ -81,6 +81,27 @@
end
module Topological = Graph.Topological.Make(G)
+
+ let with_in_file file f =
+ let chan = open_in_bin file in
+ try
+ let res = f chan in
+ close_in chan; res
+ with e -> close_in chan; raise e
+
+ let with_out_file file f =
+ let chan = open_out_bin file in
+ try
+ let res = f chan in
+ close_out chan; res
+ with e -> close_out chan; raise e
+
+ let get_rfc2822_date () =
+ let chan = Unix.open_process_in "date -R" in
+ let r = input_line chan in
+ match Unix.close_process_in chan with
+ | Unix.WEXITED 0 -> r
+ | _ -> failwith "unexpected return of date"
}
let name = ['A'-'Z' 'a'-'z' '0'-'9' '-' '.' ':' '~' '+']+
@@ -141,7 +162,7 @@
@return a [S.t M.t] mapping source packages to their build-dependencies
in terms of source packages
*)
- let dep_graph src bin =
+ let get_dep_graph src bin =
M.mapi
(fun k pkg ->
List.fold_left
@@ -159,7 +180,7 @@
src
(**
- @param dgraph [dep_graph] output
+ @param dgraph [get_dep_graph] output
@return a [string list list] with topologically sorted source packages,
grouped by dependency level
*)
@@ -207,7 +228,7 @@
@param x a binary package name
@return [Some v] if [x] depends on ABI [v], [None] otherwise
*)
- let depends_on_ocaml x =
+ let runtime_depends_on_ocaml x =
let rec aux = function
| [] -> None
| x::xs ->
@@ -225,43 +246,11 @@
else aux xs
in aux x.sdeps
- let with_in_file file f =
- let chan = open_in_bin file in
- try
- let res = f chan in
- close_in chan; res
- with e -> close_in chan; raise e
-
- let with_out_file file f =
- let chan = open_out_bin file in
- try
- let res = f chan in
- close_out chan; res
- with e -> close_out chan; raise e
-
let get_binaries arch =
let file = "Packages."^arch in
progress "Parsing %s...%!" file;
let r = with_in_file ("Packages."^arch) parse_binary in
progress "\n%!"; r
-
- let get_arch_status binaries =
- let runtime_versions = M.fold
- (fun k pkg accu -> match depends_on_ocaml pkg with
- | None -> accu
- | Some version ->
- begin try
- let (_, cur_version) = M.find k accu in
- if cur_version <> ocaml_version then accu else M.add k (pkg, version) accu
- with
- | Not_found -> M.add k (pkg, version) accu
- end)
- binaries M.empty in
- let compiled_sources = M.fold
- (fun k (pkg, version) accu ->
- M.add pkg.bsrc (version = ocaml_version) accu)
- runtime_versions M.empty in
- compiled_sources
let get_sources () =
progress "Parsing Packages.source...%!";
@@ -295,7 +284,32 @@
let a_link href contents =
a ~a:[a_href (uri_of_string href)] [pcdata contents]
- let source_status xs =
+ let get_binary_status pkg =
+ match runtime_depends_on_ocaml pkg with
+ | None -> Unknown
+ | Some version -> if version = ocaml_version then Up_to_date else Outdated
+
+ (**
+ @param binaries a [status M.t] mapping binary packages to their status
+ @param source a [source_package]
+ @return the worst status among all binary packages of [source]
+ *)
+ let get_source_status_on_arch binaries source =
+ let rec aux accu = function
+ | [] -> accu
+ | x::xs ->
+ let x = try M.find x binaries with Not_found -> Unknown in
+ match x with
+ | Outdated -> Outdated
+ | Up_to_date -> aux Up_to_date xs
+ | Unknown -> aux accu xs
+ in aux Unknown source.sbins
+
+ (**
+ @param xs outputs of [get_source_status_on_arch]
+ @return the best status among all architectures
+ *)
+ let get_source_status xs =
let rec aux accu = function
| [] -> accu
| Up_to_date::_ -> Up_to_date
@@ -304,7 +318,7 @@
in aux Unknown xs
let main () =
- let (sources_map, binaries) =
+ let (sources, binaries) =
let cache = basename^".cache" in
if !use_cache then begin
progress "Loading cache...%!";
@@ -316,60 +330,65 @@
x
end
in
- let all_binaries = List.map get_arch_status binaries in
- let src_of_bin = M.fold
+ let binaries_status = List.map (M.map get_binary_status) binaries in
+ let sources_status = M.map
+ (fun pkg -> List.map (fun x -> get_source_status_on_arch x pkg) binaries_status)
+ sources
+ in
+ let summary_status = M.map get_source_status sources_status in
+ let src_of_bin_map = M.fold
(fun src spkg accu ->
List.fold_left
(fun accu bin -> M.add bin src accu)
accu spkg.sbins)
- sources_map M.empty in
- let dgraph = dep_graph sources_map src_of_bin in
- let sections = topo_split dgraph in
- let status pkg = List.map
- (fun x ->
- try if M.find pkg x then Up_to_date else Outdated
- with Not_found -> Unknown) all_binaries
- in
- let format_section_body section = List.map
- (fun (pkg, status) -> tr
- (td ~a:[a_class [(class_of_status (source_status status))^" src"]; a_id pkg]
- [a ~a:[a_href (uri_of_string ("http://packages.qa.debian.org/"^pkg));
- a_title
- (let deps = S.elements (M.find pkg dgraph) in
- if deps <> [] then
- "dependencies: "^(String.concat ", " deps)
- else
- "no dependencies")] [pcdata pkg];
- small [
- pcdata " [ ";
- a_link ("http://buildd.debian.org/~luk/status/package.php?p="^pkg) "buildd";
- pcdata " ] "
- ];
- small [
- pcdata " ( ";
- a_link
- (sprintf "http://packages.debian.org/changelogs/pool/main/%c/%s/current/changelog" pkg.[0] pkg)
- (M.find pkg sources_map).sversion;
- pcdata " ) ";
- ];
- ])
- (List.map (fun x ->
- let x = class_of_status x and xx = string_of_status x
- in td ~a:[a_class [x]] [small [pcdata xx]]) status))
- (List.map (fun pkg -> (pkg, status pkg)) section)
- in
- let thead = tr (th [pcdata "source"]) (List.map (fun arch -> th [small [pcdata arch]]) architectures) in
+ sources M.empty in
+ let dep_graph = get_dep_graph sources src_of_bin_map in
+ (* a section is a level in the dependency graph *)
+ let sections = topo_split dep_graph in
+ progress "Generating XHTML...%!";
+ let format_package pkg = tr
+ (td
+ ~a:[a_class [(class_of_status (M.find pkg summary_status))^" src"]; a_id pkg]
+ [a
+ ~a:[a_href (uri_of_string ("http://packages.qa.debian.org/"^pkg));
+ a_title
+ (let deps = S.elements (M.find pkg dep_graph) in
+ if deps <> [] then
+ "dependencies: "^(String.concat ", " deps)
+ else
+ "no dependencies");
+ ]
+ [pcdata pkg];
+ small [
+ pcdata " [ ";
+ a_link ("http://buildd.debian.org/~luk/status/package.php?p="^pkg) "buildd";
+ pcdata " ] "
+ ];
+ small [
+ pcdata " ( ";
+ a_link
+ (sprintf "http://packages.debian.org/changelogs/pool/main/%c/%s/current/changelog" pkg.[0] pkg)
+ (M.find pkg sources).sversion;
+ pcdata " ) ";
+ ];
+ ])
+ (List.map
+ (fun x ->
+ let x = class_of_status x and xx = string_of_status x
+ in td ~a:[a_class [x]] [small [pcdata xx]])
+ (M.find pkg sources_status))
+ in
+ let format_section section =
+ let thead = tr (th [pcdata "source"]) (List.map (fun arch -> th [small [pcdata arch]]) architectures) in
+ thead::(List.map format_package section)
+ in
let summary_contents = List.fold_left
- (fun accu section -> (thead::section)@accu)
- []
- (List.rev_map format_section_body sections)
+ (fun accu section -> section at accu)
+ [] (List.rev_map format_section sections)
in
let summary = match summary_contents with x::xs -> table x xs | _ -> assert false in
let page_title = "Monitoring OCaml transition to "^ocaml_version in
- let date =
- let chan = Unix.open_process_in "date -R" in
- let r = input_line chan in
- close_in chan; r in
+ let date = get_rfc2822_date () in
let footer = [
p [pcdata "Last generated: ";
span ~a:[a_class ["timestamp"]] [pcdata date];
@@ -420,7 +439,8 @@
div ~a:[a_class ["footer"]] footer])
in
with_out_file (basename^".html")
- (fun chan -> pretty_print (fun s -> fprintf chan "%s%!" s) html)
+ (fun chan -> pretty_print (fun s -> fprintf chan "%s%!" s) html);
+ progress "\n%!"
let _ =
let speclist = [
More information about the Pkg-ocaml-maint-commits
mailing list