Subject: [PATCH 4/5] database: Call a specification 'jobset' instead of 'project'.

From: Clément Lassieur <[email-masked]>
Date: Wed, 11 Jul 2018 01:02:46 +0200

This removes the possibility to filter specifications by branch, because
branches were previously called 'jobset'.  But it doesn't matter because later
on, specifications will have as many branches as inputs.  And people should
filter by specification name instead.

* doc/cuirass.texi (Build Information, Latest builds): Remove 'jobset',
replace 'project' with 'jobset'.
* src/cuirass/http.scm (build->hydra-build): Idem.
* tests/database.scm (db-get-builds): Idem.
* tests/http.scm (build-query-result, /api/latestbuilds?nr=1&jobset=guix,
/api/latestbuilds?nr=1&jobset=gnu): Idem.
* src/cuirass/database.scm (db-format-build, db-get-builds): Don't associate
builds with branches (which were called 'jobset' afterwards).
(db-get-builds): Remove the #:project filter.
---
 doc/cuirass.texi         | 15 ++++-----------
 src/cuirass/database.scm | 20 ++++++++------------
 src/cuirass/http.scm     |  4 ++--
 tests/database.scm       |  6 ++----
 tests/http.scm           | 12 ++++++------
 5 files changed, 22 insertions(+), 35 deletions(-)

diff --git a/doc/cuirass.texi b/doc/cuirass.texi
index 38eb0b0..5c8c23f 100644
--- a/doc/cuirass.texi
+++ b/doc/cuirass.texi
@@ -448,8 +448,7 @@ $ curl -s "http://localhost:8080/build/2" | jq
 
 @{
   "id": 2,
-  "project": "guix",
-  "jobset": "master",
+  "jobset": "guix",
   "job": "acpica-20150410-job",
   "timestamp": 1501347493,
   "starttime": 1501347493,
@@ -487,11 +486,8 @@ hereafter.
 @item id
 The unique build id.
 
-@item project
-The associated specification name, as a string.
-
 @item jobset
-The associated specification branch, as a string.
+The associated specification name, as a string.
 
 @item job
 The associated job-name, as a string.
@@ -586,9 +582,6 @@ This request accepts a mandatory parameter and multiple optional ones.
 @item nr
 Limit query result to nr elements. This parameter is @emph{mandatory}.
 
-@item project
-Filter query result to builds with the given @code{project}.
-
 @item jobset
 Filter query result to builds with the given @code{jobset}.
 
@@ -606,10 +599,10 @@ For example, to ask for the ten last builds:
 $ curl "http://localhost:8080/api/latestbuilds?nr=10"
 @end example
 
-or the five last builds where project is ``guix'' and jobset ``master'':
+or the five last builds where jobset ``guix'':
 
 @example
-$ curl "http://localhost:8080/api/latestbuilds?nr=5&project=guix&jobset=master"
+$ curl "http://localhost:8080/api/latestbuilds?nr=5&jobset=guix"
 @end example
 
 If no builds matching given parameters are found, an empty JSON array is
diff --git a/src/cuirass/database.scm b/src/cuirass/database.scm
index 188b9a8..f38dcd4 100644
--- a/src/cuirass/database.scm
+++ b/src/cuirass/database.scm
@@ -405,7 +405,7 @@ log file for DRV."
 (define (db-format-build db build)
   (match build
     (#(id timestamp starttime stoptime log status derivation job-name system
-          nix-name repo-name branch)
+          nix-name repo-name)
      `((#:id         . ,id)
        (#:timestamp  . ,timestamp)
        (#:starttime  . ,starttime)
@@ -417,13 +417,12 @@ log file for DRV."
        (#:system     . ,system)
        (#:nix-name   . ,nix-name)
        (#:repo-name  . ,repo-name)
-       (#:outputs    . ,(db-get-outputs db id))
-       (#:branch     . ,branch)))))
+       (#:outputs    . ,(db-get-outputs db id))))))
 
 (define (db-get-builds db filters)
   "Retrieve all builds in database DB which are matched by given FILTERS.
-FILTERS is an assoc list which possible keys are 'project | 'jobset | 'job |
-'system | 'nr | 'order | 'status."
+FILTERS is an assoc list which possible keys are 'jobset | 'job | 'system |
+'nr | 'order | 'status."
 
   ;; XXX Change caller and remove
   (define (assqx-ref filters key)
@@ -467,7 +466,7 @@ Assumes that if group id stays the same the group headers stay the same."
     (define (finish-group)
       (match repeated-row
         (#(timestamp starttime stoptime log status derivation job-name system
-                     nix-name repo-name branch)
+                     nix-name repo-name)
          `((#:id         . ,repeated-builds-id)
            (#:timestamp  . ,timestamp)
            (#:starttime  . ,starttime)
@@ -479,8 +478,7 @@ Assumes that if group id stays the same the group headers stay the same."
            (#:system     . ,system)
            (#:nix-name   . ,nix-name)
            (#:repo-name  . ,repo-name)
-           (#:outputs    . ,outputs)
-           (#:branch     . ,branch)))))
+           (#:outputs    . ,outputs)))))
 
     (define (same-group? builds-id)
       (= builds-id repeated-builds-id))
@@ -520,22 +518,20 @@ Assumes that if group id stays the same the group headers stay the same."
          (stmt-text (format #f "\
 SELECT Builds.id, Outputs.name, Outputs.path, Builds.timestamp, Builds.starttime, Builds.stoptime, Builds.log, Builds.status, Builds.derivation,\
 Derivations.job_name, Derivations.system, Derivations.nix_name,\
-Specifications.repo_name, Specifications.branch \
+Specifications.repo_name \
 FROM Builds \
 INNER JOIN Derivations ON Builds.derivation = Derivations.derivation AND Builds.evaluation = Derivations.evaluation \
 INNER JOIN Evaluations ON Derivations.evaluation = Evaluations.id \
 INNER JOIN Specifications ON Evaluations.specification = Specifications.repo_name \
 LEFT JOIN Outputs ON Outputs.build = Builds.id \
 WHERE (:id IS NULL OR (:id = Builds.id)) \
-AND (:project IS NULL OR (:project = Specifications.repo_name)) \
-AND (:jobset IS NULL OR (:jobset = Specifications.branch)) \
+AND (:jobset IS NULL OR (:jobset = Specifications.repo_name)) \
 AND (:job IS NULL OR (:job = Derivations.job_name)) \
 AND (:system IS NULL OR (:system = Derivations.system)) \
 AND (:status IS NULL OR (:status = 'done' AND Builds.status >= 0) OR (:status = 'pending' AND Builds.status < 0)) \
 ORDER BY ~a, Builds.id ASC LIMIT :nr;" order))
          (stmt (sqlite-prepare db stmt-text #:cache? #t)))
     (sqlite-bind-arguments stmt #:id (assqx-ref filters 'id)
-                           #:project (assqx-ref filters 'project)
                            #:jobset (assqx-ref filters 'jobset)
                            #:job (assqx-ref filters 'job)
                            #:system (assqx-ref filters 'system)
diff --git a/src/cuirass/http.scm b/src/cuirass/http.scm
index e911b9b..a45e6b1 100644
--- a/src/cuirass/http.scm
+++ b/src/cuirass/http.scm
@@ -2,6 +2,7 @@
 ;;; Copyright © 2016 Mathieu Lirzin <[email-masked]>
 ;;; Copyright © 2017 Mathieu Othacehe <[email-masked]>
 ;;; Copyright © 2018 Ludovic Courtès <[email-masked]>
+;;; Copyright © 2018 Clément Lassieur <[email-masked]>
 ;;;
 ;;; This file is part of Cuirass.
 ;;;
@@ -45,8 +46,7 @@
                      (build-status started)))))
 
   `((#:id . ,(assq-ref build #:id))
-    (#:project . ,(assq-ref build #:repo-name))
-    (#:jobset . ,(assq-ref build #:branch))
+    (#:jobset . ,(assq-ref build #:repo-name))
     (#:job . ,(assq-ref build #:job-name))
 
     ;; Hydra's API uses "timestamp" as the time of the last useful event for
diff --git a/tests/database.scm b/tests/database.scm
index 847c8a6..e71c7f7 100644
--- a/tests/database.scm
+++ b/tests/database.scm
@@ -2,6 +2,7 @@
 ;;;
 ;;; Copyright © 2016 Mathieu Lirzin <[email-masked]>
 ;;; Copyright © 2018 Ludovic Courtès <[email-masked]>
+;;; Copyright © 2018 Clément Lassieur <[email-masked]>
 ;;;
 ;;; This file is part of Cuirass.
 ;;;
@@ -156,7 +157,6 @@ INSERT INTO Evaluations (specification, revision) VALUES (3, 3);")
     #(((1 "/foo.drv") (2 "/bar.drv") (3 "/baz.drv")) ;ascending order
       ((3 "/baz.drv") (2 "/bar.drv") (1 "/foo.drv")) ;descending order
       ((3 "/baz.drv") (2 "/bar.drv") (1 "/foo.drv")) ;ditto
-      ((3 "/baz.drv") (2 "/bar.drv") (1 "/foo.drv")) ;ditto
       ((3 "/baz.drv"))                               ;nr = 1
       ((2 "/bar.drv") (1 "/foo.drv") (3 "/baz.drv"))) ;status+submission-time
     (with-temporary-database db
@@ -185,9 +185,7 @@ INSERT INTO Evaluations (specification, revision) VALUES (3, 3);")
                                (assq-ref alist #:derivation)))))
         (vector (map summarize (db-get-builds db '((nr 3) (order build-id))))
                 (map summarize (db-get-builds db '()))
-                (map summarize (db-get-builds db '((project "guix"))))
-                (map summarize (db-get-builds db '((project "guix")
-                                                   (jobset "master"))))
+                (map summarize (db-get-builds db '((jobset "guix"))))
                 (map summarize (db-get-builds db '((nr 1))))
                 (map summarize
                      (db-get-builds db '((order status+submission-time))))))))
diff --git a/tests/http.scm b/tests/http.scm
index 9d460b2..ba53887 100644
--- a/tests/http.scm
+++ b/tests/http.scm
@@ -2,6 +2,7 @@
 ;;; Copyright © 2016 Mathieu Lirzin <[email-masked]>
 ;;; Copyright © 2017, 2018 Ludovic Courtès <[email-masked]>
 ;;; Copyright © 2017 Mathieu Othacehe <[email-masked]>
+;;; Copyright © 2018 Clément Lassieur <[email-masked]>
 ;;;
 ;;; This file is part of Cuirass.
 ;;;
@@ -76,8 +77,7 @@
 
 (define build-query-result
   '((#:id . 1)
-    (#:project . "guix")
-    (#:jobset . "master")
+    (#:jobset . "guix")
     (#:job . "fake-job")
     (#:timestamp . 1501347493)
     (#:starttime . 1501347493)
@@ -226,13 +226,13 @@
     500
     (response-code (http-get (test-cuirass-uri "/api/latestbuilds"))))
 
-  (test-assert "/api/latestbuilds?nr=1&project=guix&jobset=master"
+  (test-assert "/api/latestbuilds?nr=1&jobset=guix"
     (let ((hash-list
            (call-with-input-string
                (utf8->string
                 (http-get-body
                  (test-cuirass-uri
-                  "/api/latestbuilds?nr=1&project=guix&jobset=master")))
+                  "/api/latestbuilds?nr=1&jobset=guix")))
              json->scm)))
       (and (= (length hash-list) 1)
            (hash-table=?
@@ -241,14 +241,14 @@
                 (object->json-string build-query-result)
               json->scm)))))
 
-  (test-assert "/api/latestbuilds?nr=1&project=gnu"
+  (test-assert "/api/latestbuilds?nr=1&jobset=gnu"
     ;; The result should be an empty JSON array.
     (let ((hash-list
            (call-with-input-string
                (utf8->string
                 (http-get-body
                  (test-cuirass-uri
-                  "/api/latestbuilds?nr=1&project=gnu")))
+                  "/api/latestbuilds?nr=1&jobset=gnu")))
              json->scm)))
       (= (length hash-list) 0)))
 
-- 
2.18.0