aboutsummaryrefslogtreecommitdiff
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2019-2021, 2024 Ludovic Courtès <ludo@gnu.org>
;;;
;;; 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 <http://www.gnu.org/licenses/>.

(define-module (test-swh)
  #:use-module (guix swh)
  #:use-module (guix base32)
  #:use-module (guix tests http)
  #:use-module (web response)
  #:use-module (srfi srfi-19)
  #:use-module (srfi srfi-64)
  #:use-module (ice-9 match))

;; Test the JSON mapping machinery used in (guix swh).

(define %origin
  "{ \"origin_visits_url\": \"/visits/42\",
     \"type\": \"git\",
     \"url\": \"http://example.org/guix.git\" }")

(define %visits
  ;; A single visit where 'snapshot_url' is null.
  ;; See <https://bugs.gnu.org/45615>.
  "[ {
    \"origin\": \"https://github.com/Genivia/ugrep\",
    \"visit\": 1,
    \"date\": \"2020-05-17T21:43:45.422977+00:00\",
    \"status\": \"ongoing\",
    \"snapshot\": null,
    \"metadata\": {},
    \"type\": \"git\",
    \"origin_visit_url\": \"https://archive.softwareheritage.org/api/1/origin/https://github.com/Genivia/ugrep/visit/1/\",
    \"snapshot_url\": null
  } ]")

(define %directory-entries
  "[ { \"name\": \"one\",
       \"type\": \"regular\",
       \"length\": 123,
       \"dir_id\": 1 },
     { \"name\": \"two\",
       \"type\": \"regular\",
       \"length\": 456,
       \"dir_id\": 2 } ]")

(define %external-id
  "{ \"extid_type\": \"nar-sha256\",
     \"extid\":
\"0b56ba94c2b83b8f74e3772887c1109135802eb3e8962b628377987fe97e1e63\",
     \"version\": 0,
     \"target\": \"swh:1:dir:84a8b34591712c0a90bab0af604188bcd1fe3153\",
     \"target_url\":
\"https://archive.softwareheritage.org/swh:1:dir:84a8b34591712c0a90bab0af604188bcd1fe3153\"
   }")

(define-syntax-rule (with-json-result str exp ...)
  (with-http-server `((200 ,str))
    (parameterize ((%swh-base-url (%local-url)))
      exp ...)))

(test-begin "swh")

(test-equal "lookup-origin"
  (list "git" "http://example.org/guix.git")
  (with-json-result %origin
    (let ((origin (lookup-origin "http://example.org/guix.git")))
      (list (origin-type origin)
            (origin-url origin)))))

(test-equal "lookup-origin, not found"
  #f
  (with-http-server `((404 "Nope."))
    (parameterize ((%swh-base-url (%local-url)))
      (lookup-origin "http://example.org/whatever"))))

(test-equal "origin-visit, no snapshots"
  '("https://github.com/Genivia/ugrep"
    "2020-05-17T21:43:45Z"
    #f)                                      ;see <https://bugs.gnu.org/45615>
  (with-http-server `((200 ,%origin)
                      (200 ,%visits))
    (parameterize ((%swh-base-url (%local-url)))
      (let ((origin (lookup-origin "http://example.org/whatever")))
        (match (origin-visits origin)
          ((visit)
           (list (visit-origin visit)
                 (date->string (visit-date visit) "~4")
                 (visit-snapshot-url visit))))))))

(test-equal "lookup-directory"
  '(("one" 123) ("two" 456))
  (with-json-result %directory-entries
    (map (lambda (entry)
           (list (directory-entry-name entry)
                 (directory-entry-length entry)))
         (lookup-directory "123"))))

(test-equal "lookup-origin-revision"
  '("cd86c72084993d9ef26fc9e24b73cea612b8c97b"
    "d173c707ee88e3c89401ad77fafa65fcd9e9f5be")
  (let ()
    ;; Make sure that 'lookup-origin-revision' does the job, and in particular
    ;; that it doesn't stop until it has found an actual revision:
    ;; 'git-checkout visits point to directories instead of revisions.
    ;; See <https://issues.guix.gnu.org/69070>.
    (define visits
      ;; Two visits of differing types: the first visit (type 'git-checkout')
      ;; points to a directory, the second one (type 'git') points to a
      ;; revision.
      "[ {
    \"origin\": \"https://example.org/repo.git\",
    \"visit\": 1,
    \"type\": \"git-checkout\",
    \"date\": \"2020-05-17T21:43:45.422977+00:00\",
    \"status\": \"full\",
    \"metadata\": {},
    \"type\": \"git-checkout\",
    \"origin_visit_url\": \"/visit/42\",
    \"snapshot_url\": \"/snapshot/1\"
  }, {
    \"origin\": \"https://example.org/repo.git\",
    \"visit\": 2,
    \"type\": \"git\",
    \"date\": \"2020-05-17T21:43:49.422977+00:00\",
    \"status\": \"full\",
    \"metadata\": {},
    \"type\": \"git\",
    \"origin_visit_url\": \"/visit/41\",
    \"snapshot_url\": \"/snapshot/2\"
  } ]")
    (define snapshot-for-git-checkout
      "{ \"id\": 42,
         \"branches\": { \"1.3.2\": {
           \"target\": \"e4a4be18fae8d9c6528abff3bc9088feb19a76c7\",
           \"target_type\": \"directory\",
           \"target_url\": \"/directory/e4a4be18fae8d9c6528abff3bc9088feb19a76c7\"
         }}
       }")
    (define snapshot-for-git
      "{ \"id\": 42,
         \"branches\": { \"1.3.2\": {
           \"target\": \"e4a4be18fae8d9c6528abff3bc9088feb19a76c7\",
           \"target_type\": \"revision\",
           \"target_url\": \"/revision/e4a4be18fae8d9c6528abff3bc9088feb19a76c7\"
         }}
       }")
    (define revision
      "{ \"author\": {},
         \"committer\": {},
         \"committer_date\": \"2018-05-17T21:43:49.422977+00:00\",
         \"date\": \"2018-05-17T21:43:49.422977+00:00\",
         \"directory\": \"d173c707ee88e3c89401ad77fafa65fcd9e9f5be\",
         \"directory_url\": \"/directory/d173c707ee88e3c89401ad77fafa65fcd9e9f5be\",
         \"id\": \"cd86c72084993d9ef26fc9e24b73cea612b8c97b\",
         \"merge\": false,
         \"message\": \"Fix.\",
         \"parents\": [],
         \"type\": \"what type?\"
       }")

    (with-http-server `((200 ,%origin)
                        (200 ,visits)
                        (200 ,snapshot-for-git-checkout)
                        (200 ,snapshot-for-git)
                        (200 ,revision))
      (parameterize ((%swh-base-url (%local-url)))
        (let ((revision (lookup-origin-revision "https://example.org/repo.git"
                                                "1.3.2")))
          (list (revision-id revision)
                (revision-directory revision)))))))

(test-equal "lookup-directory-by-nar-hash"
  "swh:1:dir:84a8b34591712c0a90bab0af604188bcd1fe3153"
  (with-json-result %external-id
    (lookup-directory-by-nar-hash
     (nix-base32-string->bytevector
      "0qqygvlpz63phdi2p5p8ncp80dci230qfa3pwds8yfxqqaablmhb")
     'sha256)))

(test-equal "rate limit reached"
  3000000000
  (let ((too-many (build-response
                   #:code 429
                   #:reason-phrase "Too many requests"

                   ;; Pretend we've reached the limit and it'll be reset in
                   ;; June 2065.
                   #:headers '((x-ratelimit-remaining . "0")
                               (x-ratelimit-reset . "3000000000")))))
    (with-http-server `((,too-many "Too bad."))
      (parameterize ((%swh-base-url (%local-url)))
        (catch 'swh-error
          (lambda ()
            (lookup-origin "http://example.org/guix.git"))
          (lambda (key url method response)
            ;; Ensure the reset time was recorded.
            (@@ (guix swh) %general-rate-limit-reset-time)))))))

(test-assert "%allow-request? and request-rate-limit-reached?"
  ;; Here we test two things: that the rate limit set above is in effect and
  ;; that %ALLOW-REQUEST? is called, and that 'request-rate-limit-reached?'
  ;; returns true.
  (let* ((key (gensym "skip-request"))
         (skip-if-limit-reached
          (lambda (url method)
            (or (not (request-rate-limit-reached? url method))
                (throw key #t)))))
    (parameterize ((%allow-request? skip-if-limit-reached))
      (catch key
        (lambda ()
          (lookup-origin "http://example.org/guix.git")
          #f)
        (const #t)))))

(test-end "swh")

;; Local Variables:
;; eval: (put 'with-json-result 'scheme-indent-function 1)
;; eval: (put 'with-http-server 'scheme-indent-function 1)
;; End:

le.am?id=44c2211c6464b96c253ccb5e875043c63a51a6c1'>gnu: Add linux-libre 5.16.2....* gnu/packages/aux-files/linux-libre/5.16-arm.conf, gnu/packages/aux-files/linux-libre/5.16-arm64.conf, gnu/packages/aux-files/linux-libre/5.16-i686.conf, gnu/packages/aux-files/linux-libre/5.16-x86_64.conf : New files. * Makefile.am (AUX_FILES): Add them. * gnu/packages/linux.scm (linux-libre-5.16-version, linux-libre-5.16-gnu-revision, deblob-scripts-5.16, linux-libre-5.16-pristine-source, linux-libre-5.16-source, linux-libre-headers-5.16, linux-libre-5.16): New variables. Leo Famulari 2022-01-16import/github: Test it....* Makefile.am (SCM_TESTS): Register new tests. * guix/import/github.scm (%github-api): New variable. (fetch-releases-or-tags): Use the new variable. * tests/import-github.scm: New file with tests. Signed-off-by: Ludovic Courtès <ludo@gnu.org> Maxime Devos 2022-01-15gnu: renpy: Move renpy command to aux-files....* gnu/packages/aux-files/renpy/renpy.in: New file. * gnu/packages/game-development.scm (renpy)[install]: Use renpy.in with substitute*. * Makefile.am (AUX_FILES): Add it here. Liliana Marie Prikler 2022-01-06guix hash: Extract file hashing procedures....* guix/scripts/hash.scm (guix-hash)[vcs-file?] (nar-hash, default-hash): Extract hashing logic to... * guix/hash.scm (vcs-file?, file-hash*): ... these new procedures in this new file. Modified-by: Maxime Devos <maximedevos@telenet.be> Signed-off-by: Ludovic Courtès <ludo@gnu.org> Sarah Morgensen 2022-01-01Add (guix cpu)....* guix/cpu.scm: New file. * Makefile.am (MODULES): Add it. Ludovic Courtès 2021-12-28build: Fix typo in Makefile....* Makefile.am (release): Fix tense of "produce" Leo Famulari 2021-12-22tests: Move keys into ./tests/keys/ and add a third ed25519 key....The third key will be used in an upcoming commit. Rename public keys to .pub. * guix/tests/gnupg.scm (%ed25519-3-public-key-file): New variable. (%ed25519-3-secret-key-file): New variable. (%ed25519-2-public-key-file): Renamed from %ed25519bis-public-key-file. (%ed25519-2-secret-key-file): Renamed from %ed25519bis-secret-key-file. * tests/keys/ed25519-3.key: New file. * tests/keys/ed25519-3.sec: New file. Signed-off-by: Mathieu Othacehe <othacehe@gnu.org> Attila Lendvai 2021-12-05Merge remote-tracking branch 'origin/master' into core-updates-frozenRicardo Wurmus 2021-11-26gnu: Remove linux-libre 5.14....* gnu/packages/linux.scm (linux-libre-5.14-version, linux-libre-5.14-gnu-revision, deblob-scripts-5.14, linux-libre-5.14-pristine-source, linux-libre-5.14-source, linux-libre-headers-5.14, linux-libre-5.14): Remove variables. * gnu/packages/aux-files/linux-libre/5.14-arm.conf, gnu/packages/aux-files/linux-libre/5.14-arm64.conf, gnu/packages/aux-files/linux-libre/5.14-i686.conf, gnu/packages/aux-files/linux-libre/5.14-x86_64.conf: Delete files. * Makefile.am (AUX_FILES): Remove them. Leo Famulari 2021-11-26gnu: Add linux-libre 5.15.5....* gnu/packages/linux.scm (linux-libre-5.15-version, linux-libre-5.15-gnu-revision, deblob-scripts-5.15, linux-libre-5.15-pristine-source, linux-libre-5.15-source, linux-libre-headers-5.15, linux-libre-5.15): New variables. * gnu/packages/aux-files/linux-libre/5.15-arm.conf, gnu/packages/aux-files/linux-libre/5.15-arm64.conf, gnu/packages/aux-files/linux-libre/5.15-i686.conf, gnu/packages/aux-files/linux-libre/5.15-x86_64.conf: New files. * Makefile.am (AUX_FILES): Add them Leo Famulari 2021-10-31Merge remote-tracking branch 'origin/master' into core-updates-frozenEfraim Flashner 2021-10-31Add tests for ‘guix home import’....* tests/home-import.scm: New file. * Makefile.am (SCM_TESTS): Add it. Signed-off-by: Ludovic Courtès <ludo@gnu.org> Xinglu Chen 2021-10-25Add 'guix shell'....* guix/scripts/shell.scm, tests/guix-shell.sh: New files. * Makefile.am (MODULES): Add 'shell.scm'. (SH_TESTS): Add 'tests/guix-shell.sh'. * guix/scripts/environment.scm (show-environment-options-help): New procedure. (show-help): Use it. (guix-environment*): New procedure. (guix-environment): Use it. * po/guix/POTFILES.in: Add it. * doc/guix.texi (Features): Refer to "guix shell" (Invoking guix package): Likewise. (Development): Likewise. (Invoking guix shell): New node. (Invoking guix environment): Add deprecation warning. (Debugging Build Failures): Use 'guix shell' in examples. (Invoking guix container): Refer to 'guix shell'. (Invoking guix processes, Virtualization Services): Adjust examples to use 'guix shell'. * doc/contributing.texi (Building from Git): Refer to 'guix shell'. * etc/completion/bash/guix: Handle "shell". Ludovic Courtès 2021-10-18Merge remote-tracking branch 'signed/master' into core-updatesMathieu Othacehe 2021-10-17maint: Factorize po xref translation....This ensures we use the same method in "make" as in "guix/self.scm". * Makefile.am: Build guix/build/po.scm. * build-aux/convert-xref.scm: New file. * doc/local.mk (xref_command): Use it. * guix/self.scm (translate-cross-references): Move it... * guix/build/po.scm: Parse comments and flags separately to find fuzzy flags. (translate-cross-references): ...here. (parse-tree->assoc): Ignore fuzzy entries. Julien Lepiller 2021-10-12Merge remote-tracking branch 'origin/master' into core-updates-frozen.Mathieu Othacehe 2021-10-09tests: Add guix-home.sh....* tests/guix-home.sh: New file. * Makefile.am (SH_TESTS): Add this. Oleg Pykhalov 2021-10-08Revert the #51061 patch series for now....This reverts commits f63c79bf7674df012517f8e9148f94c611e35f32 ..f86f7e24b39928247729020df0134e2e1c4cde62 for more chillax reviewing. See <https://issues.guix.gnu.org/51061#32>. Tobias Geerinckx-Rice 2021-10-07build-system: Add 'rebar3-build-system'....* guix/build-system/rebar3.scm, guix/build/rebar3-build-system.scm: New files. * Makefile.am (MODULES): Add them. Hartmut Goebel 2021-10-07import: Add hex.pm importer....hex.pm is a package repository for Erlang and Elixir. * guix/scripts/import.scm (importers): Add "hexpm". * guix/scripts/import/hexpm.scm, guix/import/hexpm.scm, guix/hexpm-download.scm: New files. * guix/import/utils.scm (source-spec->object): Add "hexpm-fetch" to list of fetch methods. * guix/upstream.scm (package-update/hexpm-fetch): New function. (%method-updates) Add it. * Makefile.am: Add them. Hartmut Goebel 2021-10-07Add (guix extracting-download)....* guix/extracting-download.scm: New file * Makefile.am (MODULES): Add it. Hartmut Goebel 2021-09-27Merge branch 'wip-guix-home'Oleg Pykhalov 2021-09-22gnu: linux-libre: Update to 5.14.7....* gnu/packages/linux.scm (linux-libre-5.13-version, linux-libre-5.13-gnu-revision, linux-libre-5.13-pristine-source, linux-libre-5.13-source, linux-libre-headers-5.13, linux-libre-5.13): Remove variables. (linux-libre-version, linux-libre-gnu-revision, linux-libre-pristine-source, linux-libre-source, linux-libre, linux-libre-with-bpf): Use 5.14. * gnu/packages/aux-files/linux-libre/5.13-arm.conf, gnu/packages/aux-files/linux-libre/5.13-arm64.conf, gnu/packages/aux-files/linux-libre/5.13-i686.conf, gnu/packages/aux-files/linux-libre/5.13-x86_64.conf: Delete files. * Makefile.am (AUX_FILES): Remove them. Leo Famulari 2021-09-18import: Add 'generic-git' updater....* guix/git.scm (ls-remote-refs): New procedure. * tests/git.scm ("remote-refs" "remote-refs: only tags"): New tests. * guix/import/git.scm: New file. * doc/guix.texi (Invoking guix refresh): Document it. * tests/import-git.scm: New test file. * Makefile.am (MODULES, SCM_TESTS): Register the new files. Co-authored-by: Sarah Morgensen <iskarian@mgsn.dev> Signed-off-by: Ludovic Courtès <ludo@gnu.org> Xinglu Chen 2021-09-17Merge branch 'master' into core-updates-frozen... Conflicts: gnu/packages/bioinformatics.scm gnu/packages/chez.scm gnu/packages/docbook.scm gnu/packages/ebook.scm gnu/packages/gnome.scm gnu/packages/linux.scm gnu/packages/networking.scm gnu/packages/python-web.scm gnu/packages/python-xyz.scm gnu/packages/tex.scm gnu/packages/version-control.scm gnu/packages/xml.scm guix/build-system/dune.scm guix/build-system/go.scm guix/build-system/linux-module.scm guix/packages.scm Marius Bakke 2021-09-14etc: Add 'disarchive-manifest.scm'....* etc/disarchive-manifest.scm: New file. * Makefile.am (EXTRA_DIST): Add it. Ludovic Courtès 2021-09-14etc: Add 'source-manifest.scm'....* etc/source-manifest.scm: New file. * Makefile.am (EXTRA_DIST): Add it. Ludovic Courtès 2021-09-09scripts: home: Add import subcommand....* guix/scripts/home/import.scm: New file. * Makefile.am (MODULES): Add it. Signed-off-by: Oleg Pykhalov <go.wigust@gmail.com> Andrew Tropin 2021-09-09scripts: Add 'guix home'....* guix/scripts/home.scm: New file. * Makefile.am (MODULES): Add it. Signed-off-by: Oleg Pykhalov <go.wigust@gmail.com> Andrew Tropin 2021-09-07Merge branch 'master' into core-updates-frozenLudovic Courtès 2021-09-06gnu: Add linux-libre 5.14.1....* gnu/packages/linux.scm (linux-libre-5.14-version, deblob-scripts-5.14, linux-libre-5.14-pristine-source, linux-libre-5.14-source, linux-libre-headers-5.14, linux-libre-5.14): New variables. * gnu/packages/aux-files/linux-libre/5.14-arm.conf, gnu/packages/aux-files/linux-libre/5.14-arm64.conf, gnu/packages/aux-files/linux-libre/5.14-i686.conf, gnu/packages/aux-files/linux-libre/5.14-x86_64.conf: New files. * Makefile.am (AUX_FILES): Add them. Leo Famulari