gnu: gspell: Build with gobject-introspection.
[jackhill/guix/guix.git] / guix / download.scm
CommitLineData
233e7676 1;;; GNU Guix --- Functional package management for GNU
3961edf2 2;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
9884d7ec 3;;; Copyright © 2013, 2014, 2015 Andreas Enge <andreas@enge.fr>
95001d4b 4;;; Copyright © 2015 Federico Beffa <beffa@fbengineering.ch>
fe224d20 5;;; Copyright © 2016 Alex Griffin <a@ajgrf.com>
9c97afe8 6;;; Copyright © 2016 David Craven <david@craven.ch>
58f91e4d 7;;; Copyright © 2017 Tobias Geerinckx-Rice <me@tobias.gr>
bc4cea6f 8;;; Copyright © 2019 Guy Fleury Iteriteka <hoonandon@gmail.com>
62cab99c 9;;;
233e7676 10;;; This file is part of GNU Guix.
62cab99c 11;;;
233e7676 12;;; GNU Guix is free software; you can redistribute it and/or modify it
62cab99c
LC
13;;; under the terms of the GNU General Public License as published by
14;;; the Free Software Foundation; either version 3 of the License, or (at
15;;; your option) any later version.
16;;;
233e7676 17;;; GNU Guix is distributed in the hope that it will be useful, but
62cab99c
LC
18;;; WITHOUT ANY WARRANTY; without even the implied warranty of
19;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20;;; GNU General Public License for more details.
21;;;
22;;; You should have received a copy of the GNU General Public License
233e7676 23;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
62cab99c
LC
24
25(define-module (guix download)
26 #:use-module (ice-9 match)
27 #:use-module (guix derivations)
28 #:use-module (guix packages)
e87f0591 29 #:use-module (guix store)
b5b73a82 30 #:use-module ((guix build download) #:prefix build:)
6f8f8ccb
LC
31 #:use-module (guix monads)
32 #:use-module (guix gexp)
62cab99c 33 #:use-module (guix utils)
d8907ac4 34 #:use-module (web uri)
483f1158 35 #:use-module (srfi srfi-1)
94d222ad 36 #:use-module (srfi srfi-26)
ec4d308a 37 #:export (%mirrors
861693f3 38 url-fetch
267966f9 39 url-fetch/executable
95001d4b 40 url-fetch/tarbomb
814b099a 41 url-fetch/zipbomb
861693f3 42 download-to-store))
62cab99c
LC
43
44;;; Commentary:
45;;;
46;;; Produce fixed-output derivations with data fetched over HTTP or FTP.
47;;;
48;;; Code:
49
94d222ad
LC
50(define %mirrors
51 ;; Mirror lists used when `mirror://' URLs are passed.
52 (let* ((gnu-mirrors
53 '(;; This one redirects to a (supposedly) nearby and (supposedly)
54 ;; up-to-date mirror.
4918e7fc 55 "https://ftpmirror.gnu.org/gnu/"
94d222ad
LC
56
57 "ftp://ftp.cs.tu-berlin.de/pub/gnu/"
94d222ad
LC
58 "ftp://ftp.funet.fi/pub/mirrors/ftp.gnu.org/gnu/"
59
60 ;; This one is the master repository, and thus it's always
61 ;; up-to-date.
62 "http://ftp.gnu.org/pub/gnu/")))
63 `((gnu ,@gnu-mirrors)
64 (gcc
65 "ftp://ftp.nluug.nl/mirror/languages/gcc/"
66 "ftp://ftp.fu-berlin.de/unix/languages/gcc/"
67 "ftp://ftp.irisa.fr/pub/mirrors/gcc.gnu.org/gcc/"
68 "ftp://gcc.gnu.org/pub/gcc/"
69 ,@(map (cut string-append <> "/gcc") gnu-mirrors))
70 (gnupg
df851f5a
LF
71 "http://artfiles.org/gnupg.org"
72 "http://www.crysys.hu/"
73 "https://gnupg.org/ftp/gcrypt/"
d57b88be 74 "ftp://mirrors.dotsrc.org/gcrypt/"
94d222ad 75 "ftp://mirror.cict.fr/gnupg/"
d57b88be
AE
76 "ftp://ftp.franken.de/pub/crypt/mirror/ftp.gnupg.org/gcrypt/"
77 "ftp://ftp.freenet.de/pub/ftp.gnupg.org/gcrypt/"
d57b88be
AE
78 "ftp://ftp.hi.is/pub/mirrors/gnupg/"
79 "ftp://ftp.heanet.ie/mirrors/ftp.gnupg.org/gcrypt/"
80 "ftp://ftp.bit.nl/mirror/gnupg/"
81 "ftp://ftp.surfnet.nl/pub/security/gnupg/"
82 "ftp://ftp.iasi.roedu.net/pub/mirrors/ftp.gnupg.org/"
83 "ftp://ftp.sunet.se/pub/security/gnupg/"
84 "ftp://mirror.switch.ch/mirror/gnupg/"
85 "ftp://mirror.tje.me.uk/pub/mirrors/ftp.gnupg.org/"
86 "ftp://ftp.mirrorservice.org/sites/ftp.gnupg.org/gcrypt/"
87 "ftp://ftp.ring.gr.jp/pub/net/gnupg/"
88 "ftp://ftp.gnupg.org/gcrypt/")
71eb5c10
LC
89 (gnome
90 "http://ftp.belnet.be/ftp.gnome.org/"
91 "http://ftp.linux.org.uk/mirrors/ftp.gnome.org/"
92 "http://ftp.gnome.org/pub/GNOME/"
93897a45 93 "https://download.gnome.org/"
71eb5c10 94 "http://mirror.yandex.ru/mirrors/ftp.gnome.org/")
442c2c99 95 (hackage
4c13aad0 96 "http://hackage.haskell.org/")
94d222ad 97 (savannah
a4eabecd 98 "http://download.savannah.gnu.org/releases/"
94d222ad
LC
99 "http://ftp.cc.uoc.gr/mirrors/nongnu.org/"
100 "http://ftp.twaren.net/Unix/NonGNU/"
101 "http://mirror.csclub.uwaterloo.ca/nongnu/"
102 "http://nongnu.askapache.com/"
103 "http://savannah.c3sl.ufpr.br/"
3f6d5b8a 104 "http://download.savannah.gnu.org/releases-noredirect/"
ecc58571
LF
105 "http://download-mirror.savannah.gnu.org/releases/"
106 "ftp://ftp.twaren.net/Unix/NonGNU/"
107 "ftp://mirror.csclub.uwaterloo.ca/nongnu/"
108 "ftp://mirror.publicns.net/pub/nongnu/"
109 "ftp://savannah.c3sl.ufpr.br/")
321dc4df 110 (sourceforge ; https://sourceforge.net/p/forge/documentation/Mirrors/
fe224d20 111 "http://downloads.sourceforge.net/project/"
cd4c41fd
LC
112 "http://ufpr.dl.sourceforge.net/project/"
113 "http://heanet.dl.sourceforge.net/project/"
114 "http://freefr.dl.sourceforge.net/project/"
115 "http://internode.dl.sourceforge.net/project/"
116 "http://jaist.dl.sourceforge.net/project/"
117 "http://kent.dl.sourceforge.net/project/"
118 "http://liquidtelecom.dl.sourceforge.net/project/"
05e172ca 119 ;; "http://nbtelecom.dl.sourceforge.net/project/" ;never returns 404s
cd4c41fd
LC
120 "http://nchc.dl.sourceforge.net/project/"
121 "http://ncu.dl.sourceforge.net/project/"
122 "http://netcologne.dl.sourceforge.net/project/"
123 "http://netix.dl.sourceforge.net/project/"
124 "http://pilotfiber.dl.sourceforge.net/project/"
125 "http://superb-sea2.dl.sourceforge.net/project/"
126 "http://tenet.dl.sourceforge.net/project/"
127 "http://vorboss.dl.sourceforge.net/project/"
128 "http://netassist.dl.sourceforge.net/project/")
7c7b802c
MB
129 (netfilter.org ; https://www.netfilter.org/mirrors.html
130 "http://ftp.netfilter.org/pub/"
131 "ftp://ftp.es.netfilter.org/mirrors/netfilter/"
132 "ftp://ftp.hu.netfilter.org/"
133 "ftp://www.lt.netfilter.org/pub/")
b40b259f 134 (kernel.org
b40b259f
LC
135 "http://linux-kernel.uio.no/pub/"
136 "http://kernel.osuosl.org/pub/"
5d9cd707 137 "http://ftp.be.debian.org/pub/"
ecc58571
LF
138 "http://mirror.linux.org.au/"
139 "ftp://ftp.funet.fi/pub/mirrors/ftp.kernel.org/pub/")
47f9db41
LC
140 (apache ; from http://www.apache.org/mirrors/dist.html
141 "http://www.eu.apache.org/dist/"
142 "http://www.us.apache.org/dist/"
47f9db41
LC
143 "http://apache.belnet.be/"
144 "http://mirrors.ircam.fr/pub/apache/"
f06afd4d
LC
145 "http://apache-mirror.rbc.ru/pub/apache/"
146
147 ;; As a last resort, try the archive.
148 "http://archive.apache.org/dist/")
149acc29 149 (xorg ; from http://www.x.org/wiki/Releases/Download
0820a58b 150 "http://www.x.org/releases/" ; main mirrors
ecc58571 151 "http://mirror.csclub.uwaterloo.ca/x.org/" ; North America
149acc29
AE
152 "http://xorg.mirrors.pair.com/"
153 "http://mirror.us.leaseweb.net/xorg/"
ecc58571
LF
154 "ftp://mirror.csclub.uwaterloo.ca/x.org/"
155 "ftp://xorg.mirrors.pair.com/"
149acc29
AE
156 "ftp://artfiles.org/x.org/" ; Europe
157 "ftp://ftp.chg.ru/pub/X11/x.org/"
158 "ftp://ftp.fu-berlin.de/unix/X11/FTP.X.ORG/"
159 "ftp://ftp.gwdg.de/pub/x11/x.org/"
160 "ftp://ftp.mirrorservice.org/sites/ftp.x.org/"
161 "ftp://ftp.ntua.gr/pub/X11/"
162 "ftp://ftp.piotrkosoft.net/pub/mirrors/ftp.x.org/"
163 "ftp://ftp.portal-to-web.de/pub/mirrors/x.org/"
164 "ftp://ftp.solnet.ch/mirror/x.org/"
149acc29
AE
165 "ftp://mi.mirror.garr.it/mirrors/x.org/"
166 "ftp://mirror.cict.fr/x.org/"
167 "ftp://mirror.switch.ch/mirror/X11/"
168 "ftp://mirrors.ircam.fr/pub/x.org/"
169 "ftp://x.mirrors.skynet.be/pub/ftp.x.org/"
ecc58571
LF
170 "http://x.cs.pu.edu.tw/" ; East Asia
171 "ftp://ftp.cs.cuhk.edu.hk/pub/X11"
149acc29
AE
172 "ftp://ftp.u-aizu.ac.jp/pub/x11/x.org/"
173 "ftp://ftp.yz.yamagata-u.ac.jp/pub/X11/x.org/"
174 "ftp://ftp.kaist.ac.kr/x.org/"
175 "ftp://mirrors.go-part.com/xorg/"
6af31019 176 "ftp://ftp.is.co.za/pub/x.org") ; South Africa
63ae4800 177 (cpan
6af31019 178 "http://www.cpan.org/"
63ae4800
TGR
179 "http://cpan.metacpan.org/"
180 ;; A selection of HTTP mirrors from http://www.cpan.org/SITES.html.
181 ;; Europe.
182 "http://ftp.belnet.be/mirror/ftp.cpan.org/"
183 "http://mirrors.nic.cz/CPAN/"
184 "http://mirror.ibcp.fr/pub/CPAN/"
185 "http://ftp.ntua.gr/pub/lang/perl/"
186 "http://kvin.lv/pub/CPAN/"
187 "http://mirror.as43289.net/pub/CPAN/"
188 "http://cpan.cs.uu.nl/"
189 "http://cpan.uib.no/"
190 "http://cpan-mirror.rbc.ru/pub/CPAN/"
191 "http://mirror.sbb.rs/CPAN/"
192 "http://cpan.lnx.sk/"
193 "http://ftp.rediris.es/mirror/CPAN/"
194 "http://mirror.ox.ac.uk/sites/www.cpan.org/"
195 ;; Africa.
196 "http://mirror.liquidtelecom.com/CPAN/"
197 "http://cpan.mirror.ac.za/"
198 "http://mirror.is.co.za/pub/cpan/"
199 "http://cpan.saix.net/"
200 "http://mirror.ucu.ac.ug/cpan/"
201 ;; North America.
202 "http://mirrors.gossamer-threads.com/CPAN/"
203 "http://mirror.csclub.uwaterloo.ca/CPAN/"
204 "http://mirrors.ucr.ac.cr/CPAN/"
205 "http://www.msg.com.mx/CPAN/"
206 "http://mirrors.namecheap.com/CPAN/"
207 "http://mirror.uic.edu/CPAN/"
208 "http://mirror.datapipe.net/CPAN/"
209 "http://mirror.cc.columbia.edu/pub/software/cpan/"
210 "http://mirror.uta.edu/CPAN/"
211 ;; South America.
212 "http://cpan.mmgdesigns.com.ar/"
213 "http://mirror.nbtelecom.com.br/CPAN/"
214 "http://linorg.usp.br/CPAN/"
215 "http://cpan.dcc.uchile.cl/"
216 "http://mirror.cedia.org.ec/CPAN/"
217 ;; Oceania.
218 "http://cpan.mirror.serversaustralia.com.au/"
219 "http://mirror.waia.asn.au/pub/cpan/"
220 "http://mirror.as24220.net/pub/cpan/"
221 "http://cpan.lagoon.nc/pub/CPAN/"
222 "http://cpan.inspire.net.nz/"
223 ;; Asia.
224 "http://mirror.dhakacom.com/CPAN/"
225 "http://mirrors.ustc.edu.cn/CPAN/"
226 "http://ftp.cuhk.edu.hk/pub/packages/perl/CPAN/"
227 "http://kambing.ui.ac.id/cpan/"
228 "http://cpan.hostiran.ir/"
229 "http://ftp.nara.wide.ad.jp/pub/CPAN/"
230 "http://mirror.neolabs.kz/CPAN/"
231 "http://cpan.nctu.edu.tw/"
232 "http://cpan.ulak.net.tr/"
233 "http://mirrors.vinahost.vn/CPAN/")
cb7e4867
RW
234 (cran
235 ;; Arbitrary mirrors from http://cran.r-project.org/mirrors.html
236 ;; This one automatically redirects to servers worldwide
c009bb5a 237 "http://cran.r-project.org/"
cb7e4867
RW
238 "http://cran.rstudio.com/"
239 "http://cran.univ-lyon1.fr/"
cb7e4867
RW
240 "http://cran.ism.ac.jp/"
241 "http://cran.stat.auckland.ac.nz/"
242 "http://cran.mirror.ac.za/"
243 "http://cran.csie.ntu.edu.tw/")
6d763bdd
AE
244 (imagemagick
245 ;; from http://www.imagemagick.org/script/download.php
246 ;; (without mirrors that are unavailable or not up to date)
247 ;; mirrors keeping old versions at the top level
d0b87779 248 "https://sunsite.icm.edu.pl/packages/ImageMagick/"
6d763bdd 249 ;; mirrors moving old versions to "legacy"
ecc58571 250 "http://mirrors-usa.go-parts.com/mirrors/ImageMagick/"
7fa37abc 251 "http://mirror.checkdomain.de/imagemagick/"
ecc58571
LF
252 "http://ftp.surfnet.nl/pub/ImageMagick/"
253 "http://mirror.searchdaimon.com/ImageMagick"
254 "http://mirror.is.co.za/pub/imagemagick/"
255 "http://www.imagemagick.org/download/"
256 "ftp://mirror.aarnet.edu.au/pub/imagemagick/"
6d763bdd
AE
257 "ftp://ftp.kddlabs.co.jp/graphics/ImageMagick/"
258 "ftp://ftp.u-aizu.ac.jp/pub/graphics/image/ImageMagick/imagemagick.org/"
259 "ftp://ftp.nluug.nl/pub/ImageMagick/"
6d763bdd 260 "ftp://ftp.tpnet.pl/pub/graphics/ImageMagick/"
6d763bdd 261 "ftp://ftp.fifi.org/pub/ImageMagick/"
6d763bdd
AE
262 ;; one legacy location as a last resort
263 "http://www.imagemagick.org/download/legacy/")
e0029b74
LC
264 (debian
265 "http://ftp.de.debian.org/debian/"
266 "http://ftp.fr.debian.org/debian/"
6b287c5c 267 "http://ftp.debian.org/debian/"
ff02b826
DC
268 "http://archive.debian.org/debian/")
269 (kde
112f089d 270 "http://download.kde.org"
8b4af828 271 "http://download.kde.org/Attic" ; for when it gets archived.
ff02b826
DC
272 ;; Mirrors from http://files.kde.org/extra/mirrors.html
273 ;; Europe
274 "http://mirror.easyname.at/kde"
275 "http://mirror.karneval.cz/pub/kde"
276 "http://ftp.fi.muni.cz/pub/kde/"
277 "http://mirror.oss.maxcdn.com/kde/"
278 "http://ftp5.gwdg.de/pub/linux/kde/"
279 "http://ftp-stud.fht-esslingen.de/Mirrors/ftp.kde.org/pub/kde/"
280 "http://mirror.klaus-uwe.me/kde/ftp/"
281 "http://kde.beta.mirror.ga/"
282 "http://kde.alpha.mirror.ga/"
283 "http://mirror.netcologne.de/kde"
284 "http://vesta.informatik.rwth-aachen.de/ftp/pub/mirror/kde/"
285 "http://ftp.rz.uni-wuerzburg.de/pub/unix/kde/"
286 "http://mirrors.dotsrc.org/kde/"
287 "http://ftp.funet.fi/pub/mirrors/ftp.kde.org/pub/kde/"
288 "http://kde-mirror.freenux.org/"
289 "http://mirrors.ircam.fr/pub/KDE/"
290 "http://www-ftp.lip6.fr/pub/X11/kde/"
291 "http://fr2.rpmfind.net/linux/KDE/"
292 "http://kde.mirror.anlx.net/"
293 "http://www.mirrorservice.org/sites/ftp.kde.org/pub/kde/"
294 "http://ftp.heanet.ie/mirrors/ftp.kde.org/"
295 "http://ftp.nluug.nl/pub/windowing/kde/"
296 "http://ftp.surfnet.nl/windowing/kde/"
297 "http://ftp.icm.edu.pl/pub/unix/kde/"
298 "http://ftp.pbone.net/pub/kde/"
299 "http://piotrkosoft.net/pub/mirrors/ftp.kde.org/"
300 "http://mirrors.fe.up.pt/pub/kde/"
301 "http://ftp.iasi.roedu.net/pub/mirrors/ftp.kde.org/"
302 "http://ftp.acc.umu.se/mirror/kde.org/ftp/"
303 "http://kde.ip-connect.vn.ua/"
304 ;; North America
305 "http://mirror.its.dal.ca/kde/"
306 "http://mirror.csclub.uwaterloo.ca/kde/"
307 "http://mirror.cc.columbia.edu/pub/software/kde/"
308 "http://mirrors-usa.go-parts.com/kde"
309 "http://kde.mirrors.hoobly.com/"
310 "http://ftp.ussg.iu.edu/kde/"
311 "http://mirrors.mit.edu/kde/"
312 "http://kde.mirrors.tds.net/pub/kde/"
313 ;; Oceania
314 "http://ftp.kddlabs.co.jp/pub/X11/kde/"
644e5f17
TGR
315 "http://kde.mirror.uber.com.au/")
316 (openbsd
317 "https://ftp.openbsd.org/pub/OpenBSD/"
318 ;; Anycast CDN redirecting to your friendly local mirror.
319 "https://mirrors.evowise.com/pub/OpenBSD/"
320 ;; Other HTTPS mirrors from https://www.openbsd.org/ftp.html
321 "https://mirror.aarnet.edu.au/pub/OpenBSD/"
322 "https://ftp2.eu.openbsd.org/pub/OpenBSD/"
323 "https://openbsd.c3sl.ufpr.br/pub/OpenBSD/"
324 "https://openbsd.ipacct.com/pub/OpenBSD/"
325 "https://ftp.OpenBSD.org/pub/OpenBSD/"
326 "https://openbsd.cs.toronto.edu/pub/OpenBSD/"
327 "https://openbsd.delfic.org/pub/OpenBSD/"
328 "https://openbsd.mirror.netelligent.ca/pub/OpenBSD/"
329 "https://mirrors.ucr.ac.cr/pub/OpenBSD/"
330 "https://mirrors.dotsrc.org/pub/OpenBSD/"
331 "https://mirror.one.com/pub/OpenBSD/"
332 "https://ftp.fr.openbsd.org/pub/OpenBSD/"
333 "https://ftp2.fr.openbsd.org/pub/OpenBSD/"
334 "https://mirrors.ircam.fr/pub/OpenBSD/"
335 "https://ftp.spline.de/pub/OpenBSD/"
336 "https://mirror.hs-esslingen.de/pub/OpenBSD/"
337 "https://ftp.halifax.rwth-aachen.de/openbsd/"
338 "https://ftp.hostserver.de/pub/OpenBSD/"
339 "https://ftp.fau.de/pub/OpenBSD/"
340 "https://ftp.cc.uoc.gr/pub/OpenBSD/"
341 "https://openbsd.hk/pub/OpenBSD/"
342 "https://ftp.heanet.ie/pub/OpenBSD/"
343 "https://openbsd.mirror.garr.it/pub/OpenBSD/"
344 "https://mirror.litnet.lt/pub/OpenBSD/"
345 "https://mirror.meerval.net/pub/OpenBSD/"
346 "https://ftp.nluug.nl/pub/OpenBSD/"
347 "https://ftp.bit.nl/pub/OpenBSD/"
348 "https://mirrors.dalenys.com/pub/OpenBSD/"
349 "https://ftp.icm.edu.pl/pub/OpenBSD/"
350 "https://ftp.rnl.tecnico.ulisboa.pt/pub/OpenBSD/"
351 "https://mirrors.pidginhost.com/pub/OpenBSD/"
352 "https://mirror.yandex.ru/pub/OpenBSD/"
353 "https://ftp.eu.openbsd.org/pub/OpenBSD/"
354 "https://ftp.yzu.edu.tw/pub/OpenBSD/"
355 "https://www.mirrorservice.org/pub/OpenBSD/"
356 "https://anorien.csc.warwick.ac.uk/pub/OpenBSD/"
357 "https://mirror.bytemark.co.uk/pub/OpenBSD/"
358 "https://mirrors.sonic.net/pub/OpenBSD/"
359 "https://ftp3.usa.openbsd.org/pub/OpenBSD/"
360 "https://mirrors.syringanetworks.net/pub/OpenBSD/"
361 "https://openbsd.mirror.constant.com/pub/OpenBSD/"
362 "https://ftp4.usa.openbsd.org/pub/OpenBSD/"
363 "https://ftp5.usa.openbsd.org/pub/OpenBSD/"
bc4cea6f
GFI
364 "https://mirror.esc7.net/pub/OpenBSD/")
365 (mate
366 "https://pub.mate-desktop.org/releases/"
367 "http://pub.mate-desktop.org/releases/"))))
94d222ad 368
53216419
LC
369(define %mirror-file
370 ;; Copy of the list of mirrors to a file. This allows us to keep a single
371 ;; copy in the store, and computing it here avoids repeated calls to
372 ;; 'object->string'.
373 (plain-file "mirrors" (object->string %mirrors)))
374
cd436bf0
LC
375(define %content-addressed-mirrors
376 ;; List of content-addressed mirrors. Each mirror is represented as a
ab84b927
LC
377 ;; procedure that takes a file name, an algorithm (symbol) and a hash
378 ;; (bytevector), and returns a URL or #f.
ee2cfdfe 379 '(begin
a52ae1b6
LC
380 (use-modules (guix base32))
381
13bcc6b4
LC
382 (define (guix-publish host)
383 (lambda (file algo hash)
384 ;; Files served by 'guix publish' are accessible under a single
385 ;; hash algorithm.
386 (string-append "https://" host "/file/"
387 file "/" (symbol->string algo) "/"
388 (bytevector->nix-base32-string hash))))
389
a52ae1b6
LC
390 ;; XXX: (guix base16) appeared in March 2017 (and thus 0.13.0) so old
391 ;; installations of the daemon might lack it. Thus, load it lazily to
392 ;; avoid gratuitous errors. See <https://bugs.gnu.org/33542>.
393 (module-autoload! (current-module)
394 '(guix base16) '(bytevector->base16-string))
ee2cfdfe 395
883dc11c 396 (list (guix-publish "ci.guix.gnu.org")
ee2cfdfe
LC
397 (lambda (file algo hash)
398 ;; 'tarballs.nixos.org' supports several algorithms.
89f1fee8 399 (string-append "https://tarballs.nixos.org/"
ee2cfdfe
LC
400 (symbol->string algo) "/"
401 (bytevector->nix-base32-string hash)))
402 (lambda (file algo hash)
403 ;; Software Heritage usually archives VCS history rather than
404 ;; tarballs, but tarballs are sometimes available (and can be
405 ;; explicitly stored there.) For example, see
406 ;; <https://archive.softwareheritage.org/api/1/content/sha256:92d0fa1c311cacefa89853bdb53c62f4110cdfda3820346b59cbd098f40f955e/>.
89f1fee8 407 (string-append "https://archive.softwareheritage.org/api/1/content/"
ee2cfdfe
LC
408 (symbol->string algo) ":"
409 (bytevector->base16-string hash) "/raw/")))))
cd436bf0
LC
410
411(define %content-addressed-mirror-file
412 ;; Content-addressed mirrors stored in a file.
413 (plain-file "content-addressed-mirrors"
414 (object->string %content-addressed-mirrors)))
415
05ceb8dc 416(define built-in-builders*
3961edf2 417 (store-lift built-in-builders))
94d222ad 418
05ceb8dc
LC
419(define* (built-in-download file-name url
420 #:key system hash-algo hash
421 mirrors content-addressed-mirrors
267966f9 422 executable?
05ceb8dc 423 (guile 'unused))
267966f9
LC
424 "Download FILE-NAME from URL using the built-in 'download' builder. When
425EXECUTABLE? is true, make the downloaded file executable.
62cab99c 426
05ceb8dc
LC
427This is an \"out-of-band\" download in that the returned derivation does not
428explicitly depend on Guile, GnuTLS, etc. Instead, the daemon performs the
429download by itself using its own dependencies."
430 (mlet %store-monad ((mirrors (lower-object mirrors))
431 (content-addressed-mirrors
432 (lower-object content-addressed-mirrors)))
433 (raw-derivation file-name "builtin:download" '()
434 #:system system
435 #:hash-algo hash-algo
436 #:hash hash
267966f9 437 #:recursive? executable?
02237f13 438 #:sources (list mirrors content-addressed-mirrors)
05ceb8dc
LC
439
440 ;; Honor the user's proxy and locale settings.
441 #:leaked-env-vars '("http_proxy" "https_proxy"
442 "LC_ALL" "LC_MESSAGES" "LANG"
443 "COLUMNS")
444
445 #:env-vars `(("url" . ,(object->string url))
446 ("mirrors" . ,mirrors)
447 ("content-addressed-mirrors"
267966f9
LC
448 . ,content-addressed-mirrors)
449 ,@(if executable?
450 '(("executable" . "1"))
451 '()))
4c80d4c4
LC
452
453 ;; Do not offload this derivation because we cannot be
454 ;; sure that the remote daemon supports the 'download'
455 ;; built-in. We may remove this limitation when support
456 ;; for that built-in is widespread.
457 #:local-build? #t)))
05ceb8dc 458
05ceb8dc
LC
459(define* (url-fetch url hash-algo hash
460 #:optional name
461 #:key (system (%current-system))
267966f9
LC
462 (guile (default-guile))
463 executable?)
05ceb8dc
LC
464 "Return a fixed-output derivation that fetches URL (a string, or a list of
465strings denoting alternate URLs), which is expected to have hash HASH of type
466HASH-ALGO (a symbol). By default, the file name is the base name of URL;
267966f9
LC
467optionally, NAME can specify a different file name. When EXECUTABLE? is true,
468make the downloaded file executable.
05ceb8dc
LC
469
470When one of the URL starts with mirror://, then its host part is
471interpreted as the name of a mirror scheme, taken from %MIRROR-FILE.
472
473Alternately, when URL starts with file://, return the corresponding file name
474in the store."
475 (define file-name
476 (match url
477 ((head _ ...)
478 (basename head))
479 (_
480 (basename url))))
481
882383a9
LC
482 (let ((uri (and (string? url) (string->uri url))))
483 (if (or (and (string? url) (not uri))
484 (and uri (memq (uri-scheme uri) '(#f file))))
f220a838
LC
485 (interned-file (if uri (uri-path uri) url)
486 (or name file-name))
2e86c264
LC
487 (mlet %store-monad ((builtins (built-in-builders*)))
488 ;; The "download" built-in builder was added in guix-daemon in
489 ;; Nov. 2016 and made it in the 0.12.0 release of Dec. 2016. We now
490 ;; require it.
491 (unless (member "download" builtins)
492 (error "'guix-daemon' is too old, please upgrade" builtins))
493
494 (built-in-download (or name file-name) url
495 #:guile guile
496 #:system system
497 #:hash-algo hash-algo
498 #:hash hash
267966f9 499 #:executable? executable?
2e86c264
LC
500 #:mirrors %mirror-file
501 #:content-addressed-mirrors
502 %content-addressed-mirror-file)))))
62cab99c 503
267966f9
LC
504(define* (url-fetch/executable url hash-algo hash
505 #:optional name
506 #:key (system (%current-system))
507 (guile (default-guile)))
508 "Like 'url-fetch', but make the downloaded file executable."
509 (url-fetch url hash-algo hash name
510 #:system system
511 #:guile guile
512 #:executable? #t))
513
95001d4b
LC
514(define* (url-fetch/tarbomb url hash-algo hash
515 #:optional name
516 #:key (system (%current-system))
517 (guile (default-guile)))
518 "Similar to 'url-fetch' but unpack the file from URL in a directory of its
519own. This helper makes it easier to deal with \"tar bombs\"."
58f91e4d
TGR
520 (define file-name
521 (match url
522 ((head _ ...)
523 (basename head))
524 (_
525 (basename url))))
95001d4b
LC
526 (define gzip
527 (module-ref (resolve-interface '(gnu packages compression)) 'gzip))
528 (define tar
529 (module-ref (resolve-interface '(gnu packages base)) 'tar))
530
531 (mlet %store-monad ((drv (url-fetch url hash-algo hash
58f91e4d
TGR
532 (string-append "tarbomb-"
533 (or name file-name))
95001d4b
LC
534 #:system system
535 #:guile guile)))
536 ;; Take the tar bomb, and simply unpack it as a directory.
5e5d6613
LC
537 ;; Use ungrafted tar/gzip so that the resulting tarball doesn't depend on
538 ;; whether grafts are enabled.
58f91e4d 539 (gexp->derivation (or name file-name)
6c293a80
MW
540 (with-imported-modules '((guix build utils))
541 #~(begin
542 (use-modules (guix build utils))
543 (mkdir #$output)
544 (setenv "PATH" (string-append #$gzip "/bin"))
545 (chdir #$output)
546 (invoke (string-append #$tar "/bin/tar")
547 "xf" #$drv)))
5e5d6613 548 #:graft? #f
95001d4b
LC
549 #:local-build? #t)))
550
814b099a
TGR
551(define* (url-fetch/zipbomb url hash-algo hash
552 #:optional name
553 #:key (system (%current-system))
554 (guile (default-guile)))
555 "Similar to 'url-fetch' but unpack the zip file at URL in a directory of its
556own. This helper makes it easier to deal with \"zip bombs\"."
557 (define file-name
558 (match url
559 ((head _ ...)
560 (basename head))
561 (_
562 (basename url))))
563 (define unzip
148585c2 564 (module-ref (resolve-interface '(gnu packages compression)) 'unzip))
814b099a
TGR
565
566 (mlet %store-monad ((drv (url-fetch url hash-algo hash
567 (string-append "zipbomb-"
568 (or name file-name))
569 #:system system
570 #:guile guile)))
571 ;; Take the zip bomb, and simply unpack it as a directory.
5e5d6613
LC
572 ;; Use ungrafted unzip so that the resulting tarball doesn't depend on
573 ;; whether grafts are enabled.
814b099a 574 (gexp->derivation (or name file-name)
6c293a80
MW
575 (with-imported-modules '((guix build utils))
576 #~(begin
577 (use-modules (guix build utils))
578 (mkdir #$output)
579 (chdir #$output)
580 (invoke (string-append #$unzip "/bin/unzip")
581 #$drv)))
5e5d6613 582 #:graft? #f
814b099a
TGR
583 #:local-build? #t)))
584
861693f3 585(define* (download-to-store store url #:optional (name (basename url))
64b8695c
LC
586 #:key (log (current-error-port)) recursive?
587 (verify-certificate? #t))
861693f3 588 "Download from URL to STORE, either under NAME or URL's basename if
a43b55f1 589omitted. Write progress reports to LOG. RECURSIVE? has the same effect as
64b8695c
LC
590the same-named parameter of 'add-to-store'. VERIFY-CERTIFICATE? determines
591whether or not to validate HTTPS server certificates."
d8907ac4
LC
592 (define uri
593 (string->uri url))
594
d91a8791 595 (if (or (not uri) (memq (uri-scheme uri) '(file #f)))
a43b55f1 596 (add-to-store store name recursive? "sha256"
d91a8791 597 (if uri (uri-path uri) url))
d8907ac4
LC
598 (call-with-temporary-output-file
599 (lambda (temp port)
600 (let ((result
601 (parameterize ((current-output-port log))
64b8695c
LC
602 (build:url-fetch url temp
603 #:mirrors %mirrors
604 #:verify-certificate?
605 verify-certificate?))))
d8907ac4
LC
606 (close port)
607 (and result
a43b55f1 608 (add-to-store store name recursive? "sha256" temp)))))))
861693f3 609
62cab99c 610;;; download.scm ends here