aboutsummaryrefslogtreecommitdiff
path: root/genenetwork/development-helper.scm
blob: 8707f53f54498f1bfb4758ba2894d51878c71f80 (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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
;;; genenetwork-machines --- Guix configuration for genenetwork machines
;;; Copyright © 2022 Arun Isaac <arunisaac@systemreboot.net>
;;;
;;; This file is part of genenetwork-machines.
;;;
;;; genenetwork-machines is free software: you can redistribute it
;;; and/or modify it under the terms of the GNU General Public License
;;; as published by the Free Software Foundation, either version 3 of
;;; the License, or (at your option) any later version.
;;;
;;; genenetwork-machines 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 General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with genenetwork-machines.  If not, see
;;; <https://www.gnu.org/licenses/>.

(define-module (genenetwork development-helper)
  #:use-module (ice-9 match)
  #:use-module (guix gexp)
  #:use-module (guix profiles)
  #:use-module (guix search-paths)
  #:use-module (forge build utils))

(define (command-in-source-gexp source profile command)
  "Return a G-expression that runs COMMAND in PROFILE and with SOURCE
as the current directory. SOURCE and PROFILE are store items. COMMAND
is a list of strings specifying the command to be executed."
  (with-imported-modules '((guix build utils))
    (with-profile profile
      #~(begin
          (use-modules (rnrs exceptions)
                       (guix build utils))

          (chdir #$source)
          (guard (condition ((invoke-error? condition)
                             (format (current-error-port)
                                     "`~a~{ ~a~}' failed with exit status ~a~%"
                                     (invoke-error-program condition)
                                     (invoke-error-arguments condition)
                                     (invoke-error-exit-status condition))
                             (exit #f)))
            (apply invoke '#$command))
          (mkdir-p #$output)))))

(define (asdf-test-gexp source profile system asd-files)
  "Return a G-expression that tests SYSTEM using asdf after loading
ASD-FILES. SOURCE is the source code under test. PROFILE is a profile
with all necessary dependencies. SOURCE and PROFILE are both store
items."
  (with-imported-modules '((guix build lisp-utils)
                           (guix build utils))
    (with-profile profile
      #~(begin
          (use-modules (guix build lisp-utils)
                       (guix build utils))

          (chdir #$source)
          (setenv "HOME" "/tmp")
          (parameterize ((%lisp "sbcl")
                         (%lisp-type "sbcl"))
            (test-system #$system '#$asd-files #f))
          (mkdir-p #$output)))))

(define (genenetwork3-lint-gexp genenetwork3-source profile)
  "Return a G-expression that runs GeneNetwork3 lint tests in PROFILE
with GENENETWORK3-SOURCE as the current directory. GENENETWORK3-SOURCE
is a checkout of the genenetwork3 source code. PROFILE is a profile
with genenetwork3 dependencies."
  (with-imported-modules '((guix build utils))
    (with-profile profile
      #~(begin
          (use-modules (rnrs exceptions)
                       (srfi srfi-26)
                       (ice-9 rdelim)
                       (guix build utils))

          (define (shell-script? filename stat-obj)
            (and (eq? (stat:type stat-obj) 'regular)
                 (call-with-input-file filename
                   (lambda (port)
                     (let ((first-line (read-line port)))
                       (and (not (eof-object? first-line))
                            (> (string-length first-line) 2)
                            (string=? (string-take first-line 2) "#!")
                            (or (string-contains first-line "/bin/sh")
                                (string-contains first-line "/bin/bash"))))))))
          
          (chdir #$genenetwork3-source)
          (guard (condition ((invoke-error? condition)
                             (format (current-error-port)
                                     "`~a~{ ~a~}' failed with exit status ~a~%"
                                     (invoke-error-program condition)
                                     (invoke-error-arguments condition)
                                     (invoke-error-exit-status condition))
                             (exit #f)))
            (for-each (cut invoke "shellcheck" <>)
                      (find-files "." shell-script?))
            (invoke "pylint" "gn3"))
          (mkdir-p #$output)))))

(define (genenetwork2-runner-gexp genenetwork2-source profile gn3-port
                                  genotype-files xapian-db-path)
  "Return a G-expression that runs the genenetwork2 server for
GENENETWORK2-SOURCE in PROFILE. GENENETWORK2-SOURCE is a checkout of
the genenetwork2 source code. PROFILE is a profile with genenetwork2
dependencies. GN3-PORT is the port on which a local instance of
genenetwork3 is listening. GENOTYPE-FILES is the path to genotype
files. XAPIAN-DB-PATH is the path to the xapian search index."
  (with-imported-modules '((guix build utils))
    (with-profile profile
      #~(begin
          (use-modules (guix build utils)
                       (ice-9 match))
          
          (chdir #$genenetwork2-source)
          (match (command-line)
            ((_ ip port)
             (setenv "SERVER_PORT" port)
             (setenv "GN2_PROFILE" #$profile)
             (setenv "GN_PROXY_URL" "http://genenetwork.org/gn3-proxy/")
             (setenv "GN_SERVER_URL" "/api3")
             (setenv "GN3_LOCAL_URL"
                     (string-append "http://localhost:"
                                    (number->string #$gn3-port)))
             (setenv "GENENETWORK_FILES" #$genotype-files)
             (setenv "SQL_URI" "mysql://webqtlout:webqtlout@localhost/db_webqtl")
             (setenv "HOME" "/tmp")
             (setenv "NO_REDIS" "no-redis")
             (setenv "XAPIAN_DB_PATH" #$xapian-db-path)
             (invoke "sh" "bin/genenetwork2" "etc/default_settings.py" "-gunicorn-prod")))))))

(define (genenetwork3-runner-gexp genenetwork3-source profile)
  "Return a G-expression that runs the genenetwork3 server for
GENENETWORK3-SOURCE in PROFILE. GENENETWORK3-SOURCE is a checkout of
the genenetwork3 source code. PROFILE is a profile with genenetwork3
dependencies."
  (with-imported-modules '((guix build utils))
    (with-profile profile
      #~(begin
          (use-modules (guix build utils)
                       (ice-9 match))
          
          (chdir #$genenetwork3-source)
          (match (command-line)
            ((_ ip port)
             (invoke "gunicorn"
                     "-b" (string-append ip ":" port)
                     "gn3.app:create_app()")))))))