diff --git a/.envrc b/.envrc
index 30a7c7b..9bd4806 100644
--- a/.envrc
+++ b/.envrc
@@ -1,4 +1,4 @@
use guix
-export GUILE_LOAD_PATH="$(pwd):$HOME/.config/guix/current/share/guile/site/3.0"
+export GUILE_LOAD_PATH="$(pwd)/guix:$HOME/.config/guix/current/share/guile/site/3.0"
export RUSTUP_DIST_SERVER="https://mirrors.ustc.edu.cn/rust-static"
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..2a5c365
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,64 @@
+name: build
+on:
+ push:
+ paths-ignore:
+ - 'README.org'
+ - '.guix-authorizations'
+ - '.guix-channel'
+ pull_request:
+ schedule:
+ # weekly builds, making sure everything still works with guix-proper
+ - cron: '39 3 * * 0'
+jobs:
+ build:
+ name: Build package
+ runs-on: ubuntu-latest
+ strategy:
+ # building independent packages, don’t abort entire build if one fails
+ fail-fast: false
+ matrix:
+ package:
+ - rust-bin
+ steps:
+ - name: Guix cache
+ uses: actions/cache@v2
+ with:
+ path: ~/.cache/guix
+ # use a key that (almost) never matches
+ key: guix-cache-${{ github.sha }}
+ restore-keys: |
+ guix-cache-
+ - name: Install Guix
+ uses: PromyLOPh/guix-install-action@v1
+ with:
+ channels: |-
+ (list (channel
+ (name 'guix)
+ (url "https://github.com/declantsien/guix")
+ (branch "master")
+ (introduction
+ (make-channel-introduction
+ "9edb3f66fd807b096b48283debdcddccfea34bad"
+ (openpgp-fingerprint
+ "BBB0 2DDF 2CEA F6A8 0D1D E643 A2A0 6DF2 A33A 54FA"))))
+ (channel
+ (name 'nonguix)
+ (url "https://gitlab.com/nonguix/nonguix")
+ (branch "master")
+ (introduction
+ (make-channel-introduction
+ "897c1a470da759236cc11798f4e0a5f7d4d59fbc"
+ (openpgp-fingerprint
+ "2A39 3FFF 68F4 EF7A 3D29 12AF 6F51 20A0 22FB B2D5")))))
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Lint package
+ run: |
+ GUIX_PROFILE="/home/runner/.config/guix/current"
+ . "$GUIX_PROFILE/etc/profile"
+ guix lint -L ./channel ${{ matrix.package }} |& sed -nre 's#(.*):([0-9]+):([0-9]+): (.*)$#::warning file=\1,line=\2,col=\3::\4#gp'
+ - name: Build package
+ run: |
+ GUIX_PROFILE="/home/runner/.config/guix/current"
+ . "$GUIX_PROFILE/etc/profile"
+ guix build -L ./channel ${{ matrix.package }}
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
new file mode 100644
index 0000000..61d9293
--- /dev/null
+++ b/.github/workflows/test.yml
@@ -0,0 +1,47 @@
+name: test
+on: [push]
+jobs:
+ build-with-channels:
+ name: Test as Guix channel
+ runs-on: ubuntu-latest
+ strategy:
+ # building independent packages, don’t abort entire build if one fails
+ fail-fast: false
+ steps:
+ - name: Guix cache
+ uses: actions/cache@v3
+ with:
+ path: ~/.cache/guix
+ # use a key that (almost) never matches
+ key: guix-cache-${{ github.sha }}
+ restore-keys: |
+ guix-cache-
+ # Cannot use a cache for /gnu/store, since restore fails
+ - name: Install Guix
+ id: install-guix
+ uses: PromyLOPh/guix-install-action@v1
+ with:
+ channels: |-
+ (list (channel
+ (name 'guix)
+ (url "https://github.com/declantsien/guix")
+ (branch "master")
+ (introduction
+ (make-channel-introduction
+ "9edb3f66fd807b096b48283debdcddccfea34bad"
+ (openpgp-fingerprint
+ "BBB0 2DDF 2CEA F6A8 0D1D E643 A2A0 6DF2 A33A 54FA"))))
+ (channel
+ (name 'rustup)
+ (url "https://github.com/declantsien/guix-rustup")
+ (introduction
+ (make-channel-introduction
+ "325d3e2859d482c16da21eb07f2c6ff9c6c72a80"
+ (openpgp-fingerprint
+ "F695 F39E C625 E081 33B5 759F 0FC6 8703 75EF E2F5")))))
+ - name: Build
+ run: guix build rust-bin
+ - name: Build
+ run: guix build -e '((@@ (rustup build toolchain) rustup) "1.78.0")'
+ - name: Build
+ run: guix build -e '((@@ (rustup build toolchain) rustup) "nightly-2024-05-13")'
diff --git a/.guix-channel b/.guix-channel
index bfbb491..719365c 100644
--- a/.guix-channel
+++ b/.guix-channel
@@ -2,7 +2,7 @@
(channel
(version 0)
- (directory ".")
+ (directory "guix")
(url "https://github.com/declantsien/guix-rustup")
(dependencies
(channel
diff --git a/README.org b/README.org
new file mode 100644
index 0000000..1844d34
--- /dev/null
+++ b/README.org
@@ -0,0 +1,30 @@
+#+TITLE: Guix Rustup
+#+OPTIONS: d:nil
+#+EXPORT_FILE_NAME: guix-rustup.texi
+#+TEXINFO_DIR_CATEGORY: Guix Channels
+#+TEXINFO_DIR_TITLE: Guix Rustup: (guix-rustup).
+#+TEXINFO_DIR_DESC: Rust binary toolchain channel for Guix
+
+https://forge.rust-lang.org/infra/channel-layout.html
+https://forge.rust-lang.org/infra/other-installation-methods.html
+
+* Overview
+
+Guix Rustup
+
+** Channel introduction
+In case you want to use this channel, add the following code to
+your ~~/.config/guix/channels.scm~, and call ~guix pull~.
+#+begin_src scheme
+ (cons*
+ (channel
+ (name 'rustup)
+ (url "https://github.com/declantsien/guix-rustup")
+ (introduction
+ (make-channel-introduction
+ "325d3e2859d482c16da21eb07f2c6ff9c6c72a80"
+ (openpgp-fingerprint
+ "F695 F39E C625 E081 33B5 759F 0FC6 8703 75EF E2F5"))))
+ %default-channels)
+#+end_src
+
diff --git a/TODO.org b/TODO.org
new file mode 100644
index 0000000..e3eaf18
--- /dev/null
+++ b/TODO.org
@@ -0,0 +1 @@
+* TODO Add Github action to automaticlly update channels
diff --git a/data/aliases b/data/aliases
deleted file mode 100644
index b717907..0000000
--- a/data/aliases
+++ /dev/null
@@ -1 +0,0 @@
-(define aliases (quote (("nightly" . "nightly-2024-05-10") ("beta" . "beta-2024-05-04") ("1.79.0-beta.3" . "beta-2024-05-04") ("1.79.0-beta.2" . "beta-2024-05-03") ("1.79.0-beta.1" . "beta-2024-04-29") ("1.78.0-beta.10" . "beta-2024-04-28") ("1.79.0-beta.3" . "beta") ("stable" . "stable-2024-05-02") ("1.78.0" . "stable-2024-05-02") ("1.77.2" . "stable-2024-04-09") ("1.77.1" . "stable-2024-03-28") ("1.77.0" . "stable-2024-03-21") ("1.76.0" . "stable-2024-02-08") ("1.75.0" . "stable-2023-12-28") ("1.74.1" . "stable-2023-12-07") ("1.74.0" . "stable-2023-11-16") ("1.73.0" . "stable-2023-10-05") ("1.72.1" . "stable-2023-09-19") ("1.72.0" . "stable-2023-08-24") ("1.71.1" . "stable-2023-08-03") ("1.71.0" . "stable-2023-07-13") ("1.70.0" . "stable-2023-06-01") ("1.69.0" . "stable-2023-04-20") ("1.68.2" . "stable-2023-03-28") ("1.68.1" . "stable-2023-03-23") ("1.68.0" . "stable-2023-03-09") ("1.67.1" . "stable-2023-02-09") ("1.67.0" . "stable-2023-01-26") ("1.66.1" . "stable-2023-01-10") ("1.66.0" . "stable-2022-12-15") ("1.65.0" . "stable-2022-11-03") ("1.64.0" . "stable-2022-09-22") ("1.63.0" . "stable-2022-08-11") ("1.62.1" . "stable-2022-07-19") ("1.62.0" . "stable-2022-06-30") ("1.61.0" . "stable-2022-05-19") ("1.60.0" . "stable-2022-04-07") ("1.59.0" . "stable-2022-02-24") ("1.58.1" . "stable-2022-01-20") ("1.58.0" . "stable-2022-01-13") ("1.57.0" . "stable-2021-12-02") ("1.56.1" . "stable-2021-11-01") ("1.56.0" . "stable-2021-10-21") ("1.55.0" . "stable-2021-09-09") ("1.54.0" . "stable-2021-07-29") ("1.53.0" . "stable-2021-06-17") ("1.52.1" . "stable-2021-05-10") ("1.52.0" . "stable-2021-05-06") ("1.51.0" . "stable-2021-03-25") ("1.50.0" . "stable-2021-02-11") ("1.49.0" . "stable-2020-12-31") ("1.48.0" . "stable-2020-11-19") ("1.78.0" . "stable"))))
\ No newline at end of file
diff --git a/data/channels b/data/channels
deleted file mode 100644
index d66edbc..0000000
--- a/data/channels
+++ /dev/null
@@ -1 +0,0 @@
-(define %channels '(1.48.0 1.49.0 1.50.0 1.51.0 1.52.0 1.52.1 1.53.0 1.54.0 1.55.0 1.56.0 1.56.1 1.57.0 1.58.0 1.58.1 1.59.0 1.60.0 1.61.0 1.62.0 1.62.1 1.63.0 1.64.0 1.65.0 1.66.0 1.66.1 1.67.0 1.67.1 1.68.0 1.68.1 1.68.2 1.69.0 1.70.0 1.71.0 1.71.1 1.72.0 1.72.1 1.73.0 1.74.0 1.74.1 1.75.0 1.76.0 1.77.0 1.77.1 1.77.2 1.78.0 1.78.0-beta.10 1.79.0-beta.1 1.79.0-beta.2 1.79.0-beta.3 beta beta-2024-04-28 beta-2024-04-29 beta-2024-05-03 beta-2024-05-04 nightly nightly-2024-04-29 nightly-2024-04-30 nightly-2024-05-01 nightly-2024-05-02 nightly-2024-05-03 nightly-2024-05-04 nightly-2024-05-05 nightly-2024-05-06 nightly-2024-05-07 nightly-2024-05-08 nightly-2024-05-09 nightly-2024-05-10 stable stable-2020-11-19 stable-2020-12-31 stable-2021-02-11 stable-2021-03-25 stable-2021-05-06 stable-2021-05-10 stable-2021-06-17 stable-2021-07-29 stable-2021-09-09 stable-2021-10-21 stable-2021-11-01 stable-2021-12-02 stable-2022-01-13 stable-2022-01-20 stable-2022-02-24 stable-2022-04-07 stable-2022-05-19 stable-2022-06-30 stable-2022-07-19 stable-2022-08-11 stable-2022-09-22 stable-2022-11-03 stable-2022-12-15 stable-2023-01-10 stable-2023-01-26 stable-2023-02-09 stable-2023-03-09 stable-2023-03-23 stable-2023-03-28 stable-2023-04-20 stable-2023-06-01 stable-2023-07-13 stable-2023-08-03 stable-2023-08-24 stable-2023-09-19 stable-2023-10-05 stable-2023-11-16 stable-2023-12-07 stable-2023-12-28 stable-2024-02-08 stable-2024-03-21 stable-2024-03-28 stable-2024-04-09 stable-2024-05-02))
\ No newline at end of file
diff --git a/rustup/build/manifest.scm b/guix/rustup/build/manifest.scm
similarity index 96%
rename from rustup/build/manifest.scm
rename to guix/rustup/build/manifest.scm
index 02b5127..bf314a8 100644
--- a/rustup/build/manifest.scm
+++ b/guix/rustup/build/manifest.scm
@@ -493,24 +493,18 @@
(define channel-hash-file-hash
(let* ((content (http-fetch/guarded sha256-url)))
(if content
- (base32-from-sha256 (car (string-split
- content
- #\ )))
+ (car (string-split
+ content
+ #\ ))
(begin
(format #t "Failed to download manifest sha256 ~a ~a~%" sha256-url str)
#f))))
- (if channel-hash-file-hash
- (let* ((%store (open-connection))
- (drv (url-fetch* %store url 'sha256 (nix-base32-string->bytevector channel-hash-file-hash)))
- (out-path (derivation->output-path drv)))
- (and (build-derivations %store (list drv))
- (file-exists? out-path)
- (valid-path? %store out-path)
- (call-with-input-file out-path
- (lambda (port)
- (let* ((content (get-string-all port)))
- (parse-toml content))))))
- #f))
+ (let* ((content (http-fetch/guarded url channel-hash-file-hash)))
+ (if content
+ (parse-toml content)
+ (begin
+ (format #t "Failed to download manifest toml ~a ~a~%" url str)
+ #f))))
(define* (compact-manifest str #:optional manifest)
(define c (channel->from-str str))
@@ -581,7 +575,7 @@
component-hashed-binaries
components)))
- (let* ((manifest (or manifest (download-channel-manifest str))))
+ (let* ((manifest (or manifest (download-manifest str))))
(compact-manifest manifest)))
(define* (validate-url-pattern component-name-index triplet-index compression-kind-index hash uri-triplet-index channel-name date url)
diff --git a/rustup/build/toml.scm b/guix/rustup/build/toml.scm
similarity index 100%
rename from rustup/build/toml.scm
rename to guix/rustup/build/toml.scm
diff --git a/rustup/build/toolchain.scm b/guix/rustup/build/toolchain.scm
similarity index 86%
rename from rustup/build/toolchain.scm
rename to guix/rustup/build/toolchain.scm
index a4bc1c5..ac31519 100644
--- a/rustup/build/toolchain.scm
+++ b/guix/rustup/build/toolchain.scm
@@ -17,6 +17,7 @@
;;; along with GNU Guix. If not, see .
(define-module (rustup build toolchain)
+ #:use-module (guix ui)
#:use-module (rnrs enums)
#:use-module (guix http-client)
#:use-module (web uri)
@@ -111,9 +112,9 @@
(default #f)))
(define* (toolchain->new channel-str
- #:optional
+ #:key
(components (list ))
- (triplets (list ))
+ (targets (list ))
(profile 'default))
(define _ (channel-str? channel-str))
(toolchain-profile? profile)
@@ -122,11 +123,11 @@
(G_ "components should be a list, was given: ~a")
components)))
(for-each %toolchain-components? components)
- (unless (list? triplets)
+ (unless (list? targets)
(raise (formatted-message
(G_ "targets should be a list, was given: ~a")
- triplets)))
- (for-each %rustc-target-triplets? triplets)
+ targets)))
+ (for-each %rustc-target-triplets? targets)
(define alias (find (lambda (alias)
(string= (channel-str-normalize channel-str) (symbol->string (car alias))))
(module-ref (resolve-module '(rustup dist)) 'aliases)))
@@ -180,7 +181,7 @@
channel-str
(map %rustc-target-triplets->get available-cross-triplets)
triplet))))
- (for-each cross-target-available? triplets)
+ (for-each cross-target-available? targets)
(define profile-components
(case profile
@@ -215,7 +216,7 @@
(define cross-sources (filter
(lambda (target)
(member (car target)
- (map %rustc-target-triplets->position triplets)))
+ (map %rustc-target-triplets->position targets)))
available-cross-targets))
(define all-sources (delete-duplicates
@@ -245,7 +246,7 @@
`(,version . ,hashed-binary-urls))
-(define* (toolchain->from-file file)
+(define* (parse-rust-toolchain-file file)
(let* ((content (call-with-input-file file get-string-all))
(toml (catch #t
(lambda () (parse-toml content))
@@ -263,8 +264,11 @@
(profile (recursive-assoc-ref
toml
`("toolchain" "profile"))))
- (toolchain->new channel components targets profile))
- (toolchain->new (string-trim-right content #\newline)))))
+ (list channel
+ #:components components
+ #:targets targets
+ #:profile profile))
+ (list (string-trim-right content #\newline)))))
(define* (toolchain->version t)
(let ((manifest (toolchain->manifest t)))
@@ -276,25 +280,28 @@
#\ ))
(toolchain->channel t))))
-(define* (rustup channel
+(define* (rustup #:optional (channel-or-toolchain-file #f)
#:key
(components (list ))
(targets (list ))
(profile 'default))
-
- (let* ((t (toolchain->new channel components targets profile))
- (version (car t))
- (sources (cdr t))
- (source (car sources))
- (other-sources (cdr sources)))
+ (let ((args (match (and channel-or-toolchain-file (basename channel-or-toolchain-file))
+ ((or "rust-toolchain" "rust-toolchain.toml" #f)
+ (args-from-default-toolchain-file channel-or-toolchain-file))
+ (_ (list channel-or-toolchain-file
+ #:components components
+ #:targets targets
+ #:profile profile)))))
+ (display args)
+ (make-rust-bin (apply toolchain->new args))))
+
+(define* (make-rust-bin aggregated)
+ (let ((version (car aggregated))
+ (sources (cdr aggregated)))
(package
(name "rust-bin")
(version version)
- (source (origin
- (method url-fetch)
- (uri (car source))
- (sha256
- (base32 (cdr source)))))
+ (source #f)
(build-system binary-build-system)
(inputs
(append
@@ -307,7 +314,7 @@
(uri (car source))
(sha256
(base32 (cdr source))))))
- other-sources)))
+ sources)))
(native-inputs (list `(,gcc "lib")))
(arguments
(list
@@ -315,7 +322,7 @@
#:validate-runpath? #f
#:phases
#~(modify-phases %standard-phases
- (add-after 'unpack 'copy-dist
+ (replace 'unpack
(lambda* (#:key inputs #:allow-other-keys)
(for-each
(lambda (input)
@@ -394,17 +401,33 @@ safety and thread safety guarantees.")
(license (list license:asl2.0 license:expat)))
))
-(define* (rust-from-toolchain channel
- #:optional
- (components (list ))
- (targets (list ))
- (profile "default"))
- (let ((toolchain (toolchain->new channel components targets profile)))
- (rustup toolchain)))
-
-(define* (rust-from-toolchain-file file)
- (let ((toolchain (toolchain->from-file file)))
- (rustup toolchain)))
+;; Copied (guix scripts shell)
+(define (find-file-in-parent-directories candidates)
+ "Find one of CANDIDATES in the current directory or one of its ancestors."
+ (define start (getcwd))
+ (define device (stat:dev (stat start)))
+
+ (let loop ((directory start))
+ (let ((stat (stat directory)))
+ (and (= (stat:uid stat) (getuid))
+ (= (stat:dev stat) device)
+ (or (any (lambda (candidate)
+ (let ((candidate (string-append directory "/" candidate)))
+ (and (file-exists? candidate) candidate)))
+ candidates)
+ (and (not (string=? directory "/"))
+ (loop (dirname directory)))))))) ;lexical ".." resolution
+
+(define* (args-from-default-toolchain-file #:optional (file #f))
+ (let ((file (or file (find-file-in-parent-directories '("rust-toolchain.toml" "rust-toolchain")))))
+ (match file
+ (#f
+ (warning (G_ "no toolchain specified; using stable channel~%"))
+ (list "stable"))
+ (file
+ (begin
+ (info (G_ "loading toolchain from '~a'...~%") file)
+ (parse-rust-toolchain-file file))))))
(define* (select-latest-nightly-with file)
;; Select the latest nightly toolchain which have specific components or profile available.This helps nightly users in case of latest nightly may not contains all components they want.
diff --git a/rustup/build/utils.scm b/guix/rustup/build/utils.scm
similarity index 71%
rename from rustup/build/utils.scm
rename to guix/rustup/build/utils.scm
index 25cc610..20f2d6a 100644
--- a/rustup/build/utils.scm
+++ b/guix/rustup/build/utils.scm
@@ -3,14 +3,16 @@
#:use-module (guix http-client)
#:use-module (guix base16)
#:use-module (guix base32)
+ #:use-module (gcrypt hash)
#:use-module (web uri)
#:use-module (ice-9 textual-ports)
- #:use-module (ice-9 match)
+ #:use-module (ice-9 match)
+ #:use-module (rnrs bytevectors)
#:export (http-fetch/guarded
channel-str-normalize
base32-from-sha256))
-(define* (http-fetch/guarded url)
+(define* (http-fetch/guarded url #:optional (hash #f))
;; Handle 404
(guard (c ((http-get-error? c)
(if (= 404 (http-get-error-code c)) ;"Not Modified"
@@ -19,8 +21,11 @@
(#t c))
(let* ((port (http-fetch/cached (string->uri url)
#:ttl (* 6 3600)))
- (content (get-string-all port)))
+ (content (get-string-all port))
+ (checksum (if hash (bytevector->base16-string (sha256 (string->utf8 content))) #f)))
(close-port port)
+ (when (and hash (not (string= hash checksum)))
+ (error (format #t "~%!Error: sha256 mismatch~%Expecting: ~a~%Actual: ~a~%~%" hash checksum)))
content)))
(define* (base32-from-sha256 sha256)
diff --git a/rustup/dist.scm b/guix/rustup/dist.scm
similarity index 100%
rename from rustup/dist.scm
rename to guix/rustup/dist.scm
diff --git a/rustup/dist/2020-11-19.scm b/guix/rustup/dist/2020-11-19.scm
similarity index 100%
rename from rustup/dist/2020-11-19.scm
rename to guix/rustup/dist/2020-11-19.scm
diff --git a/rustup/dist/2020-12-31.scm b/guix/rustup/dist/2020-12-31.scm
similarity index 100%
rename from rustup/dist/2020-12-31.scm
rename to guix/rustup/dist/2020-12-31.scm
diff --git a/rustup/dist/2021-02-11.scm b/guix/rustup/dist/2021-02-11.scm
similarity index 100%
rename from rustup/dist/2021-02-11.scm
rename to guix/rustup/dist/2021-02-11.scm
diff --git a/rustup/dist/2021-03-25.scm b/guix/rustup/dist/2021-03-25.scm
similarity index 100%
rename from rustup/dist/2021-03-25.scm
rename to guix/rustup/dist/2021-03-25.scm
diff --git a/rustup/dist/2021-05-06.scm b/guix/rustup/dist/2021-05-06.scm
similarity index 100%
rename from rustup/dist/2021-05-06.scm
rename to guix/rustup/dist/2021-05-06.scm
diff --git a/rustup/dist/2021-05-10.scm b/guix/rustup/dist/2021-05-10.scm
similarity index 100%
rename from rustup/dist/2021-05-10.scm
rename to guix/rustup/dist/2021-05-10.scm
diff --git a/rustup/dist/2021-06-17.scm b/guix/rustup/dist/2021-06-17.scm
similarity index 100%
rename from rustup/dist/2021-06-17.scm
rename to guix/rustup/dist/2021-06-17.scm
diff --git a/rustup/dist/2021-07-29.scm b/guix/rustup/dist/2021-07-29.scm
similarity index 100%
rename from rustup/dist/2021-07-29.scm
rename to guix/rustup/dist/2021-07-29.scm
diff --git a/rustup/dist/2021-09-09.scm b/guix/rustup/dist/2021-09-09.scm
similarity index 100%
rename from rustup/dist/2021-09-09.scm
rename to guix/rustup/dist/2021-09-09.scm
diff --git a/rustup/dist/2021-10-21.scm b/guix/rustup/dist/2021-10-21.scm
similarity index 100%
rename from rustup/dist/2021-10-21.scm
rename to guix/rustup/dist/2021-10-21.scm
diff --git a/rustup/dist/2021-11-01.scm b/guix/rustup/dist/2021-11-01.scm
similarity index 100%
rename from rustup/dist/2021-11-01.scm
rename to guix/rustup/dist/2021-11-01.scm
diff --git a/rustup/dist/2021-12-02.scm b/guix/rustup/dist/2021-12-02.scm
similarity index 100%
rename from rustup/dist/2021-12-02.scm
rename to guix/rustup/dist/2021-12-02.scm
diff --git a/rustup/dist/2022-01-13.scm b/guix/rustup/dist/2022-01-13.scm
similarity index 100%
rename from rustup/dist/2022-01-13.scm
rename to guix/rustup/dist/2022-01-13.scm
diff --git a/rustup/dist/2022-01-20.scm b/guix/rustup/dist/2022-01-20.scm
similarity index 100%
rename from rustup/dist/2022-01-20.scm
rename to guix/rustup/dist/2022-01-20.scm
diff --git a/rustup/dist/2022-02-24.scm b/guix/rustup/dist/2022-02-24.scm
similarity index 100%
rename from rustup/dist/2022-02-24.scm
rename to guix/rustup/dist/2022-02-24.scm
diff --git a/rustup/dist/2022-04-07.scm b/guix/rustup/dist/2022-04-07.scm
similarity index 100%
rename from rustup/dist/2022-04-07.scm
rename to guix/rustup/dist/2022-04-07.scm
diff --git a/rustup/dist/2022-05-19.scm b/guix/rustup/dist/2022-05-19.scm
similarity index 100%
rename from rustup/dist/2022-05-19.scm
rename to guix/rustup/dist/2022-05-19.scm
diff --git a/rustup/dist/2022-06-30.scm b/guix/rustup/dist/2022-06-30.scm
similarity index 100%
rename from rustup/dist/2022-06-30.scm
rename to guix/rustup/dist/2022-06-30.scm
diff --git a/rustup/dist/2022-07-19.scm b/guix/rustup/dist/2022-07-19.scm
similarity index 100%
rename from rustup/dist/2022-07-19.scm
rename to guix/rustup/dist/2022-07-19.scm
diff --git a/rustup/dist/2022-08-11.scm b/guix/rustup/dist/2022-08-11.scm
similarity index 100%
rename from rustup/dist/2022-08-11.scm
rename to guix/rustup/dist/2022-08-11.scm
diff --git a/rustup/dist/2022-09-22.scm b/guix/rustup/dist/2022-09-22.scm
similarity index 100%
rename from rustup/dist/2022-09-22.scm
rename to guix/rustup/dist/2022-09-22.scm
diff --git a/rustup/dist/2022-11-03.scm b/guix/rustup/dist/2022-11-03.scm
similarity index 100%
rename from rustup/dist/2022-11-03.scm
rename to guix/rustup/dist/2022-11-03.scm
diff --git a/rustup/dist/2022-12-15.scm b/guix/rustup/dist/2022-12-15.scm
similarity index 100%
rename from rustup/dist/2022-12-15.scm
rename to guix/rustup/dist/2022-12-15.scm
diff --git a/rustup/dist/2023-01-10.scm b/guix/rustup/dist/2023-01-10.scm
similarity index 100%
rename from rustup/dist/2023-01-10.scm
rename to guix/rustup/dist/2023-01-10.scm
diff --git a/rustup/dist/2023-01-26.scm b/guix/rustup/dist/2023-01-26.scm
similarity index 100%
rename from rustup/dist/2023-01-26.scm
rename to guix/rustup/dist/2023-01-26.scm
diff --git a/rustup/dist/2023-02-09.scm b/guix/rustup/dist/2023-02-09.scm
similarity index 100%
rename from rustup/dist/2023-02-09.scm
rename to guix/rustup/dist/2023-02-09.scm
diff --git a/rustup/dist/2023-03-09.scm b/guix/rustup/dist/2023-03-09.scm
similarity index 100%
rename from rustup/dist/2023-03-09.scm
rename to guix/rustup/dist/2023-03-09.scm
diff --git a/rustup/dist/2023-03-23.scm b/guix/rustup/dist/2023-03-23.scm
similarity index 100%
rename from rustup/dist/2023-03-23.scm
rename to guix/rustup/dist/2023-03-23.scm
diff --git a/rustup/dist/2023-03-28.scm b/guix/rustup/dist/2023-03-28.scm
similarity index 100%
rename from rustup/dist/2023-03-28.scm
rename to guix/rustup/dist/2023-03-28.scm
diff --git a/rustup/dist/2023-04-20.scm b/guix/rustup/dist/2023-04-20.scm
similarity index 100%
rename from rustup/dist/2023-04-20.scm
rename to guix/rustup/dist/2023-04-20.scm
diff --git a/rustup/dist/2023-06-01.scm b/guix/rustup/dist/2023-06-01.scm
similarity index 100%
rename from rustup/dist/2023-06-01.scm
rename to guix/rustup/dist/2023-06-01.scm
diff --git a/rustup/dist/2023-07-13.scm b/guix/rustup/dist/2023-07-13.scm
similarity index 100%
rename from rustup/dist/2023-07-13.scm
rename to guix/rustup/dist/2023-07-13.scm
diff --git a/rustup/dist/2023-08-03.scm b/guix/rustup/dist/2023-08-03.scm
similarity index 100%
rename from rustup/dist/2023-08-03.scm
rename to guix/rustup/dist/2023-08-03.scm
diff --git a/rustup/dist/2023-08-24.scm b/guix/rustup/dist/2023-08-24.scm
similarity index 100%
rename from rustup/dist/2023-08-24.scm
rename to guix/rustup/dist/2023-08-24.scm
diff --git a/rustup/dist/2023-09-19.scm b/guix/rustup/dist/2023-09-19.scm
similarity index 100%
rename from rustup/dist/2023-09-19.scm
rename to guix/rustup/dist/2023-09-19.scm
diff --git a/rustup/dist/2023-10-05.scm b/guix/rustup/dist/2023-10-05.scm
similarity index 100%
rename from rustup/dist/2023-10-05.scm
rename to guix/rustup/dist/2023-10-05.scm
diff --git a/rustup/dist/2023-11-16.scm b/guix/rustup/dist/2023-11-16.scm
similarity index 100%
rename from rustup/dist/2023-11-16.scm
rename to guix/rustup/dist/2023-11-16.scm
diff --git a/rustup/dist/2023-12-07.scm b/guix/rustup/dist/2023-12-07.scm
similarity index 100%
rename from rustup/dist/2023-12-07.scm
rename to guix/rustup/dist/2023-12-07.scm
diff --git a/rustup/dist/2023-12-28.scm b/guix/rustup/dist/2023-12-28.scm
similarity index 100%
rename from rustup/dist/2023-12-28.scm
rename to guix/rustup/dist/2023-12-28.scm
diff --git a/rustup/dist/2024-02-08.scm b/guix/rustup/dist/2024-02-08.scm
similarity index 100%
rename from rustup/dist/2024-02-08.scm
rename to guix/rustup/dist/2024-02-08.scm
diff --git a/rustup/dist/2024-03-21.scm b/guix/rustup/dist/2024-03-21.scm
similarity index 100%
rename from rustup/dist/2024-03-21.scm
rename to guix/rustup/dist/2024-03-21.scm
diff --git a/rustup/dist/2024-03-28.scm b/guix/rustup/dist/2024-03-28.scm
similarity index 100%
rename from rustup/dist/2024-03-28.scm
rename to guix/rustup/dist/2024-03-28.scm
diff --git a/rustup/dist/2024-04-09.scm b/guix/rustup/dist/2024-04-09.scm
similarity index 100%
rename from rustup/dist/2024-04-09.scm
rename to guix/rustup/dist/2024-04-09.scm
diff --git a/rustup/dist/2024-05-02.scm b/guix/rustup/dist/2024-05-02.scm
similarity index 100%
rename from rustup/dist/2024-05-02.scm
rename to guix/rustup/dist/2024-05-02.scm
diff --git a/rustup/packages/rust.scm b/guix/rustup/packages/rust.scm
similarity index 100%
rename from rustup/packages/rust.scm
rename to guix/rustup/packages/rust.scm
diff --git a/tests/toml.scm b/tests/toml.scm
deleted file mode 100644
index 798f4ce..0000000
--- a/tests/toml.scm
+++ /dev/null
@@ -1,441 +0,0 @@
-;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2023 Lars-Dominik Braun
-;;;
-;;; This file is part of GNU Guix.
-;;;
-;;; GNU Guix 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.
-;;;
-;;; GNU Guix 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 GNU Guix. If not, see .
-
-(define-module (tests toml)
- #:use-module (rustup build toml)
- #:use-module (guix tests)
- #:use-module (srfi srfi-19) ; For datetime.
- #:use-module (srfi srfi-64)
- #:use-module (ice-9 match))
-
-(test-begin "toml")
-
-;; Tests taken from https://toml.io/en/v1.0.0
-
-(test-error "parse-toml: Unspecified key"
- &file-not-consumed
- (parse-toml "key = # INVALID"))
-
-(test-error "parse-toml: Missing EOL"
- &file-not-consumed
- (parse-toml "first = \"Tom\" last = \"Preston-Werner\" # INVALID"))
-
-(test-equal "parse-toml: Bare keys"
- '(("key" . "value") ("bare_key" . "value") ("bare-key" . "value") ("1234" . "value"))
- (parse-toml "key = \"value\"
-bare_key = \"value\"
-bare-key = \"value\"
-1234 = \"value\""))
-
-(test-equal "parse-toml: Quoted keys"
- '(("127.0.0.1" . "value")
- ("character encoding" . "value")
- ("ʎǝʞ" . "value")
- ("key2" . "value")
- ("quoted \"value\"" . "value"))
- (parse-toml "\"127.0.0.1\" = \"value\"
-\"character encoding\" = \"value\"
-\"ʎǝʞ\" = \"value\"
-'key2' = \"value\"
-'quoted \"value\"' = \"value\""))
-
-(test-equal "parse-toml: No key"
- #f
- (parse-toml "= \"no key name\""))
-
-(test-equal "parse-toml: Empty key"
- '(("" . "blank"))
- (parse-toml "\"\" = \"blank\""))
-
-(test-equal "parse-toml: Dotted keys"
- '(("name" . "Orange")
- ("physical" ("color" . "orange")
- ("shape" . "round"))
- ("site" ("google.com" . #t)))
- (parse-toml "name = \"Orange\"
-physical.color = \"orange\"
-physical.shape = \"round\"
-site.\"google.com\" = true"))
-
-(test-equal "parse-toml: Dotted keys with whitespace"
- '(("fruit" ("name" . "banana") ("color" . "yellow") ("flavor" . "banana")))
- (parse-toml "fruit.name = \"banana\" # this is best practice
-fruit. color = \"yellow\" # same as fruit.color
-fruit . flavor = \"banana\" # same as fruit.flavor"))
-
-(test-error "parse-toml: Multiple keys"
- &already-defined
- (parse-toml "name = \"Tom\"
-name = \"Pradyun\""))
-
-(test-equal "parse-toml: Implicit tables"
- '(("fruit" ("apple" ("smooth" . #t)) ("orange" . 2)))
- (parse-toml "fruit.apple.smooth = true
-fruit.orange = 2"))
-
-(test-error "parse-toml: Write to value"
- &already-defined
- (parse-toml "fruit.apple = 1
-fruit.apple.smooth = true"))
-
-(test-equal "parse-toml: String"
- '(("str" . "I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF."))
- (parse-toml "str = \"I'm a string. \\\"You can quote me\\\". Name\\tJos\\u00E9\\nLocation\\tSF.\""))
-
-(test-equal "parse-toml: Empty string"
- '(("str1" . "")
- ("str2" . "")
- ("str3" . "")
- ("str4" . ""))
- (parse-toml "str1 = \"\"
-str2 = ''
-str3 = \"\"\"\"\"\"
-str4 = ''''''"))
-
-(test-equal "parse-toml: Multi-line basic strings"
- '(("str1" . "Roses are red\nViolets are blue")
- ("str2" . "The quick brown fox jumps over the lazy dog.")
- ("str3" . "The quick brown fox jumps over the lazy dog.")
- ("str4" . "Here are two quotation marks: \"\". Simple enough.")
- ("str5" . "Here are three quotation marks: \"\"\".")
- ("str6" . "Here are fifteen quotation marks: \"\"\"\"\"\"\"\"\"\"\"\"\"\"\".")
- ("str7" . "\"This,\" she said, \"is just a pointless statement.\""))
- (parse-toml "str1 = \"\"\"
-Roses are red
-Violets are blue\"\"\"
-
-str2 = \"\"\"
-The quick brown \\
-
-
- fox jumps over \\
- the lazy dog.\"\"\"
-
-str3 = \"\"\"\\
- The quick brown \\
- fox jumps over \\
- the lazy dog.\\
- \"\"\"
-
-str4 = \"\"\"Here are two quotation marks: \"\". Simple enough.\"\"\"
-# str5 = \"\"\"Here are three quotation marks: \"\"\".\"\"\" # INVALID
-str5 = \"\"\"Here are three quotation marks: \"\"\\\".\"\"\"
-str6 = \"\"\"Here are fifteen quotation marks: \"\"\\\"\"\"\\\"\"\"\\\"\"\"\\\"\"\"\\\".\"\"\"
-
-# \"This,\" she said, \"is just a pointless statement.\"
-str7 = \"\"\"\"This,\" she said, \"is just a pointless statement.\"\"\"\""))
-
-(test-equal "parse-toml: Literal string"
- '(("winpath" . "C:\\Users\\nodejs\\templates")
- ("winpath2" . "\\\\ServerX\\admin$\\system32\\")
- ("quoted" . "Tom \"Dubs\" Preston-Werner")
- ("regex" . "<\\i\\c*\\s*>"))
- (parse-toml "winpath = 'C:\\Users\\nodejs\\templates'
-winpath2 = '\\\\ServerX\\admin$\\system32\\'
-quoted = 'Tom \"Dubs\" Preston-Werner'
-regex = '<\\i\\c*\\s*>'"))
-
-(test-equal "parse-toml: Multi-line literal strings"
- '(("regex2" . "I [dw]on't need \\d{2} apples")
- ("lines" . "The first newline is\ntrimmed in raw strings.\n All other whitespace\n is preserved.\n")
- ("quot15" . "Here are fifteen quotation marks: \"\"\"\"\"\"\"\"\"\"\"\"\"\"\"")
- ("apos15" . "Here are fifteen apostrophes: '''''''''''''''")
- ("str" . "'That,' she said, 'is still pointless.'"))
- (parse-toml "regex2 = '''I [dw]on't need \\d{2} apples'''
-lines = '''
-The first newline is
-trimmed in raw strings.
- All other whitespace
- is preserved.
-'''
-quot15 = '''Here are fifteen quotation marks: \"\"\"\"\"\"\"\"\"\"\"\"\"\"\"'''
-
-# apos15 = '''Here are fifteen apostrophes: '''''''''''''''''' # INVALID
-apos15 = \"Here are fifteen apostrophes: '''''''''''''''\"
-
-# 'That,' she said, 'is still pointless.'
-str = ''''That,' she said, 'is still pointless.''''"))
-
-(test-equal "parse-toml: Decimal integer"
- '(("int1" . 99) ("int2" . 42) ("int3" . 0) ("int4" . -17))
- (parse-toml "int1 = +99
-int2 = 42
-int3 = 0
-int4 = -17"))
-
-(test-equal "parse-toml: Decimal integer underscores"
- '(("int5" . 1000) ("int6" . 5349221) ("int7" . 5349221) ("int8" . 12345))
- (parse-toml "int5 = 1_000
-int6 = 5_349_221
-int7 = 53_49_221 # Indian number system grouping
-int8 = 1_2_3_4_5 # VALID but discouraged"))
-
-(test-equal "parse-toml: Hexadecimal"
- `(("hex1" . ,#xdeadbeef) ("hex2" . ,#xdeadbeef) ("hex3" . ,#xdeadbeef))
- (parse-toml "hex1 = 0xDEADBEEF
-hex2 = 0xdeadbeef
-hex3 = 0xdead_beef"))
-
-(test-equal "parse-toml: Octal"
- `(("oct1" . ,#o01234567) ("oct2" . #o755))
- (parse-toml "oct1 = 0o01234567
-oct2 = 0o755"))
-
-(test-equal "parse-toml: Binary"
- `(("bin1" . ,#b11010110))
- (parse-toml "bin1 = 0b11010110"))
-
-(test-equal "parse-toml: Float"
- '(("flt1" . 1.0)
- ("flt2" . 3.1415)
- ("flt3" . -0.01)
- ("flt4" . 5e+22)
- ("flt5" . 1e06)
- ("flt6" . -2e-2)
- ("flt7" . 6.626e-34)
- ("flt8" . 224617.445991228))
- (parse-toml "# fractional
-flt1 = +1.0
-flt2 = 3.1415
-flt3 = -0.01
-
-# exponent
-flt4 = 5e+22
-flt5 = 1e06
-flt6 = -2E-2
-
-# both
-flt7 = 6.626e-34
-
-flt8 = 224_617.445_991_228"))
-
-(test-equal "parse-toml: Float"
- '(("sf1" . +inf.0)
- ("sf2" . +inf.0)
- ("sf3" . -inf.0)
- ("sf4" . +nan.0)
- ("sf5" . +nan.0)
- ("sf6" . -nan.0))
- (parse-toml "# infinity
-sf1 = inf # positive infinity
-sf2 = +inf # positive infinity
-sf3 = -inf # negative infinity
-
-# not a number
-sf4 = nan # actual sNaN/qNaN encoding is implementation-specific
-sf5 = +nan # same as `nan`
-sf6 = -nan # valid, actual encoding is implementation-specific"))
-
-(test-equal "parse-toml: Boolean"
- '(("bool1" . #t)
- ("bool2" . #f))
- (parse-toml "bool1 = true
-bool2 = false"))
-
-(test-equal "parse-toml: Offset date-time"
- `(("odt1" . ,(make-date #f 0 32 7 27 5 1979 0))
- ("odt2" . ,(make-date #f 0 32 0 27 5 1979 (* -7 60 60)))
- ("odt3" . ,(make-date 999999 0 32 0 27 5 1979 (* 7 60 60)))
- ("odt4" . ,(make-date #f 0 32 7 27 5 1979 0)))
- (parse-toml "odt1 = 1979-05-27T07:32:00Z
-odt2 = 1979-05-27T00:32:00-07:00
-odt3 = 1979-05-27T00:32:00.999999+07:00
-odt4 = 1979-05-27 07:32:00Z"))
-
-(test-equal "parse-toml: Local date-time"
- `(("ldt1" . ,(make-date #f 0 32 7 27 5 1979 #f))
- ("ldt2" . ,(make-date 999999 0 32 0 27 5 1979 #f)))
- (parse-toml "ldt1 = 1979-05-27T07:32:00
-ldt2 = 1979-05-27T00:32:00.999999"))
-
-(test-equal "parse-toml: Local date"
- `(("ld1" . ,(make-date #f #f #f #f 27 5 1979 #f)))
- (parse-toml "ld1 = 1979-05-27"))
-
-(test-equal "parse-toml: Local time"
- `(("lt1" . ,(make-date #f 0 32 7 #f #f #f #f))
- ("lt2" . ,(make-date 999999 0 32 0 #f #f #f #f)))
- (parse-toml "lt1 = 07:32:00
-lt2 = 00:32:00.999999"))
-
-(test-equal "parse-toml: Arrays"
- '(("integers" 1 2 3)
- ("colors" "red" "yellow" "green")
- ("nested_arrays_of_ints" (1 2) (3 4 5))
- ("nested_mixed_array" (1 2) ("a" "b" "c"))
- ("string_array" "all" "strings")
- ("numbers" 0.1 0.2 0.5 1 2 5)
- ("contributors" "Foo Bar " (("name" . "Baz Qux") ("email" . "bazqux@example.com") ("url" . "https://example.com/bazqux")))
- ("integers2" 1 2 3)
- ("integers3" 1 2))
- (parse-toml "integers = [ 1, 2, 3 ]
-colors = [ \"red\", \"yellow\", \"green\" ]
-nested_arrays_of_ints = [ [ 1, 2 ], [3, 4, 5] ]
-nested_mixed_array = [ [ 1, 2 ], [\"a\", \"b\", \"c\"] ]
-string_array = [ \"all\", 'strings' ]
-
-# Mixed-type arrays are allowed
-numbers = [ 0.1, 0.2, 0.5, 1, 2, 5 ]
-contributors = [
- \"Foo Bar \",
- { name = \"Baz Qux\", email = \"bazqux@example.com\", url = \"https://example.com/bazqux\" }
-]
-
-integers2 = [
- 1, 2, 3
-]
-
-integers3 = [
- 1,
- 2, # this is ok
-]"))
-
-(test-equal "parse-toml: Tables"
- '(("table-1" ("key1" . "some string")
- ("key2" . 123))
- ("table-2" ("key1" . "another string")
- ("key2" . 456)))
- (parse-toml "[table-1]
-key1 = \"some string\"
-key2 = 123
-
-[table-2]
-key1 = \"another string\"
-key2 = 456"))
-
-
-(test-equal "parse-toml: Dotted table"
- '(("dog" ("tater.man" ("type" ("name" . "pug")))))
- (parse-toml "[dog.\"tater.man\"]
-type.name = \"pug\""))
-
-
-(test-equal "parse-toml: Dotted table with whitespace"
- '(("a" ("b" ("c" ("x" . 1))))
- ("d" ("e" ("f" ("x" . 1))))
- ("g" ("h" ("i" ("x" . 1))))
- ("j" ("ʞ" ("l" ("x" . 1)))))
- (parse-toml "[a.b.c] # this is best practice
-x=1
-[ d.e.f ] # same as [d.e.f]
-x=1
-[ g . h . i ] # same as [g.h.i]
-x=1
-[ j . \"ʞ\" . 'l' ] # same as [j.\"ʞ\".'l']
-x=1"))
-
-;; XXX: technically this is not allowed, but we permit it.
-(test-equal "parse-toml: Multiple tables"
- '(("fruit" ("apple" . "red") ("orange" . "orange")))
- (parse-toml "[fruit]
-apple = \"red\"
-
-[fruit]
-orange = \"orange\""))
-
-(test-equal "parse-toml: Assignment to non-table"
- #f
- (parse-toml "[fruit]
-apple = \"red\"
-
-[fruit.apple]
-texture = \"smooth\""))
-
-(test-equal "parse-toml: Dotted keys create tables"
- '(("fruit" ("apple" ("color" . "red") ("taste" ("sweet" . #t)))))
- (parse-toml "fruit.apple.color = \"red\"
-fruit.apple.taste.sweet = true"))
-
-(test-equal "parse-toml: Inline tables"
- '(("name" ("first" . "Tom") ("last" . "Preston-Werner"))
- ("point" ("x" . 1) ("y" . 2))
- ("animal" ("type" ("name" . "pug"))))
- (parse-toml "name = { first = \"Tom\", last = \"Preston-Werner\" }
-point = { x = 1, y = 2 }
-animal = { type.name = \"pug\" }"))
-
-(test-error "parse-toml: Invalid assignment to inline table"
- #t
- (parse-toml "[product]
-type = { name = \"Nail\" }
-type.edible = false # INVALID"))
-
-;; We do not catch this semantic error yet.
-(test-expect-fail 1)
-(test-error "parse-toml: Invalid assignment to implicit table"
- #f
- (parse-toml "[product]
-type.name = \"Nail\"
-type = { edible = false } # INVALID"))
-
-;; Not implemented.
-(test-expect-fail 1)
-(test-equal "parse-toml: Array of tables"
- '(("products" (("name" . "Hammer") ("sku" . 738594937))
- ()
- (("name" . "Nail") ("sku" . 284758393) ("color" . "gray"))))
- (parse-toml "[[products]]
-name = \"Hammer\"
-sku = 738594937
-
-[[products]] # empty table within the array
-
-[[products]]
-name = \"Nail\"
-sku = 284758393
-
-color = \"gray\""))
-
-;; Not implemented.
-(test-expect-fail 1)
-(test-equal "parse-toml: Array of tables"
- '(("fruits" ((("name" . "apple")
- ("physical" (("color" . "red") ("shape" . "round")))
- ("varieties" ((("name" . "red delicious")) (("name" . "granny smith")))))
- (("name" . "banana")
- ("varieties" (((("name" . "plantain")))))))))
- (parse-toml "[[fruits]]
-name = \"apple\"
-
-[fruits.physical] # subtable
-color = \"red\"
-shape = \"round\"
-
-[[fruits.varieties]] # nested array of tables
-name = \"red delicious\"
-
-[[fruits.varieties]]
-name = \"granny smith\"
-
-
-[[fruits]]
-name = \"banana\"
-
-[[fruits.varieties]]
-name = \"plantain\""))
-
-;; Not implemented.
-(test-expect-fail 1)
-(test-error "parse-toml: Assignment to statically defined array"
- #f
- (parse-toml "fruits = []
-
-[[fruits]]
-x=1"))
-
-(test-end "toml")