blob: 21e20a592b87699eb09c0a9efc250e5ea7ff6d01 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
;;; Guix Data Service -- Information about Guix over time
;;; Copyright © 2019 Christopher Baines <mail@cbaines.net>
;;;
;;; This program is free software: you can redistribute it and/or
;;; modify it under the terms of the GNU Affero General Public License
;;; as published by the Free Software Foundation, either version 3 of
;;; the License, or (at your option) any later version.
;;;
;;; This program is distributed in the hope that it will be useful,
;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;;; Affero General Public License for more details.
;;;
;;; You should have received a copy of the GNU Affero General Public
;;; License along with this program. If not, see
;;; <http://www.gnu.org/licenses/>.
(define-module (guix-data-service model guix-revision)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-19)
#:use-module (ice-9 match)
#:use-module (squee)
#:export (count-guix-revisions
most-recent-n-guix-revisions
commit->revision-id
git-repository-id-and-commit->revision-id
insert-guix-revision
guix-commit-exists?
guix-revision-exists?
select-guix-revision-for-branch-and-datetime
guix-revisions-cgit-url-bases))
(define (count-guix-revisions conn)
(match (exec-query
conn
"SELECT COUNT(*) FROM guix_revisions")
(((x)) (string->number x))))
(define (most-recent-n-guix-revisions conn n)
(exec-query conn "SELECT * FROM guix_revisions ORDER BY id DESC LIMIT 10"))
(define (commit->revision-id conn commit)
(match (exec-query
conn "SELECT id FROM guix_revisions WHERE commit = $1 LIMIT 1"
(list commit))
(((id))
id)
(() #f)))
(define (git-repository-id-and-commit->revision-id conn git-repository-id commit)
(match (exec-query
conn
"
SELECT id
FROM guix_revisions
WHERE commit = $1
AND git_repository_id = $2"
(list commit git-repository-id))
(((id)) (string->number id))
(() #f)))
(define (insert-guix-revision conn git-repository-id commit)
(define insert
"
INSERT INTO guix_revisions (git_repository_id, commit)
VALUES ($1, $2) RETURNING id")
(match (exec-query conn insert (list git-repository-id commit))
(((id)) (string->number id))))
(define (guix-commit-exists? conn commit)
(define query
"SELECT EXISTS(SELECT 1 FROM guix_revisions WHERE commit = $1)")
(let ((result (caar
(exec-query conn query (list commit)))))
(string=? result "t")))
(define (guix-revision-exists? conn git-repository-id commit)
(define query
(string-append "SELECT EXISTS("
"SELECT 1 FROM guix_revisions WHERE "
"git_repository_id = '" git-repository-id "' "
"AND commit = '" commit "')"
";"))
(let ((result (caar
(exec-query conn query))))
(string=? result "t")))
(define (select-guix-revision-for-branch-and-datetime conn branch datetime)
(define query
"
SELECT guix_revisions.id,
guix_revisions.commit,
guix_revisions.git_repository_id,
git_commits.datetime
FROM guix_revisions
INNER JOIN git_branches
ON git_branches.git_repository_id = guix_revisions.git_repository_id
AND git_branches.name = $1
INNER JOIN git_commits
ON git_commits.commit = guix_revisions.commit
AND git_commits.git_branch_id = git_branches.id
AND git_commits.datetime <= $2
INNER JOIN load_new_guix_revision_jobs
ON load_new_guix_revision_jobs.commit = guix_revisions.commit
WHERE load_new_guix_revision_jobs.succeeded_at IS NOT NULL
ORDER BY git_commits.datetime DESC
LIMIT 1")
(match (exec-query conn query
(list branch
(date->string datetime "~1 ~3")))
(() #f)
((result) result)))
(define (guix-revisions-cgit-url-bases conn guix-revision-ids)
(map
car
(exec-query
conn
(simple-format #f "
SELECT cgit_url_base
FROM git_repositories
WHERE cgit_url_base IS NOT NULL AND id IN (
SELECT git_repository_id
FROM guix_revisions
WHERE id IN (VALUES ~A));"
(string-join
(map (lambda (id)
(string-append "(" id ")"))
guix-revision-ids)
",")))))
|