opam-switch diff
This commit is contained in:
parent
f90a093dd6
commit
031a2042b0
5 changed files with 138 additions and 1 deletions
|
@ -255,6 +255,33 @@ let routes t =
|
||||||
|> Lwt.return
|
|> Lwt.return
|
||||||
in
|
in
|
||||||
|
|
||||||
|
let compare_opam req =
|
||||||
|
let build_left = Router.param req "build_left" in
|
||||||
|
let build_right = Router.param req "build_right" in
|
||||||
|
match Uuidm.of_string build_left, Uuidm.of_string build_right with
|
||||||
|
| None, _ | _, None ->
|
||||||
|
Response.of_plain_text "Bad request" ~status:`Bad_request
|
||||||
|
|> Lwt.return
|
||||||
|
| Some build_left, Some build_right ->
|
||||||
|
let+ switch_left =
|
||||||
|
Caqti_lwt.Pool.use (Model.build_artifact build_left (Fpath.v "opam-switch"))
|
||||||
|
t.pool
|
||||||
|
and+ switch_right =
|
||||||
|
Caqti_lwt.Pool.use (Model.build_artifact build_right (Fpath.v "opam-switch"))
|
||||||
|
t.pool
|
||||||
|
in
|
||||||
|
match switch_left, switch_right with
|
||||||
|
| Error e, _ | _, Error e ->
|
||||||
|
Log.warn (fun m -> m "Database error: %a" pp_error e);
|
||||||
|
Response.of_plain_text "Internal server error\n" ~status:`Internal_server_error
|
||||||
|
| Ok (switch_left, _sha256_left), Ok (switch_right, _sha256_right) ->
|
||||||
|
let switch_left = OpamFile.SwitchExport.read_from_string switch_left
|
||||||
|
and switch_right = OpamFile.SwitchExport.read_from_string switch_right in
|
||||||
|
Opamdiff.compare (Opamdiff.packages switch_left) (Opamdiff.packages switch_right)
|
||||||
|
|> Views.compare_opam build_left build_right
|
||||||
|
|> Response.of_html
|
||||||
|
in
|
||||||
|
|
||||||
[
|
[
|
||||||
App.get "/" builder;
|
App.get "/" builder;
|
||||||
App.get "/job/:job/" job;
|
App.get "/job/:job/" job;
|
||||||
|
@ -262,6 +289,7 @@ let routes t =
|
||||||
App.get "/job/:job/build/:build/f/**" job_build_file;
|
App.get "/job/:job/build/:build/f/**" job_build_file;
|
||||||
App.post "/upload" (authorized t upload);
|
App.post "/upload" (authorized t upload);
|
||||||
App.get "/hash" hash;
|
App.get "/hash" hash;
|
||||||
|
App.get "/compare/:build_left/:build_right/opam-switch" compare_opam;
|
||||||
]
|
]
|
||||||
|
|
||||||
let add_routes t (app : App.t) =
|
let add_routes t (app : App.t) =
|
||||||
|
|
2
lib/dune
2
lib/dune
|
@ -1,3 +1,3 @@
|
||||||
(library
|
(library
|
||||||
(name builder_web)
|
(name builder_web)
|
||||||
(libraries builder builder_db opium tyxml bos rresult duration hex caqti-lwt))
|
(libraries builder builder_db opium tyxml bos rresult duration hex caqti-lwt opamdiff))
|
||||||
|
|
55
lib/views.ml
55
lib/views.ml
|
@ -211,3 +211,58 @@ let job_build
|
||||||
(List.rev console));
|
(List.rev console));
|
||||||
];
|
];
|
||||||
]
|
]
|
||||||
|
|
||||||
|
let packages packages =
|
||||||
|
OpamPackage.Set.elements packages
|
||||||
|
|> List.concat_map (fun p -> [
|
||||||
|
txtf "%a" Opamdiff.pp_opampackage p;
|
||||||
|
br ();
|
||||||
|
])
|
||||||
|
|
||||||
|
let package_diffs diffs =
|
||||||
|
List.concat_map (fun pd -> [
|
||||||
|
txtf "%a" Opamdiff.pp_version_diff pd;
|
||||||
|
br ();
|
||||||
|
])
|
||||||
|
diffs
|
||||||
|
|
||||||
|
let compare_opam build_left build_right (same, version_diff, left, right) =
|
||||||
|
layout ~title:(Fmt.strf "Comparing opam switches between builds %a and %a"
|
||||||
|
Uuidm.pp build_left Uuidm.pp build_right)
|
||||||
|
[
|
||||||
|
h1 [txt "Comparing opam switches"];
|
||||||
|
h2 [
|
||||||
|
txtf "Builds %a and %a"
|
||||||
|
Uuidm.pp build_left Uuidm.pp build_right
|
||||||
|
];
|
||||||
|
ul [
|
||||||
|
li [
|
||||||
|
a ~a:[a_href "packages-removed"]
|
||||||
|
[txtf "%d packages removed" (OpamPackage.Set.cardinal left)]
|
||||||
|
];
|
||||||
|
li [
|
||||||
|
a ~a:[a_href "packages-installed"]
|
||||||
|
[txtf "%d new packages installed" (OpamPackage.Set.cardinal right)]
|
||||||
|
];
|
||||||
|
li [
|
||||||
|
a ~a:[a_href "packages-diff"]
|
||||||
|
[txtf "%d packages with version changes" (List.length version_diff)]
|
||||||
|
];
|
||||||
|
li [
|
||||||
|
a ~a:[a_href "packages-unchanged"]
|
||||||
|
[txtf "%d packages unchanged" (OpamPackage.Set.cardinal same)]
|
||||||
|
];
|
||||||
|
];
|
||||||
|
h3 ~a:[a_id "packages-removed"]
|
||||||
|
[txt "Packages removed"];
|
||||||
|
code (packages left);
|
||||||
|
h3 ~a:[a_id "packages-installed"]
|
||||||
|
[txt "New packages installed"];
|
||||||
|
code (packages right);
|
||||||
|
h3 ~a:[a_id "packages-diff"]
|
||||||
|
[txt "Packages with version changes"];
|
||||||
|
code (package_diffs version_diff);
|
||||||
|
h3 ~a:[a_id "packages-unchanged"]
|
||||||
|
[txt "Unchanged packages"];
|
||||||
|
code (packages same);
|
||||||
|
]
|
||||||
|
|
3
opamdiff/dune
Normal file
3
opamdiff/dune
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
(library
|
||||||
|
(name opamdiff)
|
||||||
|
(libraries opam-core opam-format))
|
51
opamdiff/opamdiff.ml
Normal file
51
opamdiff/opamdiff.ml
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
module Set = OpamPackage.Set
|
||||||
|
|
||||||
|
type package = OpamPackage.t
|
||||||
|
|
||||||
|
let packages (switch : OpamFile.SwitchExport.t) =
|
||||||
|
assert (Set.cardinal switch.selections.sel_pinned = 0);
|
||||||
|
assert (Set.cardinal switch.selections.sel_compiler = 0);
|
||||||
|
assert (Set.subset switch.selections.sel_roots switch.selections.sel_installed);
|
||||||
|
switch.selections.sel_installed
|
||||||
|
|
||||||
|
type version_diff = {
|
||||||
|
name : OpamPackage.Name.t;
|
||||||
|
version_left : OpamPackage.Version.t;
|
||||||
|
version_right : OpamPackage.Version.t;
|
||||||
|
}
|
||||||
|
|
||||||
|
let pp_opampackage ppf p =
|
||||||
|
Format.fprintf ppf "%s" (OpamPackage.to_string p)
|
||||||
|
|
||||||
|
let pp_version_diff ppf { name; version_left; version_right } =
|
||||||
|
Format.fprintf ppf "%s.%s->%s"
|
||||||
|
(OpamPackage.Name.to_string name)
|
||||||
|
(OpamPackage.Version.to_string version_left)
|
||||||
|
(OpamPackage.Version.to_string version_right)
|
||||||
|
|
||||||
|
let compare left right =
|
||||||
|
let module Set = OpamPackage.Set in
|
||||||
|
let equal_name p1 p2 = OpamPackage.Name.equal p1.OpamPackage.name p2.OpamPackage.name in
|
||||||
|
let diff l r =
|
||||||
|
Set.filter (fun p1 ->
|
||||||
|
not (Set.exists (equal_name p1) r))
|
||||||
|
l
|
||||||
|
in
|
||||||
|
let same = Set.inter left right
|
||||||
|
and version_diff =
|
||||||
|
List.filter_map (fun p1 ->
|
||||||
|
match Set.find_opt (equal_name p1) right with
|
||||||
|
| Some p2 ->
|
||||||
|
if OpamPackage.Version.equal p1.version p2.version
|
||||||
|
then None
|
||||||
|
else
|
||||||
|
Some { name = p1.OpamPackage.name;
|
||||||
|
version_left = p1.OpamPackage.version;
|
||||||
|
version_right = p2.OpamPackage.version }
|
||||||
|
| None ->
|
||||||
|
None)
|
||||||
|
(Set.elements left)
|
||||||
|
and left = diff left right
|
||||||
|
and right = diff right left
|
||||||
|
in
|
||||||
|
(same, version_diff, left, right)
|
Loading…
Reference in a new issue