From e1d950ad5b073fe6b07dfe1fae60a47f957b3769 Mon Sep 17 00:00:00 2001 From: Robur Date: Wed, 17 Nov 2021 15:54:13 +0000 Subject: [PATCH] link to failed-builds, paginate failed-builds --- db/builder_db.ml | 10 +++++++--- db/builder_db.mli | 4 ++-- lib/builder_web.ml | 10 +++++++--- lib/model.ml | 6 +++--- lib/model.mli | 2 +- lib/views.ml | 18 +++++++++++++++--- 6 files changed, 35 insertions(+), 15 deletions(-) diff --git a/db/builder_db.ml b/db/builder_db.ml index 6beba35..f4c1600 100644 --- a/db/builder_db.ml +++ b/db/builder_db.ml @@ -317,7 +317,7 @@ module Build = struct let get_all_failed = Caqti_request.collect - Caqti_type.unit + Caqti_type.(tup2 int int) (Caqti_type.tup2 Caqti_type.string t) {| SELECT job.name, b.uuid, b.start_d, b.start_ps, b.finish_d, b.finish_ps, b.result_code, b.result_msg, b.console, b.script, b.platform, @@ -326,19 +326,23 @@ module Build = struct INNER JOIN job ON job.id = b.job WHERE b.result_code <> 0 ORDER BY start_d DESC, start_ps DESC + LIMIT ?2 + OFFSET ?1 |} let get_all_failed_by_platform = Caqti_request.collect - Caqti_type.string + Caqti_type.(tup3 int int string) (Caqti_type.tup2 Caqti_type.string t) {| SELECT job.name, b.id, b.uuid, b.start_d, b.start_ps, b.finish_d, b.finish_ps, b.result_code, b.result_msg, b.console, b.script, b.platform, b.main_binary, b.input_id, b.user, b.job FROM build b INNER JOIN job ON job.id = b.job - WHERE b.result_code <> 0 AND b.platform = ? + WHERE b.result_code <> 0 AND b.platform = ?3 ORDER BY start_d DESC, start_ps DESC + LIMIT ?2 + OFFSET ?1 |} let get_all_artifact_sha = diff --git a/db/builder_db.mli b/db/builder_db.mli index d92fc47..24cb4b7 100644 --- a/db/builder_db.mli +++ b/db/builder_db.mli @@ -114,9 +114,9 @@ sig val get_all : ([`job] id, [`build] id * t, [ `Many | `One | `Zero ]) Caqti_request.t val get_all_failed : - (unit, string * t, [ `Many | `One | `Zero ]) Caqti_request.t + (int * int, string * t, [ `Many | `One | `Zero ]) Caqti_request.t val get_all_failed_by_platform : - (string, string * t, [ `Many | `One | `Zero ]) Caqti_request.t + (int * int * string, string * t, [ `Many | `One | `Zero ]) Caqti_request.t val get_all_artifact_sha : ([`job] id, Cstruct.t, [ `Many | `One | `Zero ]) Caqti_request.t val get_all_artifact_sha_by_platform : diff --git a/lib/builder_web.ml b/lib/builder_web.ml index 74f7a1a..150171a 100644 --- a/lib/builder_web.ml +++ b/lib/builder_web.ml @@ -232,11 +232,14 @@ let add_routes datadir = let failed_builds req = let platform = Dream.query "platform" req in - Dream.sql req (Model.failed_builds platform) + let to_int default s = Option.(value ~default (bind s int_of_string_opt)) in + let start = to_int 0 (Dream.query "start" req) in + let count = to_int 10 (Dream.query "count" req) in + Dream.sql req (Model.failed_builds ~start ~count platform) |> if_error "Error getting data" ~log:(fun e -> Log.warn (fun m -> m "Error getting failed builds: %a" pp_error e)) >>= fun builds -> - Views.failed_builds builds |> string_of_html |> Dream.html |> Lwt_result.ok + Views.failed_builds ~start ~count builds |> string_of_html |> Dream.html |> Lwt_result.ok in let upload req = @@ -364,8 +367,9 @@ let add_routes datadir = let w f req = or_error_response (f req) in (* - /developer <- front page with failed builds (indication) /job/:job/developer(?platform=XX) <- job list with failed builds + /job/:job/?platform=...&failed=true + /job/:job/failed(?platform=...) *) Dream.router [ diff --git a/lib/model.ml b/lib/model.ml index 5af4aa7..dc9b0ad 100644 --- a/lib/model.ml +++ b/lib/model.ml @@ -85,10 +85,10 @@ let previous_successful_build_different_output id (module Db : CONN) = let next_successful_build_different_output id (module Db : CONN) = Db.find_opt Builder_db.Build.get_next_successful_different_output id -let failed_builds platform (module Db : CONN) = +let failed_builds ~start ~count platform (module Db : CONN) = match platform with - | None -> Db.collect_list Builder_db.Build.get_all_failed () - | Some p -> Db.collect_list Builder_db.Build.get_all_failed_by_platform p + | None -> Db.collect_list Builder_db.Build.get_all_failed (start, count) + | Some p -> Db.collect_list Builder_db.Build.get_all_failed_by_platform (start, count, p) let builds_with_different_input_and_same_main_binary id (module Db : CONN) = Db.collect_list Builder_db.Build.get_different_input_same_output_input_ids id >>= fun ids -> diff --git a/lib/model.mli b/lib/model.mli index 2ca5156..e739ddb 100644 --- a/lib/model.mli +++ b/lib/model.mli @@ -48,7 +48,7 @@ val previous_successful_build_different_output : [`build] Builder_db.id -> Caqti val next_successful_build_different_output : [`build] Builder_db.id -> Caqti_lwt.connection -> (Builder_db.Build.t option, [> Caqti_error.call_or_retrieve ]) result Lwt.t -val failed_builds : string option -> Caqti_lwt.connection -> +val failed_builds : start:int -> count:int -> string option -> Caqti_lwt.connection -> ((string * Builder_db.Build.t) list, [> Caqti_error.call_or_retrieve ]) result Lwt.t val builds_with_different_input_and_same_main_binary : [`build] Builder_db.id -> Caqti_lwt.connection -> diff --git a/lib/views.ml b/lib/views.ml index f5896df..d73e635 100644 --- a/lib/views.ml +++ b/lib/views.ml @@ -216,7 +216,13 @@ let builder section_job_map = jobs) ]) section_job_map - []) + [] @ + [ p [ + txt "View the latest failed builds "; + a ~a:[a_href "/failed-builds/"] + [txt "here"]; + txt "." + ]]) let job name platform readme builds = layout ~nav:(`Job (name, platform)) ~title:(Fmt.str "Job %s %a" name pp_platform platform) @@ -500,7 +506,7 @@ let compare_builds job_left job_right code (key_value_changes changed_pkgs); ]) -let failed_builds builds = +let failed_builds ~start ~count builds = let build (job_name, build) = li [ txtf "%s %a " job_name pp_platform (Some build.Builder_db.Build.platform); @@ -511,5 +517,11 @@ let failed_builds builds = in layout ~title:"Failed builds" ([ h1 [txt "Failed builds"]; - ul (List.map build builds) ]) + ul (List.map build builds); + p [ txtf "View the next %d failed builds " count; + a ~a:[Fmt.kstr a_href "/failed-builds/?count=%d&start=%d" count (start + count)] + [ txt "here"]; + txt "."; + ] + ])